У меня есть данные о потреблении энергии в формате 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
Ищем более эффективный метод в Python и Polars для ежемесячного сравнения в течение каждого года. ⇐ Python
Программы на Python
1763052741
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 │
└──────────────────┴─────────────────────┴────────────────┴────────────┴───────────┴────────────────────┴────────────────────┘
Подробнее здесь: [url]https://stackoverflow.com/questions/79819152/seeking-more-efficient-method-in-python-polars-to-perform-monthly-comparison-w[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия