【问题标题】:Difference in price change ratio from day before in pandas大熊猫价格变化率与前一天的差异
【发布时间】:2016-11-14 22:14:48
【问题描述】:

我有以下df:

   ID   Date            A_price B_price
    3   01/01/2013 00:00    2   5
    3   02/01/2013 00:00    3   6
    1   01/01/2013 00:00    2   4
    1   02/01/2013 00:00    5   2
    1   03/01/2013 00:00    4   4
    1   04/01/2013 00:00    8   10
    1   05/01/2013 00:00    8   2
    1   06/01/2013 00:00    2   5
    1   01/01/2013 00:00    3   6

我想计算 2 个新列:A_price_ratio_increase、B_price_ratio_increase,这将仅计算特定 ID 从昨天开始的价格上涨。 考虑使用 df.groupyby(['ID','DATE'])['A_price'].shift() 以昨天的价格创建 2 个新列 然后在今天的价格和新列的价格之间进行划分,但新列的结果主要是 NaN。 有没有更有效的方法?

【问题讨论】:

    标签: python-2.7 pandas


    【解决方案1】:

    一个班轮

    pd.concat([df, df.groupby('ID')[['A_price', 'B_price']].apply(lambda df: np.exp(np.log(df).diff()))], axis=1)
    

    比较合理

    import numpy as np
    import pandas as pd
    
    def ratio(df):
        return np.exp(np.log(df).diff()) - 1
    
    price_cols = ['A_price', 'B_price']
    keys = ['Original', 'PctChange']
    pd.concat([df, df.groupby('ID')[price_cols].apply(ratio)],
              axis=1, keys=keys)
    

    【讨论】:

      【解决方案2】:

      这是一个替代解决方案,使用pct_change() 函数:

      In [484]: df[['A_price_ratio_increase','B_price_ratio_increase']] = \
                    df.groupby('ID')['A_price','B_price'].pct_change()
      
      In [485]: df
      Out[485]:
         ID       Date  A_price  B_price  A_price_ratio_increase  B_price_ratio_increase
      0   3 2013-01-01        2        5                     NaN                     NaN
      1   3 2013-02-01        3        6                    0.50                     0.2
      2   1 2013-01-01        2        4                     NaN                     NaN
      3   1 2013-02-01        5        2                    1.50                    -0.5
      4   1 2013-03-01        4        4                   -0.20                     1.0
      5   1 2013-04-01        8       10                    1.00                     1.5
      6   1 2013-05-01        8        2                    0.00                    -0.8
      7   1 2013-06-01        2        5                   -0.75                     1.5
      8   1 2013-01-01        3        6                    0.50                     0.2
      

      【讨论】:

        【解决方案3】:

        第一种方式

        • 先复制原始数据框

          copied_df=df.copy()
          
        • 将 df 值向前移动 1 步

           copied_df.shift(periods=1)
          

        这会将所有列向前移动 1 步。在您的 df 中,您应该确保将日期设置为索引列。

         copied_df.set_index("Date")
        
        • 创建一个新列“priceA_lag”,它将向前移动 A i 的价格。

          copied_df["priceA_lag"]=copied_df.A_price.shift(periods=1)
          
        • 创建另一列“PriceA_diff”

          copied_df["PriceA_diff"]=copied_df.A_price.sub(copied_df.priceA_lag)
          

        第二种方式

        df["A_price_dif"]=df.A_price.diff(periods=1)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-06
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          • 2020-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多