时间序列预测神器Prophet python实现

前言

"Prophet" 指的是由 Facebook 开发的一种用于时间序列分析和预测的工具。它设计用于处理每日观测数据,展示不同时间尺度上的模式。Prophet 特别受欢迎的原因之一是其易用性,以及能够建模季节性、假期和特殊事件。

Prophet 模型的主要特点包括:

  1. 季节性:Prophet 能够处理年度、周度和日度季节性,适用于具有周期性模式的时间序列数据

  2. 假期和特殊事件:模型允许将假期和特殊事件作为额外的输入,以提高预测准确性

  3. 可调参数:可以调整各种参数以定制模型的行为,例如季节性组件的强度和趋势的灵活性

  4. 自动检测变点:Prophet 自动识别时间序列中趋势发生显著变化的点

  5. 加法分量:该模型将时间序列表示为趋势分量、季节性分量和误差项的总和

Prophet 在 R 和 Python 中都有实现,由于其能够以极小的工作量生成准确且易于解释的预测,因此在各个行业中广受欢迎。它被广泛用于金融、电商等领域,这些领域对于决策制定而言,时间序列预测至关重要

详细解读网址:

Prophet模型的基本原理涉及将时间序列数据分解为趋势组件、季节性组件和假期效应。以下是Prophet模型的主要公式和基本原理:

这些组件的具体形式和参数通过拟合模型时从历史数据中学习得到。Prophet利用优化算法来最小化实际观测值与模型预测值之间的误差,从而获得最佳拟合。总体而言,Prophet模型通过这些组件的组合来建模时间序列数据中的趋势、季节性、假期效应和噪声

要使用 Prophet,通常需要提供一个包含两列的时间序列数据集:'ds'(日期)和 'y'(要预测的值)。然后,可以将模型拟合到历史数据中,进行预测,并可视化结果

代码实现

关注公众号了解更多模型python实现

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_csv('基于KNN临近填补缺失值', index_col=0, parse_dates=['数据时间'])
print(data.shape)
data.head()

数据集为2018-01-01 00:00:00到2021-08-31 23:45:00某地区电网间隔15分钟的负荷数据(数据完整不存在缺失)

plt.figure(figsize=(15,4 ), dpi =300)
plt.grid(True)
plt.plot(data['总有功功率(kw)'], label = '间隔15min数据')
plt.title('间隔15min功率图')
plt.xlabel('时间')
plt.ylabel('总有功功率(kw)')
plt.legend()
plt.show()

 

# 把数据化为每天的均值数据
data_dmean = data.resample('D').mean()
data_dmean

 

plt.figure(figsize=(15,4 ), dpi =300)
plt.grid(True)
plt.plot(data_dmean['总有功功率(kw)'], label = '间隔15min数据')
plt.title('每天均值功率图')
plt.xlabel('时间')
plt.ylabel('总有功功率(kw)')
plt.legend()
plt.show()

 

from fbprophet import Prophet
def FB(datal, column):
    df = pd.DataFrame({
        'ds':pd.Series(datal.iloc[:,column].index),
        'y':pd.Series(datal.iloc[:,column].values)
    })
    df['cap'] = data.iloc[:,column].max()
    df['floor'] = datal.iloc[:,column].min()
    
    m = Prophet(
    changepoint_prior_scale = 0.2,
    daily_seasonality = False,
    yearly_seasonality = True, #年周期性
    weekly_seasonality = True, #周周期性
    growth = 'linear',
    interval_width = 0.8, #置信区间宽度,有多大概率落在浅蓝色线里
    )
    
    m.add_country_holidays(country_name = 'CN') # 中国所有节假日
    
    m.fit(df)
    
    future = m.make_future_dataframe(periods = 10) # 往后预测多少
    future['cap'] = datal.iloc[:,column].max()
    future['floor'] = datal.iloc[:, column].min()
    
    forecast = m.predict(future)
    
    fig1 = m.plot(forecast)
    fig2 = m.plot_components(forecast)
    
    return future, forecast

 使用Facebook Prophet库进行时间序列预测的Python代码。FB 函数接受一个数据框(datal)和一个列索引(column)作为输入,对数据进行预处理,拟合Prophet模型,然后对未来时间段进行预测

参数含义
changepoint_prior_scale控制变更点的灵活性,值越大,趋势的灵活性越高
daily_seasonality是否包含每日季节性,如果为'True',则考虑每天的季节性波动
yearly_seasonality是否包含每年季节性,如果为'True',则考虑每年的季节性波动
weekly_seasonality是否包含每周季节性,如果为'True',则考虑每周的季节性波动
growth指定趋势的增长类型,可以是'linear'或'logistic'
interval_width置信区间的宽度,用于可视化时显示预测的不确定性
holidays指定节假日的日期。可以是数据框或'pd.DataFrame’类型,包含节假日的日期和相关信息
add_country_holidays添加指定国家的所有公共假日
seasonality_prior_scale控制季节性的灵活性。值越大,季节性的灵活性越高

这只是其中一些参数,Prophet 还有其他可调整的参数,具体可以查阅 Prophet 文档 获取详细信息

future, forecast = FB(data_dmean, 0)

 

 

 

 

plt.figure(figsize=(15,4 ), dpi =300)
plt.grid(True)
plt.plot(data_dmean, color = 'c', label = '日平均功率曲线')
plt.plot(forecast.ds, forecast.yhat, label='预测曲线')
plt.title('实际日平均功率与预测日平均功率对比图')
plt.xlabel('时间')
plt.ylabel('总有功功率(kw)')
plt.legend()
plt.show()

 

plt.figure(figsize=(15,4 ), dpi =300)
plt.grid(True)
plt.plot(data_dmean[-100:], color = 'c', label = '日平均功率曲线')
plt.plot(forecast.ds[-100-10:], forecast.yhat[-100-10:], label='预测曲线')
plt.title('实际日平均功率与预测日平均功率对比图')
plt.xlabel('时间')
plt.ylabel('总有功功率(kw)')
plt.legend()
plt.show()

 

 

from sklearn import metrics
mse = metrics.mean_squared_error(data_dmean.values, np.expand_dims(forecast.yhat.iloc[0:1339].values,axis=1)) # MSE 均方误差
rmse = np.sqrt(mse) # 均方 根误差RMSE
mae = metrics.mean_absolute_error(data_dmean.values, np.expand_dims(forecast.yhat.iloc[0:1339].values,axis=1)) # MAE 平均绝对误差
def  mape(y_true, y_pred): 
    return np.mean(np.abs((y_pred - y_true) / y_true)) * 100
mape = mape(data_dmean.values, np.expand_dims(forecast.yhat.iloc[0:1339].values,axis=1)) # MAPE 平均绝对百分比误差
print(mse)
print(rmse)
print(mae)
print(mape)

 

from sklearn.metrics import r2_score # 拟合优度
r2_score(data_dmean.values, np.expand_dims(forecast.yhat.iloc[0:1339].values,axis=1))

 

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

关注微信公众号获取更多模型python代码实现

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python机器学习AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值