Повторная выборка серии Pandas + интерполировать дает NaNs - PullRequest
0 голосов
/ 20 сентября 2018

x - это серия панд чисел с плавающей точкой64 на DateTimeIndex

x.head(20) выглядит следующим образом:

Timestamp
2018-05-03 15:05:31.864    1.799104
2018-05-03 15:05:31.993    1.080555
2018-05-03 15:05:32.145    1.374885
2018-05-03 15:05:32.963    1.264249
2018-05-03 15:05:33.529    1.251358
2018-05-03 15:05:33.938    1.199366
2018-05-03 15:05:34.378    1.201764
2018-05-03 15:05:34.496    1.267969
2018-05-03 15:05:34.895    1.251358
2018-05-03 15:05:36.572    1.313922
2018-05-03 15:05:37.562    1.270770
2018-05-03 15:05:38.013    1.230315
2018-05-03 15:05:38.166    1.185131
2018-05-03 15:05:38.285    1.150098
2018-05-03 15:05:39.555    1.122180
2018-05-03 15:05:39.698    1.094660
2018-05-03 15:05:40.815    1.084887
2018-05-03 15:05:41.700    1.068585
2018-05-03 15:05:41.993    1.071981
2018-05-03 15:05:42.139    1.084344
Name: C2:37:A3:40:10:60_s, dtype: float64

Что я хочу сделать, это повторить выборку и интерполироватьсерия до периода 100 мс.Вот что я попробовал:

y = x.resample("100ms").interpolate("linear")

Это не совсем то, что я ожидал, вообще.

Прежде всего, yсодержит около 100 NaN из 1700 записей.Разве интерполяция не должна заботиться о NaN?

Я продолжил и построил оригинальную серию x и серию 'y' с передискретизацией. plotted x series (left), y series(right)

Что я делаю неправильно?Я действительно просто пытался получить хороший и плавный ряд со значениями каждые 100 мс, линейно интерполируемый там, где это необходимо.По сути, превращая левый график в правый:

what I have (left), what I want (right)

Раньше я делал это непосредственно с scipy.interpolate.interp1d, но надеялся на что-то непосредственно в пандахэто менее громоздко для использования.

1 Ответ

0 голосов
/ 20 сентября 2018

IIUC:

Вы хотите интерполировать с объединением существующего индекса вместе с индексом с измененной выборкой.

idx = pd.date_range(x.first_valid_index(), x.last_valid_index(), freq='100ms')

Это симпатичный способ получения индекса

idx = x.asfreq('100ms').index

Если вы хотели бы округлить единицы '100ms'

idx = idx.floor('100ms')

  1. Переиндексировать с объединенным индексом
  2. Интерполировать с 'index'.Это будет линейно в зависимости от расстояния между значениями индекса.
  3. Повторная индексация с уменьшенным значением '100ms'

y = x.reindex(x.index.union(idx)).interpolate('index').reindex(idx)


y

Timestamp
2018-05-03 15:05:31.864    1.799104
2018-05-03 15:05:31.964    1.242089
2018-05-03 15:05:32.064    1.218038
2018-05-03 15:05:32.164    1.372315
2018-05-03 15:05:32.264    1.358790
2018-05-03 15:05:32.364    1.345265
2018-05-03 15:05:32.464    1.331740
2018-05-03 15:05:32.564    1.318214
2018-05-03 15:05:32.664    1.304689
2018-05-03 15:05:32.764    1.291164
                             ...   
2018-05-03 15:05:41.164    1.078458
2018-05-03 15:05:41.264    1.076616
2018-05-03 15:05:41.364    1.074774
2018-05-03 15:05:41.464    1.072932
2018-05-03 15:05:41.564    1.071090
2018-05-03 15:05:41.664    1.069248
2018-05-03 15:05:41.764    1.069327
2018-05-03 15:05:41.864    1.070486
2018-05-03 15:05:41.964    1.071645
2018-05-03 15:05:42.064    1.077993
Freq: 100L, Name: C2, Length: 103, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...