求解 pandas 的 DataFrame 的数据合并问题。效率太慢啦~

2016-10-12 10:53:10 +08:00
 kingmo888
如题,
存在 2900+的 stock 文件,每个文件格式相同,如下:
------------------------
date | value1
date | value2
date | value3
date | value4
------------------------


我想将所有文件合并到一起,格式如下:
------------------------------------------------
| code1 | code2 | code3
date1 | value1 | value2 | value3
............
daten | valuen | valuen | valuen
------------------------------------------------

目前的做法是将数据存到 list (总大小 2900+),
将这个列表拆分成 N 个,先分别 pd.concat ,得到 N 个 df 。
最后将这 N 个 df 合并为一个大的 df 。
但是效率是在太慢了,而且特别占用内存。文件的大小也就 20M ,但合并时内存能上好几个 G 。


求帮助。

谢谢。
13644 次点击
所在节点    Python
16 条回复
wh0syourda66y
2016-10-12 11:14:20 +08:00
docker pull 个 spark 镜像下来,用 pyspark 来计算。速度杠杠滴
menc
2016-10-12 11:16:28 +08:00
用原生 dict 来做
taxidriver
2016-10-12 11:23:48 +08:00
又是一个用 Python 做量化的,看到 2900+就知道了
建议合并后保存成 HDF5 文件,下次需要直接加载到内存,能省很多功夫
imn1
2016-10-12 11:30:22 +08:00
1.先用 profile 查一下哪一步慢, list 转 df 还是合并 df
2.concat 或者 append 要避免空 df ,就是直接 concat 到一个有数据的 df ,如果合并到一个空 df 会引起严重性能问题
3.多步骤处理大量数据,要及时 del 无用数据
kingmo888
2016-10-12 11:37:43 +08:00
@taxidriver 你说的很对。不过我是以 CTA 为主。 stock 涉及的少了点,搞投机。

对 HDF5 不是很了解。好像说是静态的?更新数据就不太好弄了
kingmo888
2016-10-12 11:37:57 +08:00
@wh0syourda66y pyspark ??
kingmo888
2016-10-12 11:38:30 +08:00
@menc 这个例程里,是可以的。如果是 N*M ,数据量很大时, dict 效率下降好快。
kingmo888
2016-10-12 11:38:51 +08:00
@imn1 已经删掉了空数据了的。
menc
2016-10-12 11:50:26 +08:00
@kingmo888 插入是 O(1)的,怎么可能慢, 20M 的数据哈希冲突也不会有多少,我处理几 G 的东西都很快
qleroooo
2016-10-12 11:57:58 +08:00
为什么要存到 list
kingmo888
2016-10-12 12:33:25 +08:00
@menc 如果 keys 很多的时候,索引不慢吗?
zjuhwc
2016-10-12 13:14:06 +08:00
感觉是解析到 list 和 list 转 df 这些步骤话的时间长吧,刚试了下生成 3000 个 100*2 的 df 用 concat 合并, 230ms 就够了。

In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: l = [pd.DataFrame(np.random.randn(100, 2)) for _ in xrange(3000)]
In [4]: timeit pd.concat(l, axis=1)
1 loop, best of 3: 230 ms per loop
kingmo888
2016-10-12 14:00:27 +08:00
@zjuhwc 数据不是 list , list 里的元素就是 df 格式成员。
menc
2016-10-12 15:10:21 +08:00
@kingmo888 dict 插入有什么索引,可认为就是 O(1)的
taxidriver
2016-10-12 15:41:11 +08:00
@kingmo888 keys 的索引也是 O(1)
laibluejay
2016-10-13 16:14:05 +08:00
大 df 和多个 df 的合并和输出,不如直接用读写文件的方式,快得很......

df merge 确实效率不高

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/312137

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX