首页 > 解决方案 > 计算python中多列的开盘/收盘价格百分比变化

问题描述

我有一个 1010 x 1625 长的数据框,其中包含可追溯到 2015 年的标准普尔 500 指数股票的开盘价和收盘价(示例如下)。

我正在尝试根据以下内容创建一个新的数据框,其中包含每只股票的每日回报百分比。

(当前数据框)

|            | A EQUITY PX_OPEN | A EQUITY PX_LAST | AAL EQUITY PX_OPEN | AAL EQUITY PX_LAST |
| ---------- | -----------------| ---------------- | ------------------ | ------------------ |
| 02/01/2015 | 41.18            | 40.56            | 54.16              | 53.91              |     
| 03/01/2015 | 40.32            | 39.80            | 54.35              | 53.88              |
| 04/01/2015 | 39.81            | 39.18            | 54.27              | 53.04              |

(期望的输出)

|            | A EQUITY PER_RET | AAL EQUITY PER_RET |  
| ---------- | -----------------| ------------------ | 
| 02/01/2015 | -1.51            | -.46               |      
| 03/01/2015 | -1.29            | -.87               | 
| 04/01/2015 | -1.58            | -2.27              |

公式 = ((px_last - px_open) / px_open) * 100

A EQUITY_RET = ((40.56 - 41.18) / 41.18) * 100 = -1.51

我的主要问题是每个列标题都有不同的名称,我不确定如何遍历每对打开/关闭列来计算百分比回报。

感谢是否有人能指出我正确的方向。

谢谢。

标签: pandasdataframereturnpercentagestock

解决方案


你可以试试:

df = df.set_index('index')
df = df.groupby(df.columns.str.split(' ').str[0], axis=1).apply(lambda x: (
    (x.iloc[:, 1] - x.iloc[:, 0]) / x.iloc[:, 0]).mul(100)).add_suffix(' EQUITY PER_RET')

完整示例:

df =  pd.DataFrame({'index': {0: ' 02/01/2015 ', 1: ' 03/01/2015 ', 2: ' 04/01/2015 '},
 'A EQUITY PX_OPEN': {0: 41.18, 1: 40.32, 2: 39.81},
 'A EQUITY PX_LAST': {0: 40.56, 1: 39.8, 2: 39.18},
 'AAL EQUITY PX_OPEN': {0: 54.16, 1: 54.35, 2: 54.27},
 'AAL EQUITY PX_LAST': {0: 53.91, 1: 53.88, 2: 53.04}})

df = df.set_index('index')
df = df.groupby(df.columns.str.split(' ').str[0], axis =1).apply(lambda x: ((x.iloc[:,1] - x.iloc[:,0]) / x.iloc[:, 0]).mul(100)).add_suffix(' EQUITY PER_RET')
输出:
              A EQUITY PER_RET  AAL EQUITY PER_RET
index                                             
 02/01/2015          -1.505585           -0.461595
 03/01/2015          -1.289683           -0.864765
 04/01/2015          -1.582517           -2.266446

注意:上述方法适用scalable于并且可以与其他列一起使用。


推荐阅读