Tips para mejorar la eficiencia de lectura de datos con PyArrow

👨‍💻 Aprendizaje
📅 2022-05-01

Por lo general, el motor o engine de lectura de datos de pandas es pyarrow, pero muchas veces nos parece más pesado que usar fastparquet por ejemplo, ambos no se comportan igual. Por lo que en mi caso imaginamos qué no puedo cambiar el engine porque por ejemplo fastparquet se dedica a explotar datos en sitios que no debería. Con estos dos consejos que voy a dar he mejorado mucho el rendimiento de lectura al mirar los tiempos de proceso.

Una cosa interesante es que cuando el fichero es muy grande en parquet y no necesitamos realmente todas las columnas para calcular nuestros datos, simplemente podemos evitarlas.

import pandas as pd

pd.read_parquet(data_source, columns=['metric', 'provider'])

Esto mejora con creces la eficiencia a la hora de leer un fichero, pero hay veces que me preguntaba si existía algo que pudiese filtrar por tipo de datos o por métrica y evitase leerla. La respuesta es un rotundo, sí, en esta página se habla de cómo realizar querys para leer exactamente lo necesario. Un ejemplo junto a lo anterior:

pd.read_parquet(
    data_source,
    columns=['metric', 'provider'],
    filters = [
        ('metric', 'in', ['your_metric']),
        ('provider', 'in', ['your_provider'])
    ])

Esto nos abre la posibilidad incluso de hacer querys más complejas, he descubierto qué a más explícita va más rápida la lectura hasta cierto punto. Dejo un ejemplo más avanzado:

pd.read_parquet(
    data_source,
    columns=['metric', 'provider'],
    filters = [
        [
            ('metric', 'in', ['your_metric_1']),
            ('provider', 'in', ['your_provider_1'])
        ],
        [
            ('metric', 'in', ['your_metric_2']),
            ('provider_code', 'in', ['your_provider_1', 'your_provider_2', 'your_provider_3'])
        ]])

Espero que os haya servido para mejorar vuestros procesos, cualquier feedback es bienvenido.