如何计算两个或多个数字之间的百分比差异

问题描述 投票:0回答:1

我有一个包含两列的数据框。 (可以有更多的数据列) 我想根据每行的波动性按值排序。

例如,

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')

我想知道这是否是数学或静力学中已知的算法?我用谷歌搜索,但没有找到类似的方法来计算波动率。

pandas math statistics mean volatility
1个回答
0
投票

您可以直接矢量化您的操作:

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
© www.soinside.com 2019 - 2024. All rights reserved.