作者 | AJ Gordon

责编 | Carol

头图 | CSDN  付费下载于视觉中国

出品 | CSDN云计算(ID:CSDNcloud)

本文主要介绍如何利用Python的Streamlit库和Heroku云平台来做一个交互式数据分析Web应用。开发环境如下:

  • Windows10系统

  • Anaconda3(python3.7.4)

  • Git(2.26.0.windows.1)

  • Heroku账号

  • 梯子(Heroku需翻墙才可访问)

Streamlit

根据Streamlit官方文档介绍,它是一个开放源代码的Python库,可以轻松地为机器学习和数据科学构建漂亮的自定义web应用程序。也就是说,即使你对web开发并不熟悉,但只要利用它,就可以很容易搭建出一个Web。

通过“pip install streamlit”进行安装,再执行“streamlit hello”。若安装成功,默认浏览器会自动打开或输入“localhost:8501”,会弹出如下图界面。

图1 安装成功界面

Streamlit用于数据可视化的话,主要模块有:Cache,Interactive widgets,Charts。

1) Cache

Streamlit遵循由上至下的运行顺序,所以每次代码中有进行任何更改,都会重新开始运行一遍,会十分耗时。@st.cache会对封装起来的函数进行缓存,避免二次加载。如果函数中的代码发生变动,cache会重新加载一遍并缓存起来。假如将代码还原到上一次版本,由于先前的数据已经缓存起来了,所以不会进行二次加载。

import streamlit as st
import timest.write("Loading....")
start_time = time.clock()
@st.cache()
def expensive_computation(a, b):time.sleep(5)return a ** ba = 2
b = 21
res = expensive_computation(a, b)st.write("Result:", res)
end_time = time.clock()
st.write("耗时:%0.1f 秒" % (end_time-start_time))

图2 Cache

2) Interactive widgets

Streamlit提供多种组件,如滑块,选择框和按钮等交互组件。利用组件可以灵活地展示数据,这一点类似很多BI工具提供的功能。

import streamlit as st
import pandas as pd
import time# 按钮
st.subheader("按钮")
if st.button('Say hello'):st.write('Why hello there')
# 复选框
st.subheader("复选框")
agree = st.checkbox('I agree')
if agree:st.write('Great!')
# 单选框
st.subheader("单选框")
genre = st.radio("What's your favorite movie genre",('Comedy', 'Drama', 'Documentary'))
if genre == 'Comedy':st.write('You selected comedy.')
else:st.write("You didn't select comedy.")
# 选择框
st.subheader("选择框")
option = st.selectbox('How would you like to be contacted?',('Email', 'Home phone', 'Mobile phone'))
st.write('You selected:', option)
# 多选框
st.subheader("多选框")
options = st.multiselect('What are your favorite colors',
('Green', 'Yellow', 'Red', 'Blue'),'Yellow')
st.write('You selected:', options)
# 滑块
st.subheader("滑块")
age = st.slider('How old are you?', 0, 130, 25)
st.write("I'm ", age, 'years old')
# 数值输入框
st.subheader("数值输入框")
number = st.number_input('Insert a number')
st.write('The current number is ', number)
# 加载数据
uploaded_file = st.file_uploader("Choose a CSV file", type="csv")
if uploaded_file is not None:data = pd.read_csv(uploaded_file)st.write(data)
# 进度条
my_bar = st.progress(0)
for percent_complete in range(100):time.sleep(0.1)my_bar.progress(percent_complete + 1)

图3 Interactive widgets

3) Charts

Streamlit图库底层基于Matplotlib库搭建,一些常见的图表如折线图,条形图,关系图等,都可以直接传递数据生成图表。此外还增加了deck.gl,可以用于绘制3D地图。

import streamlit as st
import pandas as pd
import numpy as np
# 折线图
st.subheader("折线图")
chart_data = pd.DataFrame(np.random.randn(20, 3),columns=['a', 'b', 'c'])st.line_chart(chart_data)
# 面积图
st.subheader("面积图")
chart_data = pd.DataFrame(np.random.randn(20, 3),columns=['a', 'b', 'c'])st.area_chart(chart_data)
# 条形图
st.subheader("条形图")
chart_data = pd.DataFrame(np.random.randn(50, 3),columns=["a", "b", "c"])st.bar_chart(chart_data)
# 3D图
st.subheader("3D图")
df = pd.DataFrame(np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],columns=['lat', 'lon'])st.deck_gl_chart(viewport={'latitude': 37.76,'longitude': -122.4,'zoom': 11,'pitch': 50,},layers=[{'type': 'HexagonLayer','data': df,'radius': 200,'elevationScale': 4,'elevationRange': [0, 1000],'pickable': True,'extruded': True,}, {'type': 'ScatterplotLayer','data': df,}])
# 关系图
st.subheader("关系图")
st.graphviz_chart('''digraph {run -> intrintr -> runblrunbl -> runrun -> kernelkernel -> zombiekernel -> sleepkernel -> runmemsleep -> swapswap -> runswaprunswap -> newrunswap -> runmemnew -> runmemsleep -> runmem}
''')
# 地图
st.subheader("地图")
df = pd.DataFrame(np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],columns=['lat', 'lon'])st.map(df)

