首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用TabPy将时间序列预测与Tableau进行集成

使用TabPy将时间序列预测与Tableau进行集成

作者头像
deephub
发布于 2021-07-01 02:52:37
发布于 2021-07-01 02:52:37
2.6K00
代码可运行
举报
文章被收录于专栏:DeepHub IMBADeepHub IMBA
运行总次数:0
代码可运行

在这篇文章中,我们将特别关注时间序列预测。

我们将使用三个时间序列模型,它们是使用python建立的超级商店数据集(零售行业数据)。我们将使用jupyter notebook 来构建我们的python代码,然后转移到Tableau。

本文旨在演示如何将模型与Tableau的分析扩展集成,并使其无缝使用。

为什么Tableau?因为我喜欢它,而且我不能强调它是多么容易探索你的数据。(译者注:我个人也认为Tableau是最强的可视化工具)

让我们从数据开始:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 #importing libraries
 import pandas as pd #for reading and processing data
 
 superstore = pd.read_excel('/Users/jevpau1/Downloads/Python Notes-UT/Superstore.xls')
 superstore.head(5)

我们只保留date和sales列,以便构建时间序列对象。下面的代码将销售数字按升序排序,并按月汇总数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 #fetching required columns
 data = superstore[[‘Order Date’,’Sales’]] 
 data = data.sort_values(by = 'Order Date')
 
 #creating a ts object
 data['Order Date'] = pd.to_datetime(data['Order Date'])
 data.index = data['Order Date']
 data = data.resample('M').sum()

我们准备可视化时间序列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import matplotlib.pyplot as plt
 import seaborn as sns
 
 plt.subplots(figsize = (17,7))
 sns.lineplot(x = “Order Date”, y = “Sales”, data = data)
 plt.show()

上面是我们的时间序列图。时间序列有三个重要的组成部分:趋势、季节性和误差。根据级数的性质和我们所假设的假设,我们可以将级数看作是一个“加法模型”或一个“乘法模型”。

现在,在切换到Tableau之前,我将分享我为完成模型而编写的代码。

正如本文开头提到的,我们将使用三个模型。这些是Holt线性模型,Holt-Winter模型和ARIMA。前两种方法是指数平滑法,ARIMA代表自回归综合移动平均,这是一种回归方法。

下面是Holt的Linear Method的python代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     import pandas as pd
     import numpy as np
     import statsmodels.api as sm
     from statsmodels.tsa.api import Holt
     import dateutil
     import datetime
     import warnings
     warnings.filterwarnings('ignore')
     
     superstore = pd.read_excel('/Users/jevpau1/Downloads/Python Notes-UT/Superstore.xls')
     
     #fetching required columns
     data = superstore[['Order Date','Sales']] 
     data = data.sort_values(by = 'Order Date')
     
     #creating a ts object
     data['Order Date'] = pd.to_datetime(data['Order Date'])
     data.index = data['Order Date']
     data = data.resample('M').sum()
     
     #use for training entire dataset
     data = data[:-(6)]
     
     #create future dataset
     step = dateutil.relativedelta.relativedelta(months=1)
     start = data.index[len(data)-1] + step
     index = pd.date_range(start, periods=6, freq='M')
     columns = ['Sales']
     df = pd.DataFrame(index=index, columns=columns)
     df = df.fillna(0)
    
     #Fit the model
     model = Holt(np.asarray(data['Sales'])).fit(smoothing_level = 0.3,smoothing_slope = 0.1)
     df['Sales']=model.forecast(6)
     df = df.fillna(0)
     x = pd.concat([data,df])
     x

该模型的训练时间为42个月,最后的6个月用于预测。模型参数可以调整为精度。模型将两者都追加,并将整个系列返回给我们。

我们怎么把它和Tableau联系起来呢?

Tableau有内置的分析扩展,允许与其他平台集成。

在本例中,我们选择TabPy。

您可以在上面描述的弹出窗口中测试Tableau中的连接。

我们还在python环境中导入TabPyClient来创建连接对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import tabpy_client
 connection = tabpy_client.Client('http://localhost:9004/')

