不用学前端编程,你就能用Python简单高效写出漂亮的交互式Web应用,将你的数据分析成果立即展示给团队和客户。
从我开始折腾数据分析工具的那一天,就没有想明白一件事儿——为什么我打算把数据分析的成果做成一个应用,这么难?
其实我需要的核心功能,无非是在网页上接收用户输入,然后做分析处理,把分析结果反馈给用户,完事儿。
可是这谈何容易?
很多人都会笑着告诉你,这得学前端编程,HTML+Javascript了解一下吧!
什么?你还需要在后台做数据分析?那你就得学Web框架了。
你说喜欢Python?那就学个Django或者Flask好了。
问题是我在学习中,提不起真正的兴趣。
因为教程里讲的那些功能,我根本不关心。
核心的功能,我早已实现了。我只是希望把输入输出弄成网页形式,方便用户来用。
我为什么要理解那么多的概念?为什么一定要跟那么繁重的数据库操作打交道?为什么几乎所有的样例,都要教我如何做一个blog?
我要是想用blog,可以直接注册一个免费的啊!难道我要自己开发?
你的教程为什么不干脆教我怎么把数据科学的分析结果,利用这些技术快速变成一个产品?
但是人家写书和做教程的人,就是不疾不徐,坚持一定要教会你,如何做一个blog出来……
我仿佛看见达芬奇的老师教学生画鸡蛋一样。
我相信,这绝不仅仅是我一个人的痛点。
我们都希望尽快把数据分析结果,或是其他的交互功能发布出来,和用户交流。但是因为缺乏这样的简单Web包裹,我们不得不每次都给别人展示一个包含了代码的JupyterNotebook。
那些不懂编程的用户,看到代码,就会觉得不适。再看到改变一个输入都需要编程(其实就是改语句中的一个赋值),立刻就决定不玩儿了。
万万没想到,这个痛点,如此容易就解决了。
我用纯Python脚本写了个Web应用。
我编写的程序里,没有一丝半毫的Web框架,Javascript,甚至是HTML。
这玩意儿能用吗?
你自己来试试看。
你会看到下面的初始化界面。
初始化完毕之后,页面会分成左右两栏。左面是两个下拉候选框,分别让你指定需要分析的数据范围。
上面一个,是事件类型;
下面一个,是事件发生归属地。
只不过,当时我们更注重的,是用循环神经网络搭建了一个严重拥堵事件预测模型。
而今天,我们是要进行探索性数据分析,也就是根据我们感兴趣的目标,对数据进行整理操作,然后可视化显示。
选定之后,你会看到右侧提示两个信息:
怎么样?
麻雀虽小,五脏俱全。
虽然咱们这个Web应用很简单,不过交互分析该有的功能和流程,基本上都涵盖了。
你可能会问:
王老师,编这么一个应用出来,不简单吧?
学完这篇教程,你就能自己开发出这样一个应用来。
可以看到,一共包含了4个文件。
有意思的是,其中3个,包括:
都只是部署到远程服务器时,需要用到的配置文件而已。
这些文件的具体使用方法,咱们后面会说明。
也就是说,只有最后一个helloworld.py是主角,它包含了实现咱们全部交互式数据分析功能的Python脚本文件。
这代码,少说也得有几百行吧?
别担心,打开来看看:
上面这张截图,就已经包含了实现交互数据分析功能的全部代码。
神奇吧?
这么短的代码,为什么能有如此强大的功能?
下面我通过实际操作,带你初步领略一下streamlit的威力。
然后,你需要打开终端,执行:
pipinstallstreamlit你可以创建一个新目录。然后在目录下新建一个helloworld.py文件,并且用任意编辑器打开它。
我这里用VisualStudioCode编辑器,来编辑和制作Python脚本文件。
然后,回到终端下,执行:
streamlitrunhelloworld.py如果一切顺利,你就会看到如下图的提示。
一般来说,你的浏览器会自动开启,并且访问上图中红色标识出的网址。
如果浏览器没有自动开启,你手动开启一个,并且输入上述网址即可。
为了演示方便,我这里把VisualStudioCode编辑器缩小到屏幕左侧半部;右边放置Chrome浏览器,来显示Web应用效果。
我们可以开始尝试了。
首先在helloworld.py中输入这些内容:
之后你会立即在右侧看到Web应用的运行效果。
这里前几行语句,只是引入了几个软件包,然后设置了一下标题。
下面我们尝试点儿好玩儿的。
我们定义了一个式子,让y总比x大3,并且显示y。
你可以试试,在滑动条拖拽x的效果。
y值紧随你的拖动变化,对吧?
从这个简单的例子里,你可以看到streamlit响应用户的输入和输出是多么方便。
而且应用上的控件一直运行。你输入的变化,会实时带来输出的变化。
下面我们还是步入正题吧。先注释掉刚才这三条语句,免得碍事儿。
然后,我们把这几个列分别用小写的名称来命名。
值得一提的,是@st.cache,这是一个新玩意儿。
它是什么呢?
这在Python里面,叫做装饰器(decorator)。其实这里没有什么魔法,它只是streamlit软件包里,一个预先定义的函数。
只不过这样写,相当于是你在自己的load_data()函数之外,又包裹了一个st.cache()函数的功能。每次执行的时候,st.cache()都会参与进来。
st.cache()这个函数做什么用呢?
那作用可太大了。
因为你每次更新代码,或者用户更新输入,整个儿Python脚本都相当于被重新执行了一遍。
而st.cache()装饰器可以告诉Python:
查查看,我包裹的这个函数,内容或者输入改过没有?如果没有,就用已存储的上次调用结果好了,别再费事重新执行一遍了。
我们这里是从一个外部文件读入数据。就这样一个300MB的文件,每次读起来也得花上近10秒钟。更别说是那些上GB规模,甚至更大的文件了。
所以,如果Streamlit能够帮助我们跳过一些无意义的重复操作,将节省大量的用户等待时长。
不过这一步,你也看到了,输出没有变化。
因为我们什么也没有输出啊。
下面我们让Python实际读数据,并且把读后的数据框前5行用列表形式(st.table())展示给用户。
这一读数据不要紧,右上角会出现一个小人儿,做各种健身运动。
这就是告诉我们,程序在忙着呢。
忙完之后,这是结果:
下面我们要让程序给用户选项,首先是选择观察哪一种事件类型。
下面一段,采用了st.sidebar.selectbox()构造了一个左边栏里的下拉选择框。里面两个参数,第一个是显示给用户的提示语句,第二个,是选择列表内容。
问题是,我们存储了之后,好像什么也没有发生啊。
没关系,看到上图里面红色标出的这个箭头没有?
点击它,选项就出现了。
照葫芦画瓢,我们顺便把事件发生所在郡的下拉选择框一并做出来。
然后,我们根据用户的输入做出反应,提示给用户经过他的选择,现在符合要求的行数还有多少。
然后,我们把一个格式化后的字符串,用st.write()直接输出在网页上。
运行结果如下图所示。
好了,下面可能是你最关心的一刻了。
老师,别卖关子了,那张标示了事件位置的叠层地图怎么画啊?一共都没有多少行语句,你都讲了这么多了,怎么还没讲到?
请你输入下面这一行语句:
st.map(part_df)然后保存。你就会看到下面的效果了。
是不是很惊讶?
我第一次用的时候,也是这感觉。
还是集成在Web应用里,可以发布给全球用户与合作者,进行展示。
不是我不明白,这世界变化快啊。
我知道,你又开始着急了。
老师,这么好的东西,我可不想在本地一个人玩儿。我也想把结果发布到网络上,让别人看到我的成果。快告诉我怎么办!
别急。
咱们部署(deploy)一下它就行。
虽然你写了半天,只是Python脚本。但是Streamlit已经把它转换成了一个动态的Web应用。
所以,只要是常见的Web应用发布平台,理论上你都可以用来部署你的交互式数据分析作品。
这些平台,常见的包括:
这列表列下去就太多了。咱们这里只介绍Heroku,也就是前文给你展示的,样例使用的部署平台。
这东西的好处,就是基础款免费。
对咱们今天的教程来说,基础款就足够了。
我这里起的名字,叫做helloworld-streamlit。
你可以根据自己的喜好,起名称。
之后我们就要部署了。
部署的步骤,在上图中,你可以参考。
注意,上图中,右上角的OpenApp按钮,就是你的应用链接地址,你可以把它记下来。
首先你需要准备一些配置文件。
这里需要说明的是,几个不同配置文件的用途。
setup.sh做一些初始设置,设定一些参数。
requirements.txt告诉机器,需要安装哪些Python依赖包。
显然,教程这里需要的依赖包不多。
Procfile是远端服务器上,Web应用启动的时候,需要调用的脚本。其实里面只有一行。
请你下载,或者自行编辑上述3个文件后,与你的Python文件放在一个文件夹下面。
下载后,根据提示安装即可。
进入终端。用cd命令切换到你的工作文件夹,也就是包含了你的Python脚本的目录。
输入:
这时按任意键,会跳出一个浏览器窗口。
下面我们来设置git,这是推送我们文件和更新改动的途径。
在终端下执行:
gitinit之后设置一下与远端的heroku服务器的连接:
herokugit:remote-ahelloworld-streamlit若是看到下图,证明成功了:
然后执行:
gitpushherokumaster这样就可以把全部内容推送到heroku了。
推送的第一步,是上传文件。
Heroku发现咱们推送的是一个PythonApp,所以自动执行许多安装设置工作。
这些安装和配置做完后,会出现下面这样的提示。
到这里,你的Web应用部署就搞定了。
回到浏览器里,用下图中标红的这个按钮开启你自己的应用吧。
很有成就感吧?
尝试过之后,你应该不难发现,Streamlit给你带来了什么。
如果你学过Javascript和Flask,Django等Web应用开发技术,Streamlit可以加快你的Web应用开发与测试进程。
如果你还没有学过上述技术,Streamlit就可以给你赋能,让你一下子有了把数据分析结果变成产品的能力。
给你讲点儿更激进的。
有人已经希望能用它替代掉Flask用于产品发布了。
还有人说,将来写技术文档,也应该充分使用Streamlit。
甚至,还把它比作了数据科学界的iPhone。
这里,它是借喻iPhone开启智能手机时代,说明Streamlit的划时代性。
我不希望你也变得如此激进。
因为这里提到的每一种功用,现在还都有非常专业的工具做的更好,而且新的工具也在不断涌现。
但是,你可以看到,一个新的工具,以一种简单,而不是更繁复的办法,解决一个功能痛点,是一件多么令人欣喜的事儿。
其实不是这样的。
可以想象,开发门槛降低以后,将来会有更多的人使用Python来做Web应用。
用Streamlit这样的方法,他们只是开发出了一个原型。
要是想打造精品,就必须精细调控很多细节。
这时候,Javascript是绕不过去的。
如果你精通Javascript,那你潜在的合作对象一下子就多了起来,你掌握的这门技术,也就有了更大的价值。
这就好像印刷术的发明,不是让会写字这件事儿变得失去价值,而是全社会都增大了对好作品的渴求。深刻的思考,加上有效的文字表达,会让你生存得更好。
当然,如果你不希望精通写作技艺,只是想做一个抄书匠糊口。那么印刷术就可能会替代你的工作,结果就不那么美妙了。
本文我为你介绍了Streamlit,它可以让你用Python脚本编写简洁实用的交互式Web应用。
通过学习本文,希望你掌握了以下知识点:
咱们是以数据分析和可视化为例,进行了讲解。而且为了讲解的清晰,我们只介绍了Streamlit可实现功能的一小部分。但请注意,即便是目前,Streamlit能帮你达成的目标,也远远不止于此。