图4 Charts

Heroku

Heroku是一个支持多种编程语言的云平台,如Java,Node.js和Python等等。注册账号需要翻墙,并且需使用gmail邮箱注册。用户每月可享受1000小时免费时长,以及512M内存,若应用超过30分钟没访问会自动休眠,重新访问即可唤醒。然后,需要下载Heroku CLI命令行工具,下载以后可以使用命令行直接部署。

图5 Heroku支持的语言

图6 Heroku CLI下载页面

应用部署实例

首先,新建一个文件“Streamlit_Demo.py”。

import streamlit as st
import pandas as pd
import numpy as npst.title('Uber pickups in NYC')DATE_COLUMN = 'date/time'
DATA_URL = ('https://s3-us-west-2.amazonaws.com/''streamlit-demo-data/uber-raw-data-sep14.csv.gz')@st.cache
def load_data(nrows):data = pd.read_csv(DATA_URL, nrows=nrows)lowercase = lambda x: str(x).lower()data.rename(lowercase, axis='columns', inplace=True)data[DATE_COLUMN] = pd.to_datetime(data[DATE_COLUMN])return datadata_load_state = st.text('Loading data...')
data = load_data(100)
data_load_state.text("Done! (using st.cache)")if st.checkbox('Show raw data'):st.subheader('Raw data')st.write(data)st.subheader('Number of pickups by hour')
hist_values = np.histogram(data[DATE_COLUMN].dt.hour, bins=24, range=(0,24))[0]
st.bar_chart(hist_values)hour_to_filter = st.slider('hour', 0, 23, 17)
filtered_data = data[data[DATE_COLUMN].dt.hour == hour_to_filter]st.subheader('Map of all pickups at %s:00' % hour_to_filter)
st.map(filtered_data)

然后,再新建三个文件:Procfile,requirements.txt,setup.sh。这三个文件是部署Streamlit必备的,缺一不可。

1) Procfile

#代码的执行语句web: sh setup.sh && streamlit run Streamlit_Demo.py

2) requirements.txt

# 代码所需的库及其版本streamlit==0.56.0pandas==0.25.1numpy==1.16.5

3) setup.sh

# 配置mkdir -p ~/.streamlit/echo "\[server]\n\headless = true\n\port = $PORT\n\enableCORS = false\n\\n\" > ~/.streamlit/config.toml

最后,配置文件和代码准备好后,可以保存在本机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 git:remote –a streamlit-demo-01git add .git commit -m "Initialize Project"# 若git出现"git Please tell me who you are.",运行以下两条命令,再重新执行commit:# git config user.name "heroku用户名"# git config user.email "heroku注册邮箱"

4) 上传代码到heroku代码库。

git push heroku master

5) 执行”heroku open”打开部署好的应用,若打开后出现” Application error”,需要自行排查是否缺失文件或文件内容有误,笔者一开始因为缺少”setup.sh”文件导致部署失败。另外,笔者直接从github clone后也会报错,所以是在本机新建文件和文件夹的,项目有上传至“

https://github.com/guoxulong/streamlit_demo

heroku open

6) 部署完成后,输入“https://streamlit-demo-01.herokuapp.com/”(需翻墙)就能够访问这个Web。

图7 部署完成界面

总结

总体上来讲,相比较用Django框架开发Web,Streamlit开发一个交互式应用会更轻松,虽然功能还不完善,但对于数据分析可视化来说已经满足了,而且只需要掌握Streamlit库的用法就可以实现。

作者简介:

AJ Gordon,对爬虫/机器学习/数据建模/可视化均有所涉猎的数据分析师

【END】

推荐阅读

  • 一文带你从头认识什么是「缓存」!

  • 在 520 这天,竟然有人把 Docker讲清楚了? | 原力计划

  • 如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你!

  • 平安科技王健宗:所有 AI 前沿技术,都可以在联邦学习中大展身手!

  • 踢翻这碗狗粮:程序员花 7 个月敲出 eBay,只因女票喜欢糖果盒!

  • 又一年5.20,用Python助力程序员脱单大攻略(视频版)

  • 斗地主吗?能学区块链那种! | 原力计划

真香,朕在看了!

