python 水质日历热力图

news2024/9/22 1:32:44

利用日历热力图可以方便的查看站点水质全年的变化情况。

接口获取站点数据

这一步根据自己实际情况,也可以读取excel、MySQL读取数据。这里把API地址已隐去。

import numpy as np
import calendar
import requests
import json
import pandas as pd
import time
from datetime import date, datetime, timedelta
import matplotlib.pyplot as plt
from matplotlib.pylab import style  # 自定义图表风格
# style.use('ggplot')
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Simhei']# 解决坐标轴刻度负号乱码
plt.rcParams['axes.unicode_minus'] = False
connect_table =pd.read_excel("设备因子对照.xls")
# 根据时间、站点名称参数获取API url
def url_ask(beginTime,endTime,mn,period):
    # beginTime 要拉取的数据开始时间节点(yyyy-MM-dd HH:mm:ss)
    # endTime = "2023-10-30 00:00:00" #前闭后开
    # mn 设备编码
    # page当前页码
    # 原始接口中包括page和pagesize 默认1和10000   
    # 这里需要注意 不宜太大,暂内存,二是如果查询内容过大则会超过1页,需要查询total page 字段的数字,并判断
    # period 时间周期,实时为空,但要带这个请求参数,1小时为h1,4小时为h4,天数据为d1 
    page ="1"
    pageSize ="10000"
    mianurl = "             "
    ip_port = "             "       
    url =ip_port + mianurl+"beginTime="+beginTime+"&endTime="+endTime +"&mn="+mn +"&page="+page +"&period=" +period +"&pageSize="+pageSize
    # 发起API请求获取JSON数据
    return(url)
# 根据站点名称求编码
def seak_mn(ask_station):
    mn_text = connect_table.loc[connect_table['设备名称'] ==ask_station] 
    mn = mn_text.mn.unique()[0]
    return(mn)

period = "h4"
ask_station = '湾凼'
mn = seak_mn(ask_station)
url =url_ask('2023-01-01 00:00:00','2023-11-20 00:00:00',mn,period)

# 根据URL 获取站点监测数据 未经降维
def mn_value(url):
    response = requests.get(url)
    response_data = response.json()
    data =response_data["data"]
    titles =data["titles"]
    titles= pd.DataFrame(titles)
    factor_code = titles["identifier"]
    factor_name = titles["name"]
    # 查询监测数据
    df_value =data["items"]
    df_value = pd.DataFrame(df_value,columns=factor_code)
    df_value.columns= factor_name
    df_value.rename(columns={'上报时间': '监测时间'}, inplace=True)
    return(df_value)
df_value =mn_value(url)
df_value.tail()

输出数据结构如下:

进行站点等级评价

选择 '氨氮', '高锰酸盐指数', '总磷',作为评价因子,以地表水评价导则判断各因子的评价等级,

再按照因子评价等级最高的最为站点评价等级。

df = df_value[['氨氮', '高锰酸盐指数', '总磷', '监测时间']]  
# 数据清洗
df = df.replace(0, np.nan)  # 将0替换为NaN
df = df.dropna(axis=0, how='any')  # 删除包含NaN的行
# 将监测时间转换为日期,并计算日平均值
df['监测时间'] = pd.to_datetime(df['监测时间'])
df['日期'] = df['监测时间'].dt.date
df = df.groupby('日期').mean().reset_index()

# 数据评价
def evaluate_index(value, limits):
    for i, limit in enumerate(limits):
        if value <= limit:
            return i + 1
    return len(limits) + 1

# 设置各因子的标准限值
limits = {
    '高锰酸盐指数': [2, 4, 6, 10, 15],
    '氨氮': [0.15, 0.5, 1, 1.5, 2.0],
    '总磷': [0.02, 0.1, 0.2, 0.3, 0.4]
}

# 计算评价等级
for factor, limit in limits.items():
    df[f'{factor}评价等级'] = df[factor].apply(lambda x: evaluate_index(x, limit))

# 计算站点评价等级
df['站点评价等级'] = df[['高锰酸盐指数评价等级', '氨氮评价等级', '总磷评价等级']].max(axis=1)

最后的结果如下图

日历热力图的绘制

通过简单查询可以知道这个点位的等级范围为2-6类(Ⅱ类到劣Ⅴ类)

第一种方式 calmap库

import pandas as pd
import calmap
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 将日期列转换为日期类型
df['日期'] = pd.to_datetime(df['日期'])

# 确保站点评价等级是数值类型
df['站点评价等级'] = pd.to_numeric(df['站点评价等级'])

# 创建日历热力图
fig, ax = plt.subplots(figsize=(20, 6), dpi=300)
calmap.yearplot(df.set_index('日期')['站点评价等级'], year=2023, cmap='RdYlGn_r', linewidth=0.01, linecolor='grey', monthticks=5, monthlabels='none')

