我有一个股票价格时间序列的数据框,需要在任何时间点查看变化(无论是 pct_change(1)、pct_change(2)、...、pct_change(7) 是否小于 20 %).
我试图模仿的逻辑是尝试捕获从 1 周前开始的每个相应日期的任何时间点,在过去 7 天内是否有 -20% 的变动。
到目前为止,我基本上循环遍历每一行,获取 .iloc[i-7:i] 的价格列表,并比较每行的每个间隔内的最高价格和最低价格......但一定有一些更好的方式?
您不需要循环。只需计算百分比并检查哪些小于 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