<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          干貨|利用Python自動根據(jù)數(shù)據(jù)生成降雨量統(tǒng)計分析報告

          共 1124字,需瀏覽 3分鐘

           ·

          2021-01-17 15:20

          作者:小小明

          簡介:Pandas數(shù)據(jù)處理專家,10余年編碼經(jīng)驗,至今已幫助過成千上萬名數(shù)據(jù)從業(yè)者解決工作實際遇到的問題,其中數(shù)據(jù)處理和辦公自動化問題涉及的行業(yè)包括會計、HR、氣象、金融等等,現(xiàn)為菜J學(xué)Python核心技術(shù)團隊成員之一。


          點擊上方“IT共享之家”,進行關(guān)注

          回復(fù)“資料”可獲贈Python學(xué)習(xí)福利

          新妝宜面下朱樓,深鎖春光一院愁。
          大家好,我是J哥。
          最近遇到一個有點燒腦的需求,其實也不算燒腦,主要是判斷條件過多,對于我這種記憶力差,內(nèi)存小的人來說容易出現(xiàn)內(nèi)存溢出導(dǎo)致大腦宕機。也可能是因為我還沒有找到能減小大腦內(nèi)存壓力的寫法。若讀者有更好的解決方案,歡迎在本文文末進行留言噢!
          后臺回復(fù)「降雨」二字,可領(lǐng)取本文所用數(shù)據(jù)集和Word模板,便于大家用Python測試。
          先看看需求吧:
          主要就是要根據(jù)左側(cè)的表格自動生成右側(cè)的Word統(tǒng)計報告,實際的各種可能性情況遠(yuǎn)比圖中展示的要更加復(fù)雜。
          好了,直接開始干代碼吧!


          1
          數(shù)據(jù)讀取

          import?pandas?as?pd

          df?=?pd.read_csv("11月份數(shù)據(jù).csv",?encoding='gbk')
          #?當(dāng)前統(tǒng)計月份
          month?=?11
          df?=?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)`?).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)差異認(rèn)為是持平
          ????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)`?)

          ????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)差異認(rèn)為是持平
          ????????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?import?DocxTemplate

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

          執(zhí)行完畢,得到Word統(tǒng)計分析報告:


          看完本文有收獲?請轉(zhuǎn)發(fā)分享給更多的人

          IT共享之家

          入群請在微信后臺回復(fù)【入群】

          -------------------?End?-------------------

          往期精彩文章推薦:

          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本黄色免费电影 | 国产一区二区三区免费看 | 亚洲福利一区二区三区 | 婷婷丁香无码 | 久久亚洲精品影院 |