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

Я пытаюсь вернуть счет во временном окне о (движущейся) фиксированной точке.

Это попытка понять состояние инструмента в любое время, как функцию использования до it.

Таким образом, если инструмент используется в 12.05, 12.10, 12.15, 12.30, 12.40 и 13.00, счетчик использования будет:

12.05 -> 1 (один раз за последний час )

12.10 -> 2

12.15 -> 3

12.30 -> 4

12.40 -> 5

1,00 -> 6

... но затем допустим, что использование возобновляется с 1.06: 1.06 -> 6, это не увеличивает счет, так как первый запуск занимает больше часа go.

Как я могу рассчитать это количество и добавить его в виде столбца?

Такое ощущение, что это групповая / совокупная / счетная, использующая, возможно, timedeltas в лямбда-функции, но я не знаю с чего начать.

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

Следующий код дает стартовый фрейм данных:

s = pd.Series(pd.date_range('2020-1-1', periods=8000, freq='250s'))
df = pd.DataFrame({'Run time': s})
df_sample = df.sample(6000)
df_sample = df_sample.sort_index()

Лучшая помощь, которую я нашел (и, честно говоря, обычно я могу взломать вместе из логики c), это Отличный счетчик на скользящем временном окне , но мне не удалось на этот раз.

Спасибо

1 Ответ

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

Ранее я делал нечто подобное с функцией DataFrame.rolling: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rolling.html

Итак, для вашего набора данных сначала нужно обновить индекс до поля datetime, затем Вы можете предварительно выполнить необходимый анализ, продолжая, исходя из своего кода:

s = pd.Series(pd.date_range('2020-1-1', periods=8000, freq='250s'))
df = pd.DataFrame({'Run time': s})
df_sample = df.sample(6000)
df_sample = df_sample.sort_index()

# Create a value we can count
df_sample('Occurrences') = 1

# Set the index to the datetime element
df_sample = df_sample.set_index('Run time')

# Use Pandas rolling method, 3600s = 1 Hour
df_sample['Occurrences in Last Hour'] = df_sample['Occurrences'].rolling('3600s').sum()

df_sample.head(15)

                     Occurrences  Occurrences in Last Hour
Run time                                                   
2020-01-01 00:00:00            1                       1.0
2020-01-01 00:04:10            1                       2.0
2020-01-01 00:08:20            1                       3.0
2020-01-01 00:12:30            1                       4.0
2020-01-01 00:16:40            1                       5.0
2020-01-01 00:25:00            1                       6.0
2020-01-01 00:29:10            1                       7.0
2020-01-01 00:37:30            1                       8.0
2020-01-01 00:50:00            1                       9.0
2020-01-01 00:54:10            1                      10.0
2020-01-01 00:58:20            1                      11.0
2020-01-01 01:02:30            1                      11.0
2020-01-01 01:06:40            1                      11.0
2020-01-01 01:15:00            1                      10.0
2020-01-01 01:19:10            1                      10.0

Вам необходимо установить индекс для элемента datetime, чтобы использовать окно временной базы, в противном случае вы можете использовать только целочисленные значения, соответствующие количество рядов.

...