使用循环或函数创建数百个 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
手动执行此过程将是一种矫枉过正,因此我正在寻找一个带有循环或函数的解决方案来创建此 train
、test
和 series
TS 对象。
和 此外 顺序 series
, train
和 test
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()
。
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
手动执行此过程将是一种矫枉过正,因此我正在寻找一个带有循环或函数的解决方案来创建此 train
、test
和 series
TS 对象。
和 此外 顺序 series
, train
和 test
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()
。