Python 带groupby和条件的Pandas滚动求和
我有一个数据框架,其中包含不同商品的销售时间序列以及客户分析。对于我要计算的每个项目和给定的一天:Python 带groupby和条件的Pandas滚动求和,python,pandas,group-by,rolling-computation,Python,Pandas,Group By,Rolling Computation,我有一个数据框架,其中包含不同商品的销售时间序列以及客户分析。对于我要计算的每个项目和给定的一天: 在过去两天的总销售额中分享我的最佳客户 在过去两天的总销售额中,我的主要客户(从列表中)所占份额 我尝试过这里提供的解决方案: 滚动总和: 对于条件groupby: 示例数据帧可通过以下方式生成: 将熊猫作为pd导入 从日期时间导入时间增量 df_1=pd.DataFrame() df_2=pd.DataFrame() df_3=pd.DataFrame() #创建日期时间和数据 df_
- 在过去两天的总销售额中分享我的最佳客户
- 在过去两天的总销售额中,我的主要客户(从列表中)所占份额
- 滚动总和:
- 对于条件groupby:
将熊猫作为pd导入
从日期时间导入时间增量
df_1=pd.DataFrame()
df_2=pd.DataFrame()
df_3=pd.DataFrame()
#创建日期时间和数据
df_1['item']=[1,1,1,2,2,2]
df_1['date']=pd.date_范围('2018年1月1日',期间=7,频率=D')
df_1['customer']=['a','b','c','a','b','b','c']
df_1['sales']=[2,4,1,5,7,2,3]
df_2['item']=[1,1,1,2,2,2]
df_2['date']=pd.date_范围('2018年1月1日',期间=7,频率=D')
df_2['customer']=['b','b','c','a','a','c','a']
df_2['sales']=[2,3,4,2,3,5,6]
df_3['item']=[1,1,1,2,2,2]
df_3['date']=pd.date_范围('2018年1月1日',期间=7,频率=D')
df_3['customer']=['b','c','a','c','b','a','b']
df_3['sales']=[6,5,2,3,4,5,6]
df=pd.concat([df_1,df_2,df_3])
df=df.sort_值(['item','date'])
df.reset_索引(drop=True)
看起来是这样的:
项目
日期
顾客
出售
1.
2018-01-01
A.
2.
1.
2018-01-01
B
2.
1.
2018-01-01
B
6.
1.
2018-01-02
B
4.
1.
2018-01-02
B
3.
1.
2018-01-02
C
5.
1.
2018-01-03
C
1.
1.
2018-01-03
C
4.
1.
2018-01-03
A.
2.
2.
2018-01-04
A.
5.
2.
2018-01-04
A.
2.
2.
2018-01-04
C
3.
2.
2018-01-05
B
7.
2.
2018-01-05
A.
3.
2.
2018-01-05
B
4.
2.
2018-01-06
B
2.
2.
2018-01-06
C
5.
2.
2018-01-06
A.
5.
2.
2018-01-07
C
3.
2.
2018-01-07
A.
6.
2.
2018-01-07
B
6.
使用:
如果要将滚动
与天数一起使用,则更为复杂:
df1 = df.groupby(['item','date'], as_index=False)['sales'].sum()
sales1 = (df1.set_index('date')
.groupby('item')['sales']
.rolling('2D', min_periods=1)
.sum()
.groupby('item')
.shift()
.rename('sales_last_2_days')
)
df1 = df1.join(sales1, on=['item','date'])
df1 = df.groupby(['item','date'], as_index=False)['sales'].sum()
sales1 = (df1.set_index('date')
.groupby('item')['sales']
.rolling('2D', min_periods=1)
.sum()
.groupby('item')
.shift()
.rename('sales_last_2_days')
)
df1 = df1.join(sales1, on=['item','date'])
df2 = df[df['customer'].eq('a')].groupby(['item','date'], as_index=False)['sales'].sum()
a = (df2.set_index('date')
.groupby('item')[['sales']]
.apply(lambda x: x.asfreq('D'))
.reset_index(level=0)
.groupby('item')['sales']
.rolling('2D', min_periods=1)
.sum()
.groupby('item')
.shift()
.rename('a_share')
)
print (a)
df1 = df1.join(a, on=['item','date'])
df1['a_share'] /= df1['sales_last_2_days']
top_cust = ['a', 'c']
df3 = df[df['customer'].isin(top_cust)].groupby(['item','date'], as_index=False)['sales'].sum()
b = (df3.set_index('date')
.groupby('item')[['sales']]
.apply(lambda x: x.asfreq('D'))
.reset_index(level=0)
.groupby('item')['sales']
.rolling('2D', min_periods=1)
.sum()
.groupby('item')
.shift()
.rename('top_share')
)
df1 = df1.join(b, on=['item','date'])
df1['top_share'] /= df1['sales_last_2_days']
print (df1)
item date sales sales_last_2_days a_share top_share
0 1 2018-01-01 10 NaN NaN NaN
1 1 2018-01-02 12 10.0 0.200000 0.200000
2 1 2018-01-03 7 22.0 0.090909 0.318182
3 2 2018-01-04 10 NaN NaN NaN
4 2 2018-01-05 14 10.0 0.700000 1.000000
5 2 2018-01-06 12 24.0 0.416667 0.541667
6 2 2018-01-07 15 26.0 0.307692 0.500000