在时间序列图中添加趋势线

问题描述 投票:0回答:1

我有这个情节

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

我想知道我是否应该进一步格式化数据,以便更清晰地检查。

python numpy matplotlib
1个回答
1
投票

如果通过“趋势线”表示文字行,那么您可能希望对数据进行线性回归。在sklearnprovides this functionality 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()

澄清一下,“整体趋势”并不是一个定义明确的事情。很多时候,通过“趋势”,人们意味着一条“适合”数据的文字线。反过来,“适合数据”我们的意思是“预测数据”。因此,获得趋势线的最常见方法是选择最能预测您观察到的数据的线。事实证明,我们甚至需要明确“预测”的含义。实现此目的的一种方法(以及非常常见的方法)是以这样的方式定义“最佳预测”,以便最小化“趋势线”和观察数据之间的所有误差的平方和。这被称为ordinary least squares linear regression,是获得“趋势线”的最简单方法之一。这是在sklearn.linear_model.LinearRegression中实现的算法。

© www.soinside.com 2019 - 2024. All rights reserved.