Панды 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.
Мои вопросы:
- Есть ли что-то, что я делаю неправильно, в результате чего у Панд возникают проблемы?
- Есть ли обходной путь для передачи данных в фрейм данных 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)
Это прозрачно позаботится о загрузке чанка, многоядерной обработке данных и всем прочем.