Как эффективно выполнять условные скользящие агрегаты в Pandas с группировкой и фильтрацией результатов?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как эффективно выполнять условные скользящие агрегаты в Pandas с группировкой и фильтрацией результатов?

Сообщение Anonymous »

У меня есть большой DataFrame с миллионами строк, и я хочу эффективно выполнить следующее сложное преобразование:
import pandas as pd
import numpy as np

np.random.seed(42)
data = pd.DataFrame({
"Category": np.random.choice(['A', 'B', 'C'], size=1000),
"SubCategory": np.random.choice(['X', 'Y', 'Z'], size=1000),
"Date": pd.date_range('2023-01-01', periods=1000),
"Value": np.random.randint(1, 100, size=1000),
"Flag": np.random.choice([True, False], size=1000)
})


Мне нужно:
Сгруппировать DataFrame по категориям и подкатегориям.
В каждой группе отсортировать строки по столбцу «Дата».Для каждой группы рассчитайте скользящую сумму столбца «Значение» с размером окна 7, но только для строк, где флаг имеет значение True`.
После расчета скользящей суммы отфильтруйте строки, в которых скользящая сумма равна ниже 50.
Верните результат в виде нового DataFrame с иерархической индексацией (Категория, Подкатегория) и оставшимися строками, отсортированными по дате.
Желаемый результат:
Новый DataFrame с:
A многоуровневый индекс категории и подкатегории.
Только строки, соответствующие критериям фильтрации (скользящая сумма > 50 для строк, в которых установлен флаг). Верно).
Скользящая сумма включена в новый столбец под названием RollingSum.
Я пробовал использовать комбинацию groupby(),rolling() и apply(), но У меня возникли проблемы:
Как обрабатывать условную логику для Флага в скользящем вычислении.
Как оптимизировать этот процесс для больших DataFrames (например, избегать чрезмерных циклов) .
Вот моя первая попытка, которая работает медленно и не справляется с условным прокатом должным образом:
def calc_rolling(group):
group = group.sort_values('Date')
group['RollingSum'] = (
group.loc[group['Flag'], 'Value']
.rolling(window=7, min_periods=1)
.sum()
)
return group[group['RollingSum'] > 50]

result = data.groupby(['Category', 'SubCategory']).apply(calc_rolling)
result.set_index(['Category', 'SubCategory'], inplace=True)



Подробнее здесь: https://stackoverflow.com/questions/792 ... -and-filte
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Скользящие средние значения Pandas для дат после группировки по
    Гость » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Гость
  • Вложенные агрегаты Elasticsearch с данными Spring elasticsearch 5.2
    Anonymous » » в форуме Elasticsearch aggregation
    0 Ответы
    1097 Просмотры
    Последнее сообщение Anonymous
  • AggregateProjection не поддерживает агрегаты, которые являются обратимо удаленными базами данных Marten и C#.
    Anonymous » » в форуме C#
    0 Ответы
    76 Просмотры
    Последнее сообщение Anonymous
  • Какие агрегаты в этом приложении DDD?
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как подразделение рабочего шаблона соответствует ссылкам на новые агрегаты?
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»