Хотите понизить дискретизацию кадра данных временных рядов с помощью Polars groupby_dynamic, включая пустые ячейки

Я пытаюсь субдискретизировать фрейм данных в полярах, в котором есть столбец с метками времени. Я хочу уменьшить дискретизацию столбца до интервалов в 1 с. Но когда я делаю это с помощью groupby_dynamic, в результате появляются только те секунды, которые имеют значения. Но я хочу, чтобы результат содержал даже секунды, в которых нет записей, чтобы я мог пересылать заполнение.

Я попробовал groupby_dynamic, и, похоже, он не делает то, что я хочу.

taq_df.groupby_dynamic("timestamp", every = '1s').agg(pl.exclude("bestex_timestamp").last())

Можете ли вы показать нам небольшой пример фрейма данных вместе с ожидаемым результатом?

jqurious 11.05.2024 14:16
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

TLDR. Применение pl.DataFrame.upsample после агрегации заполнит недостающие временные метки.

Рассмотрим следующий пример кадра.

import polars as pl
from datetime import datetime

df = pl.DataFrame({
    "timestamp": [
        datetime(2024, 1, 1, 0, 0, 0, 0), 
        datetime(2024, 1, 1, 0, 0, 2, 5),
        datetime(2024, 1, 1, 0, 0, 3, 0), 
        datetime(2024, 1, 1, 0, 0, 5, 1),
    ],
    "value": [1, 2, 3, 4],
}).set_sorted("timestamp")
shape: (4, 2)
┌────────────────────────────┬───────┐
│ timestamp                  ┆ value │
│ ---                        ┆ ---   │
│ datetime[μs]               ┆ i64   │
╞════════════════════════════╪═══════╡
│ 2024-01-01 00:00:00        ┆ 1     │
│ 2024-01-01 00:00:02.000005 ┆ 2     │
│ 2024-01-01 00:00:03        ┆ 3     │
│ 2024-01-01 00:00:05.000001 ┆ 4     │
└────────────────────────────┴───────┘

Простое применение pl.DataFrame.group_by_dynamic, как предложено в вопросе, приводит к следующему кадру данных (с отсутствующими метками времени для секунд 1 и 4).

(
    df
    .group_by_dynamic(index_column = "timestamp", every = "1s")
    .agg(pl.col("value").last())
)
shape: (4, 2)
┌─────────────────────┬───────┐
│ timestamp           ┆ value │
│ ---                 ┆ ---   │
│ datetime[μs]        ┆ i64   │
╞═════════════════════╪═══════╡
│ 2024-01-01 00:00:00 ┆ 1     │
│ 2024-01-01 00:00:02 ┆ 2     │
│ 2024-01-01 00:00:03 ┆ 3     │
│ 2024-01-01 00:00:05 ┆ 4     │
└─────────────────────┴───────┘

Теперь применение pl.DataFrame.upsample заполняет недостающие временные метки. Все остальные столбцы будут иметь нулевые значения для новых строк.


    df
    .group_by_dynamic(index_column = "timestamp", every = "1s")
    .agg(pl.col("value").last())
    .upsample("timestamp", every = "1s")
)
shape: (6, 2)
┌─────────────────────┬───────┐
│ timestamp           ┆ value │
│ ---                 ┆ ---   │
│ datetime[μs]        ┆ i64   │
╞═════════════════════╪═══════╡
│ 2024-01-01 00:00:00 ┆ 1     │
│ 2024-01-01 00:00:01 ┆ null  │
│ 2024-01-01 00:00:02 ┆ 2     │
│ 2024-01-01 00:00:03 ┆ 3     │
│ 2024-01-01 00:00:04 ┆ null  │
│ 2024-01-01 00:00:05 ┆ 4     │
└─────────────────────┴───────┘

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

Похожие вопросы

Как использовать переменную для итерации в шаблоне Django?
Как правильно индексировать фрейм данных с помощью функции?
Как лучше всего объединить два кадра данных, один из которых имеет перекрывающиеся диапазоны?
Почему randint распределен неравномерно?
Как использовать алгоритм агломеративной кластеризации из библиотеки Python scikit-learn с объявленным количеством объектов в кластере?
Неопределенный символ: _ZN15TracebackLoggerC1EPKc, версия libcudnn_ops_infer.so.8
Токенизаторы && Docker: не удалось создать колеса для токенизаторов, которые необходимы для установки проектов на основе pyproject.toml
Продукты Django не добавляются в корзину сразу
Мои потери при тестировании увеличиваются, но потери поездов для нейронной сети уменьшаются. Что я должен делать?
Установлен модуль Python `owiener`, но во время импорта продолжает появляться сообщение «Нет модуля с именем «owiener»»