成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

多快好省地使用pandas分析大型數據集

大數據 數據分析
本文就將以真實數據集和運存16G的普通筆記本電腦為例,演示如何運用一系列策略實現多快好省地用pandas分析大型數據集。

1.  簡介

pandas雖然是個非常流行的數據分析利器,但很多朋友在使用pandas處理較大規模的數據集的時候經常會反映pandas運算“慢”,且內存開銷“大”。

特別是很多學生黨在使用自己性能一般的筆記本嘗試處理大型數據集時,往往會被捉襟見肘的算力所勸退。但其實只要掌握一定的pandas使用技巧,配置一般的機器也有能力hold住大型數據集的分析。

圖1

本文就將以真實數據集和運存16G的普通筆記本電腦為例,演示如何運用一系列策略實現多快好省地用pandas分析大型數據集。

2. pandas多快好省策略

我們使用到的數據集來自kaggle上的「TalkingData AdTracking Fraud Detection Challenge」競賽( https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection ),使用到其對應的訓練集,這是一個大小有7.01G的csv文件。

下面我們將循序漸進地探索在內存開銷和計算時間成本之間尋求平衡,首先我們不做任何優化,直接使用pandas的read_csv()來讀取train.csv文件:

  1. import pandas as pd 
  2.  
  3. raw = pd.read_csv('train.csv') 
  4.  
  5. # 查看數據框內存使用情況 
  6. raw.memory_usage(deep=True

圖2

可以看到首先我們讀入整個數據集所花費的時間達到了將近三分鐘,且整個過程中因為中間各種臨時變量的創建,一度快要撐爆我們16G的運行內存空間。

這樣一來我們后續想要開展進一步的分析可是說是不可能的,因為隨便一個小操作就有可能會因為中間過程大量的臨時變量而撐爆內存,導致死機藍屏,所以我們第一步要做的是降低數據框所占的內存:

(1) 指定數據類型以節省內存

因為pandas默認情況下讀取數據集時各個字段確定數據類型時不會替你優化內存開銷,比如我們下面利用參數nrows先讀入數據集的前1000行試探著看看每個字段都是什么類型:

  1. raw = pd.read_csv('train.csv', nrows=1000
  2. raw.info() 

圖3

怪不得我們的數據集讀進來會那么的大,原來所有的整數列都轉換為了int64來存儲,事實上我們原數據集中各個整數字段的取值范圍根本不需要這么高的精度來存儲,因此我們利用dtype參數來降低一些字段的數值精度:

  1. raw = pd.read_csv('train.csv', nrows=1000
  2.                   dtype={ 
  3.                       'ip': 'int32', 
  4.                       'app': 'int16', 
  5.                       'device': 'int16', 
  6.                       'os': 'int16', 
  7.                       'channel': 'int16', 
  8.                       'is_attributed': 'int8' 
  9.                   }) 
  10. raw.info() 

圖4

可以看到,在修改數據精度之后,前1000行數據集的內存大小被壓縮了將近54.6%,這是個很大的進步,按照這個方法我們嘗試著讀入全量數據并查看其info()信息:

圖5

可以看到隨著我們對數據精度的優化,數據集所占內存有了非常可觀的降低,使得我們開展進一步的數據分析更加順暢,比如分組計數:

  1.     raw 
  2.     # 按照app和os分組計數 
  3.     .groupby(['app', 'os']) 
  4.     .agg({'ip': 'count'}) 

圖6

那如果數據集的數據類型沒辦法優化,那還有什么辦法在不撐爆內存的情況下完成計算分析任務呢?

(2) 只讀取需要的列

如果我們的分析過程并不需要用到原數據集中的所有列,那么就沒必要全讀進來,利用usecols參數來指定需要讀入的字段名稱:

  1. raw = pd.read_csv('train.csv', usecols=['ip', 'app', 'os']) 
  2. raw.info() 

圖7

可以看到,即使我們沒有對數據精度進行優化,讀進來的數據框大小也只有4.1個G,如果配合上數據精度優化效果會更好:

圖8

如果有的情況下我們即使優化了數據精度又篩選了要讀入的列,數據量依然很大的話,我們還可以以分塊讀入的方式來處理數據:

(3) 分塊讀取分析數據

利用chunksize參數,我們可以為指定的數據集創建分塊讀取IO流,每次最多讀取設定的chunksize行數據,這樣我們就可以把針對整個數據集的任務拆分為一個一個小任務最后再匯總結果:

  1. from tqdm.notebook import tqdm 
  2.  
  3. # 在降低數據精度及篩選指定列的情況下,以1千萬行為塊大小 
  4. raw = pd.read_csv('train.csv',  
  5.                   dtype={ 
  6.                       'ip': 'int32', 
  7.                       'app': 'int16', 
  8.                       'os': 'int16' 
  9.                   }, 
  10.                   usecols=['ip', 'app', 'os'], 
  11.                   chunksize=10000000
  12.  
  13. # 從raw中循環提取每個塊并進行分組聚合,最后再匯總結果 
  14. result = \ 
  15.     pd 
  16.     .concat([chunk 
  17.              .groupby(['app', 'os'], as_index=False
  18.              .agg({'ip': 'count'}) for chunk in tqdm(raw)]) 
  19.     .groupby(['app', 'os']) 
  20.     .agg({'ip': 'sum'}) 
  21.  
  22. result 

圖9

可以看到,利用分塊讀取處理的策略,從始至終我們都可以保持較低的內存負載壓力,并且一樣完成了所需的分析任務,同樣的思想,如果你覺得上面分塊處理的方式有些費事,那下面我們就來上大招:

(4) 利用dask替代pandas進行數據分析

dask相信很多朋友都有聽說過,它的思想與上述的分塊處理其實很接近,只不過更加簡潔,且對系統資源的調度更加智能,從單機到集群,都可以輕松擴展伸縮。

圖10

推薦使用conda install dask來安裝dask相關組件,安裝完成后,我們僅僅需要需要將import pandas as pd替換為import dask.dataframe as dd,其他的pandas主流API使用方式則完全兼容,幫助我們無縫地轉換代碼:

圖11

可以看到整個讀取過程只花費了313毫秒,這當然不是真的讀進了內存,而是dask的延時加載技術,這樣才有能力處理「超過內存范圍的數據集」。

接下來我們只需要像操縱pandas的數據對象一樣正常書寫代碼,最后加上.compute(),dask便會基于前面搭建好的計算圖進行正式的結果運算:

  1.     raw 
  2.     # 按照app和os分組計數 
  3.     .groupby(['app', 'os']) 
  4.     .agg({'ip': 'count'}) 
  5.     .compute() # 激活計算圖 

并且dask會非常智能地調度系統資源,使得我們可以輕松跑滿所有CPU:

圖12

關于dask的更多知識可以移步官網自行學習( https://docs.dask.org/en/latest/ )。

圖13

 

責任編輯:趙寧寧 來源: Python大數據分析
相關推薦

2009-05-05 08:50:10

ITIL運維管理摩卡

2009-02-06 09:25:00

網絡設備參數配置

2013-09-04 11:17:52

移動Web App

2025-04-11 11:14:51

2022-08-25 18:58:48

MLOps

2011-01-06 16:52:48

曙光機架式服務器

2015-07-08 15:24:59

中小型醫院IT系統華為

2013-04-28 13:33:38

翠微小學Windows Ser

2013-05-09 10:32:12

翠微小學Windows Ser微軟

2011-08-21 08:27:23

明基掃描儀

2020-09-11 10:54:54

云計算

2011-05-04 17:44:48

連續供墨系統

2011-12-19 09:07:58

S5024P-EI交換機

2018-08-02 15:49:54

聯想

2021-12-13 10:12:46

CIO低代碼軟件開發

2014-09-19 09:23:16

天地超云云服務器

2014-09-19 09:27:48

天地超云云服務器

2022-08-27 12:13:05

人工智能MLOps

2016-11-14 14:03:56

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美亚洲国产一区二区三区 | 国产欧美二区 | 在线看91 | 国产精品成人在线播放 | 尤物在线 | 狠狠亚洲 | 白浆在线 | 午夜精品久久 | 欧美日韩精品区 | 久久久久成人精品亚洲国产 | 欧美成人精品一区二区男人看 | 亚洲一区二区三区免费视频 | 国产一区二区成人 | 国产999精品久久久 日本视频一区二区三区 | 男女视频91| 欧美久久久久 | 日韩在线观看一区 | 欧美精品在线观看 | 欧美一区二区三区 | 国产98色在线 | 日韩 | 日本一区二区不卡视频 | 色爱综合 | 亚洲精品自拍 | 久草网站 | 超碰在线人人 | 国产在线中文字幕 | 先锋资源网站 | 三级国产三级在线 | 精品国产一区二区三区久久久蜜月 | 伊人青青久久 | 亚洲一区二区三区四区五区午夜 | www.国产日本 | 天堂av中文在线 | 蜜桃视频在线观看免费视频网站www | 羞羞视频网站 | 国产精品久久久久久久久久99 | 男女视频在线观看 | 麻豆久久久 | 亚洲国产成人久久久 | 91麻豆精品国产91久久久更新资源速度超快 | 在线欧美亚洲 |