Фильтрация методом dask read_parquet дает нежелательные результаты

Я пытаюсь читать файлы паркета, используяdaskread_parquet метод и filters kwarg. однако иногда он не фильтруется в соответствии с заданным условием.

Пример: создание и сохранение фрейма данных с dates колонка

import pandas as pd
import numpy as np
import dask.dataframe as dd

nums  = range(1,6)
dates = pd.date_range('2018-07-01', periods=5, freq='1d')
df = pd.DataFrame({'dates':dates, 'nums': nums})

ddf = dd.from_pandas(df, npartitions=3).to_parquet('test_par', engine = 'fastparquet')

когда я читаю и фильтрую dates колонка из 'test_par' папка не работает

filters=[('dates', '>', np.datetime64('2018-07-04'))]
df  = dd.read_parquet('test_par', engine='fastparquet', filters=filters).compute()

как вы можете видеть на выходе, 2018-07-03 а также 2018-07-04 присутствуют.

+-------+------------+------+
|       | dates      | nums |
+-------+------------+------+
| index |            |      |
+-------+------------+------+
| 2     | 2018-07-03 | 3    |
+-------+------------+------+
| 3     | 2018-07-04 | 4    |
+-------+------------+------+
| 4     | 2018-07-05 | 5    |
+-------+------------+------+

Я делаю что-то неправильно? или я должен сообщить об этом на github?

1 ответ

Решение

filters Ключевое слово - это действие по группам строк (группа строк - это термин для набора строк данных, например раздел для фрейма данных). Он не выполняет никакой фильтрации внутри разделов.

Когда вы используете filters, вы будете исключать разделы, в которых, согласно статистике max/min в файле, в данном разделе нет строк, которые могли бы соответствовать данному фильтру. Например, если вы укажете x>5, раздел с min=2,max=4 будет исключен, а раздел с min=2,max=6 не будет, даже если последний будет содержать только несколько строк, которые соответствуют фильтр.

Чтобы отфильтровать данные, вы все равно должны использовать обычный синтаксис

df[df.dates > np.datetime64('2018-07-04')]

в дополнение к фильтру и просмотра использования фильтров в качестве дополнительной оптимизации. Без этого Dask должен был бы прочитать даже разделы без хороших данных, а затем применить условие, что не дало бы результатов для этих разделов. Лучше не загружать их, если это возможно.

Другие вопросы по тегам