You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:31:11