Ищем более эффективный метод в Python и Polars для ежемесячного сравнения в течение каждого года.Python

Программы на Python
Ответить
Anonymous
 Ищем более эффективный метод в Python и Polars для ежемесячного сравнения в течение каждого года.

Сообщение Anonymous »

У меня есть данные о потреблении энергии в формате CSV с течением времени (каждый месяц в течение нескольких лет).

Я хочу определить процент (десятичную часть) для каждого месяца в течение этого года; например, август составлял 12,3% от общего потребления за 2025 календарный год.

В настоящее время я делаю это, собирая данные в фрейме данных, затем генерирую второй фрейм данных, используя .group_by("Cons Year", Maintenance_order=True).sum(), а затем, наконец, используя .join(df_yearly_total, on='Cons Year', How="left") чтобы объединить эту годовую сумму с исходным фреймом данных.
Да, это работает; но это не очень-то полярно. Ищете информацию о том, как правильно проводить такое ежемесячное сравнение в течение нескольких лет, одновременно улучшая читаемость и уменьшая раздувание кода.
Текущий код и выходные данные:
df_util_compare = (
df_util
.select(
[
'Service End Date',
'Metered Consumption',
'Number of Days',
'Cons Month',
'Cons Year',
]) # select the needed columns
# .sort("Service End Date")
)
with pl.Config(tbl_cols=15, tbl_rows=6, tbl_width_chars=180, tbl_formatting="UTF8_FULL_CONDENSED", fmt_str_lengths=120, tbl_hide_dataframe_shape=False):
print(df_util_compare.__repr__())

df_yearly_total = (
df_util_compare
.select(['Metered Consumption', 'Cons Year'])
.group_by("Cons Year", maintain_order=True).sum()
.rename({"Metered Consumption": "Yearly Consumption"})
)
print(df_yearly_total)

df_util_compare = (
df_util_compare
.join(df_yearly_total, on='Cons Year', how="left")
.with_columns((pl.col('Metered Consumption')/pl.col('Yearly Consumption')).alias('Monthly KW Portion'))
)
with pl.Config(tbl_cols=15, tbl_rows=6, tbl_width_chars=180, tbl_formatting="UTF8_FULL_CONDENSED", fmt_str_lengths=120, tbl_hide_dataframe_shape=False):
print(df_util_compare)

выдает следующий результат:
shape: (48, 5)
┌──────────────────┬─────────────────────┬────────────────┬────────────┬───────────┐
│ Service End Date ┆ Metered Consumption ┆ Number of Days ┆ Cons Month ┆ Cons Year │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ date ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞══════════════════╪═════════════════════╪════════════════╪════════════╪═══════════╡
│ 2025-09-03 ┆ 1387 ┆ 30 ┆ 9 ┆ 2025 │
│ 2025-08-04 ┆ 2496 ┆ 33 ┆ 8 ┆ 2025 │
│ 2025-07-02 ┆ 1684 ┆ 29 ┆ 7 ┆ 2025 │
│ … ┆ … ┆ … ┆ … ┆ … │
│ 2021-12-02 ┆ 2521 ┆ 30 ┆ 12 ┆ 2021 │
│ 2021-11-02 ┆ 777 ┆ 29 ┆ 11 ┆ 2021 │
│ 2021-10-04 ┆ 278 ┆ 13 ┆ 10 ┆ 2021 │
└──────────────────┴─────────────────────┴────────────────┴────────────┴───────────┘
shape: (5, 2)
┌───────────┬────────────────────┐
│ Cons Year ┆ Yearly Consumption │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═══════════╪════════════════════╡
│ 2025 ┆ 20296 │
│ 2024 ┆ 16164 │
│ 2023 ┆ 16194 │
│ 2022 ┆ 18143 │
│ 2021 ┆ 3576 │
└───────────┴────────────────────┘
shape: (48, 7)
┌──────────────────┬─────────────────────┬────────────────┬────────────┬───────────┬────────────────────┬────────────────────┐
│ Service End Date ┆ Metered Consumption ┆ Number of Days ┆ Cons Month ┆ Cons Year ┆ Yearly Consumption ┆ Monthly KW Portion │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ date ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ f64 │
╞══════════════════╪═════════════════════╪════════════════╪════════════╪═══════════╪════════════════════╪════════════════════╡
│ 2025-09-03 ┆ 1387 ┆ 30 ┆ 9 ┆ 2025 ┆ 20296 ┆ 0.068339 │
│ 2025-08-04 ┆ 2496 ┆ 33 ┆ 8 ┆ 2025 ┆ 20296 ┆ 0.12298 │
│ 2025-07-02 ┆ 1684 ┆ 29 ┆ 7 ┆ 2025 ┆ 20296 ┆ 0.082972 │
│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │
│ 2021-12-02 ┆ 2521 ┆ 30 ┆ 12 ┆ 2021 ┆ 3576 ┆ 0.704978 │
│ 2021-11-02 ┆ 777 ┆ 29 ┆ 11 ┆ 2021 ┆ 3576 ┆ 0.217282 │
│ 2021-10-04 ┆ 278 ┆ 13 ┆ 10 ┆ 2021 ┆ 3576 ┆ 0.07774 │
└──────────────────┴─────────────────────┴────────────────┴────────────┴───────────┴────────────────────┴────────────────────┘


Подробнее здесь: https://stackoverflow.com/questions/798 ... mparison-w
Ответить

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

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

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

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

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