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

Irene181
• 阅读 2402

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

作者:小小明

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

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

今夜偏知春气暖,虫声新透绿窗纱。

大家好,我是J哥。

最近遇到一个有点烧脑的需求,其实也不算烧脑,主要是判断条件过多,对于我这种记忆力差,内存小的人来说容易出现内存溢出导致大脑宕机。也可能是因为我还没有找到能减小大脑内存压力的写法。若读者有更好的解决方案,欢迎在本文文末进行留言噢!

后台回复「降雨」二字,可领取本文所用数据集和Word模板,便于大家用Python测试。

先看看需求吧:

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

主要就是要根据左侧的表格自动生成右侧的Word统计报告,实际的各种可能性情况远比图中展示的要更加复杂。

好了,直接开始干代码吧!

1

数据读取



import pandas as pd  

df = pd.read\_csv("11月份数据.csv", encoding='gbk')  
# 当前统计月份  
month = 11  
df = df.query('月份==@month')  
df.head(10)  


预览数据:

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

2

异常数据过滤

查看缺失值数量:



pd.isnull(df).sum()  


结果:



区域          0  
月份          0  
降雨量(mm)     0  
降雨距平(mm)    1  
观测站         0  
dtype: 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自动根据数据生成降雨量统计分析报告

Python渲染代码:



from docxtpl import DocxTemplate  

tpl = DocxTemplate("docxtemplate.docx")  
context = {  
    'month': month,  
    'p1': p1,  
    'p2': p2,  
    'p3s': p3s,  
}  
tpl.render(context)  
tpl.save("11月降雨量报告.docx")  


执行完毕,得到Word统计分析报告:

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

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

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

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/oMG7zFZgGN8NahjkkqR13g,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
Irene181 Irene181
3年前
盘点最重要的7个Python库
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书导读:对于那些对Python数据生态系统不太熟悉的人士,我将简要地介绍一部分重要的库。作者:韦斯·麦金尼(WesMcKinney)译者:徐敬来源:大数据DT(ID:hzdashuju)01NumPyhttp://numpy
Karen110 Karen110
3年前
Pandas专家总结:指定样式保存excel数据的 “N种” 姿势!
作者:小小明简介:Pandas数据处理专家,10余年编码经验,至今已帮助过百名以上数据从业人员解决工作实际遇到的问题,其中数据处理和办公自动化问题涉及的行业包括会计、审计、HR、气象工作人员、教师、律师、运营,以及各行业的数据分析师和专做数据分析案例的公众号号主。若你在数据处理的问题上遇到什么困难,欢迎与我交流。目录准备数据
Stella981 Stella981
3年前
Python爬取所有人位置信息,制作任意区域人流量显示图
击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤衣裳已施行看尽,针线犹存未忍开。最近偶然看到了腾讯的大数据星云图,非常漂亮,如下图:!(https://oscimg.oschina.net/oscnet/6dc6022d4dfb49
Stella981 Stella981
3年前
Python分析《哈哈哈哈哈》47687条弹幕,看看大家都在说些啥!
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤归山深浅去,须尽丘壑美。!(https://oscimg.oschina.net/oscnet/5a50ee167263416384471dc0bf419cee.png)图片来源:豆瓣
Stella981 Stella981
3年前
Python web开发从入门到放弃
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤无为之用方为大用。!(https://oscimg.oschina.net/oscnet/f64430c27950bcccce040bb032ea65e73a5.jpg)越来越多的同学知道我在做
可莉 可莉
3年前
10行Python代码自动清理电脑内重复文件,解放双手!
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤世间行乐亦如此,古来万事东流水。!(https://oscimg.oschina.net/oscnet/da5385ecbd59492aa127c14a1a5b807c.jpg)(h
Stella981 Stella981
3年前
Python3 网络爬虫:下载小说的正确姿势
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤少年心事当拂云。!(https://oscimg.oschina.net/oscnet/09902b71501b9e8c3cb656b5dfbbb0552e0.jpg)1
Stella981 Stella981
3年前
Excel中的xls、xlsx、xlsm混合文件,看我用Python如何统一处理......
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤洞房昨夜停红烛,待晓堂前拜舅姑。引言Python语言,近几年在办公自动化这一领域来说,真的超级火爆!用它做批量处理确实比VBA要方便很多。前面的文章,我们已经讲述了如何将do
Stella981 Stella981
3年前
Python中的基础数据类型(String,Number)及其常用用法简析
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤寄意寒星荃不察,我以我血荐轩辕。Python中的基础数据类型前言哈喽,各位小伙伴们,相信大家和我一样,在开始接触Python这门语言的时候,会遇到很多困
Wesley13 Wesley13
3年前
5 分钟掌握 Python 中的 Hook 钩子函数
击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤此曲有意无人传,愿随春风寄燕然。!(https://oscimg.oschina.net/oscnet/eb40675fe18343b98502990255057c76.jpg)1