【Python】轻量化编程实战
提高打工人效率系列文章:
第二篇 使用Python+Prophet 实现时间序列分析
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
创作背景:Prophet是一个由Facebook开发的时间序列分析工具,早期是用来分析网页点击行为规律。在实际工作中,我把它延申应用到分析网约车订单的出行规律中。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Prophet是什么?
Prophet是基于可分解(趋势+季节+节假日)模型的开源库,可以用简单直观的参数进行高精度的时间序列预测,并且支持自定义季节和节假日的影响。
原理:
时间序列模型可分解为三个主要组成部分:趋势,季节性和节假日。
它们按如下公式组合:
其中:
g(t):用于拟合时间序列中的分段线性增长或逻辑增长等非周期变化。
s(t):周期变化(如:每周/每年的季节性)。
h(t):非规律性的节假日效应(用户造成)。
et:误差项用来反映未在模型中体现的异常变动。
二、为什么出行业务可以使用 时间序列 模型进行分析?
- 有至少几个月(最好是一年)的每小时、每天或每周观察的历史数据;
- 有多种人类规模级别的较强的季节性趋势:每周的一些天和每年的一些时间;
- 有事先知道的以不定期的间隔发生的重要节假日(比如国庆节);
三、程序实现
3.1 导入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
from fbprophet import Prophet
- Prophet库可以通过pip来安装,建议走国内的安装源,更快一些。
- Matplotlib需要单独安装中文字符库,否则有些字体会显示成方块。
#字体管理器
from matplotlib import font_manager as rcParams
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False #这两行需要手动设置
3.2 读取并预处理相关数据
分析出行数据规律的话,最好按照分析颗粒度需求来聚合一下,否则数据量实在太大且分散,没有分析价值。
我这里是要看每天24小时之内,每个小时段的用车规律,所以只要按照小时来聚合数据即可。如果要看的是全年每一天的规律,那就按天聚合。
#数据处理
data_bs = pd.read_csv('C:/Users/xxxx/Downloads/xx区分时单量_2021-04-25.csv',header=0,encoding='gbk')
# 按照时段聚合单量的函数
def order_per_hour(data):
data['撮合成功时间'] = pd.to_datetime(data['撮合成功时间'])
# 将撮合时间归集到当前小时
data['订单时段'] = data['撮合成功时间'].map(lambda x:x.replace(minute=0,second=0))
# 按照每天每个小时聚合
result = data.groupby(['订单时段'])[['起点区域']].count()
result.sort_index()
result.reset_index(inplace=True)
result.rename(columns={
'订单时段':'ds','起点区域':'y'},inplace=True)
return result
# 获得按小时聚合的数据
result_bs = order_per_hour(data_bs)
3.3 增加非规律性信息
出行规律可能会受到一些非规律性因素的影响,从而会导致在数据上显示出不同寻常的突起。Prophet工具的优点就在于,可以自定义非规律性信息(这些非规律信息必须是跟着时间走的),也就上上面公式中的h(t):非规律性的节假日效应(用户造成)。
我们在出行规律分析中,可以将节假日作为异常信息投喂给模型。
代码示例: