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