python 水质日历热力图

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

接口获取站点数据

这一步根据自己实际情况,也可以读取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月水质较差,其他月份水质为Ⅲ类及以下。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python基于GCN(图卷积神经网络模型)和LSTM(长短期记忆神经网络模型)开发构建污染物时间序列预测模型

在以往的时间序列预测建模中广泛使用的是回归类算法模型和RNN类的算法模型&#xff0c;相对来说技术栈会更稳定一些&#xff0c;最近有一个实际业务场景的需求&#xff0c;在建模的过程中要综合考虑其余点位的影响依赖&#xff0c;这时候我想到了之前做过的交通流量和速度预测相…

全国第一届学生(青年)运动会女子拳击比赛60公斤冠军载誉归来

11月16日&#xff0c;参加全国第一届学生&#xff08;青年&#xff09;运动会女子拳击比赛60公斤冠军阿依古再丽麦合苏提抵达和田。 中华人民共和国第一届学生&#xff08;青年&#xff09;运动会拳击比赛11月12日在广西贺州市钟山县体育馆落下帷幕&#xff0c;本届比赛新疆拳击…

60V降压恒流芯片 高调光比LED驱动器 SL6015B替代PT4115 电路简单

在LED照明领域&#xff0c;降压恒流芯片是一种非常重要的芯片&#xff0c;它可以将输入的电压降低并输出稳定的电流&#xff0c;从而为LED灯提供合适的驱动电源。其中&#xff0c;SL6015B是一款非常优秀的降压恒流芯片&#xff0c;它具有高调光比、简单的电路设计、低成本的优点…

服务案例|故障频发的一周,居然睡得更香!

医院运维有多忙&#xff1f; 医院运维&#xff0c;听起来平平无奇毫不惊艳&#xff0c;但其中的含金量&#xff0c;可不是“维持系统正常运行”就能总结的。毕竟医院对业务连续性的超高要求&#xff0c;让运维面对的问题都是暂时的&#xff0c;下一秒可能就有新问题需要发现解…

一般人用 Linux 算是找虐吗?

一般人用 Linux 算是找虐吗&#xff1f; 主要得看用什么Linux&#xff0c;毕竟Android也算是Linux&#xff0c;满大街一般人整天在用&#xff0c;也没什么人觉得自己在找虐。 最近很多小伙伴找我&#xff0c;说想要一些Linux的资料&#xff0c;然后我根据自己从业十年经验&…

【Linux】:进程间通信和日志模拟

进程间通信 一.基本概念二.简单的通信-管道(匿名管道)1.建立通信信道2.通信接口 三.命名管道三.模拟命名管道通信&#xff08;加上日志&#xff09;1.完整代码2.基本使用 一.基本概念 是什么 两个或多个进程实现数据层面的交互。 因为进程独立性的存在&#xff0c;导致进程间…

spark shuffle 剖析

ShuffleExchangeExec private lazy val writeMetrics SQLShuffleWriteMetricsReporter.createShuffleWriteMetrics(sparkContext)private[sql] lazy val readMetrics SQLShuffleReadMetricsReporter.createShuffleReadMetrics(sparkContext)用在了两个地方&#xff0c;承接的是…

禁止安装新软件怎么设置(超详细图文介绍)

很多公司的网管向我们反应&#xff0c;总是有员工随意下载软件&#xff0c;并且不去正规网站、正规官网下载&#xff0c;导致公司的电脑总是又卡又慢&#xff0c;网管的工作很难开展。 此时就需要对公司安装软件的情况&#xff0c;进行统一管控了。 方法一&#xff1a;适合个人…

Git - 版本控制系统

目录 一、概述 配置用户信息 二、Git仓库 创建 本地仓库 git的三个区域 示例 Git文件状态 举例 三、区域使用 暂存区使用 版本库使用 文件忽略 四、分支 步骤 合并与删除 步骤 合并与提交 合并冲突 五、常用指令 六、Git远程仓库 使用步骤 克隆 同步 …

一键合并多个TXT文本,将保存在TXT的快递单号进行一键合并

