检查最大滚动变化是否小于数据帧中的特定数字

问题描述 投票:0回答:1

我有一个股票价格时间序列的数据框,需要在任何时间点查看变化(无论是 pct_change(1)、pct_change(2)、...、pct_change(7) 是否小于 20 %).

我试图模仿的逻辑是尝试捕获从 1 周前开始的每个相应日期的任何时间点,在过去 7 天内是否有 -20% 的变动。

到目前为止,我基本上循环遍历每一行,获取 .iloc[i-7:i] 的价格列表,并比较每行的每个间隔内的最高价格和最低价格......但一定有一些更好的方式?

pandas dataframe iteration
1个回答
0
投票

您不需要循环。只需计算百分比并检查哪些小于 20

import pandas as pd
import numpy as np

np.random.seed(42)
dates = pd.date_range(start='2023-01-01', periods=60, freq='D')
prices = np.random.lognormal(mean=0, sigma=0.1, size=len(dates)) * 100

df = pd.DataFrame({'Date': dates, 'Price': prices})

df['Max7'] = df['Price'].rolling(window=7, min_periods=1).max()
df['Min7'] = df['Price'].rolling(window=7, min_periods=1).min()

df['PctChange7'] = (df['Min7'] - df['Max7']) / df['Max7'] * 100

df['-20PctMove'] = df['PctChange7'] <= -20

print("DataFrame with 7-day window analysis:")
print(df.head(15))

这给出了


DataFrame with 7-day window analysis:
         Date       Price        Max7        Min7  PctChange7  -20PctMove
0  2023-01-01  105.092572  105.092572  105.092572    0.000000       False
1  2023-01-02   98.626872  105.092572   98.626872   -6.152386       False
2  2023-01-03  106.691238  106.691238   98.626872   -7.558603       False
3  2023-01-04  116.451301  116.451301   98.626872  -15.306338       False
4  2023-01-05   97.685667  116.451301   97.685667  -16.114576       False
5  2023-01-06   97.685828  116.451301   97.685667  -16.114576       False
6  2023-01-07  117.107401  117.107401   97.685667  -16.584548       False
7  2023-01-08  107.976505  117.107401   97.685667  -16.584548       False
8  2023-01-09   95.413755  117.107401   95.413755  -18.524573       False
9  2023-01-10  105.575485  117.107401   95.413755  -18.524573       False
10 2023-01-11   95.471561  117.107401   95.413755  -18.524573       False
11 2023-01-12   95.449490  117.107401   95.413755  -18.524573       False
12 2023-01-13  102.449133  117.107401   95.413755  -18.524573       False
13 2023-01-14   82.586164  107.976505   82.586164  -23.514691        True
14 2023-01-15   84.156520  105.575485   82.586164  -21.775245        True
© www.soinside.com 2019 - 2024. All rights reserved.