我们将使用这个连接对象将模型部署到我们刚刚启动的TabPy Server上。

让我们看看Holt的Linear方法的修改代码,它可以部署在TabPy上。

Holt线性方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 def holts_linear_method(_arg1,_arg2,_arg3):
     import pandas as pd
     from pandas import DataFrame
     import numpy as np
     import matplotlib.pyplot as plt
     import seaborn as sns
     from statsmodels.tsa.api import Holt
     import warnings
     import dateutil
     warnings.filterwarnings('ignore')
     
     data = DataFrame({'Period': _arg1,'Net Sales': _arg2})
     data = data.sort_values(by = 'Period')
     data['Period'] = pd.to_datetime(data['Period'])
     
     #use for training entire dataset
     data.index = pd.to_datetime(data['Period']) 
     data = data.resample('M').mean()
     data = data[:-(_arg3)]
     
     #create future dataset
     step = dateutil.relativedelta.relativedelta(months=1)
     start = data.index[len(data)-1] + step
     index = pd.date_range(start, periods=_arg3, freq='M')
     columns = ['Net Sales']
     df = pd.DataFrame(index=index, columns=columns)
     df = df.fillna(0)
 
     #Fit the model
     fit1 = Holt(np.asarray(data['Net Sales'])).fit(smoothing_level = 0.3,smoothing_slope = 0.1)
     df['Net Sales']=fit1.forecast(_arg3)
     df = df.fillna(0)
     x = pd.concat([data, df])
     return x['Net Sales'].tolist()
 
 connection.deploy('Holt Linear Method',holts_linear_method,'Returns forecast of revenue', override=True)

我们已经创建了一个返回模型输出的函数。因为我们将从Tableau读取数据,所以我们使用了从Tableau传递值的参数。您将注意到,我们使用连接对象在TabPy中部署模型。类似地,您可以为其他模型创建函数。

Holt-Winter方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 def holt_winters_method(_arg1,_arg2,_arg3):
     import pandas as pd
     from pandas import DataFrame
     import numpy as np
     import matplotlib.pyplot as plt
     import seaborn as sns
     from statsmodels.tsa.api import ExponentialSmoothing
     import warnings
     import dateutil
     warnings.filterwarnings('ignore')
    
     data = DataFrame({'Period': _arg1,'Net Sales': _arg2})
     data = data.sort_values(by = 'Period')
     data['Period'] = pd.to_datetime(data['Period'])
     
     #use for training entire dataset
     data.index = pd.to_datetime(data['Period']) 
     data = data.resample('M').mean()
     data = data[:-(_arg3)]
     
     #create future dataset
     step = dateutil.relativedelta.relativedelta(months=1)
     start = data.index[len(data)-1] + step
     index = pd.date_range(start, periods=_arg3, freq='M')
     columns = ['Net Sales']
     df = pd.DataFrame(index=index, columns=columns)
     df = df.fillna(0)
     
     #Fit Model
     fit1 = ExponentialSmoothing(np.asarray(data['Net Sales']) ,seasonal_periods=4 ,trend='add', seasonal='add',).fit()
     df['Net Sales']=fit1.forecast(_arg3)
     df = df.fillna(0)
     x = pd.concat([data, df])
     return x['Net Sales'].tolist()
 
 connection.deploy('Holt Winters Method',holt_winters_method,'Returns forecast of revenue', override=True)

