Pythonデータ分析戦闘:降雨統計分析レポート分析

この記事のテキストと写真はインターネットからのものであり、学習とコミュニケーションのみを目的としています。商用目的ではありません。ご不明な点がございましたら、お問い合わせください。

次の記事は、著者XiaoXiaomingのCaiJ LearnPythonからのものです。

最近、ちょっとしたブレインバーンの必要性に遭遇しましたが、実際には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

直接削除できる欠落値データは1つだけです。

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

上記の結果で、rainlow_highは、降雨量が前年の平均レベルよりも高い回数を表し、raindown_equalは、降雨量が前年の平均レベルと等しい回数を表し、raindown_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各地域の降雨量の極値を計算する

次に、レポートの2番目の段落を生成します。

p2 = ""
t = df ['
rainfall(mm)'] p2 + = f "各エリアの降雨量は{t.min()}〜{t.max()} mmの間です。ここで、{df.loc [t.argmax()、 'area']}エリアの降雨量が最大の{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

このc#チュートリアルでは、より良いパッケージ方法が思いつかなかったためにコードが複雑になった可能性があります。この問題を巧みに解決できる友人がいる場合は、J LearnPython交換グループに参加して話し合いたいと思います。

6整理されたテキストを単語に書く

Wordテンプレートファイルdocxtemplate.docxの内容:

1. { {月}}その月の各気象観測所の実際の降雨量
(1)降水量
{ {p1}}
{ {p2}}
{%pは駅、p3はp3s%}
{ {駅}}:{ {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データ分析の戦闘:降雨統計vb.netチュートリアル
分析レポート分析

おすすめ

転載: blog.csdn.net/chinaherolts2008/article/details/112912561