在 Pandas 中动态更新权重的加权平均行

Weighted Mean Row wise with dynamically updated weights in Pandas

我想按行计算我的 DataFrame 的加权平均值,其中每 n 行的权重是固定的(总是从第一行开始)并且必须动态更新中间的行。

动态更新的公式应该是 w_2_1,即第 1 列第二行:

wt_2_1 = ([var1_1_1 + 1] * wt_1_1)/(sum_i(wt_2_i))
wt_2_2 = ([var2_1_1 + 1] * wt_2_1)/(sum_i(wt_2_i))

其中 sum_i(wt_2_i) 是相应行(这里是第 2 行)中所有权重的总和。

为了说明 n=2 和权重等于 wt_1=[0.5,0.5]:

df = pd.DataFrame(  {
'datetime': ['2015-01-02', '2015-01-03', '2015-01-04', '2015-01-05', '2015-01-06'],
'var1': [var1_1_1, var1_1_2, var1_1_3, var1_1_4, var1_1_5],
'var2': [var2_1_1, var2_1_2, var2_1_3, var2_1_4, var2_1_5]})
df['datetime'] = pd.to_datetime(df['datetime'])
df.set_index([ 'datetime'], inplace =True)

下面是一个示例,其中包含我想要的目标列的编号,称为 'weighted mean'

df = pd.DataFrame(  {
'datetime': ['2015-01-02', '2015-01-03', '2015-01-04', '2015-01-05', '2015-01-06'],
'var1': [0.07, 0.08, 0.04, 0.01, 0.03],
'var2': [0.02, 0.01, 0.02, 0.02, 0.08]})
df['datetime'] = pd.to_datetime(df['datetime'])
df.set_index([ 'datetime'], inplace =True)

df['weighted_mean'] = [0.045, wm_2, 0.03, wm_3, 0.055]

因此第 1、3、5 个值使用固定权重 [0.05, 0.5]。其他的都是动态更新的,见下图:

sum_i(wt_2_i) = ([0.07 + 1] * 0.5) + ([0.02 + 1] * 0.5) = 1.045
wt_2_1 = ([0.07 + 1] * 0.5)/(sum_i(wt_2_i)) = 0.535/1.045 = 0.51196
wt_2_2 = ([0.02 + 1] * 0.5)/(sum_i(wt_2_i)) = 0.51/1.045  = 0.48804
wm_2 = 0.51196 * 0.08 + 0.48804 * 0.01 = 0.04583

让我们尝试以下操作:

(i) 创建辅助列:“ind”。

(ii) 计算sum_i(wt_2_i)的LHS和RHS:ww

(iii) 计算每行的 sum_i(wt_2_i)sm

(iv) 使用辅助列“ind”,使用前一行的 ww 与每一行的“val1”和“val2”值的乘积填写“weighted_mean”列。

df['ind'] = [1,0,1,0,1]
cols = ['var1','var2']
ww = (df[cols] + 1) * 0.5 # use initial weights here
sm = ww.sum(axis=1)
df['weighted_mean'] = (sm - 1).where(df['ind']==1, (df[cols] * ww.shift()).sum(axis=1) / sm)
df = df.drop(columns='ind')

输出:

            var1  var2  weighted_mean
datetime                             
2015-01-02  0.07  0.02       0.045000
2015-01-03  0.08  0.01       0.045837
2015-01-04  0.04  0.02       0.030000
2015-01-05  0.01  0.02       0.015172
2015-01-06  0.03  0.08       0.055000