利用prophet实现时间序列数据结果预测及对预测数据进行年度趋势和月度值分解

第一部分:prophet的介绍

选取一段chatgpt对该插件的解释,如下:
Prophet(预言家)是由Facebook开发的开源时间序列分析工具,旨在提供一个简单而强大的框架,用于预测时间序列数据。Prophet的设计目标是使时间序列分析更加可靠、易用,并且适用于各种类型的时间序列数据,无论是在商业、金融、自然资源、社会趋势等领域。

以下是Prophet的一些主要特点和优势:

自动检测季节性和节假日效应: Prophet能够自动检测并建模数据中的季节性和节假日效应,包括年度季节性、周季节性和特定的节假日。

可处理缺失数据和异常值: Prophet可以在存在缺失数据或异常值的情况下进行建模,减少了数据预处理的复杂性。

可解释性: Prophet生成的模型具有可解释性,可以通过分析分解后的成分来理解趋势、季节性和节假日效应对预测的影响。

灵活性: 用户可以根据实际情况,通过添加自定义的季节性和节假日效应来进一步改进模型。

支持多变量预测: Prophet支持对多变量时间序列数据进行预测,用户可以根据需要添加其他影响因素。

易用性: Prophet的API设计友好,使用简单,不需要过多的参数调整。

扩展性: Prophet是基于Stan概率编程语言构建的,因此可以通过调整参数来实现更复杂的建模和预测需求。

总之,Prophet是一个适用于时间序列分析的强大工具,尤其适合于那些对时间序列分析领域不太熟悉的用户。它的特点在于自动化的季节性和节假日效应检测,以及可解释性,使得用户能够更好地理解和预测时间序列数据的趋势和变化。

第二部分:prophet的安装方法

安装Prophet非常简单,可以通过以下步骤在Python环境中安装Prophet:

打开终端或命令提示符。

使用以下命令使用pip安装Prophet包:

pip install pystan==2.19.1.1
pip install prophet

请注意,上述安装步骤可能会根据您的系统和环境略有不同。如果您在安装过程中遇到任何问题,请查看Prophet的官方文档或社区支持。

安装完成后,您就可以在Python中导入Prophet并开始使用它进行时间序列分析和预测了。例如:

from prophet import Prophet

记得在导入和使用Prophet之前,确保您已经安装了必要的依赖库,并且Python的环境已经配置正确。

第三步:进行预测

完整代码如下:

import numpy as np
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt
# 示例数据,替换为您的实际数据
data =[{"时间":"2000/02","均值":0.266791999},{"时间":"2000/03","均值":0.310662061},{"时间":"2000/04","均值":0.378926367},{"时间":"2000/05","均值":0.377644122},{"时间":"2000/06","均值":0.509663224},{"时间":"2000/07","均值":0.559362471},{"时间":"2000/08","均值":0.600726485},{"时间":"2000/09","均值":0.533398926},{"时间":"2000/10","均值":0.425571382},{"时间":"2000/11","均值":0.344209075},{"时间":"2000/12","均值":0.276758969},....]
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为SimHei
plt.rcParams['axes.unicode_minus'] = False   # 解决保存图像是负号'-'显示为方块的问题

# 将数据转换为DataFrame
df = pd.DataFrame(data)
df['ds'] = pd.to_datetime(df['时间'])
df.rename(columns={'均值': 'y'}, inplace=True)

# 拆分训练测试数据
# split_index = int(len(df)*0.8)
# train = df[:split_index] 
# test = df[split_index:]
train = df[:-12]
test = df[-12:]

# 初始化Prophet模型
model = Prophet(daily_seasonality=False)

# 添加节假日效应(如果适用)
# model.add_country_holidays(country_name='US')

# 训练模型
model.fit(train)

# 生成未来日期(未来5年,每月)
future = pd.date_range(start='2021-01', periods=60, freq='M')
future = pd.DataFrame({'ds': future})

# 进行预测
forecast = model.predict(future)

# 打印预测结果
print(forecast[['ds', 'yhat']].tail(60))

fig = model.plot_components(forecast)
# 分别设置trend成分的横纵坐标标签
for ax in fig.axes[:1]:
    ax.set_xlabel("年份", fontsize=16)
    ax.set_ylabel("趋势值", fontsize=16)
    ax.set_xticklabels(ax.get_xticklabels(), fontsize=14)
    ax.set_yticklabels(ax.get_yticklabels(), fontsize=14)

# 分别设置yearly成分的横纵坐标标签
for ax in fig.axes[1:]:
    ax.set_xlabel("月份", fontsize=16)
    ax.set_ylabel("季节性值", fontsize=16)
 
    # 设置横坐标标签,这里以月份为例,根据实际情况调整
    x_labels = ['一月',  '三月','五月', 
                '七月', '九月', '十一月', '一月']

    # 设置横坐标刻度和标签
    ax.set_xticklabels(x_labels, fontsize=14)
    ax.set_yticklabels(ax.get_yticklabels(), fontsize=14)
  
# 设置标题
#plt.title('自定义标题')

plt.tight_layout()
plt.savefig('F:/plot.jpg', dpi=600, format='jpg')
plt.show()

结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42464154/article/details/132106883
今日推荐