大熊猫前一天价格变化率的差异

时间:2016-07-12 15:12:21

标签: python-2.7 pandas

我有以下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' s。 有没有更有效的方法呢?

2 个答案:

答案 0 :(得分: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)

enter image description here

答案 1 :(得分:0)

以下是使用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