我有一个包含两列的数据框。 (可以有更多的数据列) 我想根据每行的波动性按值排序。
例如,
import pandas as pd
import numpy as np
df = pd.DataFrame({'item1': {'trial_1': 1.0,
'trial_2': 7.0,
'trial_3': 16053.2,
'trial_4': 16053.2,
'trial_5': 224685.5},
'item2': {'trial_1': 0.0,
'trial_2': 0.0,
'trial_3': 19340.1,
'trial_4': 19340.1,
'trial_5': 269635.8}})
数据框应该是这样的: 项目1 项目2 审判_1 1.0 0.0 审判_2 7.0 0.0 审判_3 16053.2 19340.1 审判_4 16053.2 19340.1 试用_5 224685.5 269635.8
要获得两列的波动百分比,我们可以使用
100 * abs(gap of item1 and item2)/item1
来计算每行的百分比。
为了使其适用于 3 列或更多列,我有一个想法,即使用每行的平均值。
那就这样了
data_cols = ['item1', 'item2']
vf['mean'] = vf.T.describe().T['mean']
vf['volatility'] = np.sum(
np.abs(
[(vf['item2'] - vf['mean']) / vf['mean'] for c in data_cols]
), axis=0
)
vf.sort_values('volatility')
我想知道这是否是数学或静力学中已知的算法?我用谷歌搜索,但没有找到类似的方法来计算波动率。
您可以直接矢量化您的操作:
cols = list(vf) # or provide an explicit list
# compute averagr
avg = vf[cols].mean(axis=1)
vf['mean'] = avg
# compute volatility on all columns directly
vf['volatility'] = vf[cols].sub(avg, axis=0).div(avg, axis=0).abs().sum(axis=1)
输出:
item1 item2 mean volatility
trial_1 1.0 0.0 0.50 2.000000
trial_2 7.0 0.0 3.50 2.000000
trial_3 16053.2 19340.1 17696.65 0.185736
trial_4 16053.2 19340.1 17696.65 0.185736
trial_5 224685.5 269635.8 247160.65 0.181867