pandas 根据条件将数据转换为多步时间序列
Posted
技术标签:
【中文标题】pandas 根据条件将数据转换为多步时间序列【英文标题】:pandas transform data into multi step time series based on a condition 【发布时间】:2020-02-19 05:39:30 【问题描述】:我有一个如下所示的数据框,我正在使用下面的 for 循环创建多步数据序列,但我想在客户级别应用逻辑。
数据框:
Date Customer Price
1/1/2019 A 142
1/2/2019 A 123
1/3/2019 A 342
1/4/2019 A 232
1/5/2019 A 657
1/6/2019 B 875
1/7/2019 B 999
1/8/2019 B 434
1/9/2019 B 564
1/10/2019 B 345
1/10/2019 B 798
下面的forloop代码可以创建具有滚动窗口1的数据序列。
data = np.array(data)
X_data, y_data = [], []
for i in range(2, len(data )-2):
X_data.append(data[i-2:i])
y_data.append(data[i:i+2])
X_data 数组和 y_data 数组的输出应该如下所示
X_data(independent variables) y_data(target)
customer 0 1 0 1
A 142 123 342 232
A 123 342 232 657
B 875 999 434 564
B 999 434 564 345
B 434 564 345 798
请就此向我提出建议。在此先感谢
【问题讨论】:
【参考方案1】:使用DataFrame.shift()
将索引移动所需的数字以滚动数据
def get_rolling_data(row):
n = 2
for i in range(n):
row[f'x_data.i'] = row.shift(0 - i).Price
row[f'y_data.i'] = row.shift(0 - n - i).Price
return row
df_res = df.groupby(['Customer']).apply(get_rolling_data)
print(df_res.dropna())
Date Customer Price x_data.0 x_data.1 y_data.0 y_data.1
0 1/1/2019 A 142 142 123.0 342.0 232.0
1 1/2/2019 A 123 123 342.0 232.0 657.0
5 1/6/2019 B 875 875 999.0 434.0 564.0
6 1/7/2019 B 999 999 434.0 564.0 345.0
7 1/8/2019 B 434 434 564.0 345.0 798.0
上面的结果是Dataframe
。如果您需要np.array
,您可以进一步提取所需的数据。
【讨论】:
感谢 henry 的回复和解决方案,但是如果我每个客户有 60 个或更多价格行,而不是生成 2 列,我想为每个客户生成 30 列,滚动窗口为 1,例如 x: x_data1,x_data2...x_data30 同样适用于 y:y_data1,y_data2......y_data30,上面的代码可以工作吗? 我不明白为什么它适用于 case=2 但不适用于 case=30,为了便于阅读,您可以将这些x_data1
、x_data2
...x_data30
概括为 for 循环
我试图放入 for 循环,但出现了一些错误,你能帮我把上面的代码概括为一个 for 循环吗,提前谢谢
编辑了答案以在 get_rolling_data()
中使用 for 循环
我得到 row[f'x_data.i'] 的语法错误..你能帮我解决这个问题吗,我正在使用 python2.7以上是关于pandas 根据条件将数据转换为多步时间序列的主要内容,如果未能解决你的问题,请参考以下文章
如何根据多个条件将 1 个 pandas 数据帧合并或组合到另一个数据帧