【问题标题】:Normalizing returns to 100归一化返回 100
【发布时间】:2021-11-26 19:32:40
【问题描述】:

我有以下数据集:

import pandas as pd
data = [['2020-01-01', 'A', 0.05], ['2020-01-02', 'A', 0.06], ['2020-01-03', 'A', 0.12], ['2020-01-04', 'A', 0.09], ['2020-01-05', 'A', 0.07],   ['2020-01-01', 'B', 0.10], ['2020-01-02', 'B', 0.20], ['2020-01-03', 'B', 0.15], ['2020-01-04', 'B', 0.12], ['2020-01-05', 'B', 0.18],    ['2020-01-01', 'C', 0.05], ['2020-01-02', 'C', 0.11], ['2020-01-03', 'C', 0.18], ['2020-01-04', 'C', 0.09], ['2020-01-05', 'C', 0.22]]
df = pd.DataFrame(data, columns = ['DATE', 'Stock', 'Return'])
df

Out[1]:
          DATE Stock  Return
0   2020-01-01     A    0.05
1   2020-01-02     A    0.06
2   2020-01-03     A    0.12
3   2020-01-04     A    0.09
4   2020-01-05     A    0.07
5   2020-01-01     B    0.10
6   2020-01-02     B    0.20
7   2020-01-03     B    0.15
8   2020-01-04     B    0.12
9   2020-01-05     B    0.18
10  2020-01-01     C    0.05
11  2020-01-02     C    0.11
12  2020-01-03     C    0.18
13  2020-01-04     C    0.09
14  2020-01-05     C    0.22

我的目标是在时间序列开始时将股票收益标准化为 100,然后根据随后几天的相应股票表现进行调整。我的目标是收到以下信息(反映在“价格”列中):

data2 = [['2020-01-01', 'A', 0.05, 100], ['2020-01-02', 'A', 0.06, 120], ['2020-01-03', 'A', 0.12, 240], ['2020-01-04', 'A', 0.09, 180], ['2020-01-05', 'A', 0.07, 140],   ['2020-01-01', 'B', 0.10, 100], ['2020-01-02', 'B', 0.20, 200], ['2020-01-03', 'B', 0.15, 150], ['2020-01-04', 'B', 0.12, 120], ['2020-01-05', 'B', 0.18, 180],    ['2020-01-01', 'C', 0.05, 100], ['2020-01-02', 'C', 0.11, 220], ['2020-01-03', 'C', 0.18, 360], ['2020-01-04', 'C', 0.09, 180], ['2020-01-05', 'C', 0.22, 440]]
df2 = pd.DataFrame(data2, columns = ['DATE', 'Stock', 'Return', 'Price'])
df2

Out[2]:
          DATE Stock  Return  Price
0   2020-01-01     A    0.05    100
1   2020-01-02     A    0.06    120
2   2020-01-03     A    0.12    240
3   2020-01-04     A    0.09    180
4   2020-01-05     A    0.07    140
5   2020-01-01     B    0.10    100
6   2020-01-02     B    0.20    200
7   2020-01-03     B    0.15    150
8   2020-01-04     B    0.12    120
9   2020-01-05     B    0.18    180
10  2020-01-01     C    0.05    100
11  2020-01-02     C    0.11    220
12  2020-01-03     C    0.18    360
13  2020-01-04     C    0.09    180
14  2020-01-05     C    0.22    440

我知道有一种方法可以使用命令 df = df.reset_index().pivot_table(values='Return', index='DATE', columns='Stock') 将数据格式从长调整为宽,然后使用 df = df.pct_change().fillna(0).add(1).cumprod().mul(100).reset_index() 标准化返回,这将产生以下输出:

Out[3]:
Stock        DATE      A      B      C
0      2020-01-01  100.0  100.0  100.0
1      2020-01-02  120.0  200.0  220.0
2      2020-01-03  240.0  150.0  360.0
3      2020-01-04  180.0  120.0  180.0
4      2020-01-05  140.0  180.0  440.0

但是,在这种情况下,我希望按照最初的建议将所有股票列在一个列中。有没有办法添加“价格”列并相应地计算每只股票的值,即“股票”列中的每个唯一值?此任务是否需要“for”循环? 感谢您的任何建议和意见!

【问题讨论】:

    标签: python pandas jupyter-notebook time-series


    【解决方案1】:

    在你的情况下使用shiftcumprod

    def func(x): 
        return 100 * ((x/x.shift()).fillna(1)).cumprod()
    df.groupby('Stock')['Return'].transform(func)
    Out[138]: 
    0     100.0
    1     120.0
    2     240.0
    3     180.0
    4     140.0
    5     100.0
    6     200.0
    7     150.0
    8     120.0
    9     180.0
    10    100.0
    11    220.0
    12    360.0
    13    180.0
    14    440.0
    Name: Return, dtype: float64
    

    【讨论】:

      【解决方案2】:

      您可以使用groupby+transformfirst 来获取第一个值,然后将每一行除以*100

      df['Price'] = df['Return'].div(df['Return'].groupby(df['Stock']).transform('first'))*100
      

      print(df)
      
                DATE Stock  Return  Price
      0   2020-01-01     A    0.05  100.0
      1   2020-01-02     A    0.06  120.0
      2   2020-01-03     A    0.12  240.0
      3   2020-01-04     A    0.09  180.0
      4   2020-01-05     A    0.07  140.0
      5   2020-01-01     B    0.10  100.0
      6   2020-01-02     B    0.20  200.0
      7   2020-01-03     B    0.15  150.0
      8   2020-01-04     B    0.12  120.0
      9   2020-01-05     B    0.18  180.0
      10  2020-01-01     C    0.05  100.0
      11  2020-01-02     C    0.11  220.0
      12  2020-01-03     C    0.18  360.0
      13  2020-01-04     C    0.09  180.0
      14  2020-01-05     C    0.22  440.0
      

      【讨论】:

      • 像魅力一样工作。谢谢你!
      猜你喜欢
      • 2021-06-01
      • 2018-11-17
      • 2015-12-13
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多