Как вычислить разные статистические данные, используя select/filter/group_by/value_counts в PolarsPython

Программы на Python
Ответить
Anonymous
 Как вычислить разные статистические данные, используя select/filter/group_by/value_counts в Polars

Сообщение Anonymous »

У меня есть следующий кадр данных с тремя столбцами: Cost, State и StartTime.
import polars as pl
from datetime import datetime

df = pl.DataFrame({
"Cost": [1, 2, 3],
"State": ["KO", "OK", "OK"],
"StartTime": [datetime(2023, 6, 23), datetime(2024, 6, 22), datetime(2024, 6, 21)],
})

shape: (3, 3)
┌──────┬───────┬─────────────────────┐
│ Cost ┆ State ┆ StartTime │
│ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ datetime[μs] │
╞══════╪═══════╪═════════════════════╡
│ 1 ┆ KO ┆ 2023-06-23 00:00:00 │
│ 2 ┆ OK ┆ 2024-06-22 00:00:00 │
│ 3 ┆ OK ┆ 2024-06-21 00:00:00 │
└──────┴───────┴─────────────────────┘

Я хотел бы вычислить:
  • среднюю и общую стоимость — один раз для всего кадра данных и один раз только для текущего месяца. Я бы хотел, чтобы результат сохранялся в одном кадре данных.
  • Ежедневная частота (например, путем вычисления количества строк с одинаковой датой).
  • Также подсчитывается процентное соотношение «Состояние», равное «ОК» и равное «KO».
Как этого можно достичь в полях Python без вычисления каждого значения отдельно, если это возможно? Спасибо!
Вот пример сводной статистики моих попыток.
this_year = datetime.now().year
this_month = datetime.now().month
filter_this_year_month_exp = (pl.col('StartTime').dt.year() == this_year) & (pl.col('StartTime').dt.month() == this_month)
df = df.with_columns(
pl.col('StartTime').dt.date().alias('StartDate')
)
stats = df.select(
pl.col("Cost").sum().alias("TotalCost"),
pl.col("Cost").mean().alias("AverageCost"),
pl.col("Cost").filter(filter_this_year_month_exp).sum().alias("TotalCostCurrentMonth"),
pl.col("Cost").filter(filter_this_year_month_exp).mean().alias("AverageCostCurrentMonth"),
)
frequency_per_day_in_this_month = df.filter(
filter_this_year_month_exp
).group_by('StartDate').len().select("len").mean().item()
# this returns just the counts, should be divided by len(df) to compute the percentage
df.select(
pl.col("State").value_counts()
).unnest("State")


Подробнее здесь: https://stackoverflow.com/questions/786 ... up-by-valu
Ответить

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

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

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

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

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