Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带groupby和条件的Pandas滚动求和_Python_Pandas_Group By_Rolling Computation - Fatal编程技术网

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