相关文章
干货|利用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://dh99988.xhstdz.com/news/1227.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://dh99988.xhstdz.com/mobile/ , 查看更多   
最新文章
文心一言APP无法连接网络
文心一言APP无法连接网络许多用户反映,他们所喜爱的文心一言APP无法连接网络。这款APP以其精选的古代文言文名句和现代文学名篇
谷歌收录秘籍:揭秘提交入口网址
谷歌收录提交入口:专业指南与重要性解析在当今数字化时代,互联网已成为信息传播与商业活动的重要平台对于网站运营者而言,确保
浅探webpack优化
由于前端的快速发展,相关工具的发展速度也是相当迅猛,各大框架例如vue,react都有自己优秀的脚手架工具来帮助我们
百度收录平台排名 揭秘百度收录平台排名,优化策略助你领跑新媒体
在当今这个信息爆炸的时代,互联网已成为企业展示自我、吸引客户、拓展市场不可或缺的重要渠道而在浩瀚的网络海洋中,如何让自己
为什么要做海外推广方式
为什么要进行海外推广方式:探索国际化市场的关键路径一、引言在全球化和数字化迅猛发展的当下,企业的海外推广成为了进入国际市
99%亚马逊运营都不知道的“以图找同款”功能!
亚马逊已与各大社交媒体平台达成了合作,在社媒平台的分享按钮中,多了一个亚马逊图标。大家可以理解为:从社媒平台到亚马逊平台
如何通过百度网站链接提交提升企业在搜索引擎中的知名度与排名
目前,数字化新时代盛行之际,网络的广泛应用使得网站成为企业展现自身、招揽顾客及拓展市场的重要载体。然而,仅有网站并非万能
电脑磁盘分区格式GPT和MBR哪个好 电脑磁盘分区格式GPT和MBR对比【详解】
  最近不少用户在安装电脑的时候经常会安装新的电脑硬盘,在新的电脑硬盘安装的时候,电脑都会提示用户需要进行初始化磁盘,并
百度seo排名优化是什么?
在当今这个数字化和信息化的时代,搜索引擎已经成为人们获取信息、寻找服务的重要工具。百度,作为中国非常大的搜索引擎,其排名
永州SEO优化,企业品牌腾飞的关键策略
永州SEO推广排名,助力企业品牌崛起。通过优化关键词、提升网站质量、布局搜索引擎算法,提高企业网站在搜索引擎中的排名,吸引
相关文章