pandas: пересчет и вычисление правильного среднего - PullRequest
0 голосов
/ 28 января 2020

Я использую python pandas, но я не знаю, как пересчитать временной ряд до 1-минутного разрешения и вычислить среднее значение каждого интервала, используя правило трапеции.

Предположим, нам дается следующий временной ряд в файле data.csv:

time_stamp,x
2000-01-01 00:00:00,0.0
2000-01-01 00:00:10,100.0
2000-01-01 00:02:00,100.0
2000-01-01 00:03:00,200.0

Обратите внимание, что значение x равно 100 для большей части первой минуты, поэтому ответ

2000-01-01 00:00:00: 50.0,
2000-01-01 00:01:00: nan,
2000-01-01 00:02:00: 100.0,
2000-01-01 00:03:00: 200.0

получено

pd.read_csv("data.csv", index_col="time_stamp", parse_dates=["time_stamp"]).resample("1min").mean()

неверно. Правильное среднее значение для первой минуты будет 91.66666 = [(0 + 100) / 2 * 10s + 100 * 50s)] / 60s. Аналогично, ответ для временного интервала [2:00, 3:00] должен быть 150.

1 Ответ

0 голосов
/ 30 января 2020

Проблема с вашими данными заключается в неравном временном шаге.

import pandas as pd

# Create your dataset
index = pd.date_range('2000/01/01  00:00:00', periods=4, freq='min').to_list()
index[1] = pd.Timestamp('2000/01/01  00:00:10')
values = [0., 100., 100., 200.]

data = pd.Series(values, index)
data

[Out]: 
2000-01-01 00:00:00      0.0
2000-01-01 00:00:10    100.0
2000-01-01 00:02:00    100.0
2000-01-01 00:03:00    200.0

Когда вы звоните .resample(), вот что происходит:

data.asfreq('T')
[Out]:
2000-01-01 00:00:00      0.0
2000-01-01 00:01:00      NaN
2000-01-01 00:02:00    100.0
2000-01-01 00:03:00    200.0

Значения помещаются в соответствующие минуты , поскольку между 1мин и 2мин нет данных, значение заполняется NaN. .mean() не делает ничего полезного (он превращает объект генератора в df / series).

Вы можете выполнить повторную выборку до 10 секунд, выполнить прямую заливку и затем повторную выборку до 1 минуты.

print(data.resample('10s').ffill())

[Out]:
2000-01-01 00:00:00      0.0
2000-01-01 00:00:10    100.0
2000-01-01 00:00:20    100.0
2000-01-01 00:00:30    100.0
2000-01-01 00:00:40    100.0
2000-01-01 00:00:50    100.0
2000-01-01 00:01:00    100.0
2000-01-01 00:01:10    100.0
2000-01-01 00:01:20    100.0
2000-01-01 00:01:30    100.0
2000-01-01 00:01:40    100.0
2000-01-01 00:01:50    100.0
2000-01-01 00:02:00    100.0
2000-01-01 00:02:10    100.0
2000-01-01 00:02:20    100.0
2000-01-01 00:02:30    100.0
2000-01-01 00:02:40    100.0
2000-01-01 00:02:50    100.0
2000-01-01 00:03:00    200.0

print(data.resample('10s').ffill().resample('1t').mean())
[Out]:
2000-01-01 00:00:00     83.333333
2000-01-01 00:01:00    100.000000
2000-01-01 00:02:00    100.000000
2000-01-01 00:03:00    200.000000

В вашем вопросе вы ожидаете, что результат между 2 минутами и 3 минутами будет 150, но это не будет так, поскольку у вас есть значение 100 для всей этой минуты.

Возможно, вы найдете .interpolate(method='time') полезно. Вот ссылка на документы .

...