Python: как линейно интерполировать месячные данные? - PullRequest
0 голосов
/ 27 мая 2018

Я довольно новичок в python, особенно в библиотеках данных, поэтому прошу прощения за любой идиотизм.

Я пытаюсь попрактиковаться с составленным набором данных ежемесячных наблюдений за 12 месяцев, данные выглядят такэто ...

print(data)

2017-04-17  156
2017-05-09  216
2017-06-11  300
2017-07-29  184
2017-08-31  162
2017-09-24   91
2017-10-15  225
2017-11-03  245
2017-12-26  492
2018-01-26  485
2018-02-18  401
2018-03-09  215
2018-04-30  258

Эти ежемесячные наблюдения являются нерегулярными (есть ровно один в каждом месяце, но далеко не в одно и то же время).

Теперь я хочу использовать линейную интерполяцию для получения значений в начале каждого месяца -

Я перепробовал несколько методов ... и смог сделать это «вручную»', но я пытаюсь справиться с пандами и numpy, и я знаю, что это можно сделать с этим, вот что у меня было до сих пор: я делаю серию, содержащую данные, а затем я делаю:

resampled1 = data.resample('MS')
interp1 = resampled1.interpolate()

print(interp1)

Это печатает:

2017-04-01   NaN
2017-05-01   NaN
2017-06-01   NaN
2017-07-01   NaN
2017-08-01   NaN
2017-09-01   NaN
2017-10-01   NaN
2017-11-01   NaN
2017-12-01   NaN
2018-01-01   NaN
2018-02-01   NaN
2018-03-01   NaN
2018-04-01   NaN

Теперь я знаю, что первый 2017-4-17 должен быть NaN, так как линейная интерполяция (которую я считаю по умолчанию), интерполирует между двумя точками дои после ... что невозможно, так как у меня нет назначения до 1 апреля.Что касается других ... Я не уверен, что я делаю неправильно ... вероятно, только потому, что я изо всех сил пытаюсь обернуть свою голову точно, что делает повторная выборка?

Ответы [ 2 ]

0 голосов
/ 12 августа 2018

Попробуйте использовать RedBlackPy .

from datetime import datetime
import redblackpy as rb

index = [datetime(2017,4,17), datetime(2017,5,9), datetime(2017,6, 11)]
values = [156, 216, 300]

series = rb.Series(index=index, values=values, interpolate='linear')
# Now you can access by any key with no insertion, using interpolation.
print(series[datetime(2017, 5, 1)]) # prints 194.18182373046875
0 голосов
/ 27 мая 2018

Вы, вероятно, хотите resample('D') для интерполяции, например:

In []:
data.resample('D').interpolate().asfreq('MS')

Out[]:
2017-05-01  194.181818
2017-06-01  274.545455
2017-07-01  251.666667
2017-08-01  182.000000
2017-09-01  159.041667
2017-10-01  135.666667
2017-11-01  242.894737
2017-12-01  375.490566
2018-01-01  490.645161
2018-02-01  463.086957
2018-03-01  293.315789
2018-04-01  234.019231
...