2016-07-22 94 views
1

這看起來像一個簡單的問題(和答案),但我遇到了麻煩。在熊貓市場的日常股票市場數據中尋找52周高點

問題:

我有一個數據幀熊貓全OHLC數據。我想在整個數據框中找到滾動的52周高點。

我的數據集是從雅虎。您可以提取相同的數據打倒folllowing代碼來獲得每日數據:

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) 

我得到以下(部分彩色:

    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個交易日)?

我可以重新採樣數據到每週獲取值,但然後我不能輕鬆回到我原來的每日數據(或我可以嗎?)。

所以......這裏的問題:

有沒有辦法對大熊貓dataframes運行rolling_max和窗口設置爲'52周或類似的東西?如果沒有,任何人都可以想到比上述更好的方法嗎?

回答

4

如果您的數據有工作日頻率,那麼每週應該大致有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() 

enter image description here

+0

途徑去加倍努力,同積:) – Alex

+0

感謝。你能幫我理解這與將窗口設置爲200(或252或356或任何其他我想要的數字)有什麼不同? –

+1

@ EricD.Brown:'window'參數影響每個計算中包含的 *行數*。如果您的DataFrame每週只有5個工作日,則 那麼52周的窗口將完全對應於'window = 52 * 5'。但是,如果您的DataFrame 跳過一些假期(如新年),則每週可能不對應於5天的 天。通過使用'asfreq('D')'將頻率擴展到幾天,您每天會得到一行 行。所以你*保證* 52周完全符合 'window = 52 * 7'。 – unutbu