Je viens d'avoir ce problème il y a quelques jours! Je ne suis pas sûr que cela vous aide dans votre cas particulier, car vous ne fournissez pas autant de détails, mais ma situation était de travailler hors ligne sur un jeu de données «volumineux». Les données ont été obtenues sous forme de fichiers CSV compressés à 20 Go à partir de compteurs d’énergie, ainsi que des données chronologiques à plusieurs secondes.
Fichier IO:
data_root = r"/media/usr/USB STICK"
fname = r"meters001-050-timestamps.csv.gz"
this_file = os.path.join(data_root,fname)
assert os.path.exists(this_file), this_file
this_file
Créez un itérateur de bloc directement sur le fichier gzip (ne décompressez pas le fichier!)
cols_to_keep = [0,1,2,3,7]
column_names = ['METERID','TSTAMP','ENERGY','POWER_ALL','ENERGY_OUT',]
parse_dates = ['TSTAMP']
dtype={'METERID': np.int32,
'ENERGY': np.int32,
'POWER_ALL': np.int32,
'ENERGY_OUT': np.int32,
}
df_iterator = pd.read_csv(this_file,
skiprows=0,
compression='gzip',
chunksize=1000000,
usecols=cols_to_keep,
delimiter=";",
header=None,
names = column_names,
dtype=dtype,
parse_dates=parse_dates,
index_col=1,
)
Itérer sur les morceaux
new_df = pd.DataFrame()
count = 0
for df in df_iterator:
chunk_df_15min = df.resample('15T').first()
#chunk_df_30min = df.resample('30T').first()
#chunk_df_hourly = df.resample('H').first()
this_df = chunk_df_15min
this_df = this_df.pipe(lambda x: x[x.METERID == 1])
#print("chunk",i)
new_df = pd.concat([new_df,chunk_df_15min])
print("chunk",count, len(chunk_df_15min), 'rows added')
#print("chunk",i, len(temp_df),'rows added')
#break
count += 1
À l'intérieur de la boucle de morceau, je filtre et ré-échantillonne à temps. Ce faisant, j'ai réduit la taille de 20 Go à quelques centaines de Mo HDF5 pour une exploration plus poussée des données hors connexion.