4 回答

TA貢獻1810條經驗 獲得超4個贊
只是groupby + pct_change工作:
final = df.assign(return_ = df.groupby('stock')['price'].pct_change())
stock date price return_
0 abc 2020-01-20 102.3 NaN
1 efg 2020-01-20 36.2 NaN
2 xyz 2020-01-20 341.0 NaN
3 abc 2020-01-21 102.3 0.000000
4 efg 2020-01-21 34.3 -0.052486
5 xyz 2020-01-21 321.0 -0.058651
6 abc 2020-01-22 104.1 0.017595
7 efg 2020-01-22 35.2 0.026239
8 xyz 2020-01-22 318.0 -0.009346

TA貢獻1712條經驗 獲得超3個贊
我會這樣做:
import pandas as pd
data = {'stock':['abc','efg','xyz','abc','efg','xyz','abc','efg','xyz'],'date':['2020-01-20','2020-01-20','2020-01-20','2020-01-21','2020-01-21','2020-01-21','2020-01-22','2020-01-22','2020-01-22'],'price':[101,202,303,102,242,403,204,420,422]}
df = pd.DataFrame(data)
df['return'] = df.groupby('stock')['price'].pct_change()
df = df.dropna(how='any')
print(df)
輸出:
stock date price return
3 abc 2020-01-21 102 0.009901
4 efg 2020-01-21 242 0.198020
5 xyz 2020-01-21 403 0.330033
6 abc 2020-01-22 204 1.000000
7 efg 2020-01-22 420 0.735537
8 xyz 2020-01-22 422 0.047146

TA貢獻1784條經驗 獲得超2個贊
假設 df_ret 沒有索引,我會取消堆疊并重新堆疊。
df_ret.set_index(['date', 'stock'], inplace=True)
df_ret = df_ret.unstack(axis=0,level='stock')
rets = df_ret.pct_change()
rets=rets.stack()
rets.reset_index(inplace=True)

TA貢獻1995條經驗 獲得超2個贊
試試這個簡單的解決方案:
df['change_in_pct'] = (df.price - df.price.shift(1)) /df.price
添加回答
舉報