簡體   English   中英

在不使用隨機拆分的情況下將時間序列 pySpark 數據幀拆分為測試和訓練

[英]Split Time Series pySpark data frame into test & train without using random split

我有一個火花時間序列數據框。 我想把它分成 80-20 個(訓練測試)。 由於這是一個時間序列數據框,我不想進行隨機拆分。 我該怎么做才能將第一個數據幀傳遞到訓練中,然后將第二個數據幀傳遞到測試中?

您可以使用pyspark.sql.functions.percent_rank()來獲取按時間戳/日期列排序的 DataFrame 的百分位排名。 然后選擇rank <= 0.8所有列作為您的訓練集,其余的作為您的測試集。

例如,如果您有以下 DataFrame:

df.show(truncate=False)
#+---------------------+---+
#|date                 |x  |
#+---------------------+---+
#|2018-01-01 00:00:00.0|0  |
#|2018-01-02 00:00:00.0|1  |
#|2018-01-03 00:00:00.0|2  |
#|2018-01-04 00:00:00.0|3  |
#|2018-01-05 00:00:00.0|4  |
#+---------------------+---+

您需要訓練集中的前 4 行和訓練集中的最后一行。 首先添加一個列rank

from pyspark.sql.functions import percent_rank
from pyspark.sql import Window

df = df.withColumn("rank", percent_rank().over(Window.partitionBy().orderBy("date")))

現在使用rank將您的數據拆分為traintest

train_df = df.where("rank <= .8").drop("rank")
train_df.show()
#+---------------------+---+
#|date                 |x  |
#+---------------------+---+
#|2018-01-01 00:00:00.0|0  |
#|2018-01-02 00:00:00.0|1  |
#|2018-01-03 00:00:00.0|2  |
#|2018-01-04 00:00:00.0|3  |
#+---------------------+---+

test_df = df.where("rank > .8").drop("rank")
test_df.show()
#+---------------------+---+
#|date                 |x  |
#+---------------------+---+
#|2018-01-05 00:00:00.0|4  |
#+---------------------+---+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM