Как применить наиболее подходящую линию к временным рядам в Python - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь применить линию наилучшего соответствия к временным рядам, показывающим NDVI с течением времени, но продолжаю сталкиваться с ошибками.В данном случае my x - это разные даты в виде строк, которые не распределены равномерно, а y - это значение NDVI для использования каждой даты.Когда я использую функцию poly1d в numpy, я получаю следующую ошибку:

TypeError: ufunc 'add' did not contain a loop with signature matching types 
   dtype('<U32') dtype('<U32') dtype('<U32')

Я приложил образец набора данных, с которым я работаю

# plot Data and and models
plt.subplots(figsize=(20, 10))
plt.xticks(rotation=90)
plt.plot(x,y,'-', color= 'blue')
plt.title('WSC-10-50')
plt.ylabel('NDVI')
plt.xlabel('Date')
plt.plot(np.unique(x), np.poly1d(np.polyfit(x, y, 1))(np.unique(y)))
plt.legend(loc='upper right')

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

1 Ответ

0 голосов
/ 26 ноября 2018

Когда я применяю линию наилучшего соответствия к данным временного ряда, я создаю равномерно распределенную линию, которая представляет даты для упрощения регрессии.Поэтому я использую np.linspace(), чтобы создать набор интервалов, равный количеству дат.

Код:

from io import StringIO
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = StringIO("""

date   value
24-Jan-16   0.786
25-Feb-16   0.781
29-Apr-16   0.786
15-May-16   0.761
16-Jun-16   0.762
04-Sep-16   0.783
22-Oct-16   0.797

""")

df = pd.read_table(data, delim_whitespace=True)

# To read from csv use:
# df = pd.read_csv("/path/to/file.csv")

df.loc[:, "date"] = pd.to_datetime(df.loc[:, "date"], format="%d-%b-%y")

y_values = df.loc[:, "value"]
x_values = np.linspace(0,1,len(df.loc[:, "value"]))
poly_degree = 3

coeffs = np.polyfit(x_values, y_values, poly_degree)
poly_eqn = np.poly1d(coeffs)
y_hat = poly_eqn(x_values)

plt.figure(figsize=(12,8))
plt.plot(df.loc[:, "date"], df.loc[:,"value"], "ro")
plt.plot(df.loc[:, "date"],y_hat)
plt.title('WSC-10-50')
plt.ylabel('NDVI')
plt.xlabel('Date')
plt.savefig("NDVI_plot.png")

Выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...