相关文章
干货|利用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://dgaty.xhstdz.com/news/1227.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://dgaty.xhstdz.com/mobile/ , 查看更多   
最新文章
如何通过百度网站链接提交提升企业在搜索引擎中的知名度与排名
目前,数字化新时代盛行之际,网络的广泛应用使得网站成为企业展现自身、招揽顾客及拓展市场的重要载体。然而,仅有网站并非万能
电脑磁盘分区格式GPT和MBR哪个好 电脑磁盘分区格式GPT和MBR对比【详解】
  最近不少用户在安装电脑的时候经常会安装新的电脑硬盘,在新的电脑硬盘安装的时候,电脑都会提示用户需要进行初始化磁盘,并
百度seo排名优化是什么?
在当今这个数字化和信息化的时代,搜索引擎已经成为人们获取信息、寻找服务的重要工具。百度,作为中国非常大的搜索引擎,其排名
永州SEO优化,企业品牌腾飞的关键策略
永州SEO推广排名,助力企业品牌崛起。通过优化关键词、提升网站质量、布局搜索引擎算法,提高企业网站在搜索引擎中的排名,吸引
百度新网站收录揭秘:内容质量决定速度,SEO优化引爆排名
百度新网站收录情况近期,公众重点关注了百度搜索引擎针对新型网站的收录状况。作为网站主与网络市场推广从业者,网站于搜索引擎
SEO营销咨询,企业互联网转型的高效秘籍
SEO营销咨询,企业互联网转型的得力助手!我们提供专业的SEO策略,提升网站排名,增强网络曝光,助力企业高效转型,抢占市场先机
电商seo做法 电商SEO优化实战技巧揭秘
电商SEO:解锁流量与转化的秘密武器在当今这个数字化时代,电子商务已成为全球经济不可或缺的一部分随着市场竞争的日益激烈,如
2024年最顶尖的AI驱动SEO工具|TodayAI
在当今数字营销的竞争环境中,获得搜索引擎的高排名至关重要,因为它直接关联到网站的有机流量和品牌的在线影响力。
AI在创造还是毁掉音乐?深度学习时代的音乐变革
近一个月来,音乐界迎来了一场由人工智能主导的变革。随着多个音乐大模型的相继亮相,AI技术一举将音乐创作的门槛降
短视频排名seo(短视频排行榜前十名)
提高短视频曝光率**#8211; 如何吸引更多的观众?在当今社交媒体爆炸的时代,多种类型的短视频在不同的平台上迅速传播。但与此同
相关文章