python - 解压并读取 Dukascopy .bi5 tick 文件

标签 python pandas csv lzma bi5

我需要打开一个 .bi5 文件并阅读其中的内容,以便长话短说。问题:我有数以万计的 .bi5 文件,其中包含我需要解压缩和处理(读取、转储到 pandas 中)的时间序列数据。

我最终安装了专门用于 lzma 库的 Python 3(我通常使用 2.7),因为我遇到了使用 Python 2.7 的 lzma 后向端口编译噩梦,所以我承认并使用 Python 3 运行,但没有成功。问题多到无法吐露,没人看长题!

我已经包含了其中一个 .bi5 文件,如果有人能够设法将其放入 Pandas Dataframe 并向我展示他们是如何做到的,那就太理想了。

ps这个文件只有几kb,一秒钟就可以下载了。首先十分感谢。

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

最佳答案

下面的代码应该可以解决问题。首先,它打开一个文件并在 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)工作得很好。 (它是 big endian 3 ints 2 floats。你的建议是:'i4f' 不会产生合理的 float - 无论是 big endian 还是 little 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).

关于python - 解压并读取 Dukascopy .bi5 tick 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41176164/

相关文章:

python - 使用 pytest 测试 aiohttp 和 mongo

python - 删除 bool 列 = False 处的重复项

python - 如何不断向用户询问文件

python - Pandas 变频

pandas - Jupyter 笔记本并排显示两个 pandas 表

python - 在 Python 中将具有不同标题的 csv 文件与 Pandas 合并

python whoosh 索引大文件的时间太长

python - rpdb2 : how to connect to a pid

python - 如何像我们在 pyspark withColumn 中那样在 pandas 中动态创建新列

python - Pandas :从csv文件中获取特定列