如果你需要处理大量的TXT文本文件&#xff0c;那么你可能会遇到需要将这些文件合并为一个文件的情况。这不仅涉及到文件的组织和管理&#xff0c;还可能涉及到文件内容的连贯性和完整性。现在&#xff0c;我们有一个强大的工具&#xff0c;可以帮助你轻松实现一键文件整理&…

身份证号码校验

根据《新版外国人永久居留身份证适配性改造要点》&#xff0c;公司需要把代码中对身份证的校验进行优化 就文档内容可以看到需要优化的要点是&#xff1a; 新版永居证号码以 9 开头 受理地区代码出生日期顺序码校验码&#xff1b;&#xff08;共18位&#xff09; eg&#xff…

2023年约特干故城夜间演艺《万方乐奏有于阗》完美谢幕

11月19日&#xff0c;记者走进约特干故城看到演员在欢乐地跳着刀郎舞和古典舞&#xff0c;庆祝今年以来夜间演艺《万方乐奏有于阗》演出200场完美谢幕。 11月19日在约特干故城&#xff0c;演员正在表演迎宾乐舞。阿卜力克木依卜拉依木摄 当天晚上&#xff0c;城楼上旌旗猎猎&am…

Transmit v5.10.3(FTP客户端)

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

18张值得收藏的高清卫星影像

这里分享的18张高清卫星影像&#xff0c;由吉林一号卫星拍摄。 原图来自长光卫星嘉宾在直播中分享的PPT演示文档。 18张高清卫星影像 吉林一号高分04A星&#xff0c;于2022年05月21日拍摄的北京紫禁城高清卫星影像。 北京紫禁城 云南昆明滇池国际会展中心高清卫星影像&…

【STM32外设系列】JW01三合一空气质量检测模块

&#x1f380; 文章作者&#xff1a;二土电子 &#x1f338; 关注公众号获取更多资料&#xff01; &#x1f438; 期待大家一起学习交流&#xff01; 文章目录 一、JW01模块简介二、数据格式介绍三、程序设计3.1 串口初始化3.2 串口接收中断服务函数3.3 数据解析函数 四、其他…

思福迪 运维安全管理系统 test_qrcode_b 远程命令执行漏洞

思福迪 运维安全管理系统 test_qrcode_b 远程命令执行漏洞 一、漏洞描述二、漏洞影响三、网络测绘四、漏洞复现1.手动复现2.自动化复现3.python源代码 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任…

OOM问题排查+Jvm优化

OOM问题排查&#xff1a; 1、top命令&#xff1a;查看cpu和内存的使用情况。 2、jstat命令&#xff1a;查看YGC和FGC情况&#xff0c;一般都是老年代不够用。导致OOM 3、jmap命令&#xff1a; 查看哪个类的实例过多,以每个类占用多少了内存。4、jstack 查看线程与线程之间的阻…

【广州华锐互动】昆虫3D虚拟动态展示:探索神奇的微观世界

在这个充满科技魅力的时代&#xff0c;我们可以通过各种方式去了解和探索自然界的奥秘。而昆虫作为地球上最为丰富多样的生物群体之一&#xff0c;其独特的生活习性和形态特征一直吸引着人们的目光。 由广州华锐互动开发的昆虫3D虚拟动态展示系统&#xff0c;成为了一种全新的科…

原始类型 vs. 对象(基本类型 vs. 引用类型)

原始类型 首先我们先看一段代码&#xff1a; let age 30; let oldAge age; age 31; console.log(age); console.log(oldAge);在 JavaScript 中&#xff0c;原始类型的赋值是通过值复制的方式进行的&#xff0c;而不会相互影响。只有对象类型的值才是通过引用复制的方式进行…

【数据结构(三)】双向链表(2)

文章目录 1. 基本概念2. 管理双向链表的思路3. 代码实现 1. 基本概念 管理单向链表的缺点分析: ①单向链表&#xff0c;查找的方向只能是一个方向&#xff0c;而双向链表可以向前或者向后查找。     ②单向链表不能自我删除&#xff0c;需要靠辅助节点 &#xff0c;而双向…