簡體   English   中英

如何使用熊貓計算累積加權平均值

[英]How to calculate cumulative weighted average using pandas

我想問你如何在pandas數據框中找到特定列值的累積平均值。 首先,數據如下所示:

公司 日期 審稿人 速度
一種 2021-01-01 一種 5
一種 2021-01-01 1
一種 2021-01-01 C 2
一種 2021-01-02 d 3
一種 2021-01-02 電子 4
一種 2021-01-03 F 3
一種 2021-01-04 G 5
2021-01-01 H 5
2021-01-01 一世 2
2021-01-02 j 3
2021-01-02 4
2021-01-03 一種 3
2021-01-04 5

我要查找的是按日期獲取特定公司的平均評級,並添加一列以查找累積平均評級,包括今天的平均評級。
我想把它變成一個像下面這樣的數據框。

公司 日期 審稿人 速度 cum_avg_rate
一種 2021-01-01 一種 5 2.667
一種 2021-01-01 1 2.667
一種 2021-01-01 C 2 2.667
一種 2021-01-02 d 3 3
一種 2021-01-02 電子 4 3
一種 2021-01-03 F 3 3
一種 2021-01-04 G 5 3.286
2021-01-01 H 5 3.5
2021-01-01 一世 2 3.5
2021-01-02 j 3 3.5
2021-01-02 4 3.5
2021-01-03 一種 3 3.4
2021-01-04 5 3.667

到目前為止,我嘗試過的方法是創建一個新的數據框,使用帶有公司和日期的“groupby”方法計算平均分數和評論數量,並使用它來創建每天的累積平均值。
代碼如下。

firm_gp=avg_mean_rate.groupby(['firm','date'])['mean']
firm_gp_count=avg_mean_rate.groupby(['firm','date'])['count']
avg_mean_rate['new_avg_grade']=( (firm_gp * firm_gp_count).cumsum())/firm_gp_count.cumsum()

但是問題是在計算每一天的累積平均值的過程中出現了如下錯誤。
TypeError: unsupported operand type(s) for *: 'SeriesGroupBy' and 'method'

作為第二種方法,我使用 numpy 嘗試了以下方法。

def w_cum_avg(avg_mean_rate,mean,count):
    d=avg_mean_rate['mean']
    w= avg_mean_rate['count']
    return(d*w).cumsum() / w.cumsum()
avg_mean_rate.groupby(['firm','date']).apply(w_cum_avg,'mean','count')

但這並不奏效,這是我所期望的。

如果您能教我如何獲得結果,我將不勝感激。

先感謝您。

我們可以使用groupby aggregate然后groupby cumsum count每個firm的每日sumcount ,以獲得每個firm的每日累計總數。 通過划分並join回 DataFrame 來計算平均值:

g = (
    df.groupby(['firm', 'date'])['rate']
        .agg(['sum', 'count'])
        .groupby(level='firm').cumsum()
)

df = df.join(
    g['sum'].div(g['count']).rename('cum_avg_rate'),
    on=['firm', 'date']  # align index on columns
)

df

   firm        date reviewer  rate  cum_avg_rate
0     A  2021-01-01        a     5      2.666667
1     A  2021-01-01        b     1      2.666667
2     A  2021-01-01        c     2      2.666667
3     A  2021-01-02        d     3      3.000000
4     A  2021-01-02        e     4      3.000000
5     A  2021-01-03        f     3      3.000000
6     A  2021-01-04        g     5      3.285714
7     B  2021-01-01        h     5      3.500000
8     B  2021-01-01        i     2      3.500000
9     B  2021-01-02        j     3      3.500000
10    B  2021-01-02        k     4      3.500000
11    B  2021-01-03        a     3      3.400000
12    B  2021-01-04        b     5      3.666667

設置:

import pandas as pd

df = pd.DataFrame({
    'firm': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'],
    'date': ['2021-01-01', '2021-01-01', '2021-01-01', '2021-01-02',
             '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-01',
             '2021-01-01', '2021-01-02', '2021-01-02', '2021-01-03',
             '2021-01-04'],
    'reviewer': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'a',
                 'b'],
    'rate': [5, 1, 2, 3, 4, 3, 5, 5, 2, 3, 4, 3, 5]
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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