亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

pandas高效讀取大文件的示例詳解

 更新時間:2024年01月29日 08:07:49   作者:databook  
使用?pandas?進行數(shù)據(jù)分析時,第一步就是讀取文件,所以這篇文章主要來和大家討論一下pandas如何高效讀取大文件,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下

使用 pandas 進行數(shù)據(jù)分析時,第一步就是讀取文件。

在平時學習和練習的過程中,用到的數(shù)據(jù)量不會太大,所以讀取文件的步驟往往會被我們忽視。

然而,在實際場景中,面對十萬,百萬級別的數(shù)據(jù)量是家常便飯,即使千萬,上億級別的數(shù)據(jù),單機處理也問題不大。

不過,當數(shù)據(jù)量和數(shù)據(jù)屬性多了之后,讀取文件的性能瓶頸就開始浮現(xiàn)出來。

當我們第一次拿到數(shù)據(jù)時,經(jīng)常會反反復復的讀取文件,嘗試各種分析數(shù)據(jù)的方法。

如果每次讀取文件都要等一段時間,不僅會影響工作效率,還影響心情。

下面記錄了我自己優(yōu)化pandas讀取大文件效率的探索過程。

1. 準備部分

首先,準備數(shù)據(jù)。

下面的測試用的數(shù)據(jù)是一些虛擬幣的交易數(shù)據(jù),除了常用的K線數(shù)據(jù)之外,還包含很多分析因子的值。

import pandas as pd

fp = "all_coin_factor_data_12H.csv"
df = pd.read_csv(fp, encoding="gbk")
df.shape

# 運行結(jié)果
(398070, 224)

總數(shù)據(jù)量接近40萬,每條數(shù)據(jù)有224個屬性。

然后,封裝一個簡單的裝飾器來計時函數(shù)運行時間。

from time import time

def timeit(func):
    def func_wrapper(*args, **kwargs):
        start = time()
        ret = func(*args, **kwargs)
        end = time()
        spend = end - start
        print("{} cost time: {:.3f} s".format(func.__name__, spend))
        return ret

    return func_wrapper

2. 正常讀取

先看看讀取這樣規(guī)模的數(shù)據(jù),需要多少時間。

下面的示例中,循環(huán)讀取10次上面準備的數(shù)據(jù)all_coin_factor_data_12H.csv

import pandas as pd

@timeit
def read(fp):
    df = pd.read_csv(
        fp,
        encoding="gbk",
        parse_dates=["time"],
    )
    return df

if __name__ == "__main__":
    fp = "./all_coin_factor_data_12H.csv"
    for i in range(10):
        read(fp)

運行結(jié)果如下:

讀取一次大概27秒左右。

3. 壓縮讀取

讀取的文件all_coin_factor_data_12H.csv大概1.5GB左右,pandas是可以直接讀取壓縮文件的,嘗試壓縮之后讀取性能是否能夠提高。

壓縮之后,大約 615MB 左右,壓縮前大小的一半不到點。

import pandas as pd

@timeit
def read_zip(fp):
    df = pd.read_csv(
        fp,
        encoding="gbk",
        parse_dates=["time"],
        compression="zip",
    )
    return df

if __name__ == "__main__":
    fp = "./all_coin_factor_data_12H.zip"
    for i in range(10):
        read_zip(fp)

運行結(jié)果如下:

讀取一次大概34秒左右,還不如直接讀取來得快。

4. 分批讀取

接下來試試分批讀取能不能提高速度,分批讀取的方式是針對數(shù)據(jù)量特別大的情況,單機處理過億數(shù)據(jù)量的時候,經(jīng)常會用到這個方法,防止內(nèi)存溢出。

先試試每次讀取1萬條

import pandas as pd

@timeit
def read_chunk(fp, chunksize=1000):
    df = pd.DataFrame()
    reader = pd.read_csv(
        fp,
        encoding="gbk",
        parse_dates=["time"],
        chunksize=chunksize,
    )
    for chunk in reader:
        df = pd.concat([df, chunk])

    df = df.reset_index()
    return df

if __name__ == "__main__":
    fp = "./all_coin_factor_data_12H.csv"
    for i in range(10):
        read_chunk(fp, 10000)

運行結(jié)果如下:

和讀取壓縮文件的性能差不多。

如果調(diào)整成每次讀取10萬條,性能會有一些微提高。

分批讀取時,一次讀取的越多(只要內(nèi)存夠用),速度越快。

其實我也試了一次讀取1千條的性能,非常慢,這里就不截圖了。

5. 使用polars讀取

前面嘗試的方法,效果都不太好,下面引入一個和pandas兼容的庫Polars。

Polars是一個高性能的DataFrame庫,它主要用于操作結(jié)構(gòu)化數(shù)據(jù)。

它是用Rust寫的,主打就是高性能。

使用Polars讀取文件之后返回的Dataframe雖然和pandasDataFrame不完全一樣,當可以通過一個簡單的to_pandas方法來完成轉(zhuǎn)換。

下面看看使用Polars讀取文件的性能:

import polars as pl

@timeit
def read_pl(fp):
    df = pl.read_csv(
        fp,
        encoding="gbk",
        try_parse_dates=True,
    )
    return df.to_pandas()

