[英]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
的每日sum
和count
,以獲得每個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.