Pandas 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 в Enowedt's Canopy. Причина «% времени» заключается в том, что я заинтересован в сравнении этого показателя с R read.dta ().
- Сохранить .dta файлы в python
- Преобразование файлов .CSV в файлы .DTA в Python
- Запись в файл Stata в Python. Ядро умерло. Зачем? Что делать?
- отправить код из vim во внешнее приложение для выполнения
- Получение квантилей SciPy для соответствия функции Stata xtile
Мои вопросы:
- Есть ли что-то, что я делаю неправильно, что приводит к возникновению проблем у Панд?
- Есть ли способ обхода данных в кадре данных Pandas?
- эквивалент панды для кодировки Stata
- наиболее эффективная настройка ввода / вывода между Stata и Python (Pandas)
- Любая библиотека Python создает таблицы регрессии стиля публикации
- Запустите файл Stata do из Python
- Определенный способ сопоставления Stata с взвешенной командой xtile с использованием Python?
4 Solutions collect form web for “Pandas read_stata () с большими .dta-файлами”
Вот небольшая функция, которая была удобна для меня, используя некоторые функции 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
Я загрузил файл Stag 11G за 100 минут с этим, и мне приятно иметь что-то, чтобы играть, если мне надоело ждать и ударить cntl-c
.
Этот ноутбук показывает это в действии .
Вопрос 1.
Я не могу сказать об этом.
Вопрос 2.
Подумайте о том, как экспортировать ваш .dta
файл в .csv
используя командный outsheet
команды Stata или export delimited
а затем используя read_csv()
в pandas. Фактически, вы можете взять вновь созданный .csv
файл, использовать его как вход для R и сравнить с pandas (если это интересно). read_csv
, скорее всего, имел больше тестов, чем read_stata
.
Запустите help outsheet
о деталях экспорта.
Для всех людей, которые заканчиваются на этой странице, обновите Pandas до последней версии. У меня была эта точная проблема с застопоренным компьютером во время загрузки (300 МБ файла Stata, но только с системным RAM 8 ГБ), а обновление с v0.14 до v0.16.2 решило проблему.
В настоящее время это v 0.16.2. Там были значительные улучшения скорости, хотя я не знаю специфики. См.: Наиболее эффективная настройка ввода-вывода между Stata и Python (Pandas)
Вы не должны читать 3GB + файл в объект данных в памяти, это рецепт катастрофы (и не имеет ничего общего с пандами). Правильный способ сделать это – mem-map файл и доступ к данным по мере необходимости.
Вам следует рассмотреть возможность преобразования вашего файла в более подходящий формат ( 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)
Это будет прозрачно следить за загрузкой, многоядерной обработкой данных и всем этим.