Правильный способ использования полярных полей ignore_every с Rolling_sumPython

Программы на Python
Ответить
Anonymous
 Правильный способ использования полярных полей ignore_every с Rolling_sum

Сообщение Anonymous »

Цель: используя временной ряд с частотой 1 секунду для каждой секунды, найдите значения 1 минуты, 2 минуты, 3 минуты, 4 минуты, 5 минут назад и просуммируйте 5 значений. Например, значение, рассчитанное для 23:59:59, будет суммой значений для 23:59:59, 23:58:59, 23:57:59, 23:56:59, 23:55:59. Значение, рассчитанное для 23:59:58, будет суммой значений в 23:59:58, 23:58:58, 23:57:58, 23:56:58, 23:55:58 и т. д.
Как правильно использовать полярные значения для расчета?
Я пробовал сбор_каждый(60).rolling_sum(5), который имел ShapeError. Затем я попытался использовать сбор_каждый и Rolling_sum отдельно, затем объединить, но в кадре данных сверху и снизу отображается значение NULL, что означает, что строки были добавлены случайным образом.
В исходе 7 столбец значений_gather_every должен иметь значение NULL вверху и значения внизу, чтобы быть правильным.
Пожалуйста, посмотрите код и выходные данные из блокнота ниже:
Код 1
import polars as pl
import numpy as np
from datetime import datetime, timedelta

start = datetime(2023, 1, 1)
seconds = 86400
end = start + timedelta(seconds=seconds-1)
values = np.arange(1, seconds + 1)

df = pl.DataFrame({
'dt': pl.datetime_range(start=start, end=end, interval="1s", eager=True),
'values': values
})
print(df)

Выход 1
shape: (86_400, 2)
┌─────────────────────┬────────┐
│ dt ┆ values │
│ --- ┆ --- │
│ datetime[μs] ┆ i64 │
╞═════════════════════╪════════╡
│ 2023-01-01 00:00:00 ┆ 1 │
│ 2023-01-01 00:00:01 ┆ 2 │
│ 2023-01-01 00:00:02 ┆ 3 │
│ 2023-01-01 00:00:03 ┆ 4 │
│ … ┆ … │
│ 2023-01-01 23:59:56 ┆ 86397 │
│ 2023-01-01 23:59:57 ┆ 86398 │
│ 2023-01-01 23:59:58 ┆ 86399 │
│ 2023-01-01 23:59:59 ┆ 86400 │
└─────────────────────┴────────┘

Код 2
df = df.with_columns(pl.col("values").gather_every(60).rolling_sum(5).name.suffix("_gather_every_rolling_sum"))

Выход 2
ShapeError: unable to add a column of length 1440 to a dataframe of height 86400

Код 3
gather_every_df = df.select("values").gather_every(60)
gather_every_df = gather_every_df.rename({"values": "values_gather_every"})
print(gather_every_df)

Выход 3
shape: (1_440, 1)
┌─────────────────────┐
│ values_gather_every │
│ --- │
│ i64 │
╞═════════════════════╡
│ 1 │
│ 61 │
│ 121 │
│ 181 │
│ 241 │
│ … │
│ 86101 │
│ 86161 │
│ 86221 │
│ 86281 │
│ 86341 │
└─────────────────────┘

Код 4
rolling_sum_df = gather_every_df.select("values_gather_every").rolling_sum(5)
print(rolling_sum_df)

Выход 4
AttributeError: 'DataFrame' object has no attribute 'rolling_sum'

Код 5
rolling_sum_series = gather_every_df.select("values_gather_every").to_series().rolling_sum(5)
print(rolling_sum_series)

Выход 5
shape: (1_440,)
Series: 'values_gather_every' [i64]
[
null
null
null
null
605
905
1205
1505
1805
2105
2405
2705

427505
427805
428105
428405
428705
429005
429305
429605
429905
430205
430505
430805
431105
]

