2016-03-05 156 views
2

我有5年的S & P 500數據,我試圖將其分組到特定的時間塊中以運行某些分析。我的數據以5分鐘爲增量。在將它讀入一個名爲「過時」的DataFrame中後,我想我可以將它分組爲包含連續行的塊,按照Globex每個交易日的打開和關閉之間的時間增量進行分組。 Globex開放時間爲太平洋標準時間下午3:00(15:00),結束時間爲太平洋標準時間下午1:15(13:15),22.25小時後。因此,我想將數據從下午3點開放到下午1點15分 - 每個塊大約有275行。從DataFrame中選擇CONSECUTIVE行,根據Pandas與Groupby列中的值

的困難是,「交易日」跨越2個不同的日期,爲eaxmple,一個會議日2016年3月6日在15:00打開和關閉的週一,2016年3月7日在 13:15。我無法按'日期'列進行分組,因爲當然,所有的3-6都將在一個塊中,3-7在另一個塊中,當我需要數據塊跨越這兩個日期時,爲了獲得整個 Globex日在一個塊。

對於Pandas和Python我都不太熟悉,我不知道用什麼方法將數據分組到我想要的塊中。一旦數據被隔離,我想提取每個會話/塊的高和低分爲不同的列,併爲15:05開放價格提供一個列。

這裏是什麼我的數據看起來像一個示例:

Date Time Open High Low Close Up Down 
0 2015-08-03 15:05 2073.50 2074.00 2073.25 2073.25 210 563 
1 2015-08-03 15:10 2073.25 2073.25 2072.25 2072.75 118 632 
2 2015-08-03 15:15 2072.75 2072.75 2072.25 2072.50 132 85 
3 2015-08-03 15:20 2072.50 2072.75 2072.25 2072.50 95 312 
4 2015-08-03 15:25 2072.50 2074.00 2072.50 2073.50 372 264 

本來,「日期」列中的值是這樣的:2015年8月3日。我認爲它可能不會被讀爲一個實際的日期對象,所以我使用to_datetime()更改了值,以使'Date'列的值像實際的日期對象一樣讀取,如上面的示例DataFrame中所示。

dated['Date'] =pd.to_datetime(dated['Date']) 

當我試圖使用to_datetime(),它成功地改變從15:05到15:05:00的時間來改變在「時間」列中的值,但同時也增加了一天,所以它看起來像這樣︰'2016-03-05 15:05:00',問題是它使用今天的日期爲日期。這顯然不適用於我,因爲我的數據是歷史數據,日期和時間是對歷史價格的參考。
我試圖在「時間」欄更改爲datetime對象的原因是我想我可以把它切成我一個GROUPBY操作過程中需要的塊:

dated = dated['Date'].groupby(dated['15:05' : '13:20']) 

這產生和錯誤:

IndexError: invalid slice 

所以我會很感激解決這個問題的任何幫助 - 指着我的研究的正確區域。我一直在逐一閱讀熊貓文檔,嘗試不同的方法,但由於我不確定從哪一步開始,我一直在隨機挑選主題閱讀而沒有找到答案。

感謝, 安娜

回答

1

這實際上是非常複雜的。

首先,你可以將你的時間如下:

df['Datetime'] = pd.to_datetime(df.Date + ' ' + df.Time) 

在這裏,我將創建一個更大的樣本datframe:

np.random.seed(0) 
idx = pd.date_range('2015-1-1', '2016-1-1', freq='5min') 
df = pd.DataFrame(np.random.randn(len(idx), 6),  
        columns=['Open', 'High', 'Low', 'Close', 'Up', 'Down']) 
df['Datetime'] = idx 

讓我們添加一個布爾標誌,以表明當市場是開放的。

# Create a market open flag. 
df['market_open'] = False 
mask = (df.Datetime.dt.time > dt.time(15)) | (df.Datetime.dt.time < dt.time(13, 15)) 
df.loc[mask, 'market_open'] = True 

在這裏,我們創造出比回報功能的開放,高,低,關閉等對分組條:

def ohlc(df): 
    return (
     df.Datetime.iat[-1], # last timestamp in group. 
     df.Open.iat[0], # First Open. 
     df.High.max(), 
     df.Low.min(), 
     df.Close.iat[-1], # Last Close. 
     df.Up.sum(), 
     df.Down.sum(), 
     df.Close.count(), # Count number of closing bars. 
     df.market_open.iat[0]) # Take first True/False indicator. 

現在,我們做我們的GROUPBY基於在market_open變化 (即在真/假標誌的變化),然後我們將我們的功能應用於這些分組結果。

bars = pd.DataFrame(
    zip(*df.groupby(
      (df.market_open != df.market_open.shift()) 
      .cumsum() 
      ).apply(ohlc))).T 

bars.columns = ['bar_close_time', 'Open', 'High', 'Low', 'Close', 'Up', 'Down', 'bar_count', 'market_open'] 

我們對開放式會議和非公開會議都有酒吧。當市場關閉時,我們可以刪除這些。

# Remove bars when market is closed 
bars = bars[bars.market_open].iloc[:, :-1] 

>>> bars.tail() 
      bar_close_time  Open  High  Low  Close  Up  Down bar_count 
722 2015-12-28 13:10:00 1.23175 2.88569 -2.7143 -0.785648 -13.3166 14.6094  266 
724 2015-12-29 13:10:00 -0.900675 2.6483 -2.61698 -0.8265 0.825872 4.98565  266 
726 2015-12-30 13:10:00 1.65299 2.57881 -2.85199 -0.376141 -4.32867 3.62123  266 
728 2015-12-31 13:10:00 0.435619 2.93638 -2.74758 -0.461525 -20.0928 -15.8205  266 
730 2016-01-01 00:00:00 0.293165 2.39097 -2.1234 0.0684124 -7.83721 1.69182  108 
+0

謝謝亞歷山大, 當我拿到這部分代碼: '日[ 'markt_open'] = FALSE 面膜=(dated.Datetime.dt.time> dt.time(15)) | (datedted.Datetime.dt.time AnaB29

+0

進口日期時間爲DT – Alexander

+0

喜亞歷山大和感謝這麼多的幫助, 仍是同樣的錯誤:'AttributeError的:「據幀」對象有沒有屬性「datetime'' 進口調整: '進口大熊貓作爲PD - 進口numpy的作爲np - 導入日期時間爲dt'。我也解決了我的錯誤。我在這裏查找Datetime屬性:[鏈接](http://pandas.pydata.org/pandas-docs/version/0.17.0/api.html#dataframe)但找不到文檔。 我不知道我錯過了什麼。 – AnaB29