if __name__ == "__main__":
    fp = "./all_coin_factor_data_12H.csv"
    for i in range(10):
        read_pl(fp)

運行結(jié)果如下:

使用Polars后性能提高非常明顯,看來,混合使用Polarspandas是一個不錯的方案。

6. 序列化后讀取

最后這個方法,其實不是直接讀取原始數(shù)據(jù),而是將原始數(shù)據(jù)轉(zhuǎn)換為python自己的序列化格式pickle)之后,再去讀取。

這個方法多了一個轉(zhuǎn)換的步驟:

fp = "./all_coin_factor_data_12H.csv"
df = read(fp)
df.to_pickle("./all_coin_factor_data_12H.pkl")

生成一個 序列化文件:all_coin_factor_data_12H.pkl。

然后,測試下讀取這個序列化文件的性能。

@timeit
def read_pkl(fp):
    df = pd.read_pickle(fp)
    return df

if __name__ == "__main__":
    fp = "./all_coin_factor_data_12H.pkl"
    for i in range(10):
        read_pkl(fp)

運行結(jié)果如下:

這個性能出乎意料之外的好,而且csv文件序列化成pkl文件之后,占用磁盤的大小也只有原來的一半。

csv文件1.5GB左右,pkl文件只有690MB

這個方案雖然性能驚人,但也有一些局限,首先是原始文件不能是那種實時變化的數(shù)據(jù),因為原始csv文件轉(zhuǎn)換為pkl文件也是要花時間的(上面的測試沒有算這個時間)。

其次,序列化之后的pkl文件python專用的,不像csv文件那樣通用,不利于其他非python的系統(tǒng)使用。

7. 總結(jié)

本文探討了一些pandas讀取大文件的優(yōu)化方案,最后比較好的就是Polars方案pickle序列化方案。

如果我們的項目是分析固定的數(shù)據(jù),比如歷史的交易數(shù)據(jù),歷史天氣數(shù)據(jù),歷史銷售數(shù)據(jù)等等,那么,就可以考慮pickle序列化方案,先花時間講原始數(shù)據(jù)序列化,后續(xù)的分析中不擔心讀取文件浪費時間,可以更高效的嘗試各種分析思路。

除此之外的情況,建議使用Polars方案。

最后補充一點,如果讀取文件的性能對你影響不大,那就用原來的方式,千萬不要畫蛇添足的去優(yōu)化,把精力花在數(shù)據(jù)分析的業(yè)務上。

以上就是pandas高效讀取大文件的示例詳解的詳細內(nèi)容,更多關(guān)于pandas讀取大文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python繪制玫瑰花情人節(jié)表白

    python繪制玫瑰花情人節(jié)表白

    這篇文章主要介紹了python繪制玫瑰花,文章基于python的相關(guān)資料展開主題詳細介紹,具有一定的參考價值,想情人節(jié)花式表白的小伙伴可以參考一下喲
    2022-06-06
  • 完美解決安裝完tensorflow后pip無法使用的問題

    完美解決安裝完tensorflow后pip無法使用的問題

    今天小編就為大家分享一篇完美解決安裝完tensorflow后pip無法使用的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python中下標和切片的使用方法解析

    python中下標和切片的使用方法解析

    這篇文章主要介紹了python中下標和切片的使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Python集合基本概念與相關(guān)操作實例分析

    Python集合基本概念與相關(guān)操作實例分析

    這篇文章主要介紹了Python集合基本概念與相關(guān)操作,結(jié)合實例形式分析了Python集合的功能、原理、基本使用方法及操作注意事項,需要的朋友可以參考下
    2019-10-10
  • python登錄豆瓣并發(fā)帖的方法

    python登錄豆瓣并發(fā)帖的方法

    這篇文章主要介紹了python登錄豆瓣并發(fā)帖的方法,涉及URL模擬登陸及cookie的相關(guān)使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Python如何為圖片添加水印

    Python如何為圖片添加水印

    這篇文章主要介紹了Python如何使用Python-Pillow庫給圖片添加水印的方法,非常的簡單實用,有需要的小伙伴可以參考下
    2016-11-11
  • Python第三方庫OS庫方法實操

    Python第三方庫OS庫方法實操

    這篇文章主要給大家介紹了關(guān)于Python第三方庫OS庫的相關(guān)資料,os庫主要是對文件和文件夾進行操作,在Python中對?件和?件夾的操作要借助os模塊??的相關(guān)功能,需要的朋友可以參考下
    2024-06-06
  • python刪除列表內(nèi)容

    python刪除列表內(nèi)容

    這里給大家通過2個例子,分析了下如何使用python刪除列表內(nèi)容,也給出了思路,分別通過pop和remove方法來實現(xiàn),有相關(guān)需求的小伙伴可以參考下。
    2015-08-08
  • Python函數(shù)式編程中itertools模塊詳解

    Python函數(shù)式編程中itertools模塊詳解

    這篇文章主要介紹了在Python中使用itertools模塊中的組合函數(shù)的教程,來自IBM官方技術(shù)文檔,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • Python中一行和多行import模塊問題

    Python中一行和多行import模塊問題

    我們通過本篇文章給大家分析了為什么Python不建議使用一行import所有模塊的原因,有興趣的朋友學習下。
    2018-04-04

最新評論