![](/img/trans.png)
[英]Apply Custom Function to Pandas Groupby using Rolling 12 Month Window
[英]How to apply a custom rolling function to pandas groupby?
我想使用以下函數根據平均銷售額計算每日銷售額:
def derive_daily_sales(avg_sales_series, period, first_day_sales):
"""
derive the daily sales from previous_avg_sales start date to current_avg_sales end date
for detail formula, please refer to README.md
@avg_sales_series: an array of avg sales(e.g. 2020-08-04 to 2020-08-06)
@period: the averaging period in days (e.g. 30 days, 90 days)
@first_day_sales: the sales at the first day of previous_avg_sales
"""
x_n1 = avg_sales_series[-1]*period - avg_sales_series[0]*period + first_day_sales
return x_n1
avg_sales_series
應該是一個熊貓系列。
數據框如下所示:
date, customer_id, avg_30_day_sales
12/08/2020, 1, 30
13/08/2020, 1, 40
14/08/2020, 1, 40
12/08/2020, 2, 20
13/08/2020, 2, 40
14/08/2020, 2, 30
我想首先分組customer_id
並按date
排序。 然后,得到大小2的滾動窗口和應用自定義功能derive_daily_sales
假設period
= 30和first_day_sales
等於第一avg_30_day_sales
。
我試過:
df_sales_grouped = df_sales.sort_values('date').groupby(['customer_id','date'])]
df_daily_sales['daily_sales'] = df_sales_grouped['avg_30_day_sales'].rolling(2).apply(derive_daily_sales, axis=1, period=30, first_day_sales= df_sales['avg_30_day_sales'][0])
您不應該按日期分組,因為您要滾動該列,因此分組應該是:
df_sales_grouped = df_sales.sort_values('date').groupby('customer_id')
接下來,您真正想要做的是在數據框中的每個組上apply
滾動窗口。 所以你需要使用apply
兩次,一次在分組數據幀上,一次在每個滾動窗口上。 這可以按如下方式完成:
rolling_arguments = {'period': 30, 'first_day_sales': df_sales['avg_30_day_sales'][0]}
df_sales['daily_sales'] = df_sales_grouped['avg_30_day_sales'].apply(
lambda g: g.rolling(2).apply(derive_daily_sales, kwargs=rolling_arguments))
對於給定的輸入數據,結果為:
date customer_id avg_30_day_sales daily_sales
12/08/2020 1 30 NaN
13/08/2020 1 40 330.0
14/08/2020 1 40 30.0
12/08/2020 2 20 NaN
13/08/2020 2 40 630.0
14/08/2020 2 30 -270.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.