Вот упрощенная версия моего текущего подхода:
Код: Выделить всё
import pandas as pd
df = pd.DataFrame({
'category': ['A', 'B', 'A', 'B'] * 10**6,
'subcategory': ['X', 'Y', 'X', 'Y'] * 10**6,
'value': [1, 2, 3, 4] * 10**6,
'quantity': [10, 20, 30, 40] * 10**6
})
agg_functions = {
'value': ['sum', 'mean'],
'quantity': [lambda x: x.sum(), lambda x: (x > 20).mean()]
}
result = df.groupby(['category', 'subcategory']).agg(agg_functions)
1. Кадр данных слишком велик, и приведенному выше коду не хватает памяти при работе с реальными данными.
2. Некоторые пользовательские функции агрегирования (например, лямбда-функции для количества) работают медленно и не позволяют эффективно использовать векторизованные операции.
3. Я хочу применить эти агрегаты более эффективно с точки зрения использования памяти, не прибегая к фрагментированию данных.
Вопросы:
1. Как оптимизировать операции группировки и суммирования для более эффективной обработки больших наборов данных, особенно при применении пользовательских функций?
2. Существуют ли какие-либо передовые методы, такие как использование numba, cython или параллельной обработки, для ускорения пользовательских агрегатов в группе Pandas?
3. Обеспечит ли в этом случае преобразование фрейма данных в другую структуру, например с использованием Polars, Dask или PySpark, значительное повышение производительности или есть способ сохранить его в Pandas и при этом оптимизировать производительность?
Мне нужны советы по повышению производительности по управлению памятью и оптимизации скорости при сохранении гибкости пользовательских агрегатов. Будем признательны за любые рекомендации по передовым методам или передовым методам!
Что я пробовал:
1. Базовый GroupBy с Pandas: я начал с использования функции Pandas groupby() с пользовательскими функциями агрегирования (например, лямбда-функциями), но это было слишком медленно для моего набора данных, содержащего миллионы строк. Лямбда-функции, особенно для условной агрегации, значительно замедляли производительность.
2. Оптимизация использования памяти: я попытался сократить потребление памяти, преобразовав столбцы в более эффективные типы данных (category для категориальных данных, int32 для целых чисел), но, хотя это помогло с памятью, время выполнения группировки и агрегации все еще было очень медленно.
3. Фрагментирование данных: я пытался обрабатывать данные частями, используя pd.read_csv() с chunksize, но управление частями и выполнение операций группировки между частями стало затруднительным, а объединение результатов привело к увеличению накладных расходов.4. Многопоточность с помощью joblib: я использовал joblib для распараллеливания применения пользовательских функций агрегирования, но прирост производительности был минимальным, вероятно, из-за характера пользовательских лямбда-функций и накладных расходов на управление несколькими потоками.5. Dask DataFrame: я экспериментировал с Dask, чтобы распределить рабочую нагрузку между несколькими ядрами, но управление пользовательскими функциями и обеспечение эффективного распределения всех операций усложняло работу без существенного улучшения производительности.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ple-custom