ARIMA

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 def sarima_method(_arg1,_arg2,_arg3):
     import pandas as pd
     from pandas import DataFrame
     import numpy as np
     import matplotlib.pyplot as plt
     import seaborn as sns
     import statsmodels.api as sm
     import dateutil
     import datetime
     import warnings
     warnings.filterwarnings('ignore')
     
     data = DataFrame({'Period': _arg1,'Net Sales': _arg2})
     data = data.sort_values(by = 'Period')
     data['Period'] = pd.to_datetime(data['Period'])
     
     #use for training entire dataset
     data.index = pd.to_datetime(data['Period']) 
     data = data.resample('M').mean()
     data = data[:-(_arg3)]
     
     #create future dataset
     step = dateutil.relativedelta.relativedelta(months=1)
     start = data.index[len(data)-1] + step
     index = pd.date_range(start, periods=_arg3, freq='M')
     columns = ['Net Sales']
     df = pd.DataFrame(index=index, columns=columns)
     df = df.fillna(0)
    
     #Fit the model
    
     fit1 = sm.tsa.statespace.SARIMAX(data['Net Sales'], order=(1, 1, 1),seasonal_order=(1,1,1,12)).fit()
     df['Net Sales']=fit1.forecast(_arg3)
     df = df.fillna(0)
     x = pd.concat([data, df])
     return x['Net Sales'].tolist()
 
 
 connection.deploy('Seasonal ARIMA Method',sarima_method,'Returns forecast of revenue', override=True)

现在我们已经在TabPy中部署了这些模型,让我们在Tableau中使用它。我们将创建一个如下所示的计算字段:

Tableau使用SCRIPT_REAL、SCRIPT_STR、SCRIPT_BOOL和SCRIPT_INT四个函数分别返回实、字符串、布尔和整数类型。上面的代码告诉Tableau运行' Seasonal ARIMA Method ',该方法部署在TabPy上,有3个参数(日期、销售和月份到预测),并返回' response '到Tableau的计算字段。

类似地,我们为其他两个模型定义计算字段。如果我们想在Tableau中一目了然,它将是这样的:

请注意,您可以根据需要动态更改预测周期并查看预测。你想要选择能给你最好精确度的模型。你可以选择在Tableau中创建一个参数来在模型之间切换。

需要注意的一个关键点是,我们需要适应Tableau中的预测周期(在我们的例子中以月为单位),以便为TabPy返回的值腾出空间。这是因为当我们从Tableau传递原始数据集时,它没有这些用于未来日期的空记录。我所做的调整数据如下所示:

在添加需要预测的月份并将其传递给TabPy之后,上面的代码实际上扩展了日期范围。此外,我们选择“显示缺失的值”为我们的日期字段。

由于我们延长了日期范围,最后的日期和销售数字将被推到新的预测结束日期。然而,我们只对预测感兴趣;我们可以排除这个数据点,或者在筛选框中使用LAST()=FALSE。你可以随意提出相同的想法。

我们在Tableau的视觉发现中有一个很好的综合预测模型。你绝对可以把精度分数和模型参数带到Tableau,让它更酷!

作者:Jerry Paul

原文地址:https://jevpau1.medium.com/tableau-your-time-series-forecast-with-tabpy-5c09c151477f

deephub翻译组

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DeepHub IMBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Javascript将HTML转成PDF并下载「支持多页」
由于html2canvas只能将它能处理的生成canvas image,因此渲染出来的结果并不是100%与原来一致。但它不需要服务器参与,整个图片都由客户端浏览器生成,使用很方便。
用户1093975
2018/08/03
4.2K0
前端生成pdf,jspdf+html2Canvas的使用(vue)
2、安装html2Canvas: npm install --save html2canvas
前端小tips
2021/11/27
8.2K0
前端生成pdf,jspdf+html2Canvas的使用(vue)
前端vue项目,把某个div盒子或当前页面生成pdf文件并下载。
3、事件 给需要生成pdf的盒子设置id:pdfDom 给按钮一个全局事件方法getPdf('个人征信报告'),参数是文件名
江一铭
2022/06/16
1.5K0
前端vue项目,把某个div盒子或当前页面生成pdf文件并下载。
页面DOM导出PDF
页面DOM导出PDF Nginx设置允许跨域 location /static { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; index index.html; root /data/wwwjarapi/8905xhkjfileapitest/; } 也就是在location下添加 add_header 'Access-Control-
码客说
2020/05/09
3K0
vue前端怎么导出图片_VUE中将页面导出为图片或者PDF
1.将页面html转换成图片 npm install html2canvas –save
全栈程序员站长
2022/09/01
2.9K0
Vue 结合html2canvas和jsPDF实现html页面转pdf
E:\MyProjects\TMP\frontend>npm install html2canvas
授客
2020/04/30
5.1K0
Vue 结合html2canvas和jsPDF实现html页面转pdf
HTML页面导出PDF——高清版
  需要做一个导出PDF的功能,网上找有很多,但是一般导出来的都是比较模糊的那种,下面这个是高清版的,导出的PDF都是几M,跟正常手动导出的差不多,很清晰。
