2016-08-08 26 views
2

我能夠按列,使用此代碼離散一個大熊貓數據幀:如何通過與熊貓/ DASK可變箱列離散的大數據幀

import numpy as np 
import pandas as pd 

def discretize(X, n_scale=1): 

    for c in X.columns: 
     loc = X[c].median() 

     # median absolute deviation of the column 
     scale = mad(X[c]) 

     bins = [-np.inf, loc - (scale * n_scale), 
       loc + (scale * n_scale), np.inf] 
     X[c] = pd.cut(X[c], bins, labels=[-1, 0, 1]) 

    return X 

我想用的參數離散每一列:LOC(列的中位數)和比例(列的median absolute deviation)。

對於小數據框,所需的時間是可以接受的(因爲它是單線程解決方案)。

但是,對於較大的數據框,我想利用更多線程(或進程)來加速計算。

我不是Dask的專家,它應該爲這個問題提供解決方案。

然而,在我的情況下,離散化應與代碼是可行的:

import dask.dataframe as dd 
import numpy as np 
import pandas as pd 

def discretize(X, n_scale=1): 

    # I'm using only 2 partitions for this example 
    X_dask = dd.from_pandas(X, npartitions=2) 

    # FIXME: 
    # how can I define bins to compute loc and scale 
    # for each column? 
    bins = [-np.inf, loc - (scale * n_scale), 
      loc + (scale * n_scale), np.inf] 

    X = X_dask.apply(pd.cut, axis=1, args=(bins,), labels=[-1, 0, 1]).compute() 

    return X 

但這裏的問題是,locscale取決於列值,所以它們應該被計算爲每一列,無論是在申請之前或期間。

怎麼辦?

回答

1

我從來沒有用過dask,但我想你可以定義一個新的函數用於apply

import dask.dataframe as dd 
import multiprocessing as mp 
import numpy as np 
import pandas as pd 

def discretize(X, n_scale=1): 

    X_dask = dd.from_pandas(X.T, npartitions=mp.cpu_count()+1) 
    X = X_dask.apply(_discretize_series, 
        axis=1, args=(n_scale,), 
        columns=X.columns).compute().T 

    return X 

def _discretize_series(x, n_scale=1): 

    loc = x.median() 
    scale = mad(x) 
    bins = [-np.inf, loc - (scale * n_scale), 
      loc + (scale * n_scale), np.inf] 
    x = pd.cut(x, bins, labels=[-1, 0, 1]) 

    return x 
+0

謝謝。我使用工作解決方案編輯了您的問題。如果您認爲它足夠,請接受它。 – gc5