Python实战:爬取世界杯冠军GDP数据,分析体育成就与经济关联

📅 2026/8/9 6:15:45
Python实战:爬取世界杯冠军GDP数据,分析体育成就与经济关联
最近在整理世界杯历史数据时发现一个有趣的现象足球的荣耀与国家的经济实力之间似乎存在着某种若隐若现的联系。四年一度的世界杯不仅是球迷的狂欢其背后也折射出各国综合国力的变迁。本文将带你一起从数据视角出发梳理历届世界杯夺冠国家的经济脉络并手把手教你如何用 Python 爬取、清洗、分析数据最终生成一份动态的“世界杯冠军国家 GDP 排行榜”。无论你是对数据分析感兴趣的开发者还是想了解如何将体育数据与经济指标结合的爱好者都能从本文中获得一套完整的实战方案。我们将从数据源选择、爬虫编写、数据处理到可视化呈现一步步拆解并提供可直接复用的代码。1. 背景与核心概念在深入代码之前我们先明确几个核心概念这有助于理解整个项目的分析逻辑。1.1 世界杯与冠军国家国际足联世界杯FIFA World Cup自1930年创办以来已举办了22届截至2022年卡塔尔世界杯。共有8个国家曾捧起过大力神杯分别是巴西5次、德国4次、意大利4次、阿根廷3次、乌拉圭2次、法国2次、英格兰1次、西班牙1次。我们的分析将围绕这些国家展开。1.2 GDP 作为经济指标国内生产总值Gross Domestic Product, GDP是衡量一个国家或地区经济规模和健康状况的核心指标。它代表了一定时期内通常是一年一个国家境内所有最终产品和服务的市场价值总和。分析冠军国家在夺冠年份及其前后几年的 GDP 变化可以观察其经济周期与足球成就之间是否存在相关性例如经济繁荣期是否更易孕育体育强队。1.3 数据分析流程本项目遵循标准的数据分析流程数据获取 - 数据清洗 - 数据整合 - 数据分析 - 数据可视化。我们将使用 Python 作为主要工具因为它拥有丰富的数据处理库如 pandas, numpy和可视化库如 matplotlib, seaborn并且网络爬虫生态成熟。2. 环境准备与版本说明在开始编码前请确保你的开发环境已就绪。本文示例基于常见的 Python 开发环境重点演示配置思路和代码逻辑你可以根据实际项目需求调整版本。2.1 操作系统Windows 10/11, macOS, 或 Linux (如 Ubuntu) 均可。2.2 Python 环境Python 版本: 3.8 或以上。推荐使用 3.9 以获得更好的稳定性和库支持。你可以通过命令行检查版本python --version # 或 python3 --version2.3 必备 Python 库我们将使用以下库请通过 pip 安装requests: 用于发送 HTTP 请求获取网页数据。pandas: 数据处理和分析的核心库。numpy: 提供高效的数值计算。matplotlib: 基础绘图库。seaborn: 基于 matplotlib 的统计图形库图表更美观。beautifulsoup4: 用于解析 HTML 和 XML 文档提取数据。lxml: 一个高效的 HTML/XML 解析器作为 BeautifulSoup 的解析引擎。安装命令如下建议在虚拟环境中操作pip install requests pandas numpy matplotlib seaborn beautifulsoup4 lxml2.4 开发工具IDE/编辑器: 推荐使用 VS Code、PyCharm 或 Jupyter Notebook。Jupyter 非常适合交互式数据分析。浏览器开发者工具: 用于检查目标网页结构是写爬虫的必备技能。2.5 项目结构建议创建一个清晰的项目文件夹例如worldcup_gdp_analysis内部结构如下worldcup_gdp_analysis/ ├── data/ # 存放原始和清洗后的数据 │ ├── raw/ │ └── processed/ ├── src/ # 源代码 │ ├── crawler.py # 爬虫脚本 │ ├── processor.py # 数据处理脚本 │ └── visualizer.py # 可视化脚本 ├── output/ # 生成的图表和报告 ├── requirements.txt # 项目依赖列表 └── README.md # 项目说明3. 核心数据获取爬虫编写数据是分析的基石。我们需要两类数据历届世界杯冠军信息和各国历年 GDP 数据。3.1 数据源选择与策略世界杯冠军数据这类数据相对固定可以从维基百科、权威体育网站如 FIFA 官网或公开的数据集获取。为了演示爬虫技术我们选择从维基百科的“FIFA World Cup”页面提取。GDP 数据世界银行World Bank的公开数据库是获取各国历年 GDP 数据的可靠来源。我们可以通过其 API 或直接下载 CSV 文件获取。重要提示在编写爬虫时务必遵守网站的robots.txt规则控制请求频率添加延时避免对目标服务器造成压力。对于生产环境应考虑使用官方 API 或购买合规数据。3.2 爬取历届世界杯冠军信息以下是一个使用requests和BeautifulSoup从维基百科页面提取冠军信息的示例脚本。# 文件路径src/crawler.py import requests from bs4 import BeautifulSoup import pandas as pd import time def fetch_world_cup_winners(): 从维基百科页面爬取历届世界杯冠军信息。 返回一个包含年份、举办国、冠军国家等信息的 DataFrame。 url https://en.wikipedia.org/wiki/FIFA_World_Cup headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 } try: print(正在请求世界杯页面...) response requests.get(url, headersheaders) response.raise_for_status() # 检查请求是否成功 soup BeautifulSoup(response.content, lxml) # 寻找包含冠军信息的表格。维基百科的表格可能有特定class需要手动检查。 # 这里我们通过查找包含“Year”、“Host”、“Champion”等表头的表格来定位。 # 注意维基百科页面结构可能变更此选择器可能需要调整。 tables soup.find_all(table, {class: wikitable}) target_table None for table in tables: if table.find(th, stringYear) or table.find(th, stringChampion): target_table table break if not target_table: print(未找到目标表格请检查页面结构或选择器。) return None # 将表格转换为 pandas DataFrame df pd.read_html(str(target_table))[0] print(成功提取世界杯数据表头, df.columns.tolist()) # 数据清洗重命名列、选择需要的列、处理缺失值 # 根据实际抓取的列名进行调整例如可能为 [Year, Hosts, Champion, Runner-up, ...] df.rename(columns{ Year: year, Hosts: host_country, Champion: champion, Runner-up: runner_up, Third place: third_place }, inplaceTrue) # 只保留我们关心的列年份和冠军 df df[[year, champion]].copy() # 清洗冠军列有时会包含额外信息如“(第5次夺冠)”需要提取纯国家名 # 示例Brazil (5th title) - Brazil df[champion] df[champion].str.split(().str[0].str.strip() # 将年份转换为整数注意处理可能存在的范围如“1934–1938”这里取开始年份 df[year] df[year].str.split(–).str[0].astype(int) print(f共获取到 {len(df)} 届世界杯冠军数据。) print(df.head()) return df except requests.RequestException as e: print(f网络请求出错: {e}) return None except Exception as e: print(f解析过程出错: {e}) return None if __name__ __main__: winners_df fetch_world_cup_winners() if winners_df is not None: # 保存到本地CSV文件 winners_df.to_csv(../data/raw/world_cup_winners.csv, indexFalse) print(数据已保存至 data/raw/world_cup_winners.csv) # 礼貌性延时 time.sleep(2)3.3 获取各国 GDP 数据通过世界银行 API世界银行提供了便捷的 API。我们将获取所有冠军国家从1960年数据较全至今的 GDP现价美元数据。# 续 src/crawler.py def fetch_gdp_data(country_codes): 通过世界银行API获取指定国家列表的GDP数据。 :param country_codes: 国家ISO三位代码列表如 [BRA, DEU, ITA, ...] :return: 包含国家、年份、GDP的DataFrame base_url http://api.worldbank.org/v2/country/{}/indicator/NY.GDP.MKTP.CD?formatjsonper_page100 all_data [] for code in country_codes: print(f正在获取国家代码 {code} 的GDP数据...) url base_url.format(code) try: response requests.get(url) response.raise_for_status() data response.json() # API返回结构第一个元素是元数据第二个元素是数据列表 if len(data) 1 and isinstance(data[1], list): for item in data[1]: # 确保数据有效 if item.get(value) is not None: all_data.append({ country_code: code, country: item[country][value], year: int(item[date]), gdp_usd: item[value] }) time.sleep(1) # 重要请求间延时避免触发API限制 except requests.RequestException as e: print(f获取 {code} 数据时出错: {e}) continue if not all_data: print(未获取到任何GDP数据。) return None gdp_df pd.DataFrame(all_data) # 按国家和年份排序 gdp_df.sort_values([country, year], inplaceTrue) print(f共获取到 {len(gdp_df)} 条GDP记录。) print(gdp_df.head()) return gdp_df # 冠军国家的ISO三位代码映射需要根据冠军名单手动维护或通过其他API匹配 champion_country_codes { Brazil: BRA, Germany: DEU, # 注意1990年前为西德(DEU)之后为统一德国。此处简化处理。 Italy: ITA, Argentina: ARG, Uruguay: URY, France: FRA, England: GBR, # 英格兰属于英国用GBR代码 Spain: ESP, } if __name__ __main__: # 先获取冠军名单 winners_df fetch_world_cup_winners() if winners_df is not None: # 提取唯一的冠军国家名 champion_names winners_df[champion].unique() # 转换为国家代码列表只处理我们已知映射的 codes_to_fetch [champion_country_codes[name] for name in champion_names if name in champion_country_codes] gdp_df fetch_gdp_data(codes_to_fetch) if gdp_df is not None: gdp_df.to_csv(../data/raw/gdp_data.csv, indexFalse) print(GDP数据已保存至 data/raw/gdp_data.csv)4. 数据处理与整合原始数据通常比较杂乱需要进行清洗、转换和合并才能用于分析。4.1 数据清洗与预处理我们将编写一个数据处理脚本主要任务包括处理缺失值如某些年份GDP数据缺失。统一国家名称确保世界杯数据和GDP数据中的国家名能对应上。转换数据类型如GDP数值转换为浮点数年份转换为整数。计算衍生指标例如夺冠当年的GDP、夺冠前后几年的GDP增长率。# 文件路径src/processor.py import pandas as pd import numpy as np def load_and_clean_data(winners_path, gdp_path): 加载并清洗原始数据。 # 加载数据 df_winners pd.read_csv(winners_path) df_gdp pd.read_csv(gdp_path) print(原始冠军数据样例) print(df_winners.head()) print(\n原始GDP数据样例) print(df_gdp.head()) # 清洗冠军数据确保国家名映射一致 # 例如GDP数据中德国是Germany而冠军数据可能是West Germany或Germany country_name_mapping { West Germany: Germany, East Germany: Germany, # 统一为德国 England: United Kingdom, # 注意GDP数据是英国整体 # 添加其他需要映射的名称 } df_winners[champion_clean] df_winners[champion].replace(country_name_mapping) # 清洗GDP数据转换GDP单位为十亿美元便于阅读并处理缺失值 df_gdp[gdp_usd_bn] df_gdp[gdp_usd] / 1e9 # 可以向前或向后填充缺失的GDP值这里简单删除缺失值较多的行 df_gdp_clean df_gdp.dropna(subset[gdp_usd_bn]).copy() return df_winners, df_gdp_clean def merge_and_calculate(winners_df, gdp_df): 合并数据并计算关键指标。 # 为每个冠军国家找到其夺冠年份的GDP merged_data [] for idx, row in winners_df.iterrows(): year row[year] country row[champion_clean] # 在GDP数据中查找该国家夺冠年份的GDP # 注意可能存在年份不完全匹配的情况如GDP数据是1960,1961... country_gdp gdp_df[gdp_df[country] country] if country_gdp.empty: # 尝试用国家代码匹配 country_gdp gdp_df[gdp_df[country_code] champion_country_codes.get(row[champion])] gdp_at_year country_gdp[country_gdp[year] year] if not gdp_at_year.empty: gdp_value gdp_at_year.iloc[0][gdp_usd_bn] else: # 如果夺冠年份没有数据尝试用最近年份的数据填充向前/向后查找 # 这里使用前一年的数据 earlier_years country_gdp[country_gdp[year] year] if not earlier_years.empty: gdp_value earlier_years.iloc[-1][gdp_usd_bn] # 取最近的小于夺冠年的年份 else: gdp_value np.nan # 计算夺冠前后几年的平均GDP增长率例如夺冠前5年和后5年 # 这里以夺冠年为基准计算前5年year-5 到 year-1和后5年year1 到 year5的GDP复合年均增长率(CAGR) growth_before np.nan growth_after np.nan # 计算前5年增长率 year_start year - 5 gdp_start country_gdp[country_gdp[year] year_start] if not gdp_start.empty and not pd.isna(gdp_value): gdp_start_val gdp_start.iloc[0][gdp_usd_bn] if gdp_start_val 0: # CAGR 公式: (End Value / Start Value)^(1/n) - 1 growth_before (gdp_value / gdp_start_val) ** (1/5) - 1 # 计算后5年增长率 year_end year 5 gdp_end country_gdp[country_gdp[year] year_end] if not gdp_end.empty and not pd.isna(gdp_value): gdp_end_val gdp_end.iloc[0][gdp_usd_bn] if gdp_value 0: growth_after (gdp_end_val / gdp_value) ** (1/5) - 1 merged_data.append({ year: year, champion_original: row[champion], champion_clean: country, gdp_at_year_usd_bn: gdp_value, gdp_growth_5y_before_pct: growth_before * 100 if not pd.isna(growth_before) else np.nan, gdp_growth_5y_after_pct: growth_after * 100 if not pd.isna(growth_after) else np.nan }) result_df pd.DataFrame(merged_data) # 按夺冠年份排序 result_df.sort_values(year, inplaceTrue) return result_df if __name__ __main__: winners_path ../data/raw/world_cup_winners.csv gdp_path ../data/raw/gdp_data.csv df_winners_clean, df_gdp_clean load_and_clean_data(winners_path, gdp_path) final_df merge_and_calculate(df_winners_clean, df_gdp_clean) print(\n处理后的最终数据) print(final_df.head(10)) # 保存处理后的数据 output_path ../data/processed/merged_worldcup_gdp.csv final_df.to_csv(output_path, indexFalse) print(f\n处理后的数据已保存至{output_path})5. 数据分析与可视化数据准备就绪后我们可以进行多维度分析并生成直观的图表。5.1 分析维度静态排名按夺冠当年的 GDP 绝对值进行排序生成“历届世界杯冠军国家GDP排行榜”。动态趋势绘制每个冠军国家夺冠年份的 GDP 值随时间变化的折线图。增长率分析比较夺冠前后国家的经济增长率观察夺冠是否处于经济上升期。冠军次数与经济总量分析夺冠次数最多的国家如巴西、德国其经济总量是否也长期领先。5.2 可视化代码示例我们将使用matplotlib和seaborn来创建图表。# 文件路径src/visualizer.py import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 设置中文字体和图表样式如果系统支持中文 plt.rcParams[font.sans-serif] [SimHei, DejaVu Sans] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 sns.set_style(whitegrid) def plot_gdp_ranking(df): 绘制历届冠军夺冠当年GDP排行榜条形图。 # 按GDP排序 df_sorted df.sort_values(gdp_at_year_usd_bn, ascendingFalse).dropna(subset[gdp_at_year_usd_bn]) plt.figure(figsize(12, 8)) bars plt.barh(df_sorted[champion_original] ( df_sorted[year].astype(str) ), df_sorted[gdp_at_year_usd_bn], colorsns.color_palette(viridis, len(df_sorted))) plt.xlabel(夺冠当年GDP (十亿美元), fontsize12) plt.title(FIFA世界杯历届冠军国家夺冠当年GDP排行榜, fontsize16, fontweightbold) plt.gca().invert_yaxis() # 让最高的在最上面 # 在条形末端添加数值标签 for bar in bars: width bar.get_width() plt.text(width (width*0.01), bar.get_y() bar.get_height()/2, f{width:.1f}B, vacenter, fontsize9) plt.tight_layout() plt.savefig(../output/gdp_ranking.png, dpi300) plt.show() print(GDP排行榜图表已生成。) def plot_gdp_trend_over_time(df, gdp_full_df): 绘制所有冠军国家GDP随时间变化的趋势线并标记夺冠年份。 :param df: 处理后的合并数据包含夺冠年份 :param gdp_full_df: 完整的GDP时间序列数据 plt.figure(figsize(15, 8)) # 获取所有冠军国家清洗后的名称 champion_countries df[champion_clean].unique() for country in champion_countries: country_gdp gdp_full_df[gdp_full_df[country] country] if not country_gdp.empty: # 绘制该国的GDP趋势线 plt.plot(country_gdp[year], country_gdp[gdp_usd_bn], labelcountry, linewidth2, alpha0.7) # 标记该国的夺冠年份 country_wins df[df[champion_clean] country] for _, win in country_wins.iterrows(): win_year win[year] # 找到夺冠年份对应的GDP值可能需从完整数据中查找 gdp_at_win country_gdp[country_gdp[year] win_year] if not gdp_at_win.empty: gdp_val gdp_at_win.iloc[0][gdp_usd_bn] plt.scatter(win_year, gdp_val, s100, zorder5, edgecolorsblack) # 添加标注 plt.annotate(f{win_year}, xy(win_year, gdp_val), xytext(5, 5), textcoordsoffset points, fontsize9, fontweightbold) plt.xlabel(年份, fontsize12) plt.ylabel(GDP (十亿美元), fontsize12) plt.title(冠军国家GDP历史趋势及夺冠年份标记, fontsize16, fontweightbold) plt.legend(title国家, bbox_to_anchor(1.05, 1), locupper left) plt.yscale(log) # 使用对数刻度因为GDP跨度很大 plt.grid(True, whichboth, linestyle--, linewidth0.5, alpha0.7) plt.tight_layout() plt.savefig(../output/gdp_trend_with_wins.png, dpi300, bbox_inchestight) plt.show() print(GDP趋势图已生成。) def plot_growth_comparison(df): 绘制夺冠前后5年GDP平均增长率的对比散点图或箱线图。 # 过滤掉增长率缺失的数据 growth_df df.dropna(subset[gdp_growth_5y_before_pct, gdp_growth_5y_after_pct]).copy() fig, axes plt.subplots(1, 2, figsize(14, 6)) # 子图1夺冠前后增长率散点图 ax1 axes[0] colors sns.color_palette(husl, len(growth_df)) for i, (idx, row) in enumerate(growth_df.iterrows()): ax1.scatter(row[gdp_growth_5y_before_pct], row[gdp_growth_5y_after_pct], colorcolors[i], s100, alpha0.8, labelf{row[champion_original]} ({row[year]})) ax1.axhline(y0, colorgrey, linestyle--, linewidth0.8) ax1.axvline(x0, colorgrey, linestyle--, linewidth0.8) ax1.set_xlabel(夺冠前5年平均年增长率 (%), fontsize11) ax1.set_ylabel(夺冠后5年平均年增长率 (%), fontsize11) ax1.set_title(夺冠前后经济增长率对比, fontsize14, fontweightbold) ax1.legend(bbox_to_anchor(1.05, 1), locupper left, fontsizesmall) ax1.grid(True, alpha0.3) # 子图2夺冠前后增长率分布箱线图 ax2 axes[1] # 准备数据 before_growth growth_df[gdp_growth_5y_before_pct] after_growth growth_df[gdp_growth_5y_after_pct] growth_data [before_growth, after_growth] box ax2.boxplot(growth_data, labels[夺冠前5年, 夺冠后5年], patch_artistTrue) # 设置箱体颜色 colors_box [lightblue, lightgreen] for patch, color in zip(box[boxes], colors_box): patch.set_facecolor(color) ax2.set_ylabel(GDP平均年增长率 (%), fontsize11) ax2.set_title(夺冠前后经济增长率分布, fontsize14, fontweightbold) ax2.grid(True, alpha0.3) plt.tight_layout() plt.savefig(../output/growth_comparison.png, dpi300) plt.show() print(增长率对比图已生成。) if __name__ __main__: # 加载处理好的数据 merged_data_path ../data/processed/merged_worldcup_gdp.csv gdp_full_path ../data/raw/gdp_data.csv # 用于趋势图的完整数据 df_merged pd.read_csv(merged_data_path) df_gdp_full pd.read_csv(gdp_full_path) # 转换GDP单位 df_gdp_full[gdp_usd_bn] df_gdp_full[gdp_usd] / 1e9 # 生成图表 plot_gdp_ranking(df_merged) plot_gdp_trend_over_time(df_merged, df_gdp_full) plot_growth_comparison(df_merged)6. 常见问题与排查思路在实践过程中你可能会遇到以下问题问题现象常见原因解决思路运行爬虫脚本时连接超时或拒绝1. 网络问题。2. 目标网站屏蔽或限制频率。3. 请求头User-Agent被识别为爬虫。1. 检查网络连接。2. 在请求间添加time.sleep()延时如2-5秒。3. 使用更真实的User-Agent头或使用requests.Session()。从维基百科提取的表格结构不对网页HTML结构已更新原来的class或表格定位方式失效。1. 使用浏览器开发者工具重新检查目标表格的HTML结构。2. 尝试用更通用的选择器如soup.find(table, {class: wikitable sortable})。3. 考虑使用pandas的read_html直接尝试所有表格pd.read_html(url)然后人工筛选。世界银行API返回空数据或错误1. 国家代码不正确。2. 指标代码NY.GDP.MKTP.CD可能已变更。3. API 调用频率过高。1. 核对国家ISO代码可在世界银行网站查询。2. 查阅世界银行数据目录确认最新的GDP指标代码。3. 确保代码中已添加延时或考虑下载整份数据集世界银行提供CSV下载。合并数据时冠军国家名与GDP数据中国家名不匹配名称不一致如“Germany” vs “Federal Republic of Germany”。建立手动映射字典在数据清洗阶段进行统一替换如country_name_mapping。图表中文显示为方框系统缺少中文字体或 matplotlib 未正确配置中文字体。1. 安装中文字体如 SimHei。2. 在代码开头使用plt.rcParams指定支持中文的字体。3. 或者将图表标签改为英文。GDP增长率计算出现异常值如极大或极小1. 数据缺失导致计算基数错误。2. 某些年份GDP为负或零经济危机。1. 在计算前过滤掉无效数据gdp_value 0。2. 使用try...except捕获计算错误或使用np.log计算对数增长率前检查正值。pandas读取 CSV 文件报编码错误CSV文件保存的编码与读取时指定的编码不一致。指定encoding参数如pd.read_csv(file.csv, encodingutf-8)或encodinggbk。7. 最佳实践与工程建议将数据分析项目工程化能提高代码的可复用性、可维护性和协作效率。7.1 项目结构与代码组织模块化如示例所示将爬虫、数据处理、可视化分离成独立脚本crawler.py,processor.py,visualizer.py。主程序通过调用这些模块的函数来执行流程。配置文件将国家代码映射、API端点、文件路径等配置信息提取到单独的配置文件如config.yaml或config.py中避免硬编码。日志记录使用 Python 的logging模块替代print语句可以方便地控制日志级别、输出到文件便于后期排查问题。错误处理对网络请求、文件IO、数据计算等可能失败的操作进行充分的异常捕获try...except并给出有意义的错误提示。7.2 数据获取与存储数据缓存对于世界银行API这类相对稳定的数据首次获取后应保存到本地。下次运行时先检查本地是否有缓存文件避免重复请求既节省时间又尊重数据源。增量更新如果项目需要持续更新例如每年世界杯后设计增量更新逻辑只获取新的年份数据并与历史数据合并。数据版本控制对于原始数据和处理后的数据可以考虑使用dvc(Data Version Control) 或简单的文件夹日期戳进行版本管理。7.3 数据分析与可视化可复现性确保整个分析流程从原始数据到最终图表可以通过运行一个主脚本如main.py完整复现。使用requirements.txt或environment.yml固定依赖版本。参数化将图表样式、颜色主题、输出路径等设置为可调整的参数方便快速生成不同风格的报告。交互式探索对于深入的数据探索推荐使用Jupyter Notebook或Jupyter Lab。它们非常适合交互式编程和数据可视化可以将分析过程、代码和结果图表、表格整合在一个文档中。7.4 生产环境考量数据源可靠性对于关键项目应评估数据源的稳定性和授权情况。世界银行数据是公开且稳定的但维基百科页面结构可能变化需要考虑备用数据源或更健壮的解析逻辑。自动化与调度如果分析需要定期运行如每月更新可以使用cron(Linux) 或Task Scheduler(Windows) 来调度 Python 脚本或使用Apache Airflow等更专业的任务调度框架。结果发布生成的图表和分析结果可以自动集成到报告如使用Jupyter Notebook转HTML/PDF或仪表板如使用Plotly Dash或Streamlit构建一个简单的Web应用中便于分享和展示。通过以上步骤我们不仅完成了一次从数据获取到可视化的完整分析更构建了一个结构清晰、可扩展的数据分析项目原型。你可以在此基础上进一步探索更多维度例如加入人口数据计算人均GDP或者分析亚军、季军国家的经济表现进行对比。