作者 | AJ Gordon
责编 | Carol
头图 | CSDN 付费下载于视觉中国
出品 | CSDN云计算(:CSDNcloud)
本文主要介绍如何利用Python的Streamlit库和Heroku云平台来做一个交互式数据分析Web应用。开发环境如下:
- Windos10系统
- Anaconda3(python374)
- Git(2260indos1)
- Heroku账号
- 梯子(Heroku需科学上网才可访问)
Streamlit
根据Streamlit官方文档介绍,它是一个开放源代码的Python库,可以轻松地为机器学习和数据科学构建漂亮的自定义eb应用程序。也就是说,即使你对eb开发并不熟悉,但只要利用它,就可以很容易搭建出一个Web。
通过pip install streamlit进行安装,再执行streamlit hello。若安装成功,默认浏览器会自动打开或输入localhost8501,会弹出如下图界面。
图1 安装成功界面
Streamlit用于数据可视化的话,主要模块有:Cache,Interactive gets,Charts。
1) Cache
Streamlit遵循由上至下的运行顺序,所以每次代码中有进行任何更改,都会重新开始运行一遍,会十分耗时。stcache会对封装起来的函数进行缓存,避免二次加载。如果函数中的代码发生变动,cache会重新加载一遍并缓存起来。假如将代码还原到上一次版本,由于先前的数据已经缓存起来了,所以不会进行二次加载。
import streamlit as stimport timestrite("Loading")start_time = timeclockstcachedef expensive_putation(a, b)timesleep(5)return a ** ba = 2b = 21res = expensive_putation(a, b)strite("Result", res)end_time = timeclockstrite("耗时:01f 秒" (end_time-start_time))
图2 Cache
2) Interactive gets
Streamlit提供多种组件,如滑块,选择框和按钮等交互组件。利用组件可以灵活地展示数据,这一点类似很多BI工具提供的功能。
import streamlit as stimport pandas as pdimport time 按钮stsubheader("按钮")if stbutton('Say hello')strite('Why hello there') 复选框stsubheader("复选框")agree = stcheckbox('I agree')if agreestrite('Great!') 单选框stsubheader("单选框")genre = stradio("What's your favorite movie genre",('Comedy', 'Drama', 'Documentary'))if genre == 'Comedy'strite('You selected edy')elsestrite("You dn't select edy") 选择框stsubheader("选择框")option = stselectbox('Ho ould you like to be contacted?',('Email', 'Home phone', 'Mobile phone'))strite('You selected', option) 多选框stsubheader("多选框")options = stmultiselect('What are your favorite colors',('Green', 'Yello', 'Red', 'Blue'),'Yello')strite('You selected', options) 滑块stsubheader("滑块")age = stsler('Ho old are you?', 0, 130, 25)strite("I'm ", age, 'years old') 数值输入框stsubheader("数值输入框")number = stnumber_input('Insert a number')strite('The current number is ', number) 加载数据uploaded_file = stfile_uploader("Choose a CSV file", type="csv")if uploaded_file is not Nonedata = pdread_csv(uploaded_file)strite(data) 进度条my_bar = stprogress(0)for percent_plete in range(100)timesleep(01)my_barprogress(percent_plete + 1)
图3 Interactive gets
3) Charts
Streamlit图库底层基于Matplotlib库搭建,一些常见的图表如折线图,条形图,关系图等,都可以直接传递数据生成图表。此外还增加了deckgl,可以用于绘制3D地图。
import streamlit as stimport pandas as pdimport numpy as np 折线图stsubheader("折线图")chart_data = pdDataFrame(nprandomrandn(20, 3),columns=['a', 'b', 'c'])stline_chart(chart_data) 面积图stsubheader("面积图")chart_data = pdDataFrame(nprandomrandn(20, 3),columns=['a', 'b', 'c'])starea_chart(chart_data) 条形图stsubheader("条形图")chart_data = pdDataFrame(nprandomrandn(50, 3),columns=["a", "b", "c"])stbar_chart(chart_data) 3D图stsubheader("3D图")df = pdDataFrame(nprandomrandn(1000, 2) [50, 50] + [3776, -1224],columns=['lat', 'lon'])stdeck_gl_chart(vieport={'latitude' 3776,'longitude' -1224,'zoom' 11,'pitch' 50,},layers=[{'type' 'HexagonLayer','data' df,'radius' 200,'elevationScale' 4,'elevationRange' [0, 1000],'pickable' True,'extruded' True,}, {'type' 'ScatterplotLayer','data' df,}]) 关系图stsubheader("关系图")stgraphviz_chart('''digraph {run - intrintr - runblrunbl - runrun - kernelkernel - zombiekernel - sleepkernel - runmemsleep - sapsap - runsaprunsap - nerunsap - runmemne - runmemsleep - runmem}''') 地图stsubheader("地图")df = pdDataFrame(nprandomrandn(1000, 2) [50, 50] + [3776, -1224],columns=['lat', 'lon'])stmap(df)
图4 Charts
Heroku
Heroku是一个支持多种编程语言的云平台,如Java,Nodejs和Python等等。注册账号需要自备梯子,并且需使用gmail邮箱注册。用户每月可享受1000小时免费时长,以及512M内存,若应用超过30分钟没访问会自动休眠,重新访问即可唤醒。然后,需要下载Heroku CLI命令行工具,下载以后可以使用命令行直接部署。
图5 Heroku支持的语言
图6 Heroku CLI下载页面
应用部署实例
首先,新建一个文件Streamlit_Demopy。
import streamlit as stimport pandas as pdimport numpy as npsttitle('Uber pickups in NYC')DATE_COLUMN = 'datetime'DATA_URL = ('ss3-us-est-2amazonas''streamlit-demo-datauber-ra-data-sep14csvgz')stcachedef load_data(nros)data = pdread_csv(DATA_URL, nros=nros)loercase = lambda x str(x)loerdatarename(loercase, axis='columns', inplace=True)data[DATE_COLUMN] = pdto_datetime(data[DATE_COLUMN])return datadata_load_state = sttext('Loading data')data = load_data(100)data_load_statetext("Done! (using stcache)")if stcheckbox('Sho ra data')stsubheader('Ra data')strite(data)stsubheader('Number of pickups by hour')hist_values = nphistogram(data[DATE_COLUMN]dthour, bins=24, range=(0,24))[0]stbar_chart(hist_values)hour_to_filter = stsler('hour', 0, 23, 17)filtered_data = data[data[DATE_COLUMN]dthour == hour_to_filter]stsubheader('Map of all pickups at s00' hour_to_filter)stmap(filtered_data)
然后,再新建三个文件:Procfile,requirementstxt,setupsh。这三个文件是部署Streamlit必备的,缺一不可。
1)Procfile
代码的执行语句eb sh setupsh streamlit run Streamlit_Demopy
2)requirementstxt
代码所需的库及其版本streamlit==0560pandas==0251numpy==1165
3)setupsh
配置mkdir -p ~streamlitecho "\[server]\n\headless = true\n\port = $PORT\n\enableCORS = false\n\n\" ~streamlitconfigtoml
最后,配置文件和代码准备好后,可以保存在本机demo路径下。再按照以下步骤进行部署:
1) 进入项目路径,先登录heroku,输入heroku login后按下空格键,默认浏览器会自动打开,输入heroku账号和密码后关闭即可。
cd demoheroku login
2) 创建一个新应用,输入heroku create xx,heroku规定应用名称开头结尾只能是小写字母,并且全名只能包含小写字母,数字和破折号。也可以只输入heroku create,会自动命名一个应用。
heroku create streamlit-demo-01 或者 heroku create
3) 初始化git代码库,并远程操控heroku。
git initheroku gitremote –a streamlit-demo-01git add git mit -m "Initialize Project" 若git出现"git Please tell me ho you are",运行以下两条命令,再重新执行mit git config username "heroku用户名" git config useremail "heroku注册邮箱"
4) 上传代码到heroku代码库。
git push heroku master
5) 执行heroku open打开部署好的应用,若打开后出现 Application error,需要自行排查是否缺失文件或文件内容有误,笔者一开始因为缺少setupsh文件导致部署失败。另外,笔者直接从github clone后也会报错,所以是在本机新建文件和文件夹的,项目上传至sgithubguoxulongstreamlit_demo。
heroku open
6) 部署完成后,输入sstreamlit-demo-01herokuapp(需翻墙)就能够访问这个Web。
图7 部署完成界面
总结
总体上来讲,相比较用Django框架开发Web,Streamlit开发一个交互式应用会更轻松,虽然功能还不完善,但对于数据分析可视化来说已经满足了,而且只需要掌握Streamlit库的用法就可以实现。
作者:AJ Gordon,对爬虫机器学习数据建模可视化均有所涉猎的数据分析师。
☞AI 看脸算命,3 万张自拍揭露:颜值即命?☞无代码来了,还要程序员吗?☞芯片供应被掐断,华为能否安全渡劫?☞来了来了!趋势预测算法大PK!☞Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划☞15 岁黑进系统,发挑衅邮件意外获 Offer,不惑之年捐出全部财产,Titter CEO 太牛了!