【问题标题】:Pandas read_stata() with large .dta files带有大型 .dta 文件的 Pandas read_stata()
【发布时间】:2013-11-13 16:51:36
【问题描述】:

我正在使用大约 3.3 GB 的 Stata .dta 文件,因此它很大但不会太大。我对使用 IPython 很感兴趣,并尝试使用 Pandas 导入 .dta 文件,但发生了一些奇怪的事情。我的盒子有 32 GB 的 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. 是我做错了什么导致 Pandas 出现问题吗?
  2. 是否有将数据导入 Pandas 数据框的解决方法?

【问题讨论】:

  • 您使用的是 64 位机器。会不会是你的 R 可能是 64 位版本和 Python 32 位?

标签: python pandas stata


【解决方案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")

【讨论】:

    【解决方案2】:

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

    目前是 v 0.16.2。尽管我不知道具体细节,但速度有了显着提高。见:most efficient I/O setup between Stata and Python (Pandas)

    【讨论】:

      【解决方案3】:

      您不应该将 3GB 以上的文件读入内存数据对象,这是灾难的根源(与 pandas 无关)。 正确的做法是对文件进行内存映射并根据需要访问数据。

      您应该考虑将您的文件转换为更合适的格式(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)
      

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

      【讨论】:

      • 在您的特定情况下,hdf 将是比 csv 更好的格式
      【解决方案4】:

      这是一个对我来说很方便的小功能,它使用了一些在最初提出问题时可能不可用的 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.

      【讨论】:

        【解决方案5】:

        问题 1。

        对此我无话可说。

        问题 2。

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

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

        【讨论】:

          猜你喜欢
          • 2014-10-08
          • 2016-02-06
          • 1970-01-01
          • 2016-12-13
          • 2019-02-27
          • 2017-05-10
          • 2017-05-06
          • 2012-09-14
          • 1970-01-01
          相关资源
          最近更新 更多