V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kingmo888
V2EX  ›  Python

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

  •  
  •   kingmo888 · 2016-10-12 10:53:10 +08:00 · 13628 次点击
    这是一个创建于 2754 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,
    存在 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 。


    求帮助。

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

    对 HDF5 不是很了解。好像说是静态的?更新数据就不太好弄了
    kingmo888
        6
    kingmo888  
    OP
       2016-10-12 11:37:57 +08:00
    @wh0syourda66y pyspark ??
    kingmo888
        7
    kingmo888  
    OP
       2016-10-12 11:38:30 +08:00
    @menc 这个例程里,是可以的。如果是 N*M ,数据量很大时, dict 效率下降好快。
    kingmo888
        8
    kingmo888  
    OP
       2016-10-12 11:38:51 +08:00
    @imn1 已经删掉了空数据了的。
    menc
        9
    menc  
       2016-10-12 11:50:26 +08:00
    @kingmo888 插入是 O(1)的,怎么可能慢, 20M 的数据哈希冲突也不会有多少,我处理几 G 的东西都很快
    qleroooo
        10
    qleroooo  
       2016-10-12 11:57:58 +08:00
    为什么要存到 list
    kingmo888
        11
    kingmo888  
    OP
       2016-10-12 12:33:25 +08:00
    @menc 如果 keys 很多的时候,索引不慢吗?
    zjuhwc
        12
    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
        13
    kingmo888  
    OP
       2016-10-12 14:00:27 +08:00
    @zjuhwc 数据不是 list , list 里的元素就是 df 格式成员。
    menc
        14
    menc  
       2016-10-12 15:10:21 +08:00
    @kingmo888 dict 插入有什么索引,可认为就是 O(1)的
    taxidriver
        15
    taxidriver  
       2016-10-12 15:41:11 +08:00
    @kingmo888 keys 的索引也是 O(1)
    laibluejay
        16
    laibluejay  
       2016-10-13 16:14:05 +08:00
    大 df 和多个 df 的合并和输出,不如直接用读写文件的方式,快得很......

    df merge 确实效率不高
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1783 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:22 · PVG 00:22 · LAX 09:22 · JFK 12:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.