时间序列预测(Time Series Forecast)
时间序列数据,即以时间点(年月日时)为轴的序列型数据。时间序列预测具有广泛的应用场景,包括销量、股市指数、房价走势等等。本文介绍几种常见预测模型在Power BI(以下简称PBI)中的实现。
移动平均值法(MA,Moving Average)
这是PBI中最常见的预测模型,折线图本身就自带这个功能。如下图所示,可以设置一定置信区间范围内一定期间内的预测值。
此外还可以通过建立度量值手动建模。好处是自由度更大,可以滑动选择基于前多少期进行预测。建模需要三个表,一个是时间序列的表,一个是日期表,另外再建一个参数表,用来按需选择移动平均天数。移动平均值计算如下,其中Indicator Measure为指标的度量值。
代码语言:javascript复制Indicator_MA =
AVERAGEX(
DATESINPERIOD( 'Dates'[Date] , max( 'Dates'[Date] ) , -[Parameter] , DAY ) ,
[Indicator Measure]
)
等差等比和线性回归(Linear Regression)
某些时间序列,当期与上期大体呈等差等比关系,如:
y(t)=y(t-1) a 或 y(t)=a*y(t-1)
还有一些跟时间或者其他变量呈线性相关,如:
y=a b*t c*x
其中y为预测变量,t为时间,x为其他变量,a,b,c为参数。这两种数据分析中的基础模型,用其他软件(哪怕是Excel)都相当容易模拟,但对于PBI来说却没那么简单。
PBI做等差等比的困难在于,DAX擅长根据A列聚合求B列,而不那么容易根据B列上期值生成B列当期值。解决这个问题,需要利用循环迭代或者归的思想,在PQ里用M语言,或直接用DAX多设几个参数绕道去做。
而PBI做一元甚至多元线性回归的麻烦在于,需要生硬笨拙地用最小二乘法一步一步求解系数。光求解二元线性回归的代码已经多达50行。再者,同样的方法不能推广到多元(想想手动求解多元方程的困难)。相比在EXCEL里点几个按钮,Python、R、Matlab、SPSS、Eviews里只需敲两三行代码,而且几乎不限元,PBI做线性回归的性价比确实不高。
SEIR模型
还有没有更复杂的呢?或者说PBI还能不能更高效地做复杂模型呢?比如疫情相关预测里常用到的经典传染病动力学模型——SEIR模型:
其中S为易感染者人数,E为潜伏者人数,I为感染者人数,R为康复者人数。通常预测图如下,相信细心关注疫情新闻的大家或多或少都见过:
这个模型的复杂度在于当期变量既跟上期相关,又有跟其他变量相关,而且其他变量还跟另外的变量相关。
这样的模型,与其费劲用M或者DAX去求解,不如直接求助于Python或R(Python或R求解这个模型只需照搬上述四行等式加个循环语句,简便快捷)。毕竟大部分PBI使用者更需要的是利用工具解决问题,而不是探索工具本身。那么该怎么实操呢?下面以Python为例说明。
大体思路是在数据查询这个环节使用Python建模生成数据表。首先在get data处新建空白查询,然后点击Advanced Editor。接下来在这个框架里,就可以直接使用python代码了。
代码语言:javascript复制let
Source=Python.Execute("填写你的python代码"),
d = Source{[Name="数据表的名称"]}[Value],
in
d
几点说明:
- 上述的双引号都是必填的;
- PBI引用Python时,PBI的表对应Python的DataFrame;
- Python可以调用其他库,换言之通过Python做更复杂的机器学习模型;
- 需要设置Python数据源的安全等级为Public,才能在PBI Service里设置刷新计划;
- 要在PBI Service里使用刷新计划,只能通过个人数据网关,不能用企业版数据网关。
更进一步地,我们可以借助参数化查询,动态调整模型。比如模型中有可变参数r(感染者接触易感染人数),那么点击New Parameter,然后设置可变动的序列,如下图所示:
接着在Python的代码里面将原本是常数的r改为引用这个参数,代码如下:
代码语言:javascript复制R0 = 0 #初始康复人数
r = "&Text.From(r)&" #感染者接触人数
上述第一行设置常数,第二行引用参数。这样就完成了参数化查询的设置。用户在报告页面点击编辑查询,可以手动修改r值,生成新的时间序列预测。
参数化查询的不足是无法在发布的链接里修改参数,只能在PBI desktop里调整。据了解目前官方还没完善这个功能,国外论坛有人提出可以使用Power Apps来解决。