使用循环或函数创建数百个 TimeSeries & Train-/Testsets

Create hundreds of TimeSeries & Train-/Testsets with loop or function

MWE

我有一个 Mio 行多一点的数据集,包含几个 100 个 TimeSeries。这是此数据的简化 MWE:

import pandas as pd

df = pd.DataFrame({"dtime":["2022-01-01", "2022-01-02", "2022-01-03", "2022-01-01", "2022-01-02", "2022-01-03",
                           "2022-01-01", "2022-01-02", "2022-01-03","2022-01-01", "2022-01-02", "2022-01-03"],
                   "Type":["A","A","A","B","B","B","C","C","C","D","D","D"],
                   "Value":[1,2,3,4,6,8,1,5,8,3,1,2]})

+----+------------+--------+---------+
|    | dtime      | Type   |   Value |
|----+------------+--------+---------|
|  0 | 2022-01-01 | A      |       1 |
|  1 | 2022-01-02 | A      |       2 |
|  2 | 2022-01-03 | A      |       3 |
|  3 | 2022-01-01 | B      |       4 |
|  4 | 2022-01-02 | B      |       6 |
|  5 | 2022-01-03 | B      |       8 |
|  6 | 2022-01-01 | C      |       1 |
|  7 | 2022-01-02 | C      |       5 |
|  8 | 2022-01-03 | C      |       8 |
|  9 | 2022-01-01 | D      |       3 |
| 10 | 2022-01-02 | D      |       1 |
| 11 | 2022-01-03 | D      |       2 |
+----+------------+--------+---------+

Type表示TimeSeries-Group,所以A是一个TimeSerie,B是另一个,依此类推。


目标

我想训练多维 TimeSeries-NN(如 unit8-darts 包提供的那样)。

from darts.models import NBEATSModel
model = NBEATSModel(input_chunk_length=50, output_chunk_length=50, n_epochs=25)
model.fit([train1, train2, train3, train4])

为此我需要将Type分离并转换成TimeSeries格式,最后拆分成train/test。 像这样:

from darts import TimeSeries

split_date = "2022-01-02"

series1 = TimeSeries.from_dataframe(df[df["Type"] == "A"], "dtime", "Value", freq="D", fillna_value=0)
series2 = TimeSeries.from_dataframe(df[df["Type"] == "B"], "dtime", "Value", freq="D", fillna_value=0)
series3 = TimeSeries.from_dataframe(df[df["Type"] == "C"], "dtime", "Value", freq="D", fillna_value=0)
series4 = TimeSeries.from_dataframe(df[df["Type"] == "D"], "dtime", "Value", freq="D", fillna_value=0)
train1, val1 = series1.split_before(pd.Timestamp(split_date))
train2, val2 = series2.split_before(pd.Timestamp(split_date))
train3, val3 = series3.split_before(pd.Timestamp(split_date))
train4, val4 = series4.split_before(pd.Timestamp(split_date))

但是由于现实世界的数据超过 4 Type 手动执行此过程将是一种矫枉过正,因此我正在寻找一个带有循环或函数的解决方案来创建此 traintestseries TS 对象。

此外 顺序 series, traintest TS-objects 我想创建一个包含每个 trainX 名称如:

ts_list = [train1, train2, train3, train4]

有人知道我该怎么做吗?我很高兴接受任何提议。

您是否尝试在循环中使用 groupby over Type 列:

train_list = []
for ts_type, group in df.groupby('Type'):
    series = TimeSeries.from_dataframe(group, "dtime", "Value", freq="D", fillna_value=0)
    train, val = series.split_before(pd.Timestamp(split_date))
    train_list.append(train)

但是,对于大量数据,使用带有 Pandas 的循环可能会变得非常昂贵。所以也许可以找到更好的解决方案(例如使用其他工具,例如 spark)。

上面给出的答案看起来不错。我要补充一点,在实施之前,您可能应该问问自己是否:

  • 您想使用每组一个时间序列对数据建模。在这种情况下,建议的选项循环组看起来不错。如果代表某些相同潜在现象的不同“观察结果”的组(例如,两个不同患者的心率系列),您可能应该使用此表示。
  • 您想要为所有组使用一个时间序列来建模您的数据,其中每个组对该(多变量)时间序列构成一个维度。当每个组代表构成观察的不同维度(例如,单个患者的心率和血压)时,您应该使用它。在后一种情况下,您应该将数据框转换为将组放在单独的列中,并且只调用一次 TimeSeries.from_dataframe()