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».
Вот пример сводной статистики моих попыток.
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
Мобильная версия