获取 Pandas 中多个列的加权平均值和标准差
Getting weighted average and standard deviation on several columns in Pandas
我正在尝试在 pandas
数据框的加权平均值之上进行加权标准偏差。我有一个 pandas
数据框,例如:
import numpy as np
import pandas as pd
df = pd.DataFrame({"Date": pd.date_range(start='2018-01-01', end='2018-01-03 18:00:00', freq='6H'),
"Weight": np.random.uniform(3, 5, 12),
"V1": np.random.uniform(10, 15, 12),
"V2": np.random.uniform(10, 15, 12),
"V3": np.random.uniform(10, 15, 12)})
目前,为了获得加权平均值,受 this post 启发,我正在执行以下操作:
def weighted_average_std(grp):
return grp._get_numeric_data().multiply(grp['Weight'], axis=0).sum()/grp['Weight'].sum()
df.index = df["Date"]
df_agg = df.groupby(pd.Grouper(freq='1D')).apply(weighted_average_std).reset_index()
df_agg
我在哪里得到以下信息:
Date V1 V2 V3 Weight
0 2018-01-01 11.421749 13.090178 11.639424 3.630196
1 2018-01-02 12.142917 11.605284 12.187473 4.056303
2 2018-01-03 12.034015 13.159132 11.658969 4.318753
我想修改 weighted_average_std
,以便除 weighted average
外,每列的标准差 returns。这个想法是以矢量化的方式对每个组使用加权平均值。 Weighted Standard Deviation
的新列名称可以类似于 V1_WSD
、V2_WSD
和 V3_WSD
。
PS1:This post通过加权标准差理论。
PS2:df_agg
中的第 Weight
列无意义。
你可以使用 EOL's NumPy-based code
计算加权平均值和标准偏差。要在 Pandas groupby/apply
操作中使用它,请将 weighted_average_std
return 设为 DataFrame:
import numpy as np
import pandas as pd
def weighted_average_std(grp):
"""
Based on (EOL)
"""
tmp = grp.select_dtypes(include=[np.number])
weights = tmp['Weight']
values = tmp.drop('Weight', axis=1)
average = np.ma.average(values, weights=weights, axis=0)
variance = np.dot(weights, (values - average) ** 2) / weights.sum()
std = np.sqrt(variance)
return pd.DataFrame({'mean':average, 'std':std}, index=values.columns)
np.random.seed(0)
df = pd.DataFrame({
"Date": pd.date_range(start='2018-01-01', end='2018-01-03 18:00:00', freq='6H'),
"Weight": np.random.uniform(3, 5, 12),
"V1": np.random.uniform(10, 15, 12),
"V2": np.random.uniform(10, 15, 12),
"V3": np.random.uniform(10, 15, 12)})
df.index = df["Date"]
df_agg = df.groupby(pd.Grouper(freq='1D')).apply(weighted_average_std).unstack(-1)
print(df_agg)
产量
mean std
V1 V2 V3 V1 V2 V3
Date
2018-01-01 12.105253 12.314079 13.566136 1.803014 1.725761 0.679279
2018-01-02 13.223172 12.534893 11.860456 1.709583 0.950338 1.153895
2018-01-03 13.782625 12.013557 12.105231 0.969099 1.189149 1.249064
我正在尝试在 pandas
数据框的加权平均值之上进行加权标准偏差。我有一个 pandas
数据框,例如:
import numpy as np
import pandas as pd
df = pd.DataFrame({"Date": pd.date_range(start='2018-01-01', end='2018-01-03 18:00:00', freq='6H'),
"Weight": np.random.uniform(3, 5, 12),
"V1": np.random.uniform(10, 15, 12),
"V2": np.random.uniform(10, 15, 12),
"V3": np.random.uniform(10, 15, 12)})
目前,为了获得加权平均值,受 this post 启发,我正在执行以下操作:
def weighted_average_std(grp):
return grp._get_numeric_data().multiply(grp['Weight'], axis=0).sum()/grp['Weight'].sum()
df.index = df["Date"]
df_agg = df.groupby(pd.Grouper(freq='1D')).apply(weighted_average_std).reset_index()
df_agg
我在哪里得到以下信息:
Date V1 V2 V3 Weight
0 2018-01-01 11.421749 13.090178 11.639424 3.630196
1 2018-01-02 12.142917 11.605284 12.187473 4.056303
2 2018-01-03 12.034015 13.159132 11.658969 4.318753
我想修改 weighted_average_std
,以便除 weighted average
外,每列的标准差 returns。这个想法是以矢量化的方式对每个组使用加权平均值。 Weighted Standard Deviation
的新列名称可以类似于 V1_WSD
、V2_WSD
和 V3_WSD
。
PS1:This post通过加权标准差理论。
PS2:df_agg
中的第 Weight
列无意义。
你可以使用 EOL's NumPy-based code
计算加权平均值和标准偏差。要在 Pandas groupby/apply
操作中使用它,请将 weighted_average_std
return 设为 DataFrame:
import numpy as np
import pandas as pd
def weighted_average_std(grp):
"""
Based on (EOL)
"""
tmp = grp.select_dtypes(include=[np.number])
weights = tmp['Weight']
values = tmp.drop('Weight', axis=1)
average = np.ma.average(values, weights=weights, axis=0)
variance = np.dot(weights, (values - average) ** 2) / weights.sum()
std = np.sqrt(variance)
return pd.DataFrame({'mean':average, 'std':std}, index=values.columns)
np.random.seed(0)
df = pd.DataFrame({
"Date": pd.date_range(start='2018-01-01', end='2018-01-03 18:00:00', freq='6H'),
"Weight": np.random.uniform(3, 5, 12),
"V1": np.random.uniform(10, 15, 12),
"V2": np.random.uniform(10, 15, 12),
"V3": np.random.uniform(10, 15, 12)})
df.index = df["Date"]
df_agg = df.groupby(pd.Grouper(freq='1D')).apply(weighted_average_std).unstack(-1)
print(df_agg)
产量
mean std
V1 V2 V3 V1 V2 V3
Date
2018-01-01 12.105253 12.314079 13.566136 1.803014 1.725761 0.679279
2018-01-02 13.223172 12.534893 11.860456 1.709583 0.950338 1.153895
2018-01-03 13.782625 12.013557 12.105231 0.969099 1.189149 1.249064