Python 3.x Can';无法打开比内存大的HDF5文件。。。数值误差

Python 3.x Can';无法打开比内存大的HDF5文件。。。数值误差,python-3.x,pandas,bigdata,hdf5,vaex,Python 3.x,Pandas,Bigdata,Hdf5,Vaex,我有许多.csv的纽约出租车从,一.csv=年-月。在那里,我抓取了CSV的cca 15,并用它们制作HDF5: import h5py import pandas as pd import os import glob import numpy as np import vaex from tqdm import tqdm_notebook as tqdm #hdf = pd.HDFStore('c:/Projekty/H5Edu/NYCTaxi/NYCTaxi.hp') #df1 =

我有许多.csv的纽约出租车从,一.csv=年-月。在那里,我抓取了CSV的cca 15,并用它们制作HDF5:

import h5py
import pandas as pd
import os 
import glob
import numpy as np

import vaex
from tqdm import  tqdm_notebook as tqdm

#hdf = pd.HDFStore('c:/Projekty/H5Edu/NYCTaxi/NYCTaxi.hp')
#df1 = pd.read_csv('path nejake csvcko')
#hdf.put('DF1', df1, format = 'table', data_columns = True)


csv_list = np.sort(np.array(glob.glob('G:\\NYCTaxi\\*.csv')))[::-1]

csv_list = csv_list[20:39]

output_dir = 'c:\\Datasety\\YelowTaxi\\DataH5\\'

for file in tqdm(csv_list, leave=False, desc='Converting to hdf5...'):
    # Setting up the files, and directories
    #zip_file = ZipFile(file)
    output_file = file.split('\\')[-1][:-3]+'hdf5'
    output = output_dir + output_file
    #output = output_file
    
    # Check if a converted file already exists: if it does skip it, otherwise read in the raw csv and convert it
    if (os.path.exists(output) and os.path.isfile(output)):
        pass
    else:
        # Importing the data into pandas 
        #pandas_df = [pd.read_csv(file, index_col=None, header=0)][0]
        pandas_df = [pd.read_csv(file, index_col=None, header=0, low_memory=False)][0]
        # Rename some columns to match the more well known dataset from 
        # http://stat-computing.org/dataexpo/2009/the-data.html
        

        # Importing the data from pandas to vaex
        vaex_df = vaex.from_pandas(pandas_df, copy_index=False)
        
        # Export the data with vaex to hdf5
        vaex_df.export_hdf5(path=output, progress=False)
接下来我制作一个大的HDF5:

import re
import glob
import vaex
import numpy as np

def tryint(s):
    try:
        return int(s)
    except:
        return s

def alphanum_key(s):
    """ Turn a string into a list of string and number chunks.
        "z23a" -> ["z", 23, "a"]
    """
    return [ tryint(c) for c in re.split('([0-9]+)', s) ]

hdf5_list = glob.glob('c:\\Datasety\\YelowTaxi\\DataH5\\*.hdf5')
hdf5_list.sort(key=alphanum_key)
hdf5_list = np.array(hdf5_list)

#assert len(hdf5_list) == 3, "Incorrect number of files"

# This is an important step
master_df = vaex.open_many(hdf5_list)

# exporting
#master_df.export_hdf5(path='c:\\Datasety\\YelowTaxi\\DataH5\\Spojene.hd5', progress=True)
master_df.export_hdf5(path='c:\\Datasety\\YelowTaxi\\DataH5\\Spojene.hdf5', progress=True)
到目前为止,一切正常,我可以打开输出文件Spojene.hdf5

接下来,我将new.csv附加到Spojene.hdf5:

for file in csv_list:
#file = csv_list[0]
    df2 = pd.read_csv(file, index_col=None, header=0, low_memory=False)
    filename = 'c:\\Datasety\\YelowTaxi\\DataH5\\Spojene.hdf5'
    df2.to_hdf(filename, 'data', append=True)
但是,当我将new.csv附加到Spojene.hdf5时,我无法打开它:

