这似乎是一个简单的问题(和答案),但我遇到了麻烦。
问题:
我有一个充满OHLC数据的熊猫数据框。我希望在整个数据框架中找到52周的高点。
我的数据集来自雅虎。您可以使用以下代码提取相同的数据以获取每日数据:
import pandas.io.data as web
df = web.DataReader('SPX', 'yahoo', start, end)
数据尾部给出了以下输出:
Open High Low Close Volume
Date
2016-07-15 216.779999 217.009995 215.309998 215.830002 107155400
2016-07-18 215.970001 216.600006 215.669998 216.410004 58725900
2016-07-19 215.919998 216.229996 215.630005 216.190002 54345700
2016-07-20 216.190002 217.369995 216.190002 217.089996 58159500
2016-07-21 216.960007 217.220001 215.750000 216.270004 66070000
要获得52周高点(滚动),我可以执行以下操作:
df["52weekhigh"] = pd.rolling_max(df.High, window=200, min_periods=1)
我得到以下内容(一些col:
High 52weekhigh
Date
2016-07-15 217.009995 217.009995
2016-07-18 216.600006 217.009995
2016-07-19 216.229996 217.009995
2016-07-20 217.369995 217.369995
2016-07-21 217.220001 217.369995
这给了我一个52周高点的值,因为新的高点进来,但我不是在这里使用200的粉丝。应该是200或201还是220(一年中“约”200个交易日)?
我可以将数据重新采样到每周以获取值,但之后我无法轻松恢复到我原来的每日数据(或者我可以吗?)。
所以......这是问题:
有没有办法在pandas数据帧上运行rolling_max并将窗口设置为'52周'或类似的东西?如果没有,有人能想到比上述更好的方法吗?
答案 0 :(得分:5)
如果您的数据有工作日频率,那么每周应该有大约5行。
所以52周大致相当于window=52*5
。
当然,由于假期,可能还有其他几天失踪。更多
准确的说,您可以使用asfreq('D')
来更改工作日的频率
到实际的日子。然后,您可以使用大小为52*7
的滚动窗口:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(2016)
N = 1000
index = pd.date_range('2000-1-1', periods=N, freq='B')
data = (np.random.random((N, 1))-0.5).cumsum(axis=0)
df = pd.DataFrame(data, index=index, columns=['price'])
# result = pd.rolling_max(df.asfreq('D'), window=52*7, min_periods=1) # for older versions of Pandas
result = df.asfreq('D').rolling(window=52*7, min_periods=1).max()
result = result.rename(columns={'price':'rolling max'})
ax = df.plot()
result.plot(ax=ax)
plt.show()