Mam program do modelowania i oceniania, który intensywnie wykorzystuje DataFrame.isin
funkcję pand, przeszukując listy „podobnych” rejestrów Facebooka dla poszczególnych użytkowników dla każdej z kilku tysięcy konkretnych stron. Jest to najbardziej czasochłonna część programu, bardziej niż modelowanie lub ocenianie elementów, po prostu dlatego, że działa tylko na jednym rdzeniu, podczas gdy reszta działa na kilkudziesięciu jednocześnie.
Chociaż wiem, że mogę ręcznie rozbić ramkę danych na części i równolegle uruchomić tę operację, czy istnieje jakikolwiek prosty sposób, aby to zrobić automatycznie? Innymi słowy, czy istnieje jakikolwiek pakiet, który rozpozna, że prowadzę łatwą do delegowania operację i automatycznie ją rozpowszechnię? Być może to wymaga zbyt wiele, ale w przeszłości byłem wystarczająco zaskoczony tym, co jest już dostępne w Pythonie, więc uważam, że warto o to zapytać.
Wszelkie inne sugestie dotyczące tego, jak można to osiągnąć (nawet jeśli nie za pomocą jakiejś magicznej paczki jednorożca!) Również będą mile widziane. Głównie po prostu próbuję znaleźć sposób na zmniejszenie ilości 15-20 minut na cykl bez poświęcania równej ilości czasu na kodowanie rozwiązania.
źródło
Odpowiedzi:
Niestety, równoległość nie jest jeszcze zaimplementowana w pandach. Możesz dołączyć do tego wydania github, jeśli chcesz uczestniczyć w rozwoju tej funkcji.
Nie znam żadnego „magicznego pakietu jednorożca” do tego celu, więc najlepszą rzeczą będzie napisanie własnego rozwiązania. Ale jeśli nadal nie chcesz poświęcać na to czasu i chcesz nauczyć się czegoś nowego - możesz wypróbować dwie metody wbudowane w MongoDB (redukcja mapy i szkielet ag). Zobacz mongodb_agg_framework .
źródło
Myślę, że najlepszym rozwiązaniem byłaby rozeta . Uważam to za niezwykle przydatne i łatwe. Sprawdź metody pand .
Możesz dostać to przez pip .
źródło
Jest przydatna
dask
biblioteka dla równoległych zadań numpy / pandasLink: https://github.com/blaze/dask
źródło
Jest bardziej powszechna wersja tego pytania dotyczące parallelization na pandy mają zastosowanie funkcji - tak to jest orzeźwiający pytanie :)
Po pierwsze , chciałbym wspomnieć o szybszym, ponieważ poprosiłeś o rozwiązanie „spakowane”, i pojawia się ono na większości pytań SO dotyczących równoległości pand.
Ale .. nadal chciałbym udostępnić dla niego mój osobisty kod źródłowy, ponieważ po kilku latach pracy z DataFrame nigdy nie znalazłem rozwiązania w 100% zrównoleglonego (głównie dla funkcji Apply) i zawsze musiałem wracać po mój „ ręczny ”.
Dzięki tobie sprawiłem, że bardziej ogólna jest obsługa dowolnej (teoretycznie) metody DataFrame według jej nazwy (abyś nie musiał zachowywać wersji dla isin, aplikować itp.).
Przetestowałem to na funkcjach „isin”, „Apply” i „isna”, używając zarówno Pythona 2.7, jak i 3.6. Ma mniej niż 20 linii i postępowałem zgodnie z konwencją nazewnictwa pand, taką jak „podzbiór” i „njobs”.
Dodałem również porównanie czasu z równoważnym kodem dask dla „isin” i wydaje się ~ X2 razy wolniejsze niż ta treść.
Zawiera 2 funkcje:
df_multi_core - to ten, do którego dzwonisz. Akceptuje:
_df_split - jest to wewnętrzna funkcja pomocnicza, która musi być globalnie umieszczona w uruchomionym module (Pool.map jest „zależna od położenia”), w przeciwnym razie zlokalizowałbym ją wewnętrznie.
Oto kod z mojego GIST (dodam Więcej Pandy testy funkcyjne tam):
Poniżej znajduje się kod testowy dla równoległego isin , porównujący natywną, wielordzeniową wydajność gist i dask. Na maszynie I7 z 8 rdzeniami fizycznymi miałem około X4 razy przyspieszenie. Bardzo chciałbym usłyszeć, co masz na swoich prawdziwych danych!
źródło
isin
- wydaje się, że fragment kodu jest najskuteczniejszy z 'isin' - ~ X1,75 razy szybciej niż dask (w porównaniu zapply
funkcją, która jest tylko 5% szybsza niż dask)