Python: работа с голям набор от данни. Scipy или Rpy? И как?

В моята среда на python пакетите Rpy и Scipy вече са инсталирани.

Проблемът, с който искам да се справя, е следният:

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

2) Трябва да сумирам определени полета и да получа сумите.

3) Трябва да покажа първите 10 реда въз основа на сумите.

Кой пакет (Scipy или Rpy) е най-подходящ за тази задача?

Ако е така, можете ли да ми предоставите някои насоки (напр. документация или онлайн пример), които могат да ми помогнат да внедря решение?

Скоростта е проблем. В идеалния случай scipy и Rpy могат да обработват големите файлове, дори когато файловете са толкова големи, че не могат да бъдат поставени в паметта


person Anthony Kong    schedule 28.07.2011    source източник
comment
Може да намерите полезна информация на dabeaz.com/generators-uk   -  person lazy1    schedule 28.07.2011
comment
Какво точно означава "огромен набор" във вашия случай?   -  person radek    schedule 28.07.2011


Отговори (6)


Както отбеляза @gsk3, bigmemory е чудесен пакет за това, заедно с пакетите biganalytics и bigtabulate (има още, но си струва да ги проверите). Има и ff, но това не е толкова лесно за използване.

Общото за R и Python е поддръжката на HDF5 (вижте пакетите ncdf4 или NetCDF4 в R), което прави много бърз и лесен достъп до масивни набори от данни на диск. Лично аз основно използвам bigmemory, въпреки че това е специфично за R. Тъй като HDF5 е наличен в Python и е много, много бърз, вероятно ще бъде най-добрият ви залог в Python.

person Iterator    schedule 26.09.2011

Нито Rpy, нито Scipy са необходими, въпреки че numpy може да го направи малко по-лесно. Този проблем изглежда идеално подходящ за анализатор ред по ред. Просто отворете файла, прочетете ред в низ, сканирайте реда в масив (вижте numpy.fromstring), актуализирайте текущите си суми и преминете към следващия ред.

person so12311    schedule 28.07.2011

Файловият I/O на 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) в интерактивния интерпретатор).

person Gravity    schedule 28.07.2011

Колко големи са вашите данни, по-големи ли са от паметта на вашия компютър? Ако може да се зареди в паметта, можете да използвате 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
person HYRY    schedule 29.07.2011

Не знам нищо за Rpy. Знам, че SciPy се използва за извършване на сериозна обработка на числа с наистина големи набори от данни, така че трябва да работи за вашия проблем.

Както zephyr отбеляза, може да не се нуждаете от нито едно от двете; ако просто трябва да запазите някои текущи суми, вероятно можете да го направите в Python. Ако това е CSV файл или друг общ файлов формат, проверете и вижте дали има модул на Python, който ще го анализира вместо вас, и след това напишете цикъл, който сумира подходящите стойности.

Не съм сигурен как да получа първите десет реда. Можете ли да ги събирате в движение, докато вървите, или трябва да изчислите сумите и след това да изберете редовете? За да ги съберете, може да искате да използвате речник, за да следите текущите 10 най-добри реда, и да използвате ключовете, за да съхраните показателя, който сте използвали, за да ги класирате (за да улесните намирането и изхвърлянето на ред, ако друг ред го замести ). Ако трябва да намерите редовете, след като изчислението е направено, поставете всички данни в numpy.array или просто направете второ преминаване през файла, за да извадите десетте реда.

person steveha    schedule 28.07.2011

Тъй като това има R етикет, ще дам някои R решения:

person Ari B. Friedman    schedule 31.07.2011