Python 熊猫分别在每个类别的日期范围内求和

Python 熊猫分别在每个类别的日期范围内求和,python,pandas,time-series,grouping,rolling-computation,Python,Pandas,Time Series,Grouping,Rolling Computation,我有一个数据框架,其中包含不同项目的销售交易时间序列: import pandas as pd from datetime import timedelta df_1 = pd.DataFrame() df_2 = pd.DataFrame() df_3 = pd.DataFrame() # Create datetimes and data df_1['date'] = pd.date_range('1/1/2018', periods=5, freq='D') df_1['item'] =

我有一个数据框架,其中包含不同项目的销售交易时间序列:

import pandas as pd
from datetime import timedelta
df_1 = pd.DataFrame()
df_2 = pd.DataFrame()
df_3 = pd.DataFrame()

# Create datetimes and data
df_1['date'] = pd.date_range('1/1/2018', periods=5, freq='D')
df_1['item'] = 1
df_1['sales']= 2

df_2['date'] = pd.date_range('1/1/2018', periods=5, freq='D')
df_2['item'] = 2
df_2['sales']= 3

df_3['date'] = pd.date_range('1/1/2018', periods=5, freq='D')
df_3['item'] = 3
df_3['sales']= 4

df = pd.concat([df_1, df_2, df_3])
df = df.sort_values(['item'])
df
结果数据帧:

    date    item    sales
0   2018-01-01  1   2
1   2018-01-02  1   2
2   2018-01-03  1   2
3   2018-01-04  1   2
4   2018-01-05  1   2
0   2018-01-01  2   3
1   2018-01-02  2   3
2   2018-01-03  2   3
3   2018-01-04  2   3
4   2018-01-05  2   3
0   2018-01-01  3   4
1   2018-01-02  3   4
2   2018-01-03  3   4
3   2018-01-04  3   4
4   2018-01-05  3   4
我想计算给定时间窗口内给定项目的“销售额”之和。我不能用这个词 因为时间序列是稀疏的(例如2018-01-01>2018-01-04>2018-01-06>等)

我尝试过此解决方案(时间窗口=2天):

我的目标是分别计算每个项目的Roll_销售额,如下所示:

    date    item    sales   start_date  end_date    rolled_sales
0   2018-01-01  1   2   2017-12-29  2017-12-31  0
1   2018-01-02  1   2   2017-12-30  2018-01-01  2
2   2018-01-03  1   2   2017-12-31  2018-01-02  4
3   2018-01-04  1   2   2018-01-01  2018-01-03  6
4   2018-01-05  1   2   2018-01-02  2018-01-04  8
0   2018-01-01  2   3   2017-12-29  2017-12-31  0
1   2018-01-02  2   3   2017-12-30  2018-01-01  3
2   2018-01-03  2   3   2017-12-31  2018-01-02  6
3   2018-01-04  2   3   2018-01-01  2018-01-03  9
4   2018-01-05  2   3   2018-01-02  2018-01-04  12
0   2018-01-01  3   4   2017-12-29  2017-12-31  0
1   2018-01-02  3   4   2017-12-30  2018-01-01  4
2   2018-01-03  3   4   2017-12-31  2018-01-02  8
3   2018-01-04  3   4   2018-01-01  2018-01-03  12
4   2018-01-05  3   4   2018-01-02  2018-01-04  16
    date    item    sales   start_date  end_date    rolled_sum
0   2018-01-01  1   2   2017-12-30  2018-01-01  2.0
3   2018-01-04  1   2   2018-01-02  2018-01-04  2.0
4   2018-01-05  1   2   2018-01-03  2018-01-05  4.0
7   2018-01-08  1   2   2018-01-06  2018-01-08  2.0
9   2018-01-10  1   2   2018-01-08  2018-01-10  4.0
12  2018-01-03  2   3   2018-01-01  2018-01-03  3.0
13  2018-01-04  2   3   2018-01-02  2018-01-04  6.0
15  2018-01-06  2   3   2018-01-04  2018-01-06  6.0
17  2018-01-08  2   3   2018-01-06  2018-01-08  6.0
18  2018-01-09  2   3   2018-01-07  2018-01-09  6.0
19  2018-01-10  2   3   2018-01-08  2018-01-10  9.0
21  2018-01-02  3   4   2017-12-31  2018-01-02  4.0
23  2018-01-04  3   4   2018-01-02  2018-01-04  8.0
25  2018-01-06  3   4   2018-01-04  2018-01-06  8.0
26  2018-01-07  3   4   2018-01-05  2018-01-07  8.0
27  2018-01-08  3   4   2018-01-06  2018-01-08  12.0
28  2018-01-09  3   4   2018-01-07  2018-01-09  12.0
29  2018-01-10  3   4   2018-01-08  2018-01-10  12.0
我尝试应用此处建议的解决方案: 但失败了

有什么想法吗

非常感谢:)


安迪

每件商品两天的总销售额滚动窗口:

z = df.sort_values('date').set_index('date').groupby('item').rolling('2d')['sales'].sum()
df[df.groupby('item').cumcount() < 2 ].groupby('item').sum()
start_date = pd.to_datetime('2017-12-2')
end_date = pd.to_datetime('2018-12-2')
df[df['date'].between(start_date, end_date)].groupby('item')['sales'].sum()
输出:

item  date      
1     2018-01-01    2.0
      2018-01-02    4.0
      2018-01-03    4.0
      2018-01-04    4.0
      2018-01-05    4.0
2     2018-01-01    3.0
      2018-01-02    6.0
      2018-01-03    6.0
      2018-01-04    6.0
      2018-01-05    6.0
3     2018-01-01    4.0
      2018-01-02    8.0
      2018-01-03    8.0
      2018-01-04    8.0
      2018-01-05    8.0
Name: sales, dtype: float64
每件商品最近2天的总销售额:

z = df.sort_values('date').set_index('date').groupby('item').rolling('2d')['sales'].sum()
df[df.groupby('item').cumcount() < 2 ].groupby('item').sum()
start_date = pd.to_datetime('2017-12-2')
end_date = pd.to_datetime('2018-12-2')
df[df['date'].between(start_date, end_date)].groupby('item')['sales'].sum()
经过一些数据争论(我删除了一些行以模拟稀疏日期,并在距给定日期3天的距离内添加了辅助列“开始日期”和“结束日期”),最终输出如下所示:

    date    item    sales   start_date  end_date    rolled_sales
0   2018-01-01  1   2   2017-12-29  2017-12-31  0
1   2018-01-02  1   2   2017-12-30  2018-01-01  2
2   2018-01-03  1   2   2017-12-31  2018-01-02  4
3   2018-01-04  1   2   2018-01-01  2018-01-03  6
4   2018-01-05  1   2   2018-01-02  2018-01-04  8
0   2018-01-01  2   3   2017-12-29  2017-12-31  0
1   2018-01-02  2   3   2017-12-30  2018-01-01  3
2   2018-01-03  2   3   2017-12-31  2018-01-02  6
3   2018-01-04  2   3   2018-01-01  2018-01-03  9
4   2018-01-05  2   3   2018-01-02  2018-01-04  12
0   2018-01-01  3   4   2017-12-29  2017-12-31  0
1   2018-01-02  3   4   2017-12-30  2018-01-01  4
2   2018-01-03  3   4   2017-12-31  2018-01-02  8
3   2018-01-04  3   4   2018-01-01  2018-01-03  12
4   2018-01-05  3   4   2018-01-02  2018-01-04  16
    date    item    sales   start_date  end_date    rolled_sum
0   2018-01-01  1   2   2017-12-30  2018-01-01  2.0
3   2018-01-04  1   2   2018-01-02  2018-01-04  2.0
4   2018-01-05  1   2   2018-01-03  2018-01-05  4.0
7   2018-01-08  1   2   2018-01-06  2018-01-08  2.0
9   2018-01-10  1   2   2018-01-08  2018-01-10  4.0
12  2018-01-03  2   3   2018-01-01  2018-01-03  3.0
13  2018-01-04  2   3   2018-01-02  2018-01-04  6.0
15  2018-01-06  2   3   2018-01-04  2018-01-06  6.0
17  2018-01-08  2   3   2018-01-06  2018-01-08  6.0
18  2018-01-09  2   3   2018-01-07  2018-01-09  6.0
19  2018-01-10  2   3   2018-01-08  2018-01-10  9.0
21  2018-01-02  3   4   2017-12-31  2018-01-02  4.0
23  2018-01-04  3   4   2018-01-02  2018-01-04  8.0
25  2018-01-06  3   4   2018-01-04  2018-01-06  8.0
26  2018-01-07  3   4   2018-01-05  2018-01-07  8.0
27  2018-01-08  3   4   2018-01-06  2018-01-08  12.0
28  2018-01-09  3   4   2018-01-07  2018-01-09  12.0
29  2018-01-10  3   4   2018-01-08  2018-01-10  12.0
神奇之处在于rolling.sum参数:我应该使用“3D”而不是“3”

非常感谢您的帮助:)


Andy

nope:(.我不希望有固定的日期,但希望有一个给定大小的滚动窗口(我的情况是7天)。总体思路是计算每个项目和给定日期前7天的总销售额。我已经更新了答案,但如果仍然不匹配,请提供完整的输出示例。
df.groupby('item')。滚动('2D',on='date')。sales.sum()
对你不起作用?是的,它起作用了。非常感谢:)安迪