我想計算我的 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]
所以第一個、第三個和第五個值使用的是固定的權重[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
uj5u.com熱心網友回復:
讓我們嘗試以下方法:
(i) 創建一個輔助列:“ind”。
(ii) 計算 的 LHS 和 RHS sum_i(wt_2_i):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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/441288.html
下一篇:如何為熊貓資料框列生成權重?
