2016-12-16 116 views
5

我需要打開一個.bi5文件並閱讀內容以簡化長篇故事。問題:我有成千上萬個包含時間序列數據的.bi5文件,我需要解壓縮和處理(讀取,轉儲到熊貓)。解壓縮並讀取Dukascopy .bi5刻度文件

我結束了爲lzma庫專門安裝Python 3(我正常使用2.7),因爲我使用Python 2.7的lzma後端端口編譯惡夢,所以我放棄並使用Python 3運行,但沒有成功。這些問題不勝枚舉,沒有人讀長篇大論!

我已經包含了一個.bi5文件,如果有人可以設法將它放入熊貓數據框中,並告訴我他們是如何做到的,那將是理想的。

ps fie只有幾kb,它會在一秒鐘內下載。首先十分感謝。

(文件) http://www.filedropper.com/13hticks

+0

你知道原始數據的格式嗎?例如:每行中有(int,int,int,float,float)? – ptrj

+0

32位整數:自紀元以來的毫秒數,32位浮點數:賣價,32位浮點數:買價,32位浮點數:詢價量,32位浮點數:出價量。這個任務專門有一個C++庫,但我需要從Python開始工作。你可以在https://github看看它。com/ninety47/dukascopy – ajsp

+0

Python 2.7即是。 – ajsp

回答

7

下面的代碼應該做的伎倆。首先,它打開一個文件並在lzma中解碼它,然後使用struct解包二進制數據。

import lzma 
import struct 
import pandas as pd 


def bi5_to_df(filename, fmt): 
    chunk_size = struct.calcsize(fmt) 
    data = [] 
    with lzma.open(filename) as f: 
     while True: 
      chunk = f.read(chunk_size) 
      if chunk: 
       data.append(struct.unpack(fmt, chunk)) 
      else: 
       break 
    df = pd.DataFrame(data) 
    return df 

最重要的是要知道正確的格式。我搜索了一下,並試圖猜測和'>3i2f'(或>3I2f)作品相當不錯。 (這是一個大的endian 3 ints 2浮點數,你的建議是:'i4f'不會產生明智的浮點數 - 不管是大的還是小的endian。)對於struct和格式語法,請參閱docs

df = bi5_to_df('13h_ticks.bi5', '>3i2f') 
df.head() 
Out[177]: 
     0  1  2  3  4 
0 210 110218 110216 1.87 1.12 
1 362 110219 110216 1.00 5.85 
2 875 110220 110217 1.00 1.12 
3 1408 110220 110218 1.50 1.00 
4 1884 110221 110219 3.94 1.00 

更新

bi5_to_df的輸出與https://github.com/ninety47/dukascopy, 我編譯比較,並從那裏運行test_read_bi5。輸出的第一行是:

time, bid, bid_vol, ask, ask_vol 
2012-Dec-03 01:00:03.581000, 131.945, 1.5, 131.966, 1.5 
2012-Dec-03 01:00:05.142000, 131.943, 1.5, 131.964, 1.5 
2012-Dec-03 01:00:05.202000, 131.943, 1.5, 131.964, 2.25 
2012-Dec-03 01:00:05.321000, 131.944, 1.5, 131.964, 1.5 
2012-Dec-03 01:00:05.441000, 131.944, 1.5, 131.964, 1.5 

而且bi5_to_df相同的輸入文件提供:

bi5_to_df('01h_ticks.bi5', '>3I2f').head() 
Out[295]: 
     0  1  2  3 4 
0 3581 131966 131945 1.50 1.5 
1 5142 131964 131943 1.50 1.5 
2 5202 131964 131943 2.25 1.5 
3 5321 131964 131944 1.50 1.5 
4 5441 131964 131944 1.50 1.5 

所以一切都似乎是罰款(ninety47的代碼重新排序列)。

此外,使用'>3I2f'而不是'>3i2f'(即unsigned int而不是int)可能更準確。

+0

它看起來似乎合理的ptrj。第一列應該是一個時間戳,但如果你是正確的,而且這是數據的真實表示,那麼我將不得不從已過時的文件夾結構中獲取初始時間戳並添加到其中(長篇故事)。明天我會檢查一下,但看起來你已經將賞金存入銀行了。快說吧。 – ajsp

+1

第一列是「自紀元以來的毫秒數」。如果你運行'pd.TimedeltaIndex(df [0],'ms')',你會看到它覆蓋了1個小時。要獲得時間戳,例如'ts + pd.TimedeltaIndex(df [0],'ms')'其中'ts'是您的時間戳。 – ptrj

+0

前兩列應該是浮動的。這是貨幣的價格(EURUSD)。是否有機會以這種方式進行壓縮,以節省空間? – ajsp

0

您是否嘗試過使用numpy來解析數據,然後將其傳輸到大熊貓。也許是一個很長的解決方案,但是我可以讓你在Panda進行分析之前操作和清理數據,它們之間的集成非常直接,