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_data1x_data2...x_data30 概括为 for 循环 我试图放入 for 循环,但出现了一些错误,你能帮我把上面的代码概括为一个 for 循环吗,提前谢谢 编辑了答案以在 get_rolling_data() 中使用 for 循环 我得到 row[f'x_data.i'] 的语法错误..你能帮我解决这个问题吗,我正在使用 python2.7

以上是关于pandas 根据条件将数据转换为多步时间序列的主要内容,如果未能解决你的问题,请参考以下文章

为多标签文本分类转换数据集

Pandas:根据条件将值从一个数据帧合并到另一个数据帧

如何根据多个条件将 1 个 pandas 数据帧合并或组合到另一个数据帧

循环遍历 Pandas 数据帧并根据条件复制到新数据帧

根据 pandas 数据框中的条件将 value_counts 与 groupby 函数一起使用并插入新列

如何根据条件行值对 pandas 数据框进行取消堆叠或取消透视?