相关文章
干货|利用Python自动根据数据生成降雨量统计分析报告
2024-11-10 17:00

作者:小小明

干货|利用Python自动根据数据生成降雨量统计分析报告

简介:Pandas数据处理专家,10余年编码经验,至今已帮助过成千上万名数据从业者解决工作实际遇到的问题,其中数据处理和办公自动化问题涉及的行业包括会计、HR、气象、金融等等,现为菜J学Python核心技术团队成员之一。

新妆宜面下朱楼,深锁春光一院愁。大家好,我是J哥。最近遇到一个有点烧脑的需求,其实也不算烧脑,主要是判断条件过多,对于我这种记忆力差,内存小的人来说容易出现内存溢出导致大脑宕机。也可能是因为我还没有找到能减小大脑内存压力的写法。若读者有更好的解决方案,欢迎在本文文末进行留言噢!后台回复「降雨」二字,可领取本文所用数据集和Word模板,便于大家用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可能是我还没有想出较好的封装方式导致代码变得这么复杂,如果有巧妙解决这个问题的朋友,希望能够加菜J学Python交流群一起探讨。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")执行完毕,得到Word统计分析报告:

    以上就是本篇文章【干货|利用Python自动根据数据生成降雨量统计分析报告】的全部内容了,欢迎阅览 ! 文章地址:http://sjzytwl.xhstdz.com/news/1227.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://sjzytwl.xhstdz.com/mobile/ , 查看更多   
最新文章
3防手机(3防手机8849)
  关于《三防手机》的文章  随着科技的不断发展,智能手机已经成为我们日常生活中不可或缺的一部分。然而,我们的手机在使用
华为手机有放大镜望远镜的功能吗 华为手机放大镜望远镜功能介绍【详解】手机望远镜「华为手机有放大镜望远镜的功能吗 华为手机放大镜望远镜功能介绍【详解】」
  有放大镜望远镜的功能吗,很多朋友都遇到了这样的问题。这个问题该如何解决呢?下面小编就带来华为放大镜望远镜的功能介绍,
4glte是什么手机(4g lte+)
  关于《4GLTE是什么手机》的文章  在现代社会,移动通信技术日新月异,其中,4GLTE技术已成为众多智能手机所广泛采用的一种
工行短信银行工商银行手机银行app下载「工行短信银行」
工行短信银行app是一款工行移动金融创新产品的手机客户端。工行短信银行客户端为你提供实时查询、业务办理等等,方便快捷,快来I
怎么办理手机银行手机银行「怎么办理手机银行」
随着移动互联网的飞速发展,手机银行已成为我们日常生活中不可或缺的一部分,它提供了便捷、高效的金融服务。那么,如何办理手机
手机管家手机管家「手机管家」
手机管家是一款综合性的手机管理软件,旨在为用户提供一站式的手机优化服务。通过智能清理、加速、安全保护等功能,帮助用户轻松
品牌手机排行榜前十名手机品牌排行榜前十名「品牌手机排行榜前十名」
华为创立于1987年,是全球领先的信息与通信技术(ICT)解决方案供应商,在电信运营商、企业、终端和云计算等领域构筑了端到端的解
手机CPU天梯图2023年2月最新版,你的手机排名如何?手机cpu天梯图「手机CPU天梯图2023年2月最新版,你的手机排名如何?」
2月已经过去,我们迎来了3月,冬日的寒冷逐渐消散,春天的日子已经触手可及。今天是我们3月份的第一天,芝麻科技讯更新了2023年2
6g运行手机(6g运行手机什么牌子好)
  关于《6G运行手机》的文章  随着科技的飞速发展,手机已经成为了我们日常生活中不可或缺的一部分。近日,各大手机品牌纷纷
手机控必看!大屏手机用出“手机手” 严重的要动手术手机手「手机控必看!大屏手机用出“手机手” 严重的要动手术」
你的手还好吗?鼠标手、键盘手、近视眼、肩周炎……难道这些伤害还不够吗?这不,最近又爆出新科技病——“手机手”!没有买卖,
相关文章