Les deux sont des formats de stockage (disque) colonnaires utilisés dans les systèmes d'analyse de données. Les deux sont intégrés dans Apache Arrow (paquet pyarrow pour python) et sont conçus pour correspondre à Arrow en tant que couche d'analyse en mémoire colonnaire.
En quoi les deux formats diffèrent-ils?
Devriez-vous toujours privilégier Feather lors de travailler avec pandas quand c'est possible?
Quels sont les cas d'utilisation où feather est plus adapté que parquet et vice versa?
Annexe
J'ai trouvé quelques indications ici https://github.com/wesm/feather/issues/188, mais étant donné la jeunesse de ce projet, cela pourrait être un peu obsolète.
Il ne s'agit pas d'un test de vitesse sérieux car je viens de déverser et de charger un DataFrame entier pour vous donner une idée si vous n'avez jamais entendu parler des formats avant:
# IPython
import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.feather as feather
import pyarrow.parquet as pq
import fastparquet as fp
df = pd.DataFrame({'one': [-1, np.nan, 2.5],
'two': ['foo', 'bar', 'baz'],
'three': [True, False, True]})
print("pandas df to disk ####################################################")
print('example_feather:')
%timeit feather.write_feather(df, 'example_feather')
# 2.62 ms ± 35.8 µs par boucle (moyenne ± écart type de 7 exécutions, 100 boucles chacune)
print('example_parquet:')
%timeit pq.write_table(pa.Table.from_pandas(df), 'example.parquet')
# 3.19 ms ± 51 µs par boucle (moyenne ± écart type de 7 exécutions, 100 boucles chacune)
print()
print("pour comparaison:")
print('example_pickle:')
%timeit df.to_pickle('example_pickle')
# 2.75 ms ± 18.8 µs par boucle (moyenne ± écart type de 7 exécutions, 100 boucles chacune)
print('example_fp_parquet:')
%timeit fp.write('example_fp_parquet', df)
# 7.06 ms ± 205 µs par boucle (moyenne ± écart type de 7 exécutions, 1 boucle chacune)
print('example_hdf:')
%timeit df.to_hdf('example_hdf', 'key_to_store', mode='w', table=True)
# 24.6 ms ± 4.45 ms par boucle (moyenne ± écart type de 7 exécutions, 100 boucles chacune)
print()
print("pandas df from disk ##################################################")
print('example_feather:')
%timeit feather.read_feather('example_feather')
# 969 µs ± 1.8 µs par boucle (moyenne ± écart type de 7 exécutions, 1000 boucles chacune)
print('example_parquet:')
%timeit pq.read_table('example.parquet').to_pandas()
# 1.9 ms ± 5.5 µs par boucle (moyenne ± écart type de 7 exécutions, 1000 boucles chacune)
print("pour comparaison:")
print('example_pickle:')
%timeit pd.read_pickle('example_pickle')
# 1.07 ms ± 6.21 µs par boucle (moyenne ± écart type de 7 exécutions, 1000 boucles chacune)
print('example_fp_parquet:')
%timeit fp.ParquetFile('example_fp_parquet').to_pandas()
# 4.53 ms ± 260 µs par boucle (moyenne ± écart type de 7 exécutions, 1 boucle chacune)
print('example_hdf:')
%timeit pd.read_hdf('example_hdf')
# 10 ms ± 43.4 µs par boucle (moyenne ± écart type de 7 exécutions, 100 boucles chacune)
# version pandas : 0.22.0
# version fastparquet : 0.1.3
# version numpy : 1.13.3
# version pandas : 0.22.0
# version pyarrow : 0.8.0
# sys.version: 3.6.3
# Exemple de DataFrame pris sur https://arrow.apache.org/docs/python/parquet.html