Descomprimir y leer archivos de tick .bi5 Dukascopy

Necesito abrir un archivo .bi5 y leer el contenido para abreviar una larga historia. El problema: tengo decenas de miles de archivos .bi5 que contienen datos de series de tiempo que necesito descomprimir y procesar (leer, descargar en pandas).

Terminé instalando Python 3 (normalmente uso 2.7) específicamente para la biblioteca lzma , ya que me topé con la lzma pesadillas usando los puertos traseros de lzma para Python 2.7, así que admití y corrí con Python 3, pero sin éxito. ¡Los problemas son demasiado numerosos para divulgarlos, nadie lee largas preguntas!

He incluido uno de los archivos .bi5 , si alguien pudiera conseguirlo en un Marco de datos de Pandas y mostrarme cómo lo hicieron, eso sería lo ideal.

ps el fie es sólo unos pocos kb, se descargará en un segundo. Muchas gracias de antemano.

(El archivo) http://www.filedropper.com/13hticks

El siguiente código debe hacer el truco. Primero, abre un archivo y lo decodifica en lzma y luego usa struct para descomprimir los datos binarios.

 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 

Lo más importante es conocer el formato correcto. Busqué en Google y traté de adivinar y '>3i2f' (o >3I2f ) funciona bastante bien. (Es big endian 3 ints 2 floats. Lo que sugiere: 'i4f' no produce floats sensibles, sin importar si son grandes o little endian). Para consultar la syntax de struct y formatos, consulte los documentos .

 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 

Actualizar

Para comparar la salida de bi5_to_df con https://github.com/ninety47/dukascopy , compilé y test_read_bi5 desde allí. Las primeras líneas de la salida son:

 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 

Y bi5_to_df en el mismo archivo de entrada da:

 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 

Así que todo parece estar bien (el código de noventa noventa47 reordena las columnas).

Además, probablemente sea más preciso usar '>3I2f' lugar de '>3i2f' (es decir, unsigned int lugar de int ).

¿Intentaste usar numpy para analizar los datos antes de transferirlos a pandas? Tal vez sea una solución de largo scope, pero le permitiré manipular y limpiar los datos antes de realizar el análisis en Panda, y la integración entre ellos es bastante sencilla.