2011-07-28 20 views
7

W moim środowisku Pythona pakiety Rpy i Scipy są już zainstalowane.Python: obsługa dużego zbioru danych. Scipy czy Rpy? I jak?

Problem Chcę rozwiązania jest taki:

1) ogromny zbiór danych finansowych są przechowywane w pliku tekstowym. Ładowanie do Excela nie jest możliwe

2) Potrzebuję zsumować określone pola i uzyskać sumy.

3) Muszę pokazać 10 najlepszych wierszy na podstawie sum.

Który pakiet (Scipy lub Rpy) najlepiej nadaje się do tego zadania?

Jeśli tak, czy możesz podać mi jakieś wskazówki (np. Dokumentację lub przykład online), które mogą mi pomóc w wdrożeniu rozwiązania?

Prędkość jest problemem. Idealnie scipy i Rpy mogą obsługiwać duże pliki, nawet gdy pliki są tak duże, że nie można ich umieścić w pamięci.

+0

Możesz znaleźć przydatne informacje na stronie http://www.dabeaz.com/generators-uk/ – lazy1

+1

Co oznacza "ogromny zestaw" w twoim przypadku? – radek

Odpowiedz

2

Jak zauważyłem @ gsk3, bigmemory jest świetnym pakietem do tego, wraz z pakietami biganalytics i bigtabulate (jest ich więcej, ale warto je sprawdzić). Jest też ff, choć nie jest to takie proste.

Zarówno dla R, jak i dla Pythona obsługuje HDF5 (patrz pakiety ncdf4 lub NetCDF4 w R), co zapewnia bardzo szybki i łatwy dostęp do ogromnych zestawów danych na dysku. Osobiście głównie używam bigmemory, ale to jest specyficzne dla R. Ponieważ HDF5 jest dostępny w Pythonie i jest bardzo, bardzo szybki, prawdopodobnie będzie najlepszym wyborem w Pythonie.

5

Ani Rpy, ani Scipy nie są konieczne, chociaż numpy może to trochę ułatwić. Ten problem wydaje się idealnie pasować do analizatora składającego się z wiersza po linii. Po prostu otwórz plik, odczytaj wiersz w łańcuchu, zeskanuj go do tablicy (patrz numpy.fromstring), zaktualizuj swoje bieżące sumy i przejdź do następnej linii.

1

Nic nie wiem o Rpy. Wiem, że SciPy jest używany do poważnego chrupania liczb z naprawdę dużymi zbiorami danych, więc powinno działać na twój problem.

Jak zauważył Zephyr, możesz nie potrzebować ani jednego; jeśli chcesz zachować pewne sumy, prawdopodobnie możesz to zrobić w Pythonie. Jeśli jest to plik CSV lub inny typowy format pliku, sprawdź i sprawdź, czy istnieje moduł Pythona, który przeanalizuje go dla Ciebie, a następnie napisz pętlę, która podsumuje odpowiednie wartości.

Nie jestem pewien, jak uzyskać dziesięć najlepszych wierszy. Czy możesz zbierać je w locie podczas podróży, czy musisz obliczyć sumy, a następnie wybrać wiersze? Aby je zebrać, możesz użyć słownika, aby śledzić bieżące 10 najlepszych wierszy, i użyć klawiszy do przechowywania danych, których używałeś do ich uszeregowania (aby ułatwić znalezienie i odrzucenie wiersza, jeśli zastępuje go inny wiersz;). Jeśli musisz znaleźć wiersze po wykonaniu obliczeń, wyrzuć wszystkie dane do pliku numpy.array, lub po prostu wykonaj drugie przejście przez plik, aby wyciągnąć dziesięć wierszy.

3

Python's File I/O nie ma zła wydajność, więc możesz po prostu użyć modułu file bezpośrednio. Możesz zobaczyć, jakie funkcje są w nim dostępne, wpisując help (file) w interaktywnym tłumaczu. Utworzenie pliku jest częścią funkcji języka podstawowego i nie wymaga od użytkownika import file.

Coś jak:

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) 

Disclaimer: To jest Python 2 odpowiedź. Nie jestem w 100% pewien, czy działa to w Pythonie 3.

Zostawię to użytkownikowi, aby dowiedzieć się, jak wyświetlić 10 najlepszych wierszy i znaleźć sumy wierszy. Można to zrobić za pomocą prostej logiki programu, która nie powinna stanowić problemu bez specjalnych bibliotek. Oczywiście, jeśli wiersze mają jakieś skomplikowane formatowanie, które utrudnia przeanalizowanie wartości, możesz użyć np. Modułu do analizy, np. re (wpisz help(re) do interaktywnego interpretera).

2

Jak duże są Twoje dane, czy jest większe niż pamięć komputera? Jeśli można go załadować do pamięci, możesz użyć numpy.loadtxt(), aby załadować dane tekstowe do tablicy numpy. na przykład:

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 
Powiązane problemy