首頁  >  文章  >  後端開發  >  安麗大家一個Python大數據分析神器

安麗大家一個Python大數據分析神器

coldplay.xixi
coldplay.xixi轉載
2020-12-30 17:41:363279瀏覽

python影片教學欄位介紹一個大數據分析神器

安麗大家一個Python大數據分析神器

推薦(免費) :python影片教學

對於Pandas運行速度的提升方法,之前已經介紹過很多回了,裡面經常提及Dask,很多朋友沒接觸過可能不太了解,今天就推薦這個神器。

1、什麼是Dask?

PandasNumpy大家都不陌生了,程式碼運作後資料都載入到RAM中,如果資料集特別大,我們就會看到記憶體飆升。但有時要處理的資料並不適合RAM,這時候Dask來了。

Dask是開源免費的。它是與其他社區計畫(如Numpy,Pandas和Scikit-Learn)協調開發的。

官方:https://dask.org/

Dask支援PandasDataFrameNumpyArray 的資料結構,並且既可在本機電腦上運行,也可以擴展到在叢集上運行。

基本上,只要寫一次程式碼,使用普通的Pythonic語法,就可在本地運行或部署到多節點叢集上。這本身就是一個很屌的功能了,但這還不是最屌的。

我覺得Dask的最牛逼的功能是:它相容於大部分我們已經在用的工具,並且只需改動少量的程式碼,就可以利用自己筆記本電腦上已有的處理能力並行運行程式碼。而並行處理資料就意味著更少的執行時間,更少的等待時間和更多的分析時間。

下面這個就是Dask進行資料處理的大致流程。
安麗大家一個Python大數據分析神器

2、Dask支援哪些現有工具?

這一點也是我比較看中的,因為Dask可以與Python資料處理和建模的庫包相容,沿用庫包的API ,這對Python使用者來說學習成本是極低的。而像HadoopSpark這種大數據處理是有很高的學習門檻和時間成本的。

目前,Dask可支援pandasNumpySklearnXGBoostXArrayRAPIDS等等,光是這幾項我覺得就夠用了,至少對於常用的資料處理、建模分析是完全覆蓋得掉的。
安麗大家一個Python大數據分析神器

3、Dask安裝

可以使用condapip,或從原始碼安裝dask

conda install dask

因為dask有很多依賴,所以為了快速安裝也可用下面程式​​碼,將安裝運行Dask所需的最少依賴關係集。

conda install dask-core

再有就是透過來源來安裝。

git clone https://github.com/dask/dask.git
cd dask
python -m pip install .

4、Dask如何使用?

Numpy、pandas

Dask引入了3個並行集合,它們可以儲存大於RAM的數據,這些集合有DataFrameBagsArrays。這些集合類型中的每一個都能夠使用在RAM和硬碟之間分區的數據,以及分佈在群集中多個節點上的數據。

Dask的使用是非常清晰的,如果你使用NumPy數組,就從Dask數組開始,如果你使用 Pandas DataFrame,就從Dask DataFrame開始,依此類推。

import dask.array as da
x = da.random.uniform(low=0, high=10, size=(10000, 10000),  # normal numpy code
                      chunks=(1000, 1000))  # break into chunks of size 1000x1000

y = x + x.T - x.mean(axis=0)  # Use normal syntax for high level algorithms

# DataFrames
import dask.dataframe as dd
df = dd.read_csv('2018-*-*.csv', parse_dates='timestamp',  # normal Pandas code
                 blocksize=64000000)  # break text into 64MB chunks

s = df.groupby('name').balance.mean()  # Use normal syntax for high level algorithms

# Bags / lists
import dask.bag as db
b = db.read_text('*.json').map(json.loads)
total = (b.filter(lambda d: d['name'] == 'Alice')
          .map(lambda d: d['balance'])
          .sum())

這些高階介面在略微變化的情況下複製了標準介面。對於原始專案中的大部分API,這些介面會自動為我們並行處理較大的資料集,實作上不是很複雜,對照Dask的doc文件即可一步步完成。

