Перебирать группы, созданные с использованием столбца группировки по дате

Я новичок в Polars. Я хочу перебрать группы, созданные путем группировки по столбцу, где каждая ячейка этого столбца содержит список из двух дат. Для этого я использовал следующий (пример) фрагмент кода, и он отлично работал с версией polars==0.20.18:

import polars as pl
import datetime

dt_str = [{'ts': datetime.date(2023, 7, 1), 'files': 'AGG_202307.xlsx',
           'period_bins': [datetime.date(2023, 7, 1), datetime.date(2024, 1, 1)]},
          {'ts': datetime.date(2023, 8, 1), 'files': 'AGG_202308.xlsx',
           'period_bins': [datetime.date(2023, 7, 1), datetime.date(2024, 1, 1)]},
          {'ts': datetime.date(2023, 11, 1), 'files': 'KFC_202311.xlsx',
           'period_bins': [datetime.date(2023, 7, 1), datetime.date(2024, 1, 1)]},
          {'ts': datetime.date(2024, 2, 1), 'files': 'KFC_202402.xlsx',
           'period_bins': [datetime.date(2024, 1, 1), datetime.date(2024, 7, 1)]}]

dt = pl.from_dicts(dt_str)

df_groups = dt.group_by("period_bins")
print(df_groups.all().to_dicts())

Приведенный выше код не работает с polars==1.x и выдает следующую ошибку:

thread 'polars-0' panicked at crates/polars-row/src/encode.rs:289:15:
not implemented: Date32
thread 'polars-1' panicked at crates/polars-row/src/encode.rs:289:15:
not implemented: Date32
Traceback (most recent call last):
  File "testpad.py", line 18, in <module>
    print(df_groups.all().to_dicts())
  File "python3.10/site-packages/polars/dataframe/group_by.py", line 430, in all
    return self.agg(F.all())
  File "python3.10/site-packages/polars/dataframe/group_by.py", line 228, in agg
    self.df.lazy()
  File "python3.10/site-packages/polars/lazyframe/frame.py", line 2027, in collect
    return wrap_df(ldf.collect(callback))
pyo3_runtime.PanicException: not implemented: Date32

Как исправить эту ошибку?

PanicException — это ошибка. Разработчики должны сообщить об этом и исправить. github.com/pola-rs/polars/issues

jqurious 16.08.2024 23:25

Хотя паника — это всегда ошибка, исправлением может быть просто возникновение именованной ошибки.

Dean MacGregor 17.08.2024 04:37

Возможно, я что-то упускаю: проблема, похоже, в том, что группировка по списку дат раньше работала, но теперь вместо этого вызывает PanicException. Это похоже на настоящую регрессию, которую нужно решить?

jqurious 17.08.2024 10:32

@jqurious справедливая точка зрения. Я обращаю внимание на group_by как на итератор, и я знаю, что поведение в какой-то момент изменилось, но я просто на мобильном телефоне, поэтому не проверял.

Dean MacGregor 18.08.2024 01:05

@ritchie46 внес исправление: github.com/pola-rs/polars/pull/18251

jqurious 18.08.2024 13:11

Большое спасибо за поддержку!

arman 19.08.2024 14:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
6
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В качестве обходного пути вы можете группировать по .hash() (или приводить).

(df.group_by(pl.col("period_bins").hash().alias("key"))
   .all()
)
shape: (2, 4)
┌─────────────────────┬─────────────────────────────────┬─────────────────────────────────┬─────────────────────────────────┐
│ key                 ┆ ts                              ┆ files                           ┆ period_bins                     │
│ ---                 ┆ ---                             ┆ ---                             ┆ ---                             │
│ u64                 ┆ list[date]                      ┆ list[str]                       ┆ list[list[date]]                │
╞═════════════════════╪═════════════════════════════════╪═════════════════════════════════╪═════════════════════════════════╡
│ 6836989170623494942 ┆ [2023-07-01, 2023-08-01, 2023-… ┆ ["AGG_202307.xlsx", "AGG_20230… ┆ [[2023-07-01, 2024-01-01], [20… │
│ 2692156858231355433 ┆ [2024-02-01]                    ┆ ["KFC_202402.xlsx"]             ┆ [[2024-01-01, 2024-07-01]]      │
└─────────────────────┴─────────────────────────────────┴─────────────────────────────────┴─────────────────────────────────┘

Другие вопросы по теме