怎么用Python实现降雨量统计分析
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,本篇内容介绍了"怎么用Python实现降雨量统计分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先
千家信息网最后更新 2025年02月05日怎么用Python实现降雨量统计分析
本篇内容介绍了"怎么用Python实现降雨量统计分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
先看看需求吧:
主要就是要根据左侧的表格自动生成右侧的Word统计报告,实际的各种可能性情况远比图中展示的要更加复杂。
好了,直接开始干代码吧!
1数据读取
import pandas as pddf = pd.read_csv("11月份数据.csv", encoding='gbk')# 当前统计月份month = 11df = df.query('月份==@month')df.head(10)
2异常数据过滤
查看缺失值数量:
pd.isnull(df).sum()
结果:
区域 0月份 0降雨量(mm) 0降雨距平(mm) 1观测站 0dtype: int64
仅一个缺失值数据,可直接删除:
df.dropna(inplace=True)
3计算观测站降雨量相对往年的变化
计算降雨量比往年高,跟往年比无变化,以及比往年低的次数分别是多少:
rainfall_high = df.eval('`降雨距平(mm)` > 0').value_counts().get(True, 0)rainfall_equal = df.eval('`降雨距平(mm)` == 0').value_counts().get(True, 0)rainfall_low = df.eval('`降雨距平(mm)` < 0').value_counts().get(True, 0)print(rainfall_high, rainfall_equal, rainfall_low)13 1 18
上面的结果中rainfall_high表示降雨量比往年平均水平高的次数,rainfall_equal表示降雨量比往年平均水平持平的次数,rainfall_low表示降雨量比往年平均水平低的次数。
于是分情况讨论生成第一段的报告:
p1 = f"{month}月份"if rainfall_low == 0 or rainfall_high == 0: if rainfall_equal != 0: p1 += f"除{rainfall_equal}个观测站降雨量较往年无变化外," if rainfall_high == 0: p1 += f"各气象观测站降雨量较往年均偏低。" elif rainfall_low == 0: p1 += f"各气象观测站降雨量较往年均偏高。"else: # 10%以内差异认为是持平 if rainfall_high > rainfall_low*1.1: p1 += f"大部分气象观测站降雨量较往年偏高。" elif rainfall_low > rainfall_high*1.1: p1 += f"大部分气象观测站降雨量较往年偏低。" else: p1 += f"各气象观测站降雨量较往年整体持平。"p1
结果:
'11月份大部分气象观测站降雨量较往年偏低。'
4计算各区域降雨量的极值
再生成第二段的报告:
p2 = ""t = df['降雨量(mm)']p2 += f"各区域降雨量在{t.min()}~{t.max()}mm之间,其中{df.loc[t.argmax(), '区域']}区域的降雨量最大,为{t.max()}mm。"p2
结果:
'各区域降雨量在0.0~16.0mm之间,其中51a45区域的降雨量最大,为16.0mm。'
5分观测站统计
让我脑袋疼的地方就是从这里的代码开始的,后面还有更复杂的需求就不公布了。
对每个观测站分别统计哪些区域偏高,哪些区域持平,哪些区域偏低:
p3s = []for station, tmp in df.groupby('观测站'): t = tmp['降雨量(mm)'] p3 = f"各区域降雨量在{t.min()}~{t.max()}mm之间," rainfall_high_mask = tmp.eval('`降雨距平(mm)` > 0') rainfall_equal_mask = tmp.eval('`降雨距平(mm)` == 0') rainfall_low_mask = tmp.eval('`降雨距平(mm)` < 0') rainfall_high = rainfall_high_mask.value_counts().get(True, 0) rainfall_equal = rainfall_equal_mask.value_counts().get(True, 0) rainfall_low = rainfall_low_mask.value_counts().get(True, 0)# print(rainfall_high, rainfall_equal, rainfall_low) if rainfall_low == 0 or rainfall_high == 0: if rainfall_equal != 0: p3 += '除' p3 += '、'.join(tmp.loc[rainfall_equal_mask, '区域']+'区域') p3 += "降雨量较往年无变化外," if rainfall_high == 0: p3 += f"各区域降雨量均较往年偏低" elif rainfall_low == 0: p3 += f"各区域降雨量均较往年偏高" t = tmp['降雨距平(mm)'].abs() p3 += f"{t.min()}~{t.max()}mm;" else: if rainfall_equal != 0: p3 += '除' p3 += '、'.join(tmp.loc[rainfall_equal_mask, '区域']+'区域') p3 += "降雨量较往年无变化," # 10%以内差异认为是持平 if rainfall_high > rainfall_low*1.1: if rainfall_equal == 0: p3 += '除' p3 += '、'.join(tmp.loc[rainfall_low_mask, '区域']+'区域') p3 += "降雨量较往年偏低" t = tmp.loc[rainfall_low_mask, '降雨距平(mm)'].abs() if t.shape[0] > 1: p3 += f"{t.min()}~{t.max()}mm" else: p3 += f"{t.min()}mm" p3 += "外," t = tmp.loc[rainfall_high_mask, '降雨距平(mm)'].abs() p3 += f"其余各区域降雨量较往年偏高{t.min()}~{t.max()}mm;" elif rainfall_low > rainfall_high*1.1: if rainfall_equal == 0: p3 += '除' p3 += '、'.join(tmp.loc[rainfall_high_mask, '区域']+'区域') p3 += "降雨量较往年偏高" t = tmp.loc[rainfall_high_mask, '降雨距平(mm)'].abs() if t.shape[0] > 1: p3 += f"{t.min()}~{t.max()}mm" else: p3 += f"{t.min()}mm" p3 += "外," t = tmp.loc[rainfall_low_mask, '降雨距平(mm)'].abs() p3 += f"其余各区域降雨量较往年偏低{t.min()}~{t.max()}mm;" else: if rainfall_equal != 0: p3 = p3[:-1]+'外,' p3 += f"各区域降雨量较往年偏高和偏低的数量持平,其中" p3 += '、'.join(tmp.loc[rainfall_low_mask, '区域']+'区域') p3 += "降雨量较往年偏低" t = tmp.loc[rainfall_low_mask, '降雨距平(mm)'].abs() if t.shape[0] > 1: p3 += f"{t.min()}~{t.max()}mm," else: p3 += f"{t.min()}mm," p3 += '、'.join(tmp.loc[rainfall_high_mask, '区域']+'区域') p3 += "降雨量较往年偏高" t = tmp.loc[rainfall_high_mask, '降雨距平(mm)'].abs() if t.shape[0] > 1: p3 += f"{t.min()}~{t.max()}mm;" else: p3 += f"{t.min()}mm;" p3s.append([station, p3])p3s[-1][-1] = p3s[-1][-1][:-1]+"。"p3s
6将组织好的文本写入到word中
Word模板文件docxtemplate.docx的内容:
一、{ { month }}月各气象观测站降雨量实况(一)降水{ { p1 }}{ { p2 }}{%p for station,p3 in p3s %}{ { station }}:{ { p3 }}{%p endfor %}
即:
Python渲染代码:
from docxtpl import DocxTemplatetpl = DocxTemplate("docxtemplate.docx")context = { 'month': month, 'p1': p1, 'p2': p2, 'p3s': p3s,}tpl.render(context)tpl.save("11月降雨量报告.docx")
"怎么用Python实现降雨量统计分析"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
降雨
降雨量
区域
观测站
观测
气象
统计
月份
报告
数据
次数
结果
之间
代码
内容
大部分
情况
水平
变化
生成
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
深圳服务器租赁
辽宁厂家直销服务器机柜虚拟主机
安徽创新管理软件开发
CF手游服务器分布在哪些地方
金铲铲可以跨服务器吗
软件开发是算什么专业
第2单元 网络技术基础
服务器脚本管理
iq数据库截取函数
南京服务器工控机通讯
服务器域名去哪里买
数据中心网络安全知识
网络安全隐患小视频
dedecms 数据库表
数据库服务器虚地址
电大数据库综合题
土右旗云计算网络安全
长沙市网络安全征信
运维网络安全心得
没法连接到服务器怎么办
软件开发行业创业计划书完整版
诚信的优质软件开发
山西潮流软件开发服务参考价格
江苏软件开发价格
国家法律法规数据库新吗
项目打包怎么附加数据库
厦门青蜂网络技术有限公司
数据库试验测试
网络技术有限公司简写
网络安全知识学什么专业