# 添加颜色条
cmap = plt.cm.get_cmap('RdYlGn_r', 6)  # 选择颜色映射,这里假设我们将颜色分为7个区间
bounds = [0.5, 1.5, 2.5, 3.5, 4.5, 5.5]  # 设置颜色条的分割点
norm = plt.cm.colors.BoundaryNorm(bounds, cmap.N)  # 根据分割点创建颜色映射
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
cbar = plt.colorbar(sm, orientation='horizontal', ticks=[1, 2, 3, 4, 5], shrink=0.4)  # 设置颜色条的标记位置
cbar.ax.set_xticklabels(['Ⅱ类', 'Ⅲ类', 'Ⅳ类', 'Ⅴ类', '劣Ⅴ类'])
cbar.set_label('水质等级', fontsize=14)

# 自定义月份显示为中文
plt.gca().set_xticklabels(['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'])

# 调整图形布局
plt.subplots_adjust(left=0.05, right=0.95, top=0.95, bottom=0.2)

# 设置图形标题
label_name = ask_station + "2023年水质等级日历热力图"
plt.title(label_name, fontsize=16)
# 保存图形到本地
# plt.savefig("calendar_heatmap.png")
# 显示图形
plt.show()

缺点比较明显 不能交互,且月份之间间隔不明显。

第一种方式 pyecharts库

代码更简洁,效果还可以,输出格式为html,可交互,逻辑更清晰。

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Calendar

# 将日期列转换为日期类型
df['日期'] = pd.to_datetime(df['日期'])

# 确保站点评价等级是数值类型
df['站点评价等级'] = pd.to_numeric(df['站点评价等级'])

# 获取日期和评价等级数据
data = df[['日期', '站点评价等级']].values.tolist()

# 创建日历热力图
calendar = (
    Calendar()
    .add("", data, calendar_opts=opts.CalendarOpts(range_='2023'))
    .set_global_opts(
        title_opts=opts.TitleOpts(title=ask_station + "2023年水质等级日历热力图"),
        visualmap_opts=opts.VisualMapOpts(
            max_=5,
            min_=1,
            orient="horizontal",
            pos_top="230px",
            pos_left="center",
            is_piecewise=True,
            pieces=[
                {"min": 1, "max": 2, "label": "Ⅱ类", "color": "#00E500"},
                {"min": 2, "max": 3, "label": "Ⅲ类", "color": "blue"},
                {"min": 3, "max": 4, "label": "Ⅳ类", "color": "#FFA500"},
                {"min": 4, "max": 5, "label": "Ⅴ类", "color": "#FF0000"},
                {"min": 5, "max": 6, "label": "劣Ⅴ类", "color": "#800080"},
            ],           
        ),
    )
    .render("calendar_heatmap.html")
)

# 还是有改进的地方,比如根据等级的上下限自动匹配色块

小结

从图中可以看到该站点4-10月水质较差,其他月份水质为Ⅲ类及以下。

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

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

相关文章

『亚马逊云科技产品测评』活动征文|通过Lightsail搭建个人笔记

提示&#xff1a;授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 文章目录 前言实践知识储备Lightsail介绍Leanote介绍实践…

如何用CHAT写励志文章?

问CHAT&#xff1a;写一篇以《过了60岁要积极面对身体疾病的坎儿》为题目&#xff0c;写一篇300字励志文章 CHAT回复&#xff1a; 标题&#xff1a;《过了60岁要积极面对身体疾病的坎儿》 人生&#xff0c;有时会像一趟不期而遇的旅程&#xff0c;各自带着乐观或悲观、阳光或…

Transmit v5.10.3(FTP客户端)

Transmit 5是一款由Panic开发的功能强大的FTP(文件传输协议)客户端软件&#xff0c;专为 macOS 平台设计。它提供了简单、直观的界面和丰富的功能&#xff0c;使用户能够轻松地管理和传输文件。 在文件传输和同步方面&#xff0c;Transmit 5提供了强大的文件同步功能&#xff…

基于Android校园交流uniAPP+vue 微信小程序v7e1

本系统结合现今XX校园交流APP的功能模块以及设计方式进行分析&#xff0c;使用Android平台和Ssm框架进行开发设计&#xff0c;具体研究内容如下&#xff1a; (1) 系统管理员主要对用户管理、类型管理、娱乐天地管理、投诉举报管理、学习平台、我的收藏管理、系统管理等功能进…

小米智能摄像机云台版pro 拆解教程

拆解原因 因为设备提示无内存卡&#xff0c;摄像头手动调整方向到最上面&#xff0c;就可以看到内存卡插槽 但是这个摄像头因为内存卡弹出来了&#xff0c;导致无法插入也无法取出&#xff0c;所以决定拆开重新安装 第一步&#xff0c;拆开后即可拔出底座&#xff0c;拔掉摄像…

2023软件测试的4个技术等级,你在哪个级别?

最近&#xff0c;我们讨论了软件测试工程的的分级&#xff0c;大家都贡献了自己的想法&#xff0c;对于大家来说&#xff0c;软件测试人的分级其实也代表了我们的进阶方向&#xff0c;职业发展。总体来说&#xff0c;测试工程师未来发展有三个方向&#xff1a; 技术精英 行业专…

RK3568开发板在工控工业物联网网关方面的应用

