Pandas интерполяция ресэмплера неправильно интерполируется - PullRequest
3 голосов
/ 18 февраля 2020

Я работаю с серией pandas и хочу повторить выборку этих данных, чтобы получить 10-секундные интервалы. Ряд, с которым я работаю:

volSeries.head(20)

Time
2018-10-14 12:00:00    6.0
2018-10-14 12:00:02    5.0
2018-10-14 12:02:32    6.0
2018-10-14 12:02:57    5.0
2018-10-14 12:03:22    6.0
2018-10-14 12:03:27    5.0
2018-10-14 12:17:42    6.0
2018-10-14 12:17:47    5.0
2018-10-14 12:17:57    5.0
2018-10-14 12:18:07    6.0
2018-10-14 12:18:12    5.0
2018-10-14 12:18:17    6.0
2018-10-14 12:18:32    5.0
2018-10-14 12:18:47    6.0
2018-10-14 12:18:57    5.0
2018-10-14 12:19:27    6.0
2018-10-14 12:19:37    5.0
2018-10-14 12:20:37    6.0
2018-10-14 12:20:57    5.0
2018-10-14 12:21:07    6.0
Name: Value, dtype: float64

Когда я пытаюсь выполнить повторную выборку, выходной сигнал линейно увеличивается, что не соответствует данным:

volumeResampler = volSeries.resample('10S')
resampledVolumeData = volumeResampler.interpolate('linear')
resampledVolumeData.head(20)

Time
2018-10-14 12:00:00    6.000000
2018-10-14 12:00:10    6.198148
2018-10-14 12:00:20    6.396296
2018-10-14 12:00:30    6.594444
2018-10-14 12:00:40    6.792593
2018-10-14 12:00:50    6.990741
2018-10-14 12:01:00    7.188889
2018-10-14 12:01:10    7.387037
2018-10-14 12:01:20    7.585185
2018-10-14 12:01:30    7.783333
2018-10-14 12:01:40    7.981481
2018-10-14 12:01:50    8.179630
2018-10-14 12:02:00    8.377778
2018-10-14 12:02:10    8.575926
2018-10-14 12:02:20    8.774074
2018-10-14 12:02:30    8.972222
2018-10-14 12:02:40    9.170370
2018-10-14 12:02:50    9.368519
2018-10-14 12:03:00    9.566667
2018-10-14 12:03:10    9.764815
Freq: 10S, Name: Value, dtype: float64

Это видно при сравнении графики до и после повторной выборки, которые явно не интерполируются правильно.

до повторной выборки:

Volume before Resampling

После повторной выборки:

Volume after Resampling

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

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

# example from your sample, change the end date
sample = pd.DataFrame(
    {
        'time': pd.date_range(
            '2018-10-14 12:00:00', '2018-10-14 12:22:00', freq='10S'
        )
    }
)
df = (
    pd.concat(
        [
            volSeries.to_frame(),
            sample,
        ],
        sort=False,
    )
    .sort_values(['time'])
    .drop_duplicates(subset=['time'])
    .set_index('time')
    .interpolate('index')
    .loc[sample['time'].values, :]
)

Это дает:

                       volume
time                         
2018-10-14 12:00:00  6.000000
2018-10-14 12:00:10  5.053333
2018-10-14 12:00:20  5.120000
2018-10-14 12:00:30  5.186667
2018-10-14 12:00:40  5.253333
2018-10-14 12:00:50  5.320000
2018-10-14 12:01:00  5.386667
2018-10-14 12:01:10  5.453333
2018-10-14 12:01:20  5.520000
2018-10-14 12:01:30  5.586667
2018-10-14 12:01:40  5.653333
2018-10-14 12:01:50  5.720000
2018-10-14 12:02:00  5.786667
2018-10-14 12:02:10  5.853333
2018-10-14 12:02:20  5.920000
2018-10-14 12:02:30  5.986667
2018-10-14 12:02:40  5.680000
2018-10-14 12:02:50  5.280000
2018-10-14 12:03:00  5.120000
2018-10-14 12:03:10  5.520000
0 голосов
/ 26 февраля 2020

Ошибка, кажется, с частотой, с которой я интерполирую. Значения, которые я интерполирую, не всегда разнесены с минимальным интервалом в 2 секунды и максимумом 37080 между соседними точками.

Если я ресэмплирую при любом значении <= 4 секунды, интерполяция работает просто отлично. Я не уверен, что это ошибка или особенность. </p>

...