Добавление линии тренда к графику временных рядов - PullRequest
0 голосов
/ 22 марта 2019

У меня есть этот участок

enter image description here

Теперь я хочу добавить к нему линию тренда, как мне это сделать?

Данные выглядят так:

enter image description here

Я хотел просто показать, как средняя цена листинга в Калифорнии выросла за эти годы, поэтому я сделал это:

# Get California data
state_ca = []
state_median_price = []
state_ca_month = []
for state, price, date in zip(data['ZipName'], data['Median Listing Price'], data['Month']):
    if ", CA" not in state:
        continue
    else:
        state_ca.append(state)
        state_median_price.append(price)
        state_ca_month.append(date)

Затем я преобразовал строку state_ca_month в datetime:

# Convert state_ca_month to datetime
state_ca_month = [datetime.strptime(x, '%m/%d/%Y %H:%M') for x in state_ca_month]

Затем построил график

# Plot trends
figure(num=None, figsize=(12, 6), dpi=80, facecolor='w', edgecolor='k')
plt.plot(state_ca_month, state_median_price)
plt.show()

Я думал о добавлении линии тренда или какого-то типа линии, но я новичок в визуализации. Если у кого-то есть другие предложения, я буду признателен.

Следуя советам в комментариях, я получаю этот точечный график

enter image description here

Мне интересно, следует ли мне дополнительно отформатировать данные, чтобы сделать более четкий сюжет для изучения.

1 Ответ

1 голос
/ 22 марта 2019

Если под «линией тренда» вы подразумеваете буквальную линию, то вы, вероятно, хотите подогнать линейную регрессию к своим данным. sklearn предоставляет эту функцию в python.

Из приведенного выше примера с гиперссылкой:

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# Load the diabetes dataset
diabetes = datasets.load_diabetes()


# Use only one feature
diabetes_X = diabetes.data[:, np.newaxis, 2]

# Split the data into training/testing sets
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]

# Split the targets into training/testing sets
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]

# Create linear regression object
regr = linear_model.LinearRegression()

# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)

# Make predictions using the testing set
diabetes_y_pred = regr.predict(diabetes_X_test)

# The coefficients
print('Coefficients: \n', regr.coef_)
# The mean squared error
print("Mean squared error: %.2f"
      % mean_squared_error(diabetes_y_test, diabetes_y_pred))
# Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))

# Plot outputs
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)

plt.xticks(())
plt.yticks(())

plt.show()

Чтобы уточнить, «общая тенденция» не является четко определенной вещью. Часто под трендом люди понимают буквальную линию, которая хорошо вписывается в данные. Под «соответствует данным», в свою очередь, мы подразумеваем «предсказывает данные». Таким образом, самый распространенный способ получить линию тренда - это выбрать линию, которая лучше всего предсказывает данные, которые вы наблюдали. Оказывается, нам даже нужно четко понимать, что мы подразумеваем под «предсказаниями». Один из способов сделать это (и очень распространенный) - определить «наилучшие прогнозы» таким образом, чтобы минимизировать сумму квадратов всех ошибок между «линией тренда» и наблюдаемыми данными. Это называется обычная линейная регрессия наименьших квадратов и является одним из самых простых способов получить «линию тренда». Этот алгоритм реализован в sklearn.linear_model.LinearRegression.

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