2016-02-06 19 views
6

Mam dość duże pliki csv (~ 10 gb) i chciałbym skorzystać z dask do analizy. Jednak w zależności od liczby partycji, które ustawię dla obiektu daszka, w którym będę czytać, wyniki moich grup zostaną zmienione. Rozumiem, że daszek wykorzystał partycje dla dodatkowych korzyści przetwarzania, ale nadal będzie zwracał odpowiednie dane wyjściowe grupowe. Nie wydaje się, żeby tak było i staram się ustalić, jakie alternatywne ustawienia są konieczne. Poniżej znajduje się mały przykład:Dask DataFrame Groupby Partycje

df = pd.DataFrame({'A': np.arange(100), 'B': np.random.randn(100), 'C': np.random.randn(100), 'Grp1': np.repeat([1, 2], 50), 'Grp2': [3, 4, 5, 6], 25)}) 

test_dd1 = dd.from_pandas(df, npartitions=1) 
test_dd2 = dd.from_pandas(df, npartitions=2) 
test_dd5 = dd.from_pandas(df, npartitions=5) 
test_dd10 = dd.from_pandas(df, npartitions=10) 
test_dd100 = dd.from_pandas(df, npartitions=100) 

def test_func(x): 
    x['New_Col'] = len(x[x['B'] > 0.])/len(x['B']) 
    return x 

test_dd1.groupby(['Grp1', 'Grp2']).apply(test_func).compute().head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0.48 
1 1 -1.107799 1.075471  1  3  0.48 
2 2 -0.719420 -0.574381  1  3  0.48 
3 3 -1.287547 -0.749218  1  3  0.48 
4 4 0.677617 -0.908667  1  3  0.48 

test_dd2.groupby(['Grp1', 'Grp2']).apply(test_func).compute().head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0.48 
1 1 -1.107799 1.075471  1  3  0.48 
2 2 -0.719420 -0.574381  1  3  0.48 
3 3 -1.287547 -0.749218  1  3  0.48 
4 4 0.677617 -0.908667  1  3  0.48 

test_dd5.groupby(['Grp1', 'Grp2']).apply(test_func).compute().head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0.45 
1 1 -1.107799 1.075471  1  3  0.45 
2 2 -0.719420 -0.574381  1  3  0.45 
3 3 -1.287547 -0.749218  1  3  0.45 
4 4 0.677617 -0.908667  1  3  0.45 

test_dd10.groupby(['Grp1', 'Grp2']).apply(test_func).compute().head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0.5 
1 1 -1.107799 1.075471  1  3  0.5 
2 2 -0.719420 -0.574381  1  3  0.5 
3 3 -1.287547 -0.749218  1  3  0.5 
4 4 0.677617 -0.908667  1  3  0.5 

test_dd100.groupby(['Grp1', 'Grp2']).apply(test_func).compute().head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0 
1 1 -1.107799 1.075471  1  3  0 
2 2 -0.719420 -0.574381  1  3  0 
3 3 -1.287547 -0.749218  1  3  0 
4 4 0.677617 -0.908667  1  3  1 

df.groupby(['Grp1', 'Grp2']).apply(test_func).head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0.48 
1 1 -1.107799 1.075471  1  3  0.48 
2 2 -0.719420 -0.574381  1  3  0.48 
3 3 -1.287547 -0.749218  1  3  0.48 
4 4 0.677617 -0.908667  1  3  0.48 

Czy krok grupowy działa tylko w obrębie każdej partycji, zamiast zaglądać do pełnej ramki danych? W takim przypadku ustawienie npartitions = 1 jest trywialne i nie wydaje się, aby miało to wpływ na wydajność, ale ponieważ read_csv automatycznie ustawia określoną liczbę partycji, jak skonfigurować wywołanie, aby upewnić się, że wyniki grupowe są dokładne?

Dzięki!

+0

Moją pierwszą myślą jest to, że grupowanie/zastosowanie daszka może nie gwarantować kolejności wyników, ale wszystkie one mogą i tak być. – shoyer

+0

Tak, myślałem o tym również, ale zrobiłem różne unikalne plasterki, a wyniki w grupie kończą się różnie wraz ze wzrostem liczby partycji. W jednym zestawie unikalnych "grp1/grp2" będą na przykład 2 różne wartości. – Bhage

+0

Jakieś rozwiązanie tego problemu? – codingknob

Odpowiedz

2

Jestem zaskoczony tym wynikiem. Aplikacja Groupby.apply powinna zwracać takie same wyniki niezależnie od liczby partycji. Jeśli możesz dostarczyć odtwarzalny przykład, zachęcam Cię do: raise an issue i jeden z programistów zajrzy.

Powiązane problemy