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

作者 | 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助力程序员脱单大攻略(视频版)

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

真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里第一颗芯片问世,平头哥发布最强AI芯片含光800

阿里巴巴第一颗自研芯片正式问世。9月25日的杭州云栖大会上,达摩院院长张建锋现场展示了这款全球最强的AI芯片——含光800。在业界标准的ResNet-50测试中,含光800推理性能达到78563 IPS,比目前业界最好的AI芯片性能高4倍;能效比50…

企业实战_08_MyCat 搭建Mysql 一主二从复制环境

接上一篇:企业实战_07_MyCat 搭建Mysql 一主一从复制环境 https://gblfy.blog.csdn.net/article/details/118640210 文章目录一、解决同步和数据初始化1. 主节点node1脚本同步2. 数据初始化二、创建复制链路2.1. 登陆数据库2.2. 建立复制的链路2.3. 查看链路2.4. 设…

支付宝放出数字化经营新神器,可提升商家60%消费频次

会员经济俨然成为消费领域的“香饽饽”。 听歌、看视频、购物甚至出行,三百六十行,行行有会员。 本质上,“会员”是商家与消费者之间的“信任关系”,消费者愿意相信商家会让渡更多实惠与便利;商家则希望通过让利换取…

终于,我也到了和 Eclipse 说再见的时候,难说再见

作者 | 程序员小跃责编 | 夕颜头图 | CSDN下载自视觉中国出品 | CSDN博客2011-2020,一段旅程的结束,意味着另一端旅程的全新开始。优秀的赛车手,除了过硬的技术之外,拥有一部性能炸裂的赛车驰骋赛道,随之而来的必然是一…

企业实战_09_MyCat 搭建Mysql 一主三从复制环境

接上一篇:企业实战_08_MyCat 搭建Mysql 一主二从复制环境 https://gblfy.blog.csdn.net/article/details/118651265 文章目录一、解决同步和数据初始化1. 主节点node1脚本同步2. 数据初始化二、创建复制链路2.1. 登陆数据库2.2. 建立复制的链路2.3. 查看链路2.4. 设…

Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划...

作者 | Pythonicc责编 | 王晓曼出品 | CSDN博客简介1、什么是数据库读写分离读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致…

基于Flink和规则引擎的实时风控解决方案

对一个互联网产品来说,典型的风控场景包括:注册风控、登陆风控、交易风控、活动风控等,而风控的最佳效果是防患于未然,所以事前事中和事后三种实现方案中,又以事前预警和事中控制最好。 这要求风控系统一定要有实时性…

分辨垃圾材质自动分类 支付宝升级垃圾分类AI回收箱

塑料罐、易拉罐、玻璃瓶分别怎么丢?在今天召开的云栖大会现场,支付宝推出了智能垃圾箱,可对各类不同材质的饮料瓶自动识别、分类丢弃,为行业领先。智能垃圾箱是蚂蚁金服首次在业内推出SKU粒度的垃圾识别技术,借助机器视…

结构化大数据分析平台设计

前言 任何线上系统都离不开数据,有些数据是业务系统自身需要的,例如系统的账号,密码,页面展示的内容等。有些数据是业务系统或者用户实时产生的,例如业务系统的日志,用户浏览访问的记录,系统的…

没错,你离分布式搜索只差一个Elasticsearch入门!

来源 | 沉默王二责编 | Carol封图 | CSDN 付费下载自视觉中国学习真的是一件令人开心的事情,上次分享了Redis 入门的文章后,收到了很多小伙伴的鼓励,比如说:“哎呀,不错呀,通俗易懂,十分钟真的入…

蚂蚁金服总裁胡晓明:科技如何驱动金融从离线走向在线

今天,2019阿里云栖大会在杭州云栖小镇开幕。蚂蚁金服的展区吸引到不少关注金融创新的“同道中人”。 除了亲身体验蚂蚁金服在金融科技领域的创新技术,蚂蚁金服集团总裁胡晓明特别在主论坛发表题为《数字经济时代的金融科技》的主题演讲,分享数…

1万亿次、10亿人、10亿张,科技给生活带来多少改变?

云栖大会精彩进行中,今天,是 Day-2。 一早,阿里技术明星团闪亮登场! 贾扬清:阿里巴巴副总裁、阿里云智能计算平台事业部总经理、高级研究员 李飞飞:阿里巴巴副总裁、阿里云智能数据库产品事业部总经理、高级…

“编程能力差,90%输在了数学上!”CTO:其实你们都是瞎努力!

01从未得到过重视的问题一流程序员学数学,二流程序员学算法,低端看高端就是黑魔法。可能有人以为这就是个段子,但有过工作经验的都知道,这其实就是程序员的真实写照!想一想,我们学习、求职、工作的场景中&a…

云原生时代|分布式系统设计知识图谱(内含22个知识点)

我们身处于一个充斥着分布式系统解决方案的计算机时代,无论是支付宝、微信这样顶级流量产品、还是区块链、IOT等热门概念、抑或如火如荼的容器生态技术如Kubernetes,其背后的技术架构核心都离不开分布式系统。 为什么要懂分布式架构 系统学习分布式架构…

mysq启动失败

文章目录一、一站式解决1. 问题分析定位二、特殊场景2.1. 问题分析定位2.2. 解决方案2.3. 解决方案2一、一站式解决 1. 问题分析定位 # 找到MySQL的配置文件,复制mysql的数据目录 vim /etc/my.cnf# 进入msyql的数据目录 cd /data/mysql# 查看日志文件 vim mysql.e…

藏不住了,这就是阿里 AI 的真正实力!

不好意思,我要放大招了! 在今天的杭州云栖大会上,阿里巴巴首次公布人工智能调用规模: 每天调用超 1万亿 次 服务全球 10亿 人 日处理图像 10亿 张 视频 120万 小时 语音 55万 小时 自然语言 5千亿 句 在AI芯片、AI云服务、AI算…

Error和Exception(异常)

Error和Exception(异常) 掌握以下三种类型的异常:检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如打开一个不存在文件时,一个异常就发生了,这些异常在…

Kubernetes 是如何调度的?

作者 | 阿文,责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDN(ID:CSDNnews)自互联网出现以来 ,云计算的概念已经提出了有 50 年。从1957 年,John McCarthy 将计算机中的分时共享概念设计成了一种工具。从此…

# Schedulerx正式登陆Ali-k8s应用目录

简介 分布式任务调度 SchedulerX 是阿里巴巴基于 Akka 架构自研的的分布式任务调度平台,今天正式登陆阿里云容器服务Kubernetes应用目录,支持用户以云原生的方式获取定时、工作流任务编排、分布式批量调度等功能,同时具有高可靠、海量任务、…

刚刚,阿里巴巴小程序生态联盟重磅启动

9月27日下午,阿里巴巴小程序繁星计划峰会作为杭州云栖大会的压轴好戏,在云栖小镇国际会展中心迎来千余位商家、合作伙伴、个人开发者和行业专家。峰会以“小程序、大生态”为题,发布了阿里巴巴小程序繁星计划补贴的更多细节方案,并…