最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

1. 準(zhǔn)備部分

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

下面的測(cè)試用的數(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

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

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

然后,封裝一個(gè)簡(jiǎn)單的裝飾器來(lái)計(jì)時(shí)函數(shù)運(yùn)行時(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ù),需要多少時(shí)間。

下面的示例中,循環(huán)讀取10次上面準(zhǔn)備的數(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)

運(yùn)行結(jié)果如下:

讀取一次大概27秒左右。

3. 壓縮讀取

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

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

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)

運(yùn)行結(jié)果如下:

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

4. 分批讀取

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

先試試每次讀取1萬(wàn)條

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)

運(yùn)行結(jié)果如下:

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

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

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

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

5. 使用polars讀取

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

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

它是用Rust寫(xiě)的,主打就是高性能。

使用Polars讀取文件之后返回的Dataframe雖然和pandasDataFrame不完全一樣,當(dāng)可以通過(guò)一個(gè)簡(jiǎn)單的to_pandas方法來(lái)完成轉(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)

運(yùn)行結(jié)果如下:

使用Polars后性能提高非常明顯,看來(lái),混合使用Polarspandas是一個(gè)不錯(cuò)的方案。

6. 序列化后讀取

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

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

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

生成一個(gè) 序列化文件:all_coin_factor_data_12H.pkl。

然后,測(cè)試下讀取這個(gè)序列化文件的性能。

@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)

運(yùn)行結(jié)果如下:

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

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

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

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

7. 總結(jié)

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

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

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

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

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

相關(guān)文章

  • Python爬蟲(chóng)小練習(xí)之爬取并分析騰訊視頻m3u8格式

    Python爬蟲(chóng)小練習(xí)之爬取并分析騰訊視頻m3u8格式

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶你爬下騰訊視頻的m3u8格式來(lái)分析,大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣
    2021-10-10
  • Python中的strip()的用法介紹和語(yǔ)法詳細(xì)講解

    Python中的strip()的用法介紹和語(yǔ)法詳細(xì)講解

    這篇文章主要介紹了Python中的strip()用法介紹和語(yǔ)法的相關(guān)資料,strip()是Python中字符串(str)對(duì)象的一個(gè)內(nèi)置方法,用于去除字符串開(kāi)頭和結(jié)尾的空白字符(包括空格、換行符、制表符等),需要的朋友可以參考下
    2025-07-07
  • 通過(guò)pycharm使用git的步驟(圖文詳解)

    通過(guò)pycharm使用git的步驟(圖文詳解)

    這篇文章主要介紹了通過(guò)pycharm使用git的步驟(圖文詳解),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python繪制3D立體花朵示例詳解

    Python繪制3D立體花朵示例詳解

    情人節(jié)送玫瑰花千篇一律?本文將為大家介紹利用Python繪制多種3D立體花朵的示例代碼,讓女友感受一下程序員的浪漫!快來(lái)跟隨小編一起學(xué)習(xí)一下吧
    2021-12-12
  • Python操作多維數(shù)組輸出和矩陣運(yùn)算示例

    Python操作多維數(shù)組輸出和矩陣運(yùn)算示例

    這篇文章主要介紹了Python操作多維數(shù)組輸出和矩陣運(yùn)算,結(jié)合實(shí)例形式分析了Python多維數(shù)組的生成、打印輸出及矩陣運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • Python?的矩陣傳播機(jī)制Broadcasting和矩陣運(yùn)算

    Python?的矩陣傳播機(jī)制Broadcasting和矩陣運(yùn)算

    這篇文章主要介紹了Python?的矩陣傳播機(jī)制Broadcasting和矩陣運(yùn)算,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • python 多線程死鎖問(wèn)題的解決方案

    python 多線程死鎖問(wèn)題的解決方案

    這篇文章主要介紹了python 多線程死鎖問(wèn)題的解決方案,幫助大家更好的理解和學(xué)習(xí)python 鎖,感興趣的朋友可以了解下
    2020-08-08
  • python人工智能tensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)CNN

    python人工智能tensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)CNN

    學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)已經(jīng)有一段時(shí)間,從普通的BP神經(jīng)網(wǎng)絡(luò)到LSTM長(zhǎng)短期記憶網(wǎng)絡(luò)都有一定的了解,但是從未系統(tǒng)的把整個(gè)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)記錄下來(lái),我相信這些小記錄可以幫助我更加深刻的理解神經(jīng)網(wǎng)絡(luò)
    2022-05-05
  • Python3.4學(xué)習(xí)筆記之列表、數(shù)組操作示例

    Python3.4學(xué)習(xí)筆記之列表、數(shù)組操作示例

    這篇文章主要介紹了Python3.4列表、數(shù)組操作,結(jié)合實(shí)例形式分析了Python3.4列表的創(chuàng)建、元素追加、刪除、排序等相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Python 中如何實(shí)現(xiàn)參數(shù)化測(cè)試的方法示例

    Python 中如何實(shí)現(xiàn)參數(shù)化測(cè)試的方法示例

    這篇文章主要介紹了Python 中如何實(shí)現(xiàn)參數(shù)化測(cè)試的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論

临海市| 三亚市| 南川市| 松江区| 威远县| 马公市| 哈密市| 平利县| 洞口县| 烟台市| 湛江市| 新乡县| 光山县| 阿拉善盟| 北碚区| 上思县| 日照市| 洛阳市| 柳州市| 宜春市| 罗平县| 霍山县| 白沙| 富宁县| 石首市| 黄龙县| 吉水县| 合肥市| 兴仁县| 东乌珠穆沁旗| 曲水县| 马鞍山市| 平原县| 江西省| 濮阳市| 光山县| 禹州市| 黄浦区| 吉安市| 海丰县| 沐川县|