Как узнать значение наклона, применив линейную регрессию к тренду данных? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть данные временного ряда, из которых я могу найти trend. Теперь мне нужно поставить линию регрессии, которая лучше всего подходит для данных тренда и хотела бы знать, равен ли наклон + ve или-ve или константа. Ниже мой CSV-файл, который содержит данные

 date,cpu
2018-02-10 11:52:59.342269+00:00,6.0
2018-02-10 11:53:04.006971+00:00,6.0
2018-02-10 22:35:33.438948+00:00,4.0
2018-02-10 22:35:37.905242+00:00,4.0
2018-02-11 12:01:00.663084+00:00,4.0
2018-02-11 12:01:05.136107+00:00,4.0
2018-02-11 12:31:00.228447+00:00,5.0
2018-02-11 12:31:04.689054+00:00,5.0
2018-02-11 13:01:00.362877+00:00,5.0
2018-02-11 13:01:04.824231+00:00,5.0
2018-02-11 23:42:40.304334+00:00,0.0
2018-02-11 23:44:27.357619+00:00,0.0
2018-02-12 01:38:25.012175+00:00,7.0
2018-02-12 01:53:39.721800+00:00,8.0
2018-02-12 01:53:53.310947+00:00,8.0
2018-02-12 01:56:37.657977+00:00,8.0
2018-02-12 01:56:45.133701+00:00,8.0
2018-02-12 04:49:36.028754+00:00,9.0
2018-02-12 04:49:40.097157+00:00,9.0
2018-02-12 07:20:52.148437+00:00,9.0
...          ...                 ...

Сначала мне нужно выяснить trend в указанных данных. Ниже приведен код, который находит trend

df = pd.read_csv("test_forecast/cpu_data.csv")
df["date"] = pd.to_datetime(df["date"], format="%Y-%m-%d")
df.set_index("date", inplace=True)
df = df.resample('D').mean().interpolate(method='linear', axis=0).fillna(0)

X = df.index.strftime('%Y-%m-%d')
Y = sm.tsa.seasonal_decompose(df["cpu"]).trend.interpolate(method='linear', axis=0).fillna(0).values

Итак, X - это дневные даты, а Y - данные о трендах для каждого дня. Теперь я хочу применить линейную регрессию, чтобы найти линию регрессии и выяснить, равен ли наклон + ve или-ve или константа. Я пробовал код ниже

model = sm.OLS(y,X, missing='drop')
results = model.fit()
print(results)

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

Traceback (most recent call last):
  File "/home/souvik/PycharmProjects/Pandas/test11.py", line 37, in <module>
    model = sm.OLS(y,X, missing='drop')
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/regression/linear_model.py", line 817, in __init__
    hasconst=hasconst, **kwargs)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/regression/linear_model.py", line 663, in __init__
    weights=weights, hasconst=hasconst, **kwargs)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/regression/linear_model.py", line 179, in __init__
    super(RegressionModel, self).__init__(endog, exog, **kwargs)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/base/model.py", line 212, in __init__
    super(LikelihoodModel, self).__init__(endog, exog, **kwargs)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/base/model.py", line 64, in __init__
    **kwargs)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/base/model.py", line 87, in _handle_data
    data = handle_data(endog, exog, missing, hasconst, **kwargs)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/base/data.py", line 633, in handle_data
    **kwargs)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/base/data.py", line 79, in __init__
    self._handle_constant(hasconst)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/base/data.py", line 131, in _handle_constant
    ptp_ = self.exog.ptp(axis=0)
TypeError: cannot perform reduce with flexible type

Я получил приведенный выше фрагмент кода на каком-то сайте, но я не могу подать заявку в моем случае. Что я делаю не так?

1 Ответ

0 голосов
/ 24 мая 2018

Ваша проблема здесь:

X = df.index.strftime('%Y-%m-%d')

X, таким образом, является строкой, поэтому вы не можете использовать ее для соответствия регрессии.Вам понадобится что-то вроде

X = (df.index.astype(np.int64) // 10**9).values, которое вместо этого конвертирует ваши даты в секунды Unix.

В качестве альтернативы, если вы предпочитаете использовать что-то вроде «дней с начального значения» для X, вы можете сделать

start_date = df.index[0]
X = (df.index - start_date).days.values

В любом случае вы захотите напечатать results.summary() а не results.

...