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

У меня есть pandas dataframe, который содержит date и некоторые значения, например, ниже

Исходные данные:

list = [('2018-10-29', 6.1925), ('2018-10-29', 6.195), ('2018-10-29', 1.95833333333333), 
        ('2018-10-29', 1.785), ('2018-10-29', 3.05), ('2018-10-29', 1.30666666666667), 
        ('2018-10-29', 1.6325), ('2018-10-30', 1.765), ('2018-10-30', 1.265), 
        ('2018-10-30', 2.1125), ('2018-10-30', 2.16714285714286), ('2018-10-30', 1.485), 
        ('2018-10-30', 1.72), ('2018-10-30', 2.754), ('2018-10-30', 1.79666666666667), 
        ('2018-10-30', 1.27833333333333), ('2018-10-30', 3.48), ('2018-10-30', 6.19), 
        ('2018-10-30', 6.235), ('2018-10-30', 6.11857142857143), ('2018-10-30', 6.088), 
        ('2018-10-30', 4.3), ('2018-10-30', 7.80666666666667), 
        ('2018-10-30', 7.78333333333333), ('2018-10-30', 10.9766666666667), 
        ('2018-10-30', 2.19), ('2018-10-30', 1.88)]

После загрузки в панды

df = pd.DataFrame(list)


             0          1
0   2018-10-29   6.192500
1   2018-10-29   6.195000
2   2018-10-29   1.958333
3   2018-10-29   1.785000
4   2018-10-29   3.050000
5   2018-10-29   1.306667
6   2018-10-29   1.632500
7   2018-10-30   1.765000
8   2018-10-30   1.265000
9   2018-10-30   2.112500
10  2018-10-30   2.167143
11  2018-10-30   1.485000
12  2018-10-30   1.720000
13  2018-10-30   2.754000
14  2018-10-30   1.796667
15  2018-10-30   1.278333
16  2018-10-30   3.480000
17  2018-10-30   6.190000
18  2018-10-30   6.235000
19  2018-10-30   6.118571
20  2018-10-30   6.088000
21  2018-10-30   4.300000
22  2018-10-30   7.806667
23  2018-10-30   7.783333
24  2018-10-30  10.976667
25  2018-10-30   2.190000
26  2018-10-30   1.880000

Вот так я загружаю фрейм данных

df = pd.DataFrame(list)
df[0] = pd.to_datetime(df[0], errors='coerce')
df.set_index(0, inplace=True)

Теперь я хочу найти slope. После исследования в интернете, я обнаружил, что это то, что нужно сделать, чтобы получить slope

trend_coord = list(map(list, zip(df.index.strftime('%Y-%m-%d'), sm.tsa.seasonal_decompose(df.iloc[:,0].values).trend.interpolate(method='linear',axis=0).fillna(0).values)))

results = sm.OLS(np.asarray(sm.tsa.seasonal_decompose(df.iloc[:,0].values).trend.interpolate(method='linear', axis=0).fillna(0).values), sm.add_constant(np.array([i for i in range(len(trend_coord))])), missing='drop').fit()

slope = results.params[1]
print(slope)

Но я получаю ошибку ниже

Traceback (most recent call last):
  File "/home/souvik/Music/UI_Server2/test35.py", line 11, in <module>
    trend_coord = list(map(list, zip(df.index.strftime('%Y-%m-%d'), sm.tsa.seasonal_decompose(df.iloc[:,0].values).trend.interpolate(method='linear',axis=0).fillna(0).values)))
  File "/home/souvik/django_test/webdev/lib/python3.5/site-packages/statsmodels/tsa/seasonal.py", line 127, in seasonal_decompose
    raise ValueError("You must specify a freq or x must be a "
ValueError: You must specify a freq or x must be a pandas object with a timeseries index with a freq not set to None

Теперь, если я добавлю параметр freq к методу season_decompose, например

trend_coord = list(map(list, zip(df.index.strftime('%Y-%m-%d'), sm.tsa.seasonal_decompose(df.iloc[:,0].values, freq=1).trend.interpolate(method='linear',axis=0).fillna(0).values)))

Тогда я получаю сообщение об ошибке типа

Traceback (most recent call last):
  File "/home/souvik/Music/UI_Server2/test35.py", line 11, in <module>
    trend_coord = list(map(list, zip(df.index.strftime('%Y-%m-%d'), sm.tsa.seasonal_decompose(df.iloc[:,0].values, freq=1).trend.interpolate(method='linear',axis=0).fillna(0).values)))
AttributeError: 'numpy.ndarray' object has no attribute 'interpolate'

Однако, если я избавлюсь от мелкой детализации данных, таких как interpolate и т. Д., И сделаю что-то вроде ниже

trend_coord = sm.tsa.seasonal_decompose(df.iloc[:,0].values, freq=1, model='additive').trend

results = sm.OLS(np.asarray(trend_coord),
                 sm.add_constant(np.array([i for i in range(len(trend_coord))])), missing='drop').fit()
slope = results.params[1]
print(">>>>>>>>>>>>>>>> slope", slope)

Тогда я получаю slope значение 0.13668559218559242.

Но я не уверен, что это правильный способ узнать slope и даже если правильное значение.

Есть ли лучший способ узнать slope?

1 Ответ

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

Вы можете использовать datetime.toordinal для сопоставления каждой даты с целым числом и sklearn.linear_model для подгонки модели линейной регрессии к вашим данным, чтобы получить наклон, такой как:

import datetime as dt
from sklearn import linear_model

df = pd.DataFrame(list, columns=['date', 'value'])
df['date_ordinal'] = pd.to_datetime(df['date']).map(dt.datetime.toordinal)
reg = linear_model.LinearRegression()
reg.fit(df['date_ordinal'].values.reshape(-1, 1), df['value'].values)

reg.coef_

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