facebook prophet的探索(python语言)

fbprophet的探索历程

facebook开源了时间序列预测框架prophet,目前支持R语言和python语言。托管在github上:https://github.com/facebookincubator/prophet。本文将使用python对该框架的使用。

开发环境的搭建:

在Linux环境下,搭建会简单些,fbpropeht依赖pystan,numpy,pandas,所以首先要安装这个三个库:(当然,需要先安装python环境,Linux一般自带,如果没有,可以自行搜索下安装方法)

pip 的安装:

sudo apt-get install python-pip

依赖库的安装:

sudo pip install pystan
sudo pip install numpy
sudo pip install pandas
fbprophet的安装:

pip install fbprophet
等待安装完成之后,可以测试一下:进入python,导入fbprophet库,看是否能成功导入,如下,便安装成功了。

loaderbox@loaderbox-desktop:~$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from fbprophet import Prophet
>>> 
如果要在windows下搭建fbprophet开发环境的话,那么python的版本需要 3.5或以上,安装方法的类似于在Linux环境的。

环境搭建成功之后就能直接使用fbprophet了。github上面的quick start 介绍了fbprophet的基本使用:https://facebookincubator.github.io/prophet/docs/quick_start.html

其中使用到的样本也在github上,所以大家最好先git下来:

git clone https://github.com/facebookincubator/prophet.git
git下来的目录如下图,样本在examples目录下(样本格式为.csv),实现预测要用到的文件forecaster.py(在python/fbprophet目录下):

                

那么,现在就使用fbprophet来实现预测。(以时间:天为粒度,目前,fbprophet支持的最小粒度为:天(截止我写这篇博客时,是不支持小时的),如果想去预测以小时为粒度的数据,需要对源码作出一些修改,会在下一篇博客上说明)

第一步,读取数据:(先要导入pandas、numpy和Prophet)

import pandas as pd
import numpy as np
from fbprophet import Prophet
from matplotlib import pyplot as plt

file_path= '/home/loaderbox/ecr/prophet/examples/example_wp_peyton_manning.csv'
df = pd.read_csv(file_path)
使用pandas的read_csv()方法读取数据,返回的结果df是一个DataFrame格式的对象,打印df可以看到类似于以下数据格式( dsy是必须的,不能改变):

              ds      y
0     2007-12-10  14629
1     2007-12-11   5012
2     2007-12-12   3582
3     2007-12-13   3205
4     2007-12-14   2680
5     2007-12-15   2401
6     2007-12-16   4510
7     2007-12-17   6831
8     2007-12-18   4370
9     2007-12-19   3196
10    2007-12-20   2642

第二步:创建一个Prophet对象

prophet = Prophet()
传入参数说明:(打开forecaster.py文件,查看它的__init__方法)

def __init__(
            self,
            growth='linear',
            changepoints=None,
            n_changepoints=25,
            yearly_seasonality=True,
            weekly_seasonality=True,
            daily_seasonality=True,
            holidays=None,
            seasonality_prior_scale=10.0,
            holidays_prior_scale=10.0,
            changepoint_prior_scale=0.05,
            mcmc_samples=0,
            interval_width=0.80,
            uncertainty_samples=1000,
    ):
growth = 'linear':fbporphet有两种模式,线性增长模式和逻辑增长模式(growth='logistic')

changepoints:指定潜在改变点,如果不指定,将会自动选择潜在改变点例如:

changepoints=['2014-01-01']
指定2014-01-01这一天是潜在的changepoints

n_changepoints:默认值为25,表示changepoints的数量大小,如果changepoints指定,该传入参数将不会被使用。如果changepoints不指定,将会从输入的历史数据前80%中选取25个(个数由n_changepoints传入参数决定)潜在改变点。

yearly_seasonality:指定是否分析数据的年季节性,如果为True,最后会输出,yearly_trend,yearly_upper,yearly_lower等数据。

weekly_seasonality:指定是否分析数据的周季节性,如果为True,最后会输出,weekly_trend,weekly_upper,weekly_lower等数据。

daily_seasonality:这是是我自定义的参数,前面有说到,目前fbprophet不支持以小时为粒度的数据,所以,我在这里添加了这个参数,会在下篇博客上说明

holidays:传入pd.dataframe格式的数据。这个数据包含有holiday列 (string)和ds(date类型)和可选列lower_window和upper_window来指定该日期的lower_window或者upper_window范围内都被列为假期。lower_window=-2将包括前2天的日期作为假期,例如:(这个是官方的quick start中的季后赛和超级杯两个假期的指定)

