Python: обработка большого набора данных. Scipy или Rpy? И как?

в моей среде python пакеты Rpy и Scipy уже установлены.

проблема, которую я хочу решить, такова:

1) в текстовом файле хранится огромный набор финансовых данных. Загрузка в Excel невозможна

2) мне нужно суммировать определенные поля и получить итоги.

3) мне нужно показать верхние 10 строк на основе итогов.

какой пакет (Scipy или Rpy) лучше всего подходит для этой задачи?

Если это так, не могли бы вы предоставить мне некоторые указатели (например, документацию или онлайн-пример), которые могут помочь мне реализовать решение?

скорость. В идеале scipy и Rpy могут обрабатывать большие файлы, даже если файлы настолько велики, что их нельзя поместить в память

6 ответов


как отметил @gsk3,bigmemory большой пакет для этого, наряду с пакетами biganalytics и bigtabulate (есть больше, но это стоит проверить). Есть также ff, хотя это не так легко использовать.

общим для R и Python является поддержка HDF5 (см. ncdf4 или NetCDF4 пакеты в R), что делает его очень быстрым и легким для доступа к массивным наборам данных на диске. Лично я в первую очередь использую bigmemory, хотя это R специфично. Как HDF5 доступен в Python и очень, очень быстро, это, вероятно, будет ваш лучший выбор в Python.


ни Rpy, ни Scipy не нужны, хотя numpy может сделать это немного проще. Эта проблема, кажется, идеально подходит для построчного разбора. Просто откройте файл, прочитайте строку в строку, сканируйте строку в массив (см. numpy.fromstring), обновите текущие суммы и перейдите к следующей строке.


файл ввода-вывода Python не имеет плохой производительности, поэтому вы можете просто использовать file модуль напрямую. Вы можете увидеть, какие функции доступны в нем, введя help (file) в интерактивном интерпретаторе. Создание файла является частью функциональности основного языка и не требует от вас import file.

что-то типа:

f = open ("C:\BigScaryFinancialData.txt", "r");
for line in f.readlines():
    #line is a string type
    #do whatever you want to do on a per-line basis here, for example:
    print len(line)

отказ от ответственности: это ответ Python 2. Я не уверен на 100%, что это работает в Python 3.

Я оставлю это вам, чтобы выяснить как показывают первые 10 строк и найти суммы строк. Это можно сделать с помощью простой логики программы, которая не должна быть проблемой без каких-либо специальных библиотек. Конечно, если строки имеют какое-то сложное форматирование, которое затрудняет разбор значений, вы можете использовать какой-то модуль для разбора,re например (типа help(re) в интерактивный интерпретатор).


насколько велики ваши данные, больше ли они памяти вашего ПК? Если его можно загрузить в память, вы можете использовать numpy.loadtxt() для загрузки текстовых данных в массив NumPy. например:

import numpy as np
with file("data.csv", "rb") as f:
   title = f.readline()  # if your data have a title line.
   data = np.loadtxt(f, delimiter=",") # if your data splitted by ","
   print np.sum(data, axis=0)  # sum along 0 axis to get the sum of every column

Я ничего не знаю о Rpy. Я знаю, что SciPy используется для серьезного хруста чисел с действительно большими наборами данных, поэтому он должен работать для вашей проблемы.

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

Я не уверен, как получить первые десять строк. Можете ли вы собрать их на лету, или вам нужно вычислить суммы, а затем выбрать строки? Чтобы собрать их, вы можете использовать словарь для отслеживания текущих 10 лучших строк и использовать ключи для хранения метрики, которую вы использовали для их ранжирования (чтобы легко найти и выбросить строку, если другая строка заменяет ее). Если вам нужно найти строки после завершения вычисления, slurp все данные в numpy.массив или иначе просто сделайте второй проход через файл, чтобы вытащить десять строк.


Так как это имеет тег R, Я дам некоторые решения R: