我有以下 df:
date price MA1 MA2 MA3
date0 price0 12 10 8
date1 price1 11 11 11
date2 price2 12 21 14
date3 price3 13 12 15
date4 price4 14 14 14
date5 price5 15 17 14
date6 price6 19 16 15
date7 price7 15 12 13
date8 price8 11 10 13
date9 price9 21 12 13
date10 price10 13 11 14
date11 price11 14 14 14
date12 price12 16 16 16
date13 price13 34 32 23
date14 price14 12 12 12
我使用以下掩码过滤我的 df:
df =(data
.assign(same=lambda x: (x['MA1'] == x['MA2']) & (x['MA1'] == x['MA3']))
.loc[lambda x: x.same == True]
)
我得到:
date price MA1 MA2 MA3
date1 price1 11 11 11
date4 price4 14 14 14
date11 price11 14 14 14
date12 price12 16 16 16
date14 price14 12 12 12
因此 MA1、MA2 和 M3 匹配的日期为 date1、date4、date11、date 12、date14。
我想创建一个与此格式匹配的 df
date price price_past price_fut return_past return_future
date1 price1 price0 price2 (price1-price0)/price0 (price2-price1)/price1
date4 price4 price3 price5 (price4-price3)/price3 (price5-price4)/price4
date11 price11 price10 price12 (price11-price10)/price10 (price12-price11)/price11
date12 price12 price11 price13 (price12-price11)/price11 (price13 -price12)/price12
date14 price14 price13 price15 (price14-price13)/price13 (price15-price14)/price14
感谢您的帮助
最佳答案
一个可能的解决方案(我感谢 @AdrienPacifico 建议使用 pandas.query
,这非常简化):
# I made column price equal to column MA1
# to have numbers to play with
df['price'] = df['MA1']
df['price_past'] = df['price'].shift()
df['price_fut'] = df['price'].shift(-1)
df['return_past'] = (df['price'] - df['price_past']) / df['price_past']
df['return_future'] = (df['price_fut'] - df['price']) / df['price']
df.query("MA1==MA2==MA3").drop(['MA1', 'MA2', 'MA3'], axis=1)
输出:
date price price_past price_fut return_past return_future
1 date1 11 12.0 12.0 -0.083333 0.090909
4 date4 14 13.0 15.0 0.076923 0.071429
11 date11 14 13.0 16.0 0.076923 0.142857
12 date12 16 14.0 34.0 0.142857 1.125000
14 date14 12 34.0 NaN -0.647059 NaN
关于 python Pandas : Modify Dataframe with mask and create new Dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73875162/