<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          安利一個提升python數(shù)據(jù)分析效率的神器

          共 6970字,需瀏覽 14分鐘

           ·

          2021-05-11 07:29



          大家好,歡迎來到 Crossin的編程教室 !
          今天給大家推薦一款提升數(shù)據(jù)分析代碼效率的工具:Dask
          1、什么是Dask?
          Pandas和Numpy大家都不陌生了,代碼運行后數(shù)據(jù)都加載到RAM中,如果數(shù)據(jù)集特別大,我們就會看到內(nèi)存飆升。但有時要處理的數(shù)據(jù)并不適合RAM,這時候Dask來了。
          Dask是開源免費的。它是與其他社區(qū)項目(如Numpy,Pandas和Scikit-Learn)協(xié)調(diào)開發(fā)的。
          官方:https://dask.org/
          Dask支持Pandas的DataFrame和NumpyArray的數(shù)據(jù)結(jié)構(gòu),并且既可在本地計算機上運行,也可以擴展到在集群上運行。
          基本上,只要編寫一次代碼,使用普通的Pythonic語法,就可在本地運行或部署到多節(jié)點集群上。這本身就是一個很牛逼的功能了,但這還不是最牛逼的。
          我覺得Dask的最牛逼的功能是:它兼容大部分我們已經(jīng)在用的工具,并且只需改動少量的代碼,就可以利用自己筆記本電腦上已有的處理能力并行運行代并行處理數(shù)據(jù)就意味著更少的執(zhí)行時間,更少的等待時間和更多的分析時間。
          下面這個就是Dask進行數(shù)據(jù)處理的大致流程。


          2、Dask支持哪些現(xiàn)有工具?
          這一點也是我比較看中的,因為Dask可以與Python數(shù)據(jù)處理和建模的庫包兼容,沿用庫包的API,這對于Python使用者來說學(xué)習(xí)成本是極低的。而像Hadoop、Spark這種大數(shù)據(jù)處理是有很高的學(xué)習(xí)門檻和時間成本的。
          目前,Dask可支持pandas、Numpy、Sklearn、XGBoost、XArray、RAPIDS等等,光是這幾項我覺得就足夠用了,至少對于常用的數(shù)據(jù)處理、建模分析是完全覆蓋得掉的。
          3、Dask安裝
          可以使用 conda 或者 pip,或從源代碼安裝dask 
          conda install dask
          因為dask有很多依賴,所以為了快速安裝也可用下面代碼,將安裝運行Dask所需的最少依賴關(guān)系集
          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的數(shù)據(jù),這些集合有DataFrame、Bags、Arrays。這些集合類型中的每一個都能夠使用在RAM和硬盤之間分區(qū)的數(shù)據(jù),以及分布在群集中多個節(jié)點上的數(shù)據(jù)。
          Dask的使用是非常清晰的,如果你使用NumPy數(shù)組,就從Dask數(shù)組開始,如果你使用Pandas DataFrame,就從Dask DataFrame開始,依此類推。
          import dask.array as da
          x = da.random.uniform(low=0, high=10, size=(1000010000),  # normal numpy code
                                chunks=(10001000))  # 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())
          這些高級接口在略微變化的情況下復(fù)制了標準接口。對于原始項目中的大部分API,這些接口會自動為我們并行處理較大的數(shù)據(jù)集,實現(xiàn)上不是很復(fù)雜,對照Dask的doc文檔即可一步步完成。
          Delayed
          下面說一下Dask的 Delay 功能,非常強大。
          Dask.delayed是一種并行化現(xiàn)有代碼的簡單而強大的方法。之所以被叫做delayed是因為,它沒有立即計算出結(jié)果,而是將要作為任務(wù)計算的結(jié)果記錄在一個圖形中,稍后將在并行硬件上運行。
          有時問題用已有的dask.array或dask.dataframe可能都不適合,在這些情況下,我們可以使用更簡單的dask.delayed界面并行化自定義算法。例如下面這個例子。
          def inc(x):
              return x + 1

          def double(x):
              return x * 2

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

          data = [12345]

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

          total = sum(output)
          45
          上面代碼在單個線程中按順序運行。但是,我們看到其中很多可以并行執(zhí)行。Dask delayed函數(shù)可修飾inc、double這些函數(shù),以便它們可延遲運行,而不是立即執(zhí)行函數(shù),它將函數(shù)及其參數(shù)放入計算任務(wù)圖中。
          我們簡單修改代碼,用delayed函數(shù)包裝一下。
          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)
          代碼運行后inc、double、add和sum都還沒有發(fā)生,而是生成一個計算的任務(wù)圖交給了total。然后我們用visualizatize看下任務(wù)圖。
          total.visualize()  
          上圖明顯看到了并行的可能性,所以毫不猶豫,使用compute進行并行計算,這時才完成了計算。
          >>> total.compute()
          45
          由于數(shù)據(jù)集較小無法比較時間,這里只介紹下使用方法,具體可自己動手實踐下。
          Sklearn機器學(xué)習(xí)
          關(guān)于機器學(xué)習(xí)的并行化執(zhí)行,由于內(nèi)容較多,東哥會在另一篇文章展開。這里簡單說下一下dask-learn。
          dask-learn項目是與Sklearn開發(fā)人員協(xié)作完成的。現(xiàn)在可實現(xiàn)并行化有Scikit-learn的Pipeline、GridsearchCV和RandomSearchCV以及這些的變體,它們可以更好地處理嵌套的并行操作。
          因此,如果你將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的示例,其中應(yīng)用了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=[50100150250],
                      logistic__C=[1e-41.0101e4],
                      logistic__penalty=['l1''l2'])

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

          estimator = GridSearchCV(pipe, grid)

          estimator.fit(X, y)
          結(jié)果是:sklearn會在40秒鐘左右執(zhí)行此計算,而dask-learn替代品大約需要10秒鐘。
          另外,如果添加以下代碼可以連接到集群,通過Client可以展示整個計算過程的dashboard,由Bokeh實現(xiàn)。
          from dask.distributed import Client
          c = Client('scheduler-address:8786')


          5、總結(jié)
          以上就是Dask的簡單介紹,Dask的功能是非常強大的,且說明文檔也非常全,既有示例又有解釋。感興趣的朋友可以自行去官網(wǎng)或者GitHub學(xué)習(xí),之后也會分享使用Dask進行機器學(xué)習(xí)的一些實例。
          如果文章對你有幫助,歡迎轉(zhuǎn)發(fā)/點贊/收藏~
          作者:東哥起飛
          來源:Python數(shù)據(jù)科學(xué)


          _往期文章推薦_

          8個提升Python數(shù)據(jù)分析效率的代碼技巧




          如需了解付費精品課程教學(xué)答疑服務(wù)
          請在Crossin的編程教室內(nèi)回復(fù): 666

          瀏覽 68
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久无码中文 | 青青草2017在线视频 | 人人夜夜i日日 | www黄色一级 | 色老板新网址 |