Python基于CSV生成2004-2021年Uf=MG数据及汇总值图表
2004-2021年MG州CFEM数据统计图表实现
先修正你原有代码的语法问题,再补充筛选、聚合、绘图逻辑:
- 原代码存在缩进错误:
le_df函数被错误嵌套在写文件的with块内,且函数内部未初始化df列表 - 原代码缺少类型转换逻辑:年份、金额字段读取后为字符串格式,无法直接做数值统计
- 按需求补充筛选规则:仅保留
Uf字段值为MG、年份在2004-2021区间的记录 - 统计维度覆盖两类值:按年统计单年采集数值,同时计算逐年累计汇总值,用双轴图同时展示两类数据趋势
完整可运行代码
先安装依赖库:pip install pandas matplotlib
import requests import pandas as pd import matplotlib.pyplot as plt # 配置绘图中文显示,避免文字乱码 plt.rcParams['font.sans-serif'] = ['SimHei', 'WenQuanYi Micro Hei'] plt.rcParams['axes.unicode_minus'] = False # 下载原始数据集 URL = 'https://app.dnpm.gov.br/DadosAbertos/ARRECADACAO/Cfem.csv' r = requests.get(URL, allow_redirects=True) file_name = URL.split('/')[-1] with open(file_name, 'wb') as f: f.write(r.content) # 读取并清洗数据,自动处理分号分隔、逗号小数、点号千分位格式 df = pd.read_csv( file_name, sep=';', encoding='ISO-8859-1', decimal=',', thousands='.' ) # 筛选符合条件的记录:MG州、2004-2021年 df_mg = df[ (df['Uf'] == 'MG') & (df['Ano'] >= 2004) & (df['Ano'] <= 2021) ].copy() # 按年份聚合计算单年统计值 yearly_stat = df_mg.groupby('Ano')['ValorRecolhido'].sum().reset_index() # 计算逐年累计汇总值 yearly_stat['累计汇总值'] = yearly_stat['ValorRecolhido'].cumsum() # 绘制统计图表 fig, ax1 = plt.subplots(figsize=(12, 6)) # 左轴绘制年度单值:柱状图 ax1.bar( x=yearly_stat['Ano'], height=yearly_stat['ValorRecolhido'], color='#2E86AB', label='年度CFEM采集值' ) ax1.set_xlabel('年份') ax1.set_ylabel('年度采集值(雷亚尔)', color='#2E86AB') ax1.tick_params(axis='y', labelcolor='#2E86AB') ax1.set_xticks(range(2004, 2022, 1)) # 右轴绘制累计汇总值:折线图 ax2 = ax1.twinx() ax2.plot( yearly_stat['Ano'], yearly_stat['累计汇总值'], color='#A23B72', marker='o', linewidth=2, label='累计汇总值' ) ax2.set_ylabel('累计汇总值(雷亚尔)', color='#A23B72') ax2.tick_params(axis='y', labelcolor='#A23B72') # 合并双轴图例 lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left') plt.title('2004-2021年米纳斯吉拉斯州(MG)CFEM采集值统计') plt.tight_layout() # 保存高清图表到本地,同时弹出预览窗口 plt.savefig('mg_cfem_stat.png', dpi=300) plt.show()
补充说明
- 用pandas原生读取方法处理CSV格式,比手动逐行拆分更稳定,能自动规避特殊字符、数字格式解析错误
- 双轴布局可以同时清晰展示单年数值的波动、累计值的增长趋势,不会因为两类数值量级差异导致某类数据被压缩
- 如果不想依赖pandas,也可以基于你原有列表读取逻辑改造:遍历每行时先判断
Uf对应索引位的值是否为MG,再把年份字段转成整数判断是否在2004-2021区间,最后用字典按年份累加数值即可,只是手动写聚合逻辑代码量会稍大。
内容的提问来源于stack exchange,提问作者fph
相关产品推荐
相关产品推荐

