Pandas和Streamlit对时间序列数据进行可视化过滤
liuian 2025-01-12 16:24 25 浏览
介绍
我们每天处理的数据最多的类型可能是时间序列数据。基本上,使用日期,时间或两者同时索引的任何内容都可以视为时间序列数据集。在我们工作中,可能经常需要使用日期和时间本身来过滤时间序列数据。根据任何其他形式的索引过滤dataframe是一件相当麻烦的任务。尤其是当日期和时间在不同的列中时。
幸运的是,我们有Pandas和Streamlit在这方面为我们提供帮助,并且可以方便的创建和可视化交互式日期时间过滤器。我认为我们大多数人对Pandas应该有所了解,并且可能会在我们的数据生活中例行使用它,但是我觉得许多人都不熟悉Streamlit,下面我们从Pandas的简单介绍开始
在处理Python中的数据时,Pandas可以说是最敏捷,高效,灵活,健壮,有弹性工具。这个强大的工具包使您能够而只需几行代码即可操纵,转换以及尤其是可视化dataframe中的数据。在此应用程序中,我们将使用Pandas从CSV文件读取/写入数据,并根据选定的开始和结束日期/时间调整数据框的大小。流光
Streamlit是一个纯粹的Python API,它允许你创建机器学习应用程序。其实远不止这些。Streamlit是一个web框架,他将一个准端口转发代理服务器和一个前端UI库混合在一起。简单地说,你可以为了各种目的开发和部署无数的web应用程序(或本地应用程序)。对于我们的应用程序,我们将使用Streamlit为我们的时间序列数据渲染一个交互式滑动过滤器,该数据也将即时可视化。
python包
import pandas as pd
import streamlit as st
import datetime
import re
import base64
如果你需要安装上面的任何一个包,请使用"pip install",例如以下命令
pip install streamlit
数据集
我们将使用随机生成的数据集,它有一个日期、时间和值的列,如下所示。
日期格式如下:
YYYYMMDD
而时间格式为:
HHMM
可以使用任何其他格式来格式化日期时间,但是您必须确保按照后续部分中的说明在脚本中声明它。
日期时间过滤器
为了实现我们的过滤器,我们将使用以下函数作为参数— message和df,它们与滑块小部件显示的消息以及需要过滤的原始dataframe相对应。
def df_filter(message,df):
slider_1, slider_2 = st.slider('%s' % (message),0,len(df)-1,[0,len(df)-1],1)
while len(str(df.iloc[slider_1][1]).replace('.0','')) < 4:
df.iloc[slider_1,1] = '0' + str(df.iloc[slider_1][1]).replace('.0','')
while len(str(df.iloc[slider_2][1]).replace('.0','')) < 4:
df.iloc[slider_2,1] = '0' + str(df.iloc[slider_1][1]).replace('.0','')
start_date = datetime.datetime.strptime(str(df.iloc[slider_1][0]).replace('.0','') + str(df.iloc[slider_1][1]).replace('.0',''),'%Y%m%d%H%M%S')
start_date = start_date.strftime('%d %b %Y, %I:%M%p')
end_date = datetime.datetime.strptime(str(df.iloc[slider_2][0]).replace('.0','') + str(df.iloc[slider_2][1]).replace('.0',''),'%Y%m%d%H%M%S')
end_date = end_date.strftime('%d %b %Y, %I:%M%p')
st.info('Start: **%s** End: **%s**' % (start_date,end_date))
filtered_df = df.iloc[slider_1:slider_2+1][:].reset_index(drop=True)
return filtered_df
首先,我们将调用Streamlit slider小部件,文档如下所示。
streamlit.slider(label, min_value, max_value, value, step)
参数如下
label (str或None) -一个短标签,向用户解释这个滑块的用途。
min_value(支持的类型或无)—最小允许值。如果值是一个int型,默认为0,如果是float型,默认为0.0,如果是date/datetime, time. value - timedelta(days=14)。最小时间
max_value(支持的类型或None) -最大允许值。如果值是int类型,默认值为100,如果是float类型,默认值为1.0,如果是date/datetime, time,则value + timedelta(days=14)。max if a time
value(一个支持的类型或一个元组/支持的类型列表或None) -滑块第一次呈现时的值。如果在这里传递一个包含两个值的元组/列表,则会呈现一个带有上下边界的范围滑块。例如,如果设置为(1,10),滑块将在1到10之间有一个可选择的范围。默认为min_value。
step (int/float/timedelta或None)—步进间隔。默认值为1,如果是浮点数则为0.01,如果是date/datetime则为timedelta(days=1),如果是time(或者maxvalue - minvalue < 1 day)则为timedelta(minutes=15)
请注意,我们的滑块将返回两个值,即开始日期时间和结束日期时间值。因此,我们必须使用数组声明滑块的初始值为:
[0,len(df)-1]
我们必须将小部件等同于如下所示的两个变量,即用于过滤dataframe的开始和结束日期时间索引:
slider_1, slider_2 = st.slider('%s' % (message),0,len(df)-1,[0,len(df)-1,1)
还需要从我们的开始/结束时间列中删除任何后面的小数点位,并在时间少于一个小时的情况下添加前面的零,即12:00AM引用为0,如下所示:
while len(str(df.iloc[slider_1][1]).replace('.0','')) < 4:
df.iloc[slider_1,1] = '0' + str(df.iloc[slider_1][1]).replace('.0','')
然后,我们需要将日期添加到时间中,并以使用datetime可以理解的格式解析我们的datetime。Python中的strptime绑定如下所示:
start_date = datetime.datetime.strptime(str(df.iloc[slider_1][0]).replace('.0','') + str(df.iloc[slider_1][1]).replace('.0',''),'%Y%m%d%H%M%S')
为了显示我们选择的日期时间,我们可以使用strftime函数来重新格式化开始/结束,如下所示:
start_date = start_date.strftime('%d %b %Y, %I:%M%p')
最后,我们将显示选定的日期时间,并将过滤后的索引应用到我们的数据集,如下所示:
st.info('Start: **%s** End: **%s**' % (start_date,end_date)) filtered_df = df.iloc[slider_1:slider_2+1][:].reset_index(drop=True)
Streamlit应用
最后,我们可以将所有内容绑定在一个Streamlit 应用程序的形式中,该应用程序将渲染datetime过滤器、dataframe和折线图,当我们移动滑块时,这些都将即时更新。
if __name__ == '__main__':
df = pd.read_csv('file_path')
st.title('Datetime Filter')
filtered_df = df_filter('Move sliders to filter dataframe',df)
column_1, column_2 = st.beta_columns(2)
with column_1:
st.title('Data Frame')
st.write(filtered_df)
with column_2:
st.title('Chart')
st.line_chart(filtered_df['value'])
st.markdown(download_csv('Filtered Data Frame',filtered_df),unsafe_allow_html=True)
您可能会发现将过滤后的dataframe下载为CSV文件非常方便。如果是这样,请使用以下函数在您的Streamlit应用程序中创建一个可下载的文件。
def download_csv(name,df):
csv = df.to_csv(index=False)
base = base64.b64encode(csv.encode()).decode()
file = (f'<a href="data:file/csv;base64,{base}" download="%s.csv">Download file</a>' % (name))
return file
这个函数的参数- name和df分别对应于需要转换为CSV文件的可下载文件和dataframe的名称。
最后,运行我们的程序
streamlit run file_name.py
结果
一个交互式仪表板,允许你可视化地过滤你的时间序列数据,并在同一时间可视化它!
本文代码:github/mkhorasani/interactivedatetimefilter
作者:M Khorasani
deephub翻译组
- 上一篇:pandas 重置索引!
- 下一篇:Python办公自动化之Excel做表自动化
相关推荐
- Python生态下的微服务框架FastAPI
-
FastAPI是什么FastAPI是一个用于构建API的web框架,使用Python并基于标准的Python类型提示。与flask相比有什么优势高性能:得益于uvloop,可达到与...
- SpringBoot:如何解决跨域问题,详细方案和示例代码
-
跨域问题在前端开发中经常会遇到,特别是在使用SpringBoot框架进行后端开发时。解决跨域问题的方法有很多,我将为你提供一种详细的方案,包含示例代码。首先,让我们了解一下什么是跨域问题。跨域是指在...
- 使用Nginx轻松搞定跨域问题_使用nginx轻松搞定跨域问题的方法
-
跨域问题(Cross-OriginResourceSharing,简称CORS)是由浏览器的同源策略引起的。同源策略指的是浏览器限制来自不同源(协议、域名、端口)的JavaScript对资源的...
- spring boot过滤器与拦截器的区别
-
有小伙伴使用springboot开发多年,但是对于过滤器和拦截器的主要区别依然傻傻分不清。今天就对这两个概念做一个全面的盘点。定义与作用范围过滤器(Filter):过滤器是一种可以动态地拦截、处理和...
- nginx如何配置跨域_nginx配置跨域访问
-
要在Nginx中配置跨域,可以使用add_header指令来添加Access-Control-Allow-*头信息,如下所示:location/api{if($reques...
- 解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
-
跨域问题是浏览器为了保护用户的信息安全,实施了同源策略(Same-OriginPolicy),即只允许页面请求同源(相同协议、域名和端口)的资源,当JavaScript发起的请求跨越了同源策略,...
- 图解CORS_图解数学
-
CORS的全称是Cross-originresourcesharing,中文名称是跨域资源共享,是一种让受限资源能够被其他域名的页面访问的一种机制。下图描述了CORS机制。一、源(Orig...
- CORS 幕后实际工作原理_cors的工作原理
-
跨域资源共享(CORS)是Web浏览器实施的一项重要安全机制,用于保护用户免受潜在恶意脚本的攻击。然而,这也是开发人员(尤其是Web开发新手)感到沮丧的常见原因。小编在此将向大家解释它存在...
- 群晖无法拉取Docker镜像?最稳定的方法:搭建自己的加速服务!
-
因为未知的原因,国内的各大DockerHub镜像服务器无法使用,导致在使用群晖时无法拉取镜像构建容器。网上大部分的镜像加速服务都是通过Cloudflare(CF)搭建的,为什么都选它呢?因为...
- Sa-Token v1.42.0 发布,新增 API Key、TOTP 验证码等能力
-
Sa-Token是一款免费、开源的轻量级Java权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、微服务网关鉴权等一系列权限相关问题。目前最新版本v1.42.0已...
- NGINX常规CORS错误解决方案_nginx配置cors
-
CORS错误CORS(Cross-OriginResourceSharing,跨源资源共享)是一种机制,它使用额外的HTTP头部来告诉浏览器允许一个网页运行的脚本从不同于它自身来源的服务器上请求资...
- Spring Boot跨域问题终极解决方案:3种方案彻底告别CORS错误
-
引言"接口调不通?前端同事又双叒叕在吼跨域了!""明明Postman能通,浏览器却报OPTIONS403?""生产环境跨域配置突然失效,凌晨3点被夺命连环Ca...
- SpringBoot 项目处理跨域的四种技巧
-
上周帮一家公司优化代码时,顺手把跨域的问题解决了,这篇文章,我们聊聊SpringBoot项目处理跨域的四种技巧。1什么是跨域我们先看下一个典型的网站的地址:同源是指:协议、域名、端口号完全相...
- Spring Cloud入门看这一篇就够了_spring cloud使用教程
-
SpringCloud微服务架构演进单体架构垂直拆分分布式SOA面向服务架构微服务架构服务调用方式:RPC,早期的webservice,现在热门的dubbo,都是RPC的典型代表HTTP,HttpCl...
- 前端程序员:如何用javascript开发一款在线IDE?
-
前言3年前在AWSre:Invent大会上AWS宣布推出Cloud9,用于在云端编写、运行和调试代码,它可以直接运行在浏览器中,也就是传说中的WebIDE。3年后的今天随着国内云计算的发...
- 一周热门
-
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)