日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

利用pandas读写HDF5文件

發(fā)布時(shí)間:2023/11/28 生活经验 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用pandas读写HDF5文件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、簡(jiǎn)介

HDF5(Hierarchical Data Formal)是用于存儲(chǔ)大規(guī)模數(shù)值數(shù)據(jù)的較為理想的存儲(chǔ)格式,文件后綴名為h5,存儲(chǔ)讀取速度非常快,且可在文件內(nèi)部按照明確的層次存儲(chǔ)數(shù)據(jù),同一個(gè)HDF5可以看做一個(gè)高度整合的文件夾,其內(nèi)部可存放不同類型的數(shù)據(jù)。在Python中操縱HDF5文件的方式主要有兩種,一是利用pandas中內(nèi)建的一系列HDF5文件操作相關(guān)的方法來(lái)將pandas中的數(shù)據(jù)結(jié)構(gòu)保存在HDF5文件中,二是利用h5py模塊來(lái)完成從Python原生數(shù)據(jù)結(jié)構(gòu)向HDF5格式的保存,本文就將針對(duì)pandas中讀寫HDF5文件的方法進(jìn)行介紹。

二、利用pandas操縱HDF5文件

2.1 寫出

pandas中的HDFStore()用于生成管理HDF5文件IO操作的對(duì)象,其主要參數(shù)如下:

path:字符型輸入,用于指定h5文件的名稱(不在當(dāng)前工作目錄時(shí)需要帶上完整路徑信息)

mode:用于指定IO操作的模式,與Python內(nèi)建的open()中的參數(shù)一致,默認(rèn)為’a’,即當(dāng)指定文件已存在時(shí)不影響原有數(shù)據(jù)寫入,指定文件不存在時(shí)則新建文件;‘r’,只讀模式;‘w’,創(chuàng)建新文件(會(huì)覆蓋同名舊文件);‘r+’,與’a’作用相似,但要求文件必須已經(jīng)存在;

complevel:int型,用于控制h5文件的壓縮水平,取值范圍在0-9之間,越大則文件的壓縮程度越大,占用的空間越小,但相對(duì)應(yīng)的在讀取文件時(shí)需要付出更多解壓縮的時(shí)間成本,默認(rèn)為0,代表不壓縮

下面我們創(chuàng)建一個(gè)HDF5 IO對(duì)象store:

import pandas as pdstore = pd.HDFStore('demo.h5')
'''查看store類型'''
print(store)

可以看到store對(duì)象屬于pandas的io類,通過(guò)上面的語(yǔ)句我們已經(jīng)成功的初始化名為demo.h5的的文件,本地也相應(yīng)的出現(xiàn)了如下的文件:

接下來(lái)我們創(chuàng)建pandas中不同的兩種對(duì)象,并將它們共同保存到store中,首先創(chuàng)建series對(duì)象:

import numpy as np#創(chuàng)建一個(gè)series對(duì)象
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s


接著我們創(chuàng)建一個(gè)dataframe對(duì)象:

#創(chuàng)建一個(gè)dataframe對(duì)象
df = pd.DataFrame(np.random.randn(8, 3),columns=['A', 'B', 'C'])
df


第一種方式利用鍵值對(duì)將不同的數(shù)據(jù)存入store對(duì)象中,這里為了代碼簡(jiǎn)潔使用了元組賦值法:

store['s'],store['df'] = s,df

第二種方式利用store對(duì)象的put()方法,其主要參數(shù)如下:

key:指定h5文件中待寫入數(shù)據(jù)的key

value:指定與key對(duì)應(yīng)的待寫入的數(shù)據(jù)

format:字符型輸入,用于指定寫出的模式,'fixed’對(duì)應(yīng)的模式速度快,但是不支持追加也不支持檢索;'table’對(duì)應(yīng)的模式以表格的模式寫出,速度稍慢,但是支持直接通過(guò)store對(duì)象進(jìn)行追加和表格查詢操作

使用put()方法將數(shù)據(jù)存入store對(duì)象中:

store.put(key='s',value=s);store.put(key='df',value=df)

既然是鍵值對(duì)的格式,那么可以查看store的items屬性(注意這里store對(duì)象只有items和keys屬性,沒(méi)有values屬性):

store.items


調(diào)用store對(duì)象中的數(shù)據(jù)直接用對(duì)應(yīng)的鍵名來(lái)索引即可:

store['df']


刪除store對(duì)象中指定數(shù)據(jù)的方法有兩種,一是使用remove()方法,傳入要?jiǎng)h除數(shù)據(jù)對(duì)應(yīng)的鍵:

store.remove('s')
print(store.keys())

二是使用Python中的關(guān)鍵詞del來(lái)刪除指定數(shù)據(jù):

del store['s']
print(store.keys())

打印出的結(jié)果都如下:

這時(shí)若想將當(dāng)前的store對(duì)象持久化到本地,只需要利用close()方法關(guān)閉store對(duì)象即可:

store['df']


刪除store對(duì)象中指定數(shù)據(jù)的方法有兩種,一是使用remove()方法,傳入要?jiǎng)h除數(shù)據(jù)對(duì)應(yīng)的鍵:

store.remove('s')
print(store.keys())

二是使用Python中的關(guān)鍵詞del來(lái)刪除指定數(shù)據(jù):

del store['s']
print(store.keys())

打印出的結(jié)果都如下:

這時(shí)若想將當(dāng)前的store對(duì)象持久化到本地,只需要利用close()方法關(guān)閉store對(duì)象即可:

store.close()
'''查看store連接狀況,False則代表已關(guān)閉'''
store.is_open


 這時(shí)本地的h5文件也相應(yīng)的存儲(chǔ)進(jìn)store對(duì)象關(guān)閉前包含的文件:

除了通過(guò)定義一個(gè)確切的store對(duì)象的方式,還可以從pandas中的數(shù)據(jù)結(jié)構(gòu)直接導(dǎo)出到本地h5文件中:

#創(chuàng)建新的數(shù)據(jù)框
df_ = pd.DataFrame(np.random.randn(5,5))
#導(dǎo)出到已存在的h5文件中,這里需要指定key
df_.to_hdf(path_or_buf='demo.h5',key='df_')
#創(chuàng)建于本地demo.h5進(jìn)行IO連接的store對(duì)象
store = pd.HDFStore('demo.h5')
#查看指定h5對(duì)象中的所有鍵
print(store.keys())

2.2 讀入

在pandas中讀入HDF5文件的方式主要有兩種,一是通過(guò)上一節(jié)中類似的方式創(chuàng)建與本地h5文件連接的IO對(duì)象,接著使用鍵索引或者store對(duì)象的get()方法傳入要提取數(shù)據(jù)的key來(lái)讀入指定數(shù)據(jù):

store = pd.HDFStore('demo.h5')
'''方式1'''
df1 = store['df']
'''方式2'''
df2 = store.get('df')
df1 == df2


可以看出這兩種方式都能順利讀取鍵對(duì)應(yīng)的數(shù)據(jù)。

第二種讀入h5格式文件中數(shù)據(jù)的方法是pandas中的read_hdf(),其主要參數(shù)如下:

path_or_buf:傳入指定h5文件的名稱

key:要提取數(shù)據(jù)的鍵

需要注意的是利用read_hdf()讀取h5文件時(shí)對(duì)應(yīng)文件不可以同時(shí)存在其他未關(guān)閉的IO對(duì)象,否則會(huì)報(bào)錯(cuò),如下例:

print(store.is_open)
df = pd.read_hdf('demo.h5',key='df')


store.close()
print(store.is_open)
df = pd.read_hdf(‘demo.h5’,key=‘df’)
df

2.3 速度比較

這一小節(jié)我們來(lái)測(cè)試一下對(duì)于存儲(chǔ)同樣數(shù)據(jù)的csv格式文件、h5格式的文件,在讀取速度上的差異情況:

這里我們首先創(chuàng)建一個(gè)非常大的數(shù)據(jù)框,由一億行x5列浮點(diǎn)類型的標(biāo)準(zhǔn)正態(tài)分布隨機(jī)數(shù)組成,接著分別用pandas中寫出HDF5和csv格式文件的方式持久化存儲(chǔ):

import pandas as pd
import numpy as np
import timestore = pd.HDFStore('store.h5')
#生成一個(gè)1億行,5列的標(biāo)準(zhǔn)正態(tài)分布隨機(jī)數(shù)表
df = pd.DataFrame(np.random.rand(100000000,5))
start1 = time.clock()
store['df'] = df
store.close()
print(f'HDF5存儲(chǔ)用時(shí){time.clock()-start1}秒')
start2 = time.clock()
df.to_csv('df.csv',index=False)
print(f'csv存儲(chǔ)用時(shí){time.clock()-start2}秒')


在寫出同樣大小的數(shù)據(jù)框上,HDF5比常規(guī)的csv快了將近50倍,而且兩者存儲(chǔ)后的文件大小也存在很大差異:


csv比HDF5多占用將近一倍的空間,這還是在我們沒(méi)有開(kāi)啟HDF5壓縮的情況下,接下來(lái)我們關(guān)閉所有IO連接,運(yùn)行下面的代碼來(lái)比較對(duì)上述兩個(gè)文件中數(shù)據(jù)還原到數(shù)據(jù)框上兩者用時(shí)差異:

import pandas as pd
import timestart1 = time.clock()
store = pd.HDFStore('store.h5',mode='r')
df1 = store.get('df')
print(f'HDF5讀取用時(shí){time.clock()-start1}秒')
start2 = time.clock()
df2 = pd.read_csv('df.csv')
print(f'csv讀取用時(shí){time.clock()-start2}秒')


 HDF5用時(shí)僅為csv的1/13,因此在涉及到數(shù)據(jù)存儲(chǔ)特別是規(guī)模較大的數(shù)據(jù)時(shí),HDF5是你不錯(cuò)的選擇。

以上就是本文的全部?jī)?nèi)容,如有筆誤望指出!
https://www.cnblogs.com/feffery/p/11135082.html

總結(jié)

以上是生活随笔為你收集整理的利用pandas读写HDF5文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。