Delayed

下面說一下DaskDelay 功能,非常強大。

Dask.delayed是一種並行化現有程式碼的簡單而強大的方法。之所以被稱為delayed是因為,它沒有立即計算出結果,而是將要作為任務計算的結果記錄在一個圖形中,稍後將在並行硬體上運行。

有時問題用已有的dask.arraydask.dataframe可能都不適合,在這些情況下,我們可以使用更簡單的 dask.delayed介面並行化自訂演算法。例如下面這個例子。

def inc(x):
    return x + 1

def double(x):
    return x * 2

def add(x, y):
    return x + y

data = [1, 2, 3, 4, 5]

output = []
for x in data:
    a = inc(x)
    b = double(x)
    c = add(a, b)
    output.append(c)

total = sum(output)
45

上面代码在单个线程中按顺序运行。但是,我们看到其中很多可以并行执行。Dask delayed函数可修饰incdouble这些函数,以便它们可延迟运行,而不是立即执行函数,它将函数及其参数放入计算任务图中。

我们简单修改代码,用delayed函数包装一下。

import dask

output = []
for x in data:
    a = dask.delayed(inc)(x)
    b = dask.delayed(double)(x)
    c = dask.delayed(add)(a, b)
    output.append(c)

total = dask.delayed(sum)(output)

代码运行后incdoubleaddsum都还没有发生,而是生成一个计算的任务图交给了total。然后我们用visualizatize看下任务图。

total.visualize()

安麗大家一個Python大數據分析神器

上图明显看到了并行的可能性,所以毫不犹豫,使用compute进行并行计算,这时才完成了计算。

>>> total.compute()
45

由于数据集较小无法比较时间,这里只介绍下使用方法,具体可自己动手实践下。

Sklearn机器学习

关于机器学习的并行化执行,由于内容较多,东哥会在另一篇文章展开。这里简单说下一下dask-learn

dask-learn项目是与Sklearn开发人员协作完成的。现在可实现并行化有Scikit-learnPipelineGridsearchCVRandomSearchCV以及这些的变体,它们可以更好地处理嵌套的并行操作。

因此,如果你将sklearn替换为dklearn,那么速度将会提升很多。

# from sklearn.grid_search import GridSearchCV
  from dklearn.grid_search import GridSearchCV
# from sklearn.pipeline import Pipeline
  from dklearn.pipeline import Pipeline
下面是一个使用Pipeline的示例,其中应用了PCA和逻辑回归。
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=10000,
                           n_features=500,
                           n_classes=2,
                           n_redundant=250,
                           random_state=42)

from sklearn import linear_model, decomposition
from sklearn.pipeline import Pipeline
from dklearn.pipeline import Pipeline

logistic = linear_model.LogisticRegression()
pca = decomposition.PCA()
pipe = Pipeline(steps=[('pca', pca),
                       ('logistic', logistic)])


grid = dict(pca__n_components=[50, 100, 150, 250],
            logistic__C=[1e-4, 1.0, 10, 1e4],
            logistic__penalty=['l1', 'l2'])

# from sklearn.grid_search import GridSearchCV
from dklearn.grid_search import GridSearchCV

estimator = GridSearchCV(pipe, grid)

estimator.fit(X, y)

结果是:sklearn会在40秒钟左右执行此计算,而dask-learn替代品大约需要10秒钟。
另外,如果添加以下代码可以连接到集群,通过Client可以展示整个计算过程的dashboard,由Bokeh实现。

from dask.distributed import Client
c = Client('scheduler-address:8786')

安麗大家一個Python大數據分析神器

5、总结

以上就是Dask的简单介绍,Dask的功能是非常强大的,且说明文档也非常全,既有示例又有解释。感兴趣的朋友可以自行去官网或者GitHub学习,东哥下次分享使用Dask进行机器学习的一些实例。

以上是安麗大家一個Python大數據分析神器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除