[英]Python calculation for moving average
我有一個數據集如下:
import pandas as pd
data = {'Category': ['A','A','A','A','A','A','B','B','B','B','B','C','C','C','C','C'],
'Date' : [1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5],
'Count': [1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,6]}
df = pd.DataFrame(data)
我試圖計算每 3 行的平均計數,不包括按類別分組的當前行,並且日期是從新到舊,如果沒有足夠的 3 行來計算,它將返回 0。
預期結果應如下所示。 例如:對於日期 1 的類別 A,平均值計算為類別 A 的日期 2、3 和 4 的平均計數。
類別 | 日期 | 數數 | 平均 |
---|---|---|---|
一個 | 1 | 1 | 3 |
一個 | 2 | 2 | 4 |
一個 | 3 | 3 | 3.333333333 |
一個 | 4 | 4 | 2.666666666 |
一個 | 5 | 5 | 0 |
一個 | 6 | 1 | 0 |
乙 | 1 | 2 | 4 |
乙 | 2 | 3 | 5 |
乙 | 3 | 4 | 0 |
乙 | 4 | 5 | 0 |
乙 | 5 | 6 | 0 |
C | 1 | 1 | 3 |
C | 2 | 2 | 4.333333333 |
C | 3 | 3 | 0 |
C | 4 | 4 | 0 |
C | 5 | 6 | 0 |
我試圖在下面使用,但沒有得到預期的結果
df['average'] = df.groupby(['Category'])['count'].transform(lambda x: x.rolling(3, 1).mean())
您可以將rolling
與shift
和sort_values
結合使用,如下所示:
def reverse_roll(df):
df['Count'] = df.sort_values('Date', ascending=False)['Count'].rolling(3, 3).mean().shift()
df['Count'] = df['Count'].fillna(0.0)
df = df.sort_values('Date', ascending=True)
return df
df.groupby('Category').apply(reverse_roll)
上面, rolling(3, 3)
用於強制滾動 window 始終考慮 3 行而不是更少。 因此,結果的前 2 行將是 NaN,使用fillna
設置為 0。 要在 window 中不包括當前行,請使用shift
。
結果:
Category Date Count
0 A 1 3.000000
1 A 2 4.000000
2 A 3 3.333333
3 A 4 0.000000
4 A 5 0.000000
5 A 6 0.000000
6 B 1 4.000000
7 B 2 5.000000
8 B 3 0.000000
9 B 4 0.000000
10 B 5 0.000000
11 C 1 3.000000
12 C 2 4.333333
13 C 3 0.000000
14 C 4 0.000000
15 C 5 0.000000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.