Pandas read_stata()包含大型.dta文件

时间:2013-11-02 17:09:04

标签: python pandas stata

我正在使用大约3.3千兆字节的Stata .dta文件,因此它很大但不会过大。我有兴趣使用IPython并尝试使用Pandas导入.dta文件,但是有些事情正在发生。我的盒子有32千兆字节的RAM,并试图加载.dta文件导致所有使用的RAM(约30分钟后)和我的计算机停止运行。这不是'感觉'正确,因为我能够使用外部包中的read.dta()打开R中的文件没有问题,并且使用Stata中的文件很好。我正在使用的代码是:

%time myfile = pd.read_stata(data_dir + 'my_dta_file.dta')

我正在使用Enthought的Canopy程序中的IPython。 '%time'的原因是因为我有兴趣对R的read.dta()进行基准测试。

我的问题是:

  1. 我做错了什么导致熊猫出现问题?
  2. 是否有解决方法将数据导入Pandas数据帧?

5 个答案:

答案 0 :(得分:7)

这是一个对我来说很方便的功能,使用了一些pandas功能,这些功能在最初提出问题时可能无法使用:

def load_large_dta(fname):
    import sys

    reader = pd.read_stata(fname, iterator=True)
    df = pd.DataFrame()

    try:
        chunk = reader.get_chunk(100*1000)
        while len(chunk) > 0:
            df = df.append(chunk, ignore_index=True)
            chunk = reader.get_chunk(100*1000)
            print '.',
            sys.stdout.flush()
    except (StopIteration, KeyboardInterrupt):
        pass

    print '\nloaded {} rows'.format(len(df))

    return df

我在100分钟内加载了一个11G Stata文件,如果我厌倦了等待并点击cntl-c,那么可以玩一些东西。

This notebook shows it in action

答案 1 :(得分:3)

对于在此页面结尾的所有人,请将Pandas升级到最新版本。在加载期间,我遇到了一个停滞计算机的确切问题(300 MB Stata文件,但只有8 GB系统ram),从v0.14升级到v0.16.2很快解决了这个问题。

目前,它是0.16.2。虽然我不知道具体细节,但速度有了显着的提高。请参阅:most efficient I/O setup between Stata and Python (Pandas)

答案 2 :(得分:1)

使用Pandas的内置函数read_stata可以解决此问题。

假设您的大文件名为large.dta

import pandas as pd

reader=pd.read_stata("large.dta",chunksize=100000)

df = pd.DataFrame()

for itm in reader:
    df=df.append(itm)

df.to_csv("large.csv")

答案 3 :(得分:0)

问题1。

关于这一点我没说太多。

问题2。

考虑使用Stata命令.dta.csv将您的outsheet文件导出到export delimited,然后在pandas中使用read_csv()。实际上,您可以使用新创建的.csv文件,将其用作R的输入并与pandas进行比较(如果感兴趣的话)。 read_csv可能比read_stata有更多的测试。

运行help outsheet了解导出的详细信息。

答案 4 :(得分:-3)

你不应该将3GB +文件读入内存中的数据对象,这是一个灾难的处方(与熊猫无关)。 正确的方法是mem-map文件并根据需要访问数据。

您应该考虑将文件转换为更合适的格式(csvhdf),然后您可以使用pandas DataFrame周围的Dask包装器根据需要对数据进行块加载:

from dask import dataframe as dd
# If you don't want to use all the columns, make a selection
columns = ['column1', 'column2']
data = dd.read_csv('your_file.csv', use_columns=columns)

这将透明地处理块加载,多核数据处理和所有这些。