如何使用 pandas 计算累积加权平均值
How to calculate cumulative weighted average using pandas
我想问一下如何在 pandas 数据框中查找特定列值的累积平均值。
首先,数据如下所示:
firm
date
reviewer
rate
A
2021-01-01
a
5
A
2021-01-01
b
1
A
2021-01-01
c
2
A
2021-01-02
d
3
A
2021-01-02
e
4
A
2021-01-03
f
3
A
2021-01-04
g
5
B
2021-01-01
h
5
B
2021-01-01
i
2
B
2021-01-02
j
3
B
2021-01-02
k
4
B
2021-01-03
a
3
B
2021-01-04
b
5
我要查找的是按日期获取特定公司的平均评分,并添加一列以查找包括今天平均评分在内的累计平均评分。
我想把它变成像下面这样的数据框。
firm
date
reviewer
rate
cum_avg_rate
A
2021-01-01
a
5
2.667
A
2021-01-01
b
1
2.667
A
2021-01-01
c
2
2.667
A
2021-01-02
d
3
3
A
2021-01-02
e
4
3
A
2021-01-03
f
3
3
A
2021-01-04
g
5
3.286
B
2021-01-01
h
5
3.5
B
2021-01-01
i
2
3.5
B
2021-01-02
j
3
3.5
B
2021-01-02
k
4
3.5
B
2021-01-03
a
3
3.4
B
2021-01-04
b
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')
但这并不像我预期的那样有效。
如果你能教我如何得到结果,我将不胜感激。
提前致谢。
我们可以计算每个 firm
的每日 sum
和 count
与 groupby aggregate
then groupby cumsum
to get the daily cumulative total per firm
. Compute the mean by dividing and 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]
})
我想问一下如何在 pandas 数据框中查找特定列值的累积平均值。 首先,数据如下所示:
firm | date | reviewer | rate |
---|---|---|---|
A | 2021-01-01 | a | 5 |
A | 2021-01-01 | b | 1 |
A | 2021-01-01 | c | 2 |
A | 2021-01-02 | d | 3 |
A | 2021-01-02 | e | 4 |
A | 2021-01-03 | f | 3 |
A | 2021-01-04 | g | 5 |
B | 2021-01-01 | h | 5 |
B | 2021-01-01 | i | 2 |
B | 2021-01-02 | j | 3 |
B | 2021-01-02 | k | 4 |
B | 2021-01-03 | a | 3 |
B | 2021-01-04 | b | 5 |
我要查找的是按日期获取特定公司的平均评分,并添加一列以查找包括今天平均评分在内的累计平均评分。
我想把它变成像下面这样的数据框。
firm | date | reviewer | rate | cum_avg_rate |
---|---|---|---|---|
A | 2021-01-01 | a | 5 | 2.667 |
A | 2021-01-01 | b | 1 | 2.667 |
A | 2021-01-01 | c | 2 | 2.667 |
A | 2021-01-02 | d | 3 | 3 |
A | 2021-01-02 | e | 4 | 3 |
A | 2021-01-03 | f | 3 | 3 |
A | 2021-01-04 | g | 5 | 3.286 |
B | 2021-01-01 | h | 5 | 3.5 |
B | 2021-01-01 | i | 2 | 3.5 |
B | 2021-01-02 | j | 3 | 3.5 |
B | 2021-01-02 | k | 4 | 3.5 |
B | 2021-01-03 | a | 3 | 3.4 |
B | 2021-01-04 | b | 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')
但这并不像我预期的那样有效。
如果你能教我如何得到结果,我将不胜感激。
提前致谢。
我们可以计算每个 firm
的每日 sum
和 count
与 groupby aggregate
then groupby cumsum
to get the daily cumulative total per firm
. Compute the mean by dividing and 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]
})