实操来了!一文告诉你如何用 Streamlit 和 Heroku 开发 Web相关推荐

  1. 一文告诉你如何用Bito AI提高开发效率

    ​ 随着最近ChatGPT.AutoGPT的诞生,如何利用AI提效赋能成为了大家关注的焦点.然而,OpenAI较高的实用门槛(科学上网),使得大部分程序猿只能望洋兴叹,空有渴望AI的能力,却无使用AI ...

  2. 理论+实操: MySQL索引与事务、视图、存储过程(软件开发用的多)、存储引擎MyISAM和InnoDB

    文章目录 一:索引的概念 二:索引的作用 三:索引的分类 3.1 普通索引 3.2 唯一性索引 3.3 主键 3.4 全文索引 3.5 单列索引与多列索引 四:创建索引的原则依据 五:创建索引的方法 ...

  3. Python 实操案例:一文详解10种聚类算法

    聚类或聚类分析是无监督学习问题.它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群.有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法.相反,最好探索一系列聚类算法以 ...

  4. 如何简单粗暴的提升NER效果?一文告诉你如何用词库来做NER数据增强

    每天给你送来NLP技术干货! 来自:船长尼莫 点击这里进群->加入NLP交流群 在NLP的基础任务中,NER无疑很难做,但是做好了,会提升下游的很多效果.那么如何提升NER的效果呢?数据增强无疑 ...

  5. 一文告诉你如何用好uber开源的zap日志库

    1. 引子 日志在后端系统中有着重要的地位,通过日志不仅可以直观看到程序的当前运行状态,更重要的是日志可以在程序发生问题时为开发人员提供线索. 在Go生态中,logrus[2]可能是使用最多的Go日志 ...

  6. 层次分析法和熵值法经典实操案例+数据

    1.数据来源:无 2.时间跨度:无 3.区域范围:无 4.指标说明: 层次分析法(Analytic Hierarchy Process,简称AHP)是美国运筹学家.匹兹堡大学T. L. Saaty教授 ...

  7. 智能设计(智能家居的研发实战实操)专项技能培训通知

    随着物联网产业的不断发展,物联网相关技术人才成为企业最大的需求,为解决该专业人才紧缺现状,同时配合工业和信息化部教育与考试中心在全国范围内开展的以服务产业人才需求为导向,紧紧围绕"两化深度融 ...

  8. 一文带你学会微信V3版本下单支付、退款、关单流程代码实操

    目录 开篇介绍 一.微信支付-Maven依赖加入和代码参数准备 二.商户私钥证书代码读取 三.微信订单支付系列接口URL配置 四.快速验证统一下单接口 五.查询订单支付状态验证 六.关闭订单状态验证 ...

  9. 实操Tiktok一个月告诉你,10万粉丝轻松拿下?

    1.要明确一个事实,就是它没有你想象中困难. 很多东西,并没有我们想象中困难,你只要一步一步去尝试了也可以做到.不行就想办法找到专业的人跟他们合作或者付费,缩短中间的摸索时间. 关于Tiktok,我一 ...

最新文章

  1. VTK修炼之道4_Win32控制台项目
  2. 【面经】字节跳动后端开发视频架构方向一面二面
  3. 消息断点 RUN跟踪
  4. 【华为云技术分享】智能诊断和优化,华为云DAS服务云DBA平台让您无忧运维
  5. 【Elasticsearch】关于 Analyzers 的一切,第2部分
  6. 西普实验吧-ctf-web-1
  7. __proto__和prototype 1
  8. 周黑鸭借力MES,推进智能生产
  9. visual studio中番茄助手添加注释模板
  10. psftp上传文件到服务器,使用PsFtp将文件上传到FTP Powershell
  11. 逆波兰表达式 c++
  12. MT7628处理器介绍,MT7628芯片原理图资料
  13. Mysql中查找附近人的查询语句
  14. 浏览器地址栏中文乱码问题
  15. 美化桌面软件测试面试题,软件测试面试题的经典逻辑题
  16. 【深度学习笔记(九)】之物体的分类与定位
  17. 会做饭的机器人曰记_会做饭的机器人!
  18. 红米2 手机root
  19. idea Maven阿里云仓库和阿里spring代理仓库配置
  20. 转载 :高中时候想的一个脑洞大开的故事

热门文章

  1. java循环遍历类属性_java循环遍历类属性 get 和set值方法
  2. arcgis标注牵引线_解析ArcGis的标注(三)——标注的放置 与 转注记修改
  3. uva计算机水平,UVA 12096 集合栈计算机
  4. 清华数学能赶超北大?北大数学院士已达8人,清华引进2位菲尔兹奖
  5. To 研究生,第一:做学位论文期间,不要有任何度假休息的打算;第二,导师错的时候不多;第三……...
  6. 智能机器人正催生新的工业革命
  7. 李开复:人工智能行业发展与投资趋势
  8. 做科研,到底应该看什么?
  9. 聊飞行 | 飞机到底是如何起飞的?
  10. 某剧院有33排座位java_2018湖南省考行测数学题“拍档”:等差数列和等比数列...