簡體   English   中英

Python 計算移動平均線

[英]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())

您可以將rollingshiftsort_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.

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