Как найти периодичность временных рядов, охватывающих микро-единицы времени? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть временной ряд, в котором единица времени - миллисекунды, а в серии около 3000 записей.Я пытаюсь выяснить сезонность этой серии, например, чтобы обнаружить какие-либо периодические сбои в данных.Данные представлены в виде pandas dataframe.

Я пытался использовать метод season_decompose () из statsmodel, например:

import pandas as pd
data = pd.read_csv('Sample_data.csv',index_col=0)
data.index = pd.to_datetime(data.index)
print(data.head())
##                              Sample_values
## Dates    
## 1970-01-01 05:30:00.000000   0.466812
## 1970-01-01 05:30:00.016667   0.218692
## 1970-01-01 05:30:00.033333   0.938067
## 1970-01-01 05:30:00.050000   0.480025
## 1970-01-01 05:30:00.066667   0.915175
print(type(data))
##  <class 'pandas.core.frame.DataFrame'>
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(data, model='additive')
fig = result.plot()

Но это приводит к следующей ошибке:

ValueError: You must specify a freq or x must be a pandas object with a timeseries index with a freq not set to None

Однако, если я использую тот же код с набором данных, чьи единицы измерения по осям x указаны в месяцах (например, скачано с https://www.analyticsvidhya.com/wp-content/uploads/2016/02/AirPassengers.csv), то я не получаю никаких ошибок и получаю 4 графика из season_decompose() как и ожидалось.

Итак, как я могу определить закономерности сезонности для своего вида данных, который охватывает только несколько часов?

1 Ответ

0 голосов
/ 30 ноября 2018

Вам необходимо задать freq для индекса даты и времени.

Используя следующее:

                            sample_values
1970-01-01 05:30:00.000000       0.466812
1970-01-01 05:30:00.016667       0.218692
1970-01-01 05:30:00.033333       0.938067
1970-01-01 05:30:00.050000       0.480025
1970-01-01 05:30:00.066667       0.915175

Частота в настоящее время None

In [1]: print df.index
DatetimeIndex([       '1970-01-01 05:30:00', '1970-01-01 05:30:00.016667',
               '1970-01-01 05:30:00.033333', '1970-01-01 05:30:00.050000',
               '1970-01-01 05:30:00.066667'],
              dtype='datetime64[ns]', freq=None)

И функция Pandas infer_freq не может его обнаружить:

In [2]: print pd.infer_freq(df.index)
None

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

In [3]: df_freq = df.resample('.000001S').ffill().reindex(pd.date_range(df.index[0],df.index[-1],freq='0.016667S'))

In [4]: print df_freq
                            sample_values
1970-01-01 05:30:00.000000       0.466812
1970-01-01 05:30:00.016667       0.218692
1970-01-01 05:30:00.033334       0.938067
1970-01-01 05:30:00.050001       0.480025

In [5]: print df_freq.index
DatetimeIndex([       '1970-01-01 05:30:00', '1970-01-01 05:30:00.016667',
               '1970-01-01 05:30:00.033334', '1970-01-01 05:30:00.050001'],
              dtype='datetime64[ns]', freq='16667U')

Теперь у вас есть определенный freq.Попробуйте это в своем полном наборе данных, и посмотрите, будет ли seasonal_decompose() работать.Однако временные метки, вероятно, станут неточными в течение длительного времени.

Вы также можете попробовать что-то вроде этого:

In [6]: df_freq = df.resample('.000001S').interpolate().resample('.005S').first()

In [7]: print df_freq
                         sample_values
1970-01-01 05:30:00.000       0.466812
1970-01-01 05:30:00.005       0.392377
1970-01-01 05:30:00.010       0.317943
1970-01-01 05:30:00.015       0.243508
1970-01-01 05:30:00.020       0.362558
1970-01-01 05:30:00.025       0.578380
1970-01-01 05:30:00.030       0.794201
1970-01-01 05:30:00.035       0.892255
1970-01-01 05:30:00.040       0.754845
1970-01-01 05:30:00.045       0.617435
1970-01-01 05:30:00.050       0.480025
1970-01-01 05:30:00.055       0.610567
1970-01-01 05:30:00.060       0.741110
1970-01-01 05:30:00.065       0.871652

Это имеет freq='5L' и использует линейную интерполяцию для приближениятенденция ваших исходных данных с регулярным частотным индексом.Вы можете поэкспериментировать с .005S для второй частоты понижающей дискретизации, чтобы получить более высокую или более низкую частоту, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...