[英]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
將您的數據拆分為train
和test
:
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.