¡Acabo de tener este problema hace unos días! No estoy seguro de si esto ayuda en su caso específico, ya que no proporciona tantos detalles, pero mi situación era trabajar sin conexión en un conjunto de datos 'grande'. Los datos se obtuvieron como archivos CSV comprimidos de 20 GB de medidores de energía, datos de series de tiempo a intervalos de varios segundos.
Archivo 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
Cree un iterador de fragmentos directamente sobre el archivo gzip (¡no lo descomprima!)
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,
)
Iterar sobre los trozos
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
Dentro del bucle de fragmentos, estoy filtrando y volviendo a muestrear a tiempo. Al hacer esto, reduje el tamaño de 20 GB a unos pocos cientos de MB HDF5 para una mayor exploración de datos fuera de línea.