gpt4 book ai didi

python - Pandas ,使用基于多列的下一个条件值填充单元格

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:05 25 4
gpt4 key购买 nike

我有一个如下所示的数据框,用于分析股票数据:

    timestamp                    Price      Exit Price
1 2019-09-29 15:33:00 14
2 2019-09-29 15:34:00 15
3 2019-09-29 15:35:00 14
4 2019-09-29 15:36:00 17
5 2019-09-29 15:37:00 20

我正在尝试回测策略,因此当满足以下任何条件的第一行时,我想用价格列的后续值填充退出价格列:

  1. 当前行时间戳与比较时间戳之间的时间差大于或等于 X 分钟。
  2. 当前行价格与比较行价格的百分比差异大于 Y%

因此,例如,如果分钟数为 2,返回率为 10%,则表格应按如下方式填充:

    timestamp                    Price      Exit Price
1 2019-09-29 15:33:00 14 14<-- From Row 3 because 2 minutes passed
2 2019-09-29 15:34:00 15 17<-- From Row 4, both conditions satisfied
3 2019-09-29 15:35:00 14 17<-- From Row 4, difference greater than 10%
4 2019-09-29 15:36:00 17 20
5 2019-09-29 15:37:00 20 Nan

我考虑过实现类似的解决方案:

customFilter(row):
results = df[
(df['timestamp'] > row['timestamp']) &
(
(df['timestamp'] <= (row['timestamp']+pd.timedelta('2m')) |
(df['price'] > row['price']*1.1)
)
]

if results.shape[0] > 0:
return results['price'].first()

return nan

df['Exit Price'] = df.apply(lambda x: customFilter(x), axis = 1)

问题是,有没有更好的方法来做到这一点?这似乎不是最有效或最快的方法,尤其是当我增加数据集的大小时。

最佳答案

IICU,这就是你需要的。

from datetime import timedelta
df['timestamp'] = pd.to_datetime(df['timestamp'])

E_Price=[]
time_diff = df['timestamp'].apply(lambda x: x >= (df['timestamp']+timedelta(minutes=2)))
price_diff = df['Price'].apply(lambda x: x >= (df['Price']*1.1))
for i in range(len(df)):
check = (time_diff|price_diff)[i]
ind = check.idxmax()
if ind != 0:
val = df.iloc[ind,1]
else:
val = np.nan
E_Price.append(val)

df['Exit_Price'] = E_Price
df['Exit_Price'] = df.Exit_Price.astype(pd.Int32Dtype())
print(df)

输出

            timestamp   Price   Exit_Price
0 2019-09-29 15:33:00 14 14
1 2019-09-29 15:34:00 15 17
2 2019-09-29 15:35:00 14 17
3 2019-09-29 15:36:00 17 20
4 2019-09-29 15:37:00 20 NaN

关于python - Pandas ,使用基于多列的下一个条件值填充单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58211168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com