Принимая первое значение в скользящем окне, которое не является числовым - PullRequest
0 голосов
/ 01 апреля 2020

Этот вопрос следует за тем, который я ранее задавал здесь , и на который были даны ответы для числовых значений c.

Теперь я задаю второй вопрос относительно данных типа Период.

Хотя приведенный ниже пример кажется простым, у меня есть windows, которые имеют переменный размер . Интересуюсь 1-й строкой windows, я ищу технику c, которая использует это определение.

import pandas as pd
from random import seed, randint

# DataFrame
pi1h = pd.period_range(start='2020-01-01 00:00+00:00', end='2020-01-02 00:00+00:00', freq='1h')

seed(1)
values = [randint(0, 10) for ts in pi1h]

df = pd.DataFrame({'Values' : values, 'Period' : pi1h}, index=pi1h)

# This works (numeric type)
df['first'] = df['Values'].rolling(3).agg(lambda rows: rows[0])

# This doesn't (Period type)
df['OpeningPeriod'] = df['Period'].rolling(3).agg(lambda rows: rows[0])

Результат 2-й команды

DataError: No numeric types to aggregate

Пожалуйста , Есть идеи? Спасибо за любую помощь! Bests,

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Первый ряд скользящего окна размером 3 означает строку, которая на 2 строки выше текущей - просто используйте pd.Series.shift(2):

df['OpeningPeriod'] = df['Period'].shift(2)

Для переменного размера (для примера - Я взял Values столбец в качестве этого переменного размера):

import numpy as np

x=(np.arange(len(df))-df['Values'])

df['OpeningPeriod'] = np.where(x.ge(0), df.loc[df.index[x.tolist()], 'Period'], np.nan)
0 голосов
/ 01 апреля 2020

Преобразование period[H] в float

# convert to float
df['Period1'] = df['Period'].dt.to_timestamp().values.astype(float)
# rolling and convert back to period
df['OpeningPeriod'] = pd.to_datetime(df['Period1'].rolling(3)\
                                     .agg(lambda rows: rows[0])).dt.to_period('1h')
# drop column
df = df.drop(columns='Period1')
...