# Python
playoffs = pd.DataFrame({
  'holiday': 'playoff',
  'ds': pd.to_datetime(['2008-01-13', '2009-01-03', '2010-01-16',
                        '2010-01-24', '2010-02-07', '2011-01-08',
                        '2013-01-12', '2014-01-12', '2014-01-19',
                        '2014-02-02', '2015-01-11', '2016-01-17',
                        '2016-01-24', '2016-02-07']),
  'lower_window': 0,
  'upper_window': 1,
})
superbowls = pd.DataFrame({
  'holiday': 'superbowl',
  'ds': pd.to_datetime(['2010-02-07', '2014-02-02', '2016-02-07']),
  'lower_window': 0,
  'upper_window': 1,
})
holidays = pd.concat((playoffs, superbowls))

这里再引用下官方的一段话进行补充说明:

You can also include columns lower_window and upper_window which extend the holiday out to [lower_window, upper_window] days around the date. For instance, if you wanted to included Christmas Eve in addition to Christmas you’d include lower_window=-1,upper_window=0. If you wanted to use Black Friday in addition to Thanksgiving, you’d include lower_window=0,upper_window=1.

seasonality_prior_scale:季节性模型的调节强度,较大的值允许模型以适应更大的季节性波动,较小的值抑制季节性

holidays_prior_scale:假期组件模型的调节强度。

changepoints_prior_scale:自动的潜在改变点的灵活性调节参数,较大值将允许更多的潜在改变点,较小值将允许更少的潜在改变点。

mcmc_samples:整数,若大于0,将做mcmc样本的全贝叶斯推理,如果为0,将做最大后验估计。
指定贝叶斯抽样,例如mcmc_samples=20,

Iteration:  1 / 20 [  5%]  (Warmup) (Chain 0)
Iteration:  2 / 20 [ 10%]  (Warmup) (Chain 0)
Iteration:  4 / 20 [ 20%]  (Warmup) (Chain 0)
Iteration:  6 / 20 [ 30%]  (Warmup) (Chain 0)
Iteration:  8 / 20 [ 40%]  (Warmup) (Chain 0)
Iteration: 10 / 20 [ 50%]  (Warmup) (Chain 0)
Iteration: 11 / 20 [ 55%]  (Sampling) (Chain 0)
Iteration: 12 / 20 [ 60%]  (Sampling) (Chain 0)
Iteration: 14 / 20 [ 70%]  (Sampling) (Chain 0)
Iteration: 16 / 20 [ 80%]  (Sampling) (Chain 0)
Iteration: 18 / 20 [ 90%]  (Sampling) (Chain 0)
Iteration: 20 / 20 [100%]  (Sampling) (Chain 0)
预测时会打印出这些。

interval_width:浮点数,给预测提供不确定性区间宽度,如果mcmc_samples=0,这将是预测的唯一不确定性,如果mcmc_samples>0,这将会被集成在所有的模型参数中,其中包括季节性不确定性

uncertainty_samples:模拟绘制数,用于估计不确定的时间间隔

第三步,填充数据并准备预测的数据框架:

df['y'] = np.log(df['y'])
prophet.fit(df)
future = prophet.make_future_dataframe(freq='D',periods=periods)
先求对数(以e为底).

fit(df)填充数据.

make_future_dataframe()准备预测的数据框架,该函数的定义如下:

    def make_future_dataframe(self, periods, freq='D', include_history=True):
        last_date = self.history['ds'].max()
        dates = pd.date_range(
            start=last_date,
            periods=periods + 1,  # closed='right' removes a period
            freq=freq,
            closed='right')  # omits the start date

        if include_history:
            dates = np.concatenate((np.array(self.history['ds']), dates))

        return pd.DataFrame({'ds': dates})
periods:指定要预测的时长,要根据freq这个参数去设置。假如freq='D',那么粒度为天,periods则指定要预测未来多少天的数据。如果freq='H‘,则periods指定要预测未来多少小时的数据(当然,要在框架支持粒度为小时的前提下才能运用)。

include_history:是否包含历史数据,保持默认就好。

第四步,预测:

forecasts = prophet.predict(future)
预测好的数据是返回给forescasts,如果上一步的include_history传入为False,那么这次的返回将不会包括里历史数据。只包含预测出来的数据。

可以将预测结果显示出来:

forecasts的keys如下:

['ds', 't', 'trend', 'seasonal_lower', 'seasonal_upper',
       'trend_lower', 'trend_upper', 'yhat_lower', 'yhat_upper', 'daily',
       'daily_lower', 'daily_upper', 'weekly', 'weekly_lower',
       'weekly_upper', 'yearly', 'yearly_lower', 'yearly_upper',
       'seasonal', 'yhat']
画图:

prophet.plot(forecasts).show()
prophet.plot_components(forecasts).show()


