Панды read_stata() с большими файлами.dta

Я работаю с файлом Stata .dta размером около 3,3 гигабайта, поэтому он большой, но не слишком большой. Я заинтересован в использовании IPython и попытался импортировать файл.dta с помощью Pandas, но что-то шаткое происходит. В моем боксе 32 гигабайта оперативной памяти, и попытка загрузить файл.dta приводит к тому, что вся используемая оперативная память (через ~30 минут) и мой компьютер отключаются. Это не "правильно", так как я могу открыть файл в R с помощью read.dta() из стороннего пакета без проблем, и работа с файлом в Stata - это нормально. Код, который я использую:

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

и я использую IPython в программе Canopy Enthought. Причина "% времени" в том, что я заинтересован в том, чтобы сравнить это с read.dta() в R.

Мои вопросы:

  1. Есть ли что-то, что я делаю неправильно, в результате чего у Панд возникают проблемы?
  2. Есть ли обходной путь для передачи данных в фрейм данных Pandas?

5 ответов

Вот небольшая функция, которая была полезна для меня, используя некоторые 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

Я загрузил файл Stata 11G за 100 минут с этим, и было бы приятно поиграть, если я устал ждать и ударить cntl-c,

Эта тетрадь показывает это в действии.

Существует более простой способ решить эту проблему с помощью встроенной функции 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")

Для всех людей, которые заканчивают на этой странице, пожалуйста, обновите Pandas до последней версии. У меня была именно эта проблема с зависшим компьютером во время загрузки (300-мегабайтный файл Stata, но только 8 Гбайт оперативной памяти системы), и обновление с v0.14 до v0.16.2 решило проблему в одно мгновение.

В настоящее время это v 0.16.2. Там были значительные улучшения в скорости, хотя я не знаю специфику. Смотрите: наиболее эффективная настройка ввода / вывода между Stata и Python (Pandas)

Вопрос 1.

Я мало что могу сказать по этому поводу.

Вопрос 2.

Рассмотрите возможность экспорта вашего .dta подать в .csv используя команду Stata outsheet или же export delimited а затем с помощью read_csv() в пандах. На самом деле, вы можете взять только что созданный .csv файл, используйте его как вход для R и сравните с пандами (если это интересно). read_csv скорее всего, было больше испытаний, чем read_stata,

Бежать help outsheet для деталей экспорта.

Вы не должны читать файл размером 3 ГБ + в объект данных в памяти, это является рецептом катастрофы (и не имеет ничего общего с пандами). Правильный способ сделать это - запоминать файл и получать доступ к данным по мере необходимости.

Вы должны рассмотреть возможность преобразования вашего файла в более подходящий формат (csv или же hdf) и затем вы можете использовать оболочку Dask вокруг pandas DataFrame для чанк-загрузки данных по мере необходимости:

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)

Это прозрачно позаботится о загрузке чанка, многоядерной обработке данных и всем прочем.

Другие вопросы по тегам