df = vaex.open('c:\\Datasety\\YelowTaxi\\DataH5\\Spojene.hdf5')
ValueError:第一列的长度为289184484,而列表的长度为60107988


请告诉我,我能做什么?

我认为这与熊猫如何创建hdf5文件有关。根据vaex的规定,如果HDF5文件是通过
to_hdf
方法创建的,则无法使用vaex打开该文件。如果附加到现有的HDF5文件,我假设情况相同

为避免此错误,您可以重新使用逻辑,将pandas数据帧转换为vaex数据帧,将其导出到HDF5,然后使用
open\u many
。像这样的方法应该会奏效:

main\u hdf5\u file\u path=“c:\\Datasety\\yelowtaix\\DataH5\\Spojene.hdf5”
hdf5_文件_已创建=[]
对于csv_列表中的文件:
hdf5_file=file.replace(“.csv”和“.hdf5”)
#from_csv可采用其他参数转发至pd.read_csv
#您还可以使用convert=True将其自动转换为hdf5,而无需导出hdf5
#指https://vaex.readthedocs.io/en/docs/api.html#vaex.from_csv
df=vaex.from_csv(文件)
df.export_hdf5(hdf5_文件)
已创建hdf5\u文件。追加(hdf5\u文件)
hdf5_to_read=hdf5_files_created+[main_hdf5_files_path]
最终df=vaex.打开多个(hdf5到读取)
最终导出hdf5(主hdf5文件路径)

我认为这与熊猫如何创建hdf5文件有关。根据vaex的规定,如果HDF5文件是通过
to_hdf
方法创建的,则无法使用vaex打开该文件。如果附加到现有的HDF5文件,我假设情况相同

为避免此错误,您可以重新使用逻辑,将pandas数据帧转换为vaex数据帧,将其导出到HDF5,然后使用
open\u many
。像这样的方法应该会奏效:

main\u hdf5\u file\u path=“c:\\Datasety\\yelowtaix\\DataH5\\Spojene.hdf5”
hdf5_文件_已创建=[]
对于csv_列表中的文件:
hdf5_file=file.replace(“.csv”和“.hdf5”)
#from_csv可采用其他参数转发至pd.read_csv
#您还可以使用convert=True将其自动转换为hdf5,而无需导出hdf5
#指https://vaex.readthedocs.io/en/docs/api.html#vaex.from_csv
df=vaex.from_csv(文件)
df.export_hdf5(hdf5_文件)
已创建hdf5\u文件。追加(hdf5\u文件)
hdf5_to_read=hdf5_files_created+[main_hdf5_files_path]
最终df=vaex.打开多个(hdf5到读取)
最终导出hdf5(主hdf5文件路径)

文件大小应该不是问题。通常,打开大于RAM的HDF5文件(至少用H5PY、PyTables、C、C++和FORTRAN)。这就是HDF5的全部要点。检查您的第二个流程-它与第一个流程不同。创建
Spojene.hdf5
时,使用
pd加载数据。读取\u csv()
,然后使用
。从\u pandas()
转换为vaex,然后使用
。导出\u hdf5()
。第二次加载时,使用
pd.read\u csv()
,但直接使用
df2.to\u hdf()将数据添加到
Spojene.hdf5
。不同的过程——不同的结果?调查每个进程的数据模式。也许它们不一致。文件大小应该不是问题。通常,打开大于RAM的HDF5文件(至少用H5PY、PyTables、C、C++和FORTRAN)。这就是HDF5的全部要点。检查您的第二个流程-它与第一个流程不同。创建
Spojene.hdf5
时,使用
pd加载数据。读取\u csv()
,然后使用
。从\u pandas()
转换为vaex,然后使用
。导出\u hdf5()
。第二次加载时,使用
pd.read\u csv()
,但直接使用
df2.to\u hdf()将数据添加到
Spojene.hdf5
。不同的过程——不同的结果?调查每个进程的数据模式。也许他们不一致。