Есть DataFrame примерно такого содержания:
Time Data
95114 1012.0
96078 1108.0
97033 1132.0
98015 1076.0
...
Состоит из 100 строк, где:
Time - время измерения в микросекундах
Data - измеряемое значение.
Мне необходимо найти ДПФ этой зависимости. Все бы ничего, только частота измерения непостоянна. Она немного плывет со временем случайным образом. Т.е. мои потуги в духе:
xf = fftfreq(len(df['Time']),1000) # 1000 взята как примерный период измерений
i = xf > 0
yf = fft(df['Data'])
Дают немного неожиданный результат. Я так понимаю, что дело в частоте. Как правильно ее искать? Интерполировать свой дискретный ряд и потом уже находить его ДПФ?
В итоге мне нужно будет найти площадь между определенными частотами спектра.
Ответ
Можно воспользоваться методом DataFrame.resample(), чтобы преобразовать DataFrame во временной ряд с единым интервалом (в качестве единого интервала возьмем средний интервал между замерами в микросекундах) и после этого интерполировать недостающие значения.
Для этого надо конвертировать df.Time в datetime dtype и установить этот столбец в качестве индекса:
In [62]: freq = int(df['Time'].diff().mean()) # средняя частота измерения в микросекундах
In [63]: freq
Out[63]: 967
In [64]: df = (df.set_index(pd.to_datetime(df.pop('Time'), unit='us'))
.resample('{}U'.format(freq))
.mean()
.interpolate())
In [65]: df
Out[65]:
Data
Time
1970-01-01 00:00:00.094766 1012.0
1970-01-01 00:00:00.095733 1108.0
1970-01-01 00:00:00.096700 1132.0
1970-01-01 00:00:00.097667 1076.0
После этого можно попробовать воспользоваться преобразованиями Фурье.
Комментариев нет:
Отправить комментарий