_一级菜鸟
2019/09/10
2.3K0
html页面导出为pdf(jsPDF、iText、wkhtmltopdf)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/79710704
DannyHoo
2018/09/13
7.2K0
html页面导出为pdf(jsPDF、iText、wkhtmltopdf)
VUE 网页生成 PDF[通俗易懂]
如图,在导出文件时,发现网络错误,可能是因为下载器不支持,首先换浏览器试一次,如果可以下载,则就是下载器不支持。
全栈程序员站长
2022/08/28
2.1K0
VUE 网页生成 PDF[通俗易懂]
教你两招,轻松搞定html页面导出为pdf文件
Hi,大家好,我是麦洛,最近项目中遇到了将html页面导出为pdf文件,现在将相关内容分享出来,希望帮到有需要的伙伴
麦洛
2021/05/24
3.6K0
教你两招,轻松搞定html页面导出为pdf文件
​html2canvas 出现图片无法展示
最近接收到一个优化需求:就是对之前的行程文档的图文介绍添加打印生成 pdf 的功能
公众号---人生代码
2020/11/26
2.6K0
vue3 如何将页面生成 pdf 导出
最近工作中有需要将一些前端页面(如报表页面等)导出为pdf的需求,博主采用的是html2Canvas + jspdf。
唐志远
2023/07/26
1.4K0
vue3 如何将页面生成 pdf 导出
Vue 一键导出 PDF
生成 PDF 基本思路大多一致,先用 html2canvas 将 DOM 元素转换为 canvas,再利用 canvas 的 toDataURL 方法输出为图片,最后使用 jsPDF 添加图片生成 PDF 实现一键下载。
数媒派
2022/12/01
2K0
Vue如何实现导出页面为PDF
导入完成之后,开始编写需要进行操作的Vue页面,如下,当然其中页面只是为了参考,读者可以通过自己编写的页面来进行测试
初学者123
2020/10/07
2.4K0
Vue如何实现导出页面为PDF
vue-pdf实现pdf预览、分页、下载、打印
https://www.npmjs.com/package/vue-pdf-app
圆圆的冬瓜
2021/08/18
26.6K2
vue-pdf实现pdf预览、分页、下载、打印
所见即所得——HTML转图片组件开发
在我们日常开发中一定会遇到"所见即所得"的需求,如导出查询表格中的内容为 Excel 表格——《前端导出 Excel,让后端刮目相看》(https://juejin.cn/post/7030291455243452429)、通过后台网页配置实现配置预览页与实际页面展示的统一——《从零开发一款可视化大屏制作平台》(https://juejin.cn/post/6937257727106220040)。
政采云前端团队
2022/12/01
3.7K0
所见即所得——HTML转图片组件开发
html2canvas 与 jspdf 相结合生成 pdf 内容被截断的终极解决方案
最近接收到一个优化需求:就是对之前的行程文档的图文介绍添加打印生成 pdf 的功能
公众号---人生代码
2020/11/26
4.4K0
H5基于Canvas实现电子签名并生成PDF文档
原文:https://juejin.cn/post/6901273585428463624
zz_jesse
2021/01/06
4K0
H5基于Canvas实现电子签名并生成PDF文档
html导出pdf的四种方式
将html页面导出为pdf文件并打印,可以直接在windows下使用Ctrl + P,苹果下⌘ + P。
二十三年蝉
2018/12/05
5.1K0
html导出pdf的四种方式
React项目实现导出PDF的功能
在做web项目中,有时候会遇到pdf导出的需求,现根据之前在公司的React项目中遇到的导出PDF需求,整理一个demo出来。
用户1174387
2022/06/08
2.5K0
React项目实现导出PDF的功能
相关推荐
Javascript将HTML转成PDF并下载「支持多页」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档