python实现气象数据分析统计服_Python数据分析实战:降雨量统计分析报告分析
本文的文字及圖片來源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,如有問題請及時聯(lián)系我們以作處理。
以下文章來源于菜J學(xué)Python ,作者小小明
最近遇到一個有點燒腦的需求,其實也不算燒腦,主要是判斷條件過多,對于我這種記憶力差,內(nèi)存小的人來說容易出現(xiàn)內(nèi)存溢出導(dǎo)致大腦宕機。也可能是因為我還沒有找到能減小大腦內(nèi)存壓力的方法。
先看看需求吧:
主要就是要根據(jù)左側(cè)的表格自動生成右側(cè)的Word統(tǒng)計報告,實際的各種可能性情況遠比圖中展示的要更加復(fù)雜。
好了,直接開始干代碼吧!
1數(shù)據(jù)讀取
importpandas as pd
df= pd.read_csv("11月份數(shù)據(jù).csv", encoding='gbk')#當(dāng)前統(tǒng)計月份
month = 11df= df.query('月份==@month')
df.head(10)
預(yù)覽數(shù)據(jù):
2異常數(shù)據(jù)過濾
查看缺失值數(shù)量:
pd.isnull(df).sum()
結(jié)果:
區(qū)域 0
月份 0
降雨量(mm) 0
降雨距平(mm)1觀測站 0
dtype: int64
僅一個缺失值數(shù)據(jù),可直接刪除:
df.dropna(inplace=True)
3計算觀測站降雨量相對往年的變化
計算降雨量比往年高,跟往年比無變化,以及比往年低的次數(shù)分別是多少:
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
上面的結(jié)果中rainfall_high表示降雨量比往年平均水平高的次數(shù),rainfall_equal表示降雨量比往年平均水平持平的次數(shù),rainfall_low表示降雨量比往年平均水平低的次數(shù)。
于是分情況討論生成第一段的報告:
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%以內(nèi)差異認為是持平
if rainfall_high > rainfall_low*1.1:
p1+= f"大部分氣象觀測站降雨量較往年偏高。"
elif rainfall_low > rainfall_high*1.1:
p1+= f"大部分氣象觀測站降雨量較往年偏低。"
else:
p1+= f"各氣象觀測站降雨量較往年整體持平。"p1
結(jié)果:
'11月份大部分氣象觀測站降雨量較往年偏低。'
4計算各區(qū)域降雨量的極值
再生成第二段的報告:
p2 = ""t= df['降雨量(mm)']
p2+= f"各區(qū)域降雨量在{t.min()}~{t.max()}mm之間,其中{df.loc[t.argmax(), '區(qū)域']}區(qū)域的降雨量最大,為{t.max()}mm。"p2
結(jié)果:
'各區(qū)域降雨量在0.0~16.0mm之間,其中51a45區(qū)域的降雨量最大,為16.0mm。'
5分觀測站統(tǒng)計
讓我腦袋疼的地方就是從這里的代碼開始的,后面還有更復(fù)雜的需求就不公布了。
對每個觀測站分別統(tǒng)計哪些區(qū)域偏高,哪些區(qū)域持平,哪些區(qū)域偏低:
p3s =[]for station, tmp in df.groupby('觀測站'):
t= tmp['降雨量(mm)']
p3= f"各區(qū)域降雨量在{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, '區(qū)域']+'區(qū)域')
p3+= "降雨量較往年無變化外,"
if rainfall_high ==0:
p3+= f"各區(qū)域降雨量均較往年偏低"
elif rainfall_low ==0:
p3+= f"各區(qū)域降雨量均較往年偏高"t= tmp['降雨距平(mm)'].abs()
p3+= f"{t.min()}~{t.max()}mm;"
else:if rainfall_equal !=0:
p3+= '除'p3+= '、'.join(tmp.loc[rainfall_equal_mask, '區(qū)域']+'區(qū)域')
p3+= "降雨量較往年無變化,"
#10%以內(nèi)差異認為是持平
if rainfall_high > rainfall_low*1.1:if rainfall_equal ==0:
p3+= '除'p3+= '、'.join(tmp.loc[rainfall_low_mask, '區(qū)域']+'區(qū)域')
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"其余各區(qū)域降雨量較往年偏高{t.min()}~{t.max()}mm;"
elif rainfall_low > rainfall_high*1.1:if rainfall_equal ==0:
p3+= '除'p3+= '、'.join(tmp.loc[rainfall_high_mask, '區(qū)域']+'區(qū)域')
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"其余各區(qū)域降雨量較往年偏低{t.min()}~{t.max()}mm;"
else:if rainfall_equal !=0:
p3= p3[:-1]+'外,'p3+= f"各區(qū)域降雨量較往年偏高和偏低的數(shù)量持平,其中"p3+= '、'.join(tmp.loc[rainfall_low_mask, '區(qū)域']+'區(qū)域')
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, '區(qū)域']+'區(qū)域')
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
可能是我還沒有想出較好的封裝方式導(dǎo)致代碼變得這么復(fù)雜,如果有巧妙解決這個問題的朋友,希望能夠加菜J學(xué)Python交流群一起探討。
6將組織好的文本寫入到word中
Word模板文件docxtemplate.docx的內(nèi)容:
一、{{?month?}}月各氣象觀測站降雨量實況
(一)降水
{{ p1 }}
{{ p2 }}
{%p for station,p3 in p3s %}
{{ station }}:{{ p3 }}
{%p endfor %}
即:
Python渲染代碼:
from docxtpl importDocxTemplate
tpl= DocxTemplate("docxtemplate.docx")
context={'month': month,'p1': p1,'p2': p2,'p3s': p3s,
}
tpl.render(context)
tpl.save("11月降雨量報告.docx")
執(zhí)行完畢,得到Word統(tǒng)計分析報告:
總結(jié)
以上是生活随笔為你收集整理的python实现气象数据分析统计服_Python数据分析实战:降雨量统计分析报告分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 时间序列预测 币价_pyt
- 下一篇: python算法实现源码_python