说明:图中浅蓝色表示yhat_upper和yhat_lower,受到interval_width这个参数的影响,当然,从forecasts的keys中可以看到,还有其他的_upper和_lower,同样也会受到这个参数的影响。



基本上,到此就是fbprophet的使用了,对于那些__init__函数中传入的参数对预测结果的影响,如果有兴趣,可以去阅读下源码,琢磨一下这些参数的含义。

上面的内容也是我自己摸索出来,会存在一些错误,请大家在评论中指出,互相学习。

下篇博客将会介绍如何添加以小时为粒度的支持:修改fbprophet源码以支持以小时为粒度的预测




  • 13
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: "Prophet" 是一种用于时间序列预测Python库。它由Facebook开发,并且被广泛用于预测商业和社交媒体数据。 Prophet 使用了一种称为“可加性季节分解的时间序列模型”。这个模型可以识别出数据集中的趋势、季节性和节假日效应,并基于这些特征进行预测。 使用Prophet进行预测的过程相对简单。首先,需要准备一个包含日期和对应数值的数据集。然后,使用Prophet拟合数据集,识别和建模出趋势、季节性和节假日效应。最后,可以使用Prophet生成预测结果,并对结果进行进一步的分析和可视化。 Prophet具有以下特点使其在时间序列预测中广受欢迎: 1. 简单易用:使用Prophet的API非常直观,无需过多的统计知识。 2. 灵活性和可解释性:Prophet能够灵活地适应各种复杂的数据集,并提供对预测结果的可解释性。 3. 高效性:Prophet被设计为能够处理大规模数据集,并且在计算上非常高效。 4. 节假日效应建模:Prophet能够自动处理常见的节假日效应,从而提高预测的准确性。 5. 可视化功能:Prophet提供了丰富的可视化功能,帮助用户更好地理解数据的特征和预测结果。 总之,Prophet是一种强大而易用的Python库,适用于各种时间序列预测任务,如销售预测、股票预测等。 ### 回答2: 预测是一种猜测未来事件的行为,而先知是指那些被认为能够预知未来的人或神秘力量。当用“prophet”和“预测”这两个词同时提及“python”时,可能是指使用Python编程语言进行预测分析。Python在信息技术领域被广泛应用,包括数据科学、人工智能和机器学习等领域。 Python具有丰富的库和工具,使得它成为进行预测模型开发和实施的理想选择。使用Python编写的库如NumPy、Pandas和SciPy提供了强大的数据处理和统计分析功能。而scikit-learn和TensorFlow等库则提供了丰富的机器学习和深度学习算法,用于构建预测模型。 借助Python的这些库和工具,可以进行各种预测任务。例如,在金融领域,可以使用Python对股票市场进行预测,分析市场趋势和价格变化。在销售行业,可以使用Python预测产品销售量,为供应链和库存管理提供指导。在气预报方面,Python可以用于分析大量的气象数据,进行气象模型的构建和预测。 总之,Python作为一种灵活而强大的编程语言,为预测任务提供了丰富的工具和算法。无论是数据分析、机器学习还是其他领域的预测Python都可以为我们提供极大的帮助,并为预测工作的准确性和效率做出贡献。 ### 回答3: 预测是一种基于已有信息和趋势,对未来事件或发展进行估计或预测的行为。Python是一种流行的高级编程语言,常用于软件开发、数据分析和人工智能领域。预测Python的未来发展可以基于以下几个方面考虑。 首先,Python作为一种简洁而易读的语言,其用户群体不断扩大。Python的简单语法使得初学者容易上手,因此未来将会有更多的人选择Python作为编程语言入门。此外,Python在大数据和机器学习领域的应用广泛,这也将吸引更多的开发者和研究者加入到Python社区。 其次,Python具有丰富且庞大的生态系统。Python拥有丰富的第三方库和框架,如NumPy、Pandas、Scikit-learn等,这些库和框架可以大大简化开发者的工作,提高工作效率。随着人工智能的快速发展,Python在深度学习和自然语言处理方面的应用也会继续增长。 再次,Python的开源性质使得其发展充满活力。Python社区活跃且开放,任何人都可以为Python做出贡献,这使得Python的发展迅速且符合用户需求。未来更多的开发者将参与到Python的开源项目中,进一步丰富和改进了Python的功能和性能。 最后,Python在不同领域的应用越来越广泛。无论是科学计算、Web开发、自动化测试还是数据可视化等,Python都有着广泛的应用。随着各行各业对技术需求的增加,Python的发展也将得到更多机会和挑战。 综上所述,基于Python的简洁易读、丰富生态系统、开源性质和广泛应用的特点,可以预测Python在未来会继续快速发展,并在技术领域中扮演更重要的角色。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值