Код 6
rolling_sum_df = pl.DataFrame({
'values_gather_every_rolling_sum': rolling_sum_series
})
print(rolling_sum_df)

Выход 6
shape: (1_440, 1)
┌─────────────────────────────────┐
│ values_gather_every_rolling_su… │
│ --- │
│ i64 │
╞═════════════════════════════════╡
│ null │
│ null │
│ null │
│ null │
│ 605 │
│ … │
│ 429905 │
│ 430205 │
│ 430505 │
│ 430805 │
│ 431105 │
└─────────────────────────────────┘

Код 7
df2 = pl.concat([df, gather_every_df, rolling_sum_df], how="horizontal")
print(df2)
print(df2.describe())

Выход 7
shape: (86_400, 4)
┌─────────────────────┬────────┬─────────────────────┬─────────────────────────────────┐
│ dt ┆ values ┆ values_gather_every ┆ values_gather_every_rolling_su… │
│ --- ┆ --- ┆ --- ┆ --- │
│ datetime[μs] ┆ i64 ┆ i64 ┆ i64 │
╞═════════════════════╪════════╪═════════════════════╪═════════════════════════════════╡
│ 2023-01-01 00:00:00 ┆ 1 ┆ 1 ┆ null │
│ 2023-01-01 00:00:01 ┆ 2 ┆ 61 ┆ null │
│ 2023-01-01 00:00:02 ┆ 3 ┆ 121 ┆ null │
│ 2023-01-01 00:00:03 ┆ 4 ┆ 181 ┆ null │
│ 2023-01-01 00:00:04 ┆ 5 ┆ 241 ┆ 605 │
│ … ┆ … ┆ … ┆ … │
│ 2023-01-01 23:59:55 ┆ 86396 ┆ null ┆ null │
│ 2023-01-01 23:59:56 ┆ 86397 ┆ null ┆ null │
│ 2023-01-01 23:59:57 ┆ 86398 ┆ null ┆ null │
│ 2023-01-01 23:59:58 ┆ 86399 ┆ null ┆ null │
│ 2023-01-01 23:59:59 ┆ 86400 ┆ null ┆ null │
└─────────────────────┴────────┴─────────────────────┴─────────────────────────────────┘
shape: (9, 5)
┌────────────┬────────────────────────────┬──────────────┬─────────────────────┬─────────────────────────────────┐
│ statistic ┆ dt ┆ values ┆ values_gather_every ┆ values_gather_every_rolling_su… │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ f64 ┆ f64 ┆ f64 │
╞════════════╪════════════════════════════╪══════════════╪═════════════════════╪═════════════════════════════════╡
│ count ┆ 86400 ┆ 86400.0 ┆ 1440.0 ┆ 1436.0 │
│ null_count ┆ 0 ┆ 0.0 ┆ 84960.0 ┆ 84964.0 │
│ mean ┆ 2023-01-01 11:59:59.500000 ┆ 43200.5 ┆ 43171.0 ┆ 215855.0 │
│ std ┆ null ┆ 24941.675966 ┆ 24950.19038 ┆ 124404.541718 │
│ min ┆ 2023-01-01 00:00:00 ┆ 1.0 ┆ 1.0 ┆ 605.0 │
│ 25% ┆ 2023-01-01 06:00:00 ┆ 21601.0 ┆ 21601.0 ┆ 108305.0 │
│ 50% ┆ 2023-01-01 12:00:00 ┆ 43201.0 ┆ 43201.0 ┆ 216005.0 │
│ 75% ┆ 2023-01-01 17:59:59 ┆ 64800.0 ┆ 64741.0 ┆ 323405.0 │
│ max ┆ 2023-01-01 23:59:59 ┆ 86400.0 ┆ 86341.0 ┆ 431105.0 │
└────────────┴────────────────────────────┴──────────────┴─────────────────────┴─────────────────────────────────┘


Подробнее здесь: https://stackoverflow.com/questions/767 ... olling-sum
Ответить

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

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

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

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

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