Python: анализ файлов CSV 100 000 строк x 40 столбцов - PullRequest
12 голосов
/ 26 января 2010

У меня есть около 100 файлов CSV каждые 100000 х 40 строк столбцов. Я хотел бы провести некоторый статистический анализ, извлечь некоторые образцы данных, построить общие тренды, провести анализ дисперсии и R-квадрата и построить некоторые диаграммы спектра. На данный момент я рассматриваю NumPy для анализа.

Мне было интересно, каких проблем мне следует ожидать с такими большими файлами? Я уже проверил на ошибочные данные. Каковы ваши рекомендации по проведению статистического анализа? было бы лучше, если бы я просто разбил файлы и сделал все это в Excel?

Ответы [ 5 ]

13 голосов
/ 26 января 2010

Я обнаружил, что Python + CSV, вероятно, самый быстрый и простой способ выполнения некоторых видов статистической обработки.

Мы делаем много переформатирования и исправляем нечетные ошибки данных, поэтому Python помогает нам.

Наличие функциональных возможностей программирования Python делает это особенно простым. Вы можете сделать выборку с помощью таких инструментов.

def someStatFunction( source ):
    for row in source:
        ...some processing...

def someFilterFunction( source ):
    for row in source:
        if someFunction( row ):
            yield row

# All rows
with open( "someFile", "rb" )  as source:
    rdr = csv.reader( source )
    someStatFunction( rdr )

# Filtered by someFilterFunction applied to each row
with open( "someFile", "rb" )  as source:
    rdr = csv.reader( source )
    someStatFunction( someFilterFunction( rdr ) )

Мне действительно нравится составлять более сложные функции из более простых функций.

2 голосов
/ 31 января 2010

Для массивных наборов данных вас может заинтересовать ROOT . Его можно использовать для анализа и очень эффективного хранения петабайт данных. Он также поставляется с некоторыми базовыми и более расширенными инструментами статистики.

Хотя он написан для использования с C ++, есть также довольно полные привязки Python. Они не делают чрезвычайно простым получение прямого доступа к необработанным данным (например, использование их в R или numpy) - но это определенно возможно (я делаю это все время).

1 голос
/ 27 января 2010

В общем, не беспокойтесь о размере. Если ваши файлы увеличиваются в 2-3 раза, у вас может не хватить памяти в 32-битной системе. Я полагаю, что если каждое поле таблицы составляет 100 байтов, т.е. каждая строка имеет 4000 байтов, вы будете использовать примерно 400 МБ ОЗУ для хранения данных в памяти, и если вы добавите примерно столько же для обработки вы все равно будете использовать только 800 МБ. Эти вычисления очень далеки от конверта и чрезвычайно щедры (вы будете использовать этот объем памяти только в том случае, если у вас много длинных строк или огромных целых чисел в ваших данных, поскольку максимум, который вы будете использовать для стандартных типов данных, составляет 8 байт для плавать или долго).

Если вы делаете нехватку памяти, 64-битным может быть путь. Но кроме этого, Python будет обрабатывать большие объемы данных с апломбом, особенно в сочетании с numpy / scipy. Использование массивов Numpy почти всегда будет быстрее, чем использование собственных списков. Matplotlib позаботится о большинстве потребностей в заговоре и, безусловно, сможет справиться с простыми графиками, которые вы описали.

Наконец, если вы найдете что-то, что Python не может сделать, но в нем уже написана кодовая база, взгляните на RPy .

1 голос
/ 27 января 2010

У меня большой успех при использовании чтения и генерации файлов на Python и CSV. Используя скромный ноутбук Core 2 Duo, я смог сохранить почти столько же данных, сколько вы, и обработать их в памяти за несколько минут. Мой главный совет в этом состоит в том, чтобы разделить ваши задания, чтобы вы могли выполнять их в несколько этапов, поскольку пакетирование всех ваших заданий за один раз может быть затруднительным, если вы хотите, чтобы выполнялась только одна функция. Придумайте хороший боевой ритм, который позволит вам максимально использовать свои ресурсы.

Excel подходит для небольших пакетов данных, но посмотрите matplotlib для создания графиков и диаграмм, обычно зарезервированных для Excel.

1 голос
/ 27 января 2010

Python очень хорош для такой обработки данных, особенно если ваши выборки являются "строками" и вы можете обрабатывать каждую такую ​​строку независимо:

 row1
 row2
 row3
 etc.

На самом деле ваша программа может иметь очень маленький объем памяти, благодаря генераторам и выражениям генераторов, о которых вы можете прочитать здесь: http://www.dabeaz.com/generators/ (это не базовые вещи, а некоторые изумительные приложения генераторов).

Что касается ответа S.Lott, вы, вероятно, хотите избежать применения filter () к последовательности строк - он может взорваться на вашем компьютере, если вы передадите ему последовательность, которая достаточно длинна (попробуйте: filter(None, itertools.count()) - после сохранения всех вас данные :-)). Гораздо лучше заменить filter на что-то вроде этого:

    def filter_generator(func, sequence):
        for item in sequence:
            if (func is None and item) or func(item):
                yield item

или короче:

    filtered_sequence = (item for item in sequence if (func is None and item) or func(item))

Это может быть дополнительно оптимизировано путем извлечения условия перед циклом, но это упражнение для читателя: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...