在 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
我想按行计算我的 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