2016-02-06 15 views
6

Bazı oldukça büyük csv dosyalarım var (~ 10 gb) ve analiz için dask'dan yararlanmak istiyorum. Bununla birlikte, okumak için dask nesnesini ayarladığım bölümlerin sayısına bağlı olarak, groupby sonuçlarım değişiyor. Anladığım kadarıyla dask, çekirdek dışı işlem faydaları için ayrılan bölümlerden yararlandı, ancak yine de uygun grup çıkışına dönecekti. Bu durum böyle görünmüyor ve alternatif ayarların gerekli olduğu şeyleri çözmeye çalışıyorum. Aşağıda küçük örnektir:Dask DataFrame Groupby Bölümleri

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 

GroupBy adım sadece ziyade tam dataframe bakarak daha her bölüm içinde çalışıyor mu? Bu durumda, npartitions = 1 değerini ayarlamanız önemsizdir ve performansı çok fazla etkilemiyor gibi görünmektedir, ancak read_csv otomatik olarak belirli sayıda bölümü ayarladığı için, gruplama sonuçlarının doğru olduğundan emin olmak için çağrıyı nasıl kurarsınız?

Teşekkürler!

+0

İlk düşüncem şudur ki, dask'ın groupby/apply sonuçları sonucunu garanti edemeyebilir, ancak yine de orada olabilirler. – shoyer

+0

Evet, ben de bunu düşünüyordum ama farklı benzersiz dilimler yaptım ve grup içindeki sonuçlar, bölüm sayısı arttıkça farklılık gösteriyor. Tek bir 'grp1/grp2' kümesinde, örneğin 2 farklı değer olacaktır. – Bhage

+0

Bu sorunun çözümü var mı? – codingknob

cevap

2

Bu sonuca şaşırdım. Groupby.apply, bölümlerin sayısına bakılmaksızın aynı sonuçları döndürmelidir. Tekrarlanabilir bir örnek sağlayabiliyorsanız, raise an issue numaralı telefonu kullanmanızı öneririz ve geliştiricilerinden biri bir göz atacaktır.