Python: анализ CSV файлов 100 000 строк x 40 столбцов

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

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

Ответ 1

Я обнаружил, что 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

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

 row1
 row2
 row3
 etc.

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

Относительно ответа S.Lott вы, вероятно, хотите, чтобы фильтр() не применялся к последовательности строк - он мог бы взорвать ваш компьютер, если вы перейдете к его последовательности, которая достаточно длинная (попробуйте: 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))

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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