在数字化转型的浪潮中&#xff0c;工控物联网关产品扮演着重要的角色。这些产品通过连接工业设备和网络&#xff0c;为数据传输和分析提供了便利。而迅为RK3568核心板作为一款高性能的芯片&#xff0c;为工控物联网关产品的性能提升和功能扩展提供了强大的支持。 迅为RK3568核心…

【Java】智慧工地管理系统源代码,支持二次开发,SaaS模式

智慧工地系统围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效。 一、行业现状 1、施工现场管理难&#xff1a;安全事故频发&#xff0c;人工巡检难度大&#xff0c;质量进度协同难等…

自动化发展趋势以及自动化测试常见问题解析

前言 ⾃动化接⼝测试会越来越受到重视 在移动互联⽹时代&#xff0c;对于质量的要求⽐PC时代⾼的多&#xff0c;⽽投⼊产出⽐最⾼的⾃动化接⼝测试&#xff0c;将会是⼤部分公司的⾸选⽅向&#xff0c;但需要严格掌握⼀门语⾔ 持续集成是⽬前⾮常流⾏的开发⽅式&#xff0c;…

在有springSecurity或者若依项目中获取当前系统登录的用户信息

方法一&#xff08;springSecurity自带的&#xff09; AuthenticationPrincipal 是 Spring Security 框架中的一个注解&#xff0c;用于获取当前已认证用户的 principal&#xff08;即用户身份信息&#xff09;。 方法二&#xff08;若依项目自带的&#xff09; &#xff08;1…

最新AIGC创作系统ChatGPT网站源码,Midjourney绘画系统,支持最新GPT-4-Turbo模型,支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

七、通过libfdk_aac编解码器实现aac音频和pcm的编解码

前言 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12 AAC编码是MP3格式的后继产品&#xff0c;通常在相同的比特率下可以获得比MP3更高的声音质量&#xff0c;是iPhone、iPod、iPad、iTunes的标准音频格式。 AAC相较于MP3的改进包含&#xff1a; 更多的采…

【Python】Vscode解决Python中制表符和空格混用导致的缩进问题

【Python】Vscode解决Python中制表符和空格混用导致的缩进问题 文章目录 【Python】Vscode解决Python中制表符和空格混用导致的缩进问题1. 问题来源2. 解决Reference 1. 问题来源 在python中使用缩进来进行代码块的分区&#xff0c;通常来说python的一个缩进包含4个空格&#…

微服务学习|Feign:快速入门、自定义配置、性能优化、最佳实践

RestTemplate方式调用存在的问题 先来看我们以前利用RestTemplate发起远程调用的代码 存在下面的问题 代码可读性差&#xff0c;编程体验不统一 参数复杂URL难以维护 Feign的介绍 Feign是一个声明式的http客户端&#xff0c;官方地址: https://github.com/OpenFeign/feign …

轻松整理文件夹,将视频文件全部归类到另一个文件夹!

如果你需要整理文件夹中的文件&#xff0c;将同一类别的文件归纳到一起&#xff0c;可以更加方便地管理和查找。现在&#xff0c;我们有一个简单而实用的方法&#xff0c;可以将文件夹中的所有视频文件归类到另一个文件夹中&#xff0c;让你的文件管理更加有序和高效。 首先&am…

《向量数据库指南》——向量数据库Milvus Cloud搭建Excel公式编辑器助手

引言 在日常工作中,Excel是我们经常使用的办公工具,而熟练应用Excel公式对于提高工作效率非常重要。然而,有时候我们会遇到一些复杂的需求,需要用到较为专业的Excel公式,而这正是Excel公式编辑器助手的用武之地。本文将介绍如何利用向量数据库Milvus Cloud搭建GPT大模型和…

【顺序表的应用-通讯录的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、顺序表的应用 1. 基于动态顺序表实现通讯录 1、功能要求 2、代码实现 二、通讯录的代码实现 1.通讯录的底层结构(顺序表) (1)思路展示 (2)底层代码实现(顺序表…

如何有效解决UDP协议传输问题实现快速安全的文件传输

随着互联网技术的不断发展&#xff0c;UDP协议作为一种快速、简单的传输协议被广泛应用于文件传输领域。然而&#xff0c;UDP协议传输过程中也存在着一些问题&#xff0c;如传输速度不稳定、数据丢失等&#xff0c;这些问题会影响到文件传输的效率和安全性。本文将介绍UDP协议传…

为什么要学习 Linux?

为什么要学习 Linux&#xff1f; 用 Linus 本人的话来说&#xff0c;用户不需要接触到操作系统。操作系统的功能是给应用程序提供API&#xff0c;因而&#xff0c;只有开发人员才需要学习操作系统。 最近很多小伙伴找我&#xff0c;说想要一些Linux的资料&#xff0c;然后我根…

公众号留言功能怎么没有了?

为什么公众号没有留言功能&#xff1f;2018年2月12日之后直到现在&#xff0c;新注册公众号的运营者会发现一个问题&#xff1a;无论是个人还是企业的公众号&#xff0c;在后台都找不到留言功能了。这对公众号来说绝对是一个极差的体验&#xff0c;少了一个这么重要的功能&…