簡體   English   中英

日內時間序列的多指數構造(10分鍾價格數據)

[英]A Multi-Index Construction for Intraday TimeSeries (10 min price data)

我有一個文件,每十分鍾就有一個盤中價格。 [0:41]一天的時間。 每個日期重復42次。 下面的多指數應該將重復的日期“折疊”為一次。

  • 有62,035行×3列: [date, time, price]

  • 我想寫一個函數來獲得十分鍾價格的差異,限制每個唯一日期的差異。

換句話說,09:30是每天的第一次,16:20是最后一次:我不能在16:20 - 09:30之間重疊價格天數之間的差異。 對於數據框中的每個唯一日期,差異應從09:40 - 09:30開始,以16:20 - 16:10結束。

這是我的嘗試。 任何建議將不勝感激。

def diffSeries(rounded,data):

'''This function accepts a column called rounded from 'data'
 The 2nd input 'data' is a dataframe 
'''

df=rounded.shift(1)
idf=data.set_index(['date', 'time'])  
data['diff']=['000']

  for i in range(0,length(rounded)):

    for day in idf.index.levels[0]:


      for time in idf.index.levels[1]:

        if idf.index.levels[1]!=1620:

          data['diff']=rounded[i]-df[i]

        else:
          day+=1
          time+=2

data[['date','time','price','II','diff']].to_csv('final.csv')

return data['diff']

然后我打電話給:

data=read_csv('file.csv')

rounded=roundSeries(data['price'],5) 

diffSeries(rounded,data)

在追溯 - 我得到一個Assertion Error

你可以使用groupby然后申請實現你想要的:

diffs = data.groupby(lambda idx: idx[0]).apply(lambda row: row - row.shift(1))

有關完整示例,假設您為11月14日至11月16日創建了測試數據集:

import pandas as pd
from numpy.random import randn
from datetime import time

# Create date range with 10 minute intervals, and filter out irrelevant times
times = pd.bdate_range(start=pd.datetime(2012,11,14,0,0,0),end=pd.datetime(2012,11,17,0,0,0), freq='10T')
filtered_times = [x for x in times if x.time() >= time(9,30) and x.time() <= time(16,20)]
prices = randn(len(filtered_times))

# Create MultiIndex and data frame matching the format of your CSV
arrays = [[x.date() for x in filtered_times]
         ,[x.time() for x in filtered_times]]
tuples = zip(*arrays)

m_index = pd.MultiIndex.from_tuples(tuples, names=['date', 'time'])
data = pd.DataFrame({'prices': prices}, index=m_index)

您應該得到一個像這樣的DataFrame:

                       prices
date       time              
2012-11-14 09:30:00  0.696054
           09:40:00 -1.263852
           09:50:00  0.196662
           10:00:00 -0.942375
           10:10:00  1.915207

如上所述,您可以通過按第一個索引分組然后減去每行的前一行來獲得差異:

diffs = data.groupby(lambda idx: idx[0]).apply(lambda row: row - row.shift(1))

這給你的東西:

                       prices
date       time              
2012-11-14 09:30:00       NaN
           09:40:00 -1.959906
           09:50:00  1.460514
           10:00:00 -1.139036
           10:10:00  2.857582

由於您按日期分組,因此該功能不適用於16:20 - 09:30。

您可能需要考慮使用TimeSeries而不是DataFrame,因為它可以為您提供這種數據的更大靈活性。 假設您已經從CSV文件加載了DataFrame,您可以輕松地將其轉換為TimeSeries並執行類似的功能來獲取差異:

dt_index = pd.DatetimeIndex([datetime.combine(i[0],i[1]) for i in data.index])
# or dt_index = pd.DatetimeIndex([datetime.combine(i.date,i.time) for i in data.index]) 
# if you don't have an multi-level index on data yet
ts = pd.Series(data.prices.values, dt_index)
diffs = ts.groupby(lambda idx: idx.date()).apply(lambda row: row - row.shift(1))

但是,您現在可以訪問內置的時間序列函數,例如重新采樣。 有關熊貓時間序列的更多信息,請參見此處

@ MattiJohn的結構給出了一個長度為86,772的過濾列表 - 當超過1/3 / 2007-8 / 30/2012運行42次(間隔10分鍾)時。 觀察數據清理問題。

這里來自csv的價格數據是長度:62,034。 因此,簡單地從.csv導入,如下所示,是有問題的:

filtered_times = [x for x in times if x.time() >= time(9,30) and x.time() <= time(16,20)]
DF=pd.read_csv('MR10min.csv')
prices = DF.price
 # I.E. rather than the generic: prices = randn(len(filtered_times))  above.

實際數據達不到“應該”的長度這一事實意味着存在數據清理問題 通常我們沒有bdate_time會產生的全部時間(市場半天等假期)

您的解決方案很優雅。 但我不確定如何克服實際數據與先驗規定數據幀之間的不匹配。

您的第二個TimesSeries建議似乎仍然需要構建類似於第一個的日期時間索引。 例如,如果我使用以下兩行來獲取感興趣的實際數據:

DF=pd.read_csv('MR10min.csv')
data=pd.DF.set_index(['date','time'])


dt_index = pd.DatetimeIndex([datetime.combine(i[0],i[1]) for i in data.index])

它會生成一個:

TypeError: combine() argument 1 must be datetime.date, not str

如何根據可用的實際數據完全通知bdate_time數組?

感謝(@MattiJohn)以及有興趣繼續討論的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM