簡體   English   中英

如何將自定義滾動功能應用於 Pandas groupby?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM