2016-12-16 9 views
5

Мне нужно открыть файл .bi5 и прочитать содержимое, чтобы сократить длинный рассказ. Проблема: у меня есть десятки тысяч файлов .bi5, содержащих данные временного ряда, которые мне нужно для распаковки и обработки (чтение, сброс в панды).Декомпрессия и чтение файлов Dukascopy .bi5

Я в конечном итоге установка Python 3 (я использую 2.7 нормально) специально для lzma библиотеки, как я побежал в компиляции кошмаров, используя lzma резервные порты для Python 2.7, так что я не признал и побежал с Python 3, но не успех. Проблем слишком много, чтобы разглашать, никто не читает длинные вопросы!

Я включил один из файлов .bi5, если кто-то сумел получить его в Dataframe Pandas и показать мне, как они это сделали, это было бы идеально.

ps the fie всего несколько килобайт, он будет загружен через секунду. Большое спасибо заранее.

(Файл) http://www.filedropper.com/13hticks

+0

Знаете ли вы формат исходных данных? Это, например: (int, int, int, float, float) в каждой строке? – ptrj

+0

32-разрядное целое число: миллисекунды с эпохи, 32-бит float: Ask price, 32-bit float: цена покупки, 32-битный float: задайте объем, 32-бит float: объем торгов. Для этой задачи существует библиотека 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 

Главное, чтобы знать правильный формат. Я googled вокруг и попытался угадать и '>3i2f' (или >3I2f) работает неплохо. То, что вы предлагаете: 'i4f' не создает разумных поплавков - независимо от того, большой или маленький конец.) Для 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 

Update

Для сравнения выход 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, а также интеграция между ними довольно прямолинейна,

 Смежные вопросы

  • Нет связанных вопросов^_^