免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
python大規(guī)模數(shù)據(jù)處理技巧之一:數(shù)據(jù)常用操作

面對讀取上G的數(shù)據(jù),python不能像做簡單代碼驗證那樣隨意,必須考慮到相應(yīng)的代碼的實現(xiàn)形式將對效率的影響。如下所示,對pandas對象的行計數(shù)實現(xiàn)方式不同,運行的效率差別非常大。雖然時間看起來都微不足道,但一旦運行次數(shù)達(dá)到百萬級別時,其運行時間就根本不可能忽略不計了:

故接下來的幾個文章將會整理下渣渣在關(guān)于在大規(guī)模數(shù)據(jù)實踐上遇到的一些問題,文章中總結(jié)的技巧基本是基于pandas,有錯誤之處望指正。

1、外部csv文件讀寫


大數(shù)據(jù)量csv讀入到內(nèi)存


  • 分析思路:數(shù)據(jù)量非常大時,比如一份銀行一個月的流水賬單,可能有高達(dá)幾千萬的record。對于一般性能的計算機,有或者是讀入到特殊的數(shù)據(jù)結(jié)構(gòu)中,內(nèi)存的存儲可能就非常吃力了??紤]到我們使用數(shù)據(jù)的實際情況,并不需要將所有的數(shù)據(jù)提取出內(nèi)存。當(dāng)然讀入數(shù)據(jù)庫是件比較明智的做法。若不用數(shù)據(jù)庫呢?可將大文件拆分成小塊按塊讀入后,這樣可減少內(nèi)存的存儲與計算資源
  • 注意事項:open(file.csv)與pandas包的pd.read_csv(file.csv ): python32位的話會限制內(nèi)存,提示太大的數(shù)據(jù)導(dǎo)致內(nèi)存錯誤。解決方法是裝python64位。如果嫌python各種包安裝過程麻煩,可以直接安裝Anaconda2 64位版本
  • 簡易使用方法:
    chunker = pd.read_csv(PATH_LOAD, chunksize = CHUNK_SIZE)
  • 1
  • 讀取需要的列:
    columns = ("date_time",  "user_id")    chunks_train = pd.read_csv(filename, usecols = columns, chunksize = 100000)
  • 1
  • 2

chunker對象指向了多個分塊對象,但并沒有將實際數(shù)據(jù)先讀入,而是在提取數(shù)據(jù)時才將數(shù)據(jù)提取進來。數(shù)據(jù)的處理和清洗經(jīng)常使用分塊的方式處理,這能大大降低內(nèi)存的使用量,但相比會更耗時一些

  • 分塊讀取chunk中的每一行:
    for rawPiece in chunker_rawData:        current_chunk_size = len(rawPiece.index)   #rawPiece 是dataframe        for i in range(current_chunk_size ):            timeFlag = timeShape(rawPiece.ix[i])   #獲取第i行的數(shù)據(jù)
  • 1
  • 2
  • 3
  • 4

將數(shù)據(jù)存到硬盤


  • 直接寫出到磁盤:
    data.to_csv(path_save, index = False, mode = 'w')`
  • 1
  • 分塊寫出到磁盤:
  1. 對于第一個分塊使用pandas包的存儲IO:
    • 保留header信息,‘w’模式寫入
    • data.to_csv(path_save, index = False, mode = 'w')
  2. 接下的分塊寫入
    • 去除header信息,‘a(chǎn)’模式寫入,即不刪除原文檔,接著原文檔后繼續(xù)寫
    • data.to_csv(path_save, index = False, header = False, mode = a')
  • 少量的數(shù)據(jù)寫出:

少量的數(shù)據(jù)用pickle(cPickle更快)輸出和讀取,非常方便 ,下面分別是寫出和讀入

寫出:

    import cPickle as pickle    def save_trainingSet(fileLoc, X, y):        pack = [X, y]        with open(fileLoc, 'w') as f:            pickle.dump(pack, f)
  • 1
  • 2
  • 3
  • 4
  • 5

讀入:

    import cPickle as pickle    def read_trainingSet(fileLoc):        with open(fileLoc, 'r') as f:            pack = pickle.load(f)        return pack[0], pack[1]
  • 1
  • 2
  • 3
  • 4
  • 5

高效讀取外部csv到python內(nèi)部的list數(shù)據(jù)結(jié)構(gòu)


  • 效率低下的方法:使用pd讀入需要從pd轉(zhuǎn)換到python本身的數(shù)據(jù)結(jié)構(gòu),多此一舉
    userList = []    content = pd.read_csv(filename)    for i in range(len(content)):        line = content.ix[i]['id']        userList.append(line)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 效率高的方法:直接將外部數(shù)據(jù)讀入進來
    userList = []    f = open(filename)    content = f.readlines()    for line in content:        line = line.replace('\n', '').split(',')        userList.append(line)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、數(shù)據(jù)分析時常用數(shù)據(jù)結(jié)構(gòu)之間的轉(zhuǎn)化


數(shù)據(jù)集的橫向與縱向合并


  • 簡單地橫向合并數(shù)據(jù)集:
  • 問題分析:
    • 縱向的合并使用list并不好,因為需要去拆解list的每一個行元素,并用extend去拓展每一行的縱向元素
    • 最好使用dataframe中的concat函數(shù):c = pd.concat([a, b], axis = 1),當(dāng)axis=0時表示合并行(以行為軸)
    inx1 = DataFrame(np.random.randn(nSample_neg), columns = ['randVal'])    inx2 = DataFrame(range(nSample_neg), columns = ['inxVal'])    inx = pd.concat([inx1, inx2], axis = 1)
  • 1
  • 2
  • 3
  • 類似數(shù)據(jù)庫的表合并:join(待完整)
    ret = ret.join(dest_small, on="srch_destination_id", how='left', rsuffix="dest")
  • 1
  • 簡單縱向合并數(shù)據(jù)集:
  • 縱向合并數(shù)據(jù)集可以考慮一下幾種方法:
    • 讀取數(shù)據(jù)為list格式,使用append函數(shù)逐行讀取
    • 將數(shù)據(jù)集轉(zhuǎn)換為pandas中的dataframe格式,使用dataframe的merge與concat方法
  • 方法:
    • 方法一:使用dataframe讀入,使用concat把每行并起來
    • 方法二:先使用list讀入并起來,最后轉(zhuǎn)換成dataframe
    • 方法三:先使用list讀入并起來大塊的list,每塊list轉(zhuǎn)換成dataframe后用concat合并起來
  • 比較:方法一由于concat的靜態(tài)性,每次要重新分配資源,故跑起來很慢; 方法二與三:會快很多,但具體沒有測試,以下是使用方法三的代碼:
    data = []    cleanedPiece = []    for i in range(CHUNK_SIZE):        line = rawPiece.ix[i]        uid = [line['user_id'], line['item_id'],            line['behavior_type'], timeFlag]        cleanedPiece.append(uid)    cleanedPiece = DataFrame(cleanedPiece, columns = columns)    data = pd.concat([data, cleanedPiece], axis = 0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

<未完待續(xù)>

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
數(shù)據(jù)科學(xué) | Pandas數(shù)據(jù)分析入門
Python報表自動化:10000個Excel表縱向合并成1張表
如何解決python讀取大數(shù)據(jù)量文件時造成的內(nèi)存溢出?
大數(shù)據(jù)理論課(-----pandas對DataFrame表格的切割、合并、去重)
pandas的菜鳥級應(yīng)用(誰都能學(xué)會)
利用python實現(xiàn)自動化高效率辦公?
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服