当前位置: 首页 > article >正文

【数据可视化实战】从API到图表:一步步构建奥运奖牌榜与运动员数据分析平台

1. 数据获取从API到结构化数据做数据分析的第一步永远是获取数据。这次我们选择奥运奖牌榜和运动员数据作为案例主要是因为这类数据公开透明且结构清晰非常适合新手练手。我实测下来咪咕视频的奥运数据接口非常稳定返回的JSON格式也很规范。先来看看奖牌榜数据的获取方法。直接用Python的requests库就能搞定import requests rank_url https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609 data requests.get(rank_url).json()这里有个小技巧获取数据后建议立即保存原始JSON文件。我在项目里吃过亏有一次分析到一半API突然调整了数据结构导致后续代码全部报错。建议加上时间戳保存import json import time with open(fmedal_data_{int(time.time())}.json, w) as f: json.dump(data, f)运动员数据稍微复杂些需要从奥委会官网抓取。这里要注意两个细节一是国家简称和中文名称的映射关系二是运动项目的多语言转换。我整理好的代码如下# 获取国家简称映射 noc_url https://olympics.com/tokyo-2020/olympic-games/zh/results/all-sports/nocs-list.htm r requests.get(noc_url) patterns re.compile(r/li.*?country(?P简称.*?).*?div classmx-auto font-weight-bold(?P中文名称.*?)/div) noc_dict {k: v for k, v in patterns.findall(r.text)}2. 数据清洗Pandas实战技巧原始数据往往存在各种问题缺失值、格式不一致、冗余字段等。我常用的清洗流程是查看→处理→验证三步走。首先用Pandas快速查看数据概况import pandas as pd df pd.DataFrame(data[body][allMedalData]) print(df.info()) print(df.describe())奖牌数据常见的清洗需求包括处理空值比如某些国家没有银牌统一国家名称格式转换数字类型这是我优化后的清洗代码medal_df pd.DataFrame([{ 排名: item[rank], 国家: item[countryName].strip(), 金牌: int(item[goldMedalNum] or 0), 银牌: int(item[silverMedalNum] or 0), 铜牌: int(item[bronzeMedalNum] or 0), 总数: int(item[totalMedalNum]) } for item in data[body][allMedalData]])运动员数据清洗更复杂些。遇到过的一个坑是某些运动员参加了多个项目原始数据会用逗号分隔。这时候需要先做拆分athletes_df[项目] athletes_df[项目].str.split(,) athletes_df athletes_df.explode(项目)3. 数据分析挖掘有趣洞察清洗好的数据就像待雕琢的玉石需要合适的工具来展现价值。Pandas的聚合功能是我的首选武器。先看基础的奖牌分析# 按大洲分析 continent_map {中国:亚洲, 美国:美洲, ...} # 需要预先定义 medal_df[大洲] medal_df[国家].map(continent_map) continent_stats medal_df.groupby(大洲).agg({ 金牌:sum, 银牌:sum, 铜牌:sum })更高级的分析可以计算奖牌效率奖牌数/参赛人数# 合并两个数据集 analysis_df pd.merge( medal_df, athletes_df.groupby(国家).size().rename(参赛人数), left_on国家, right_indexTrue ) analysis_df[奖牌效率] analysis_df[总数] / analysis_df[参赛人数]4. 可视化呈现从静态到交互数据可视化是分析结果的最终呈现。我推荐Plotly和Pyecharts这两个库它们生成的图表既美观又交互性强。4.1 基础奖牌榜表格用Plotly创建带颜色渐变的表格import plotly.graph_objects as go fig go.Figure(data[go.Table( headerdict(valueslist(medal_df.columns)), cellsdict( valuesmedal_df.values.T, fill_color[rgb(245,245,245), rgb(220,220,220)] ) )]) fig.update_layout(title奥运奖牌榜) fig.show()4.2 交互式旭日图展示各国参赛项目分布Pyecharts的旭日图非常合适from pyecharts import options as opts from pyecharts.charts import Sunburst data [] for country, group in athletes_df.groupby(国家): children [] for sport, sub_group in group.groupby(项目): children.append({name: sport, value: len(sub_group)}) data.append({name: country, children: children}) sunburst ( Sunburst() .add(参赛情况, data, radius[0, 90%]) .set_global_opts(title_optsopts.TitleOpts(title参赛项目分布)) ) sunburst.render_notebook()4.3 动态地图展示地理数据一定要用地图展示。Pyecharts的世界地图配置from pyecharts.charts import Map world_map ( Map() .add(金牌数, list(zip(medal_df[国家], medal_df[金牌])), world) .set_series_opts(label_optsopts.LabelOpts(is_showFalse)) .set_global_opts( title_optsopts.TitleOpts(title金牌分布图), visualmap_optsopts.VisualMapOpts(max_50) ) )5. 项目优化与部署完成分析后可以考虑将项目产品化。我用Flask搭建过一个简单的数据看板from flask import Flask, render_template app Flask(__name__) app.route(/) def dashboard(): return render_template(dashboard.html, medal_tablemedal_df.to_html(), sunburstsunburst.render_embed()) if __name__ __main__: app.run()部署时遇到的典型问题包括数据更新机制定时爬取还是手动触发性能优化大数据量下的渲染速度移动端适配我的解决方案是使用APScheduler设置定时任务对静态数据预渲染HTML使用Bootstrap做响应式布局6. 避坑指南在完成这个项目的过程中我踩过不少坑这里分享几个关键经验数据缓存很重要频繁请求API可能导致IP被封建议设置合理的请求间隔或者使用本地缓存。我通常会在代码中加入这样的逻辑from pathlib import Path cache_file Path(medal_data.json) if cache_file.exists(): with open(cache_file) as f: data json.load(f) else: data requests.get(rank_url).json() with open(cache_file, w) as f: json.dump(data, f)异常处理不能少网络请求、数据解析都可能出错。完善的异常处理能让程序更健壮try: response requests.get(url, timeout10) response.raise_for_status() data response.json() except requests.exceptions.RequestException as e: print(f请求失败: {e}) # 这里可以加入重试逻辑可视化配色有讲究颜色使用不当会导致图表难以阅读。建议使用渐变色表示数值大小重要数据用对比色突出避免使用色盲人士难以区分的颜色组合性能优化技巧当处理大量数据时Pandas操作可能会变慢。几个提速方法尽量使用向量化操作而非循环对于大型DataFrame考虑使用Dask替代Pandas可视化时可以先采样再展示完整数据最后提醒一点所有体育数据都可能存在后续修正。在我的项目中就遇到过奖牌数调整的情况所以关键分析结果最好注明数据获取时间。

相关文章:

【数据可视化实战】从API到图表:一步步构建奥运奖牌榜与运动员数据分析平台

1. 数据获取:从API到结构化数据 做数据分析的第一步永远是获取数据。这次我们选择奥运奖牌榜和运动员数据作为案例,主要是因为这类数据公开透明且结构清晰,非常适合新手练手。我实测下来,咪咕视频的奥运数据接口非常稳定&#xf…...

MeteorSeed赐

这个代码的核心功能是:基于输入词的长度动态选择反义词示例,并调用大模型生成反义词,体现了 “动态少样本提示(Dynamic Few-Shot Prompting)” 与 “上下文长度感知的示例选择” 的能力。 from langchain.prompts imp…...

Cuvil加速AI推理:从零部署到GPU推理优化的7个关键配置步骤

第一章:Cuvil加速AI推理:从零部署到GPU推理优化的7个关键配置步骤Cuvil 是一个轻量级、高性能的 AI 推理加速框架,专为边缘与云侧异构 GPU 环境设计。它通过统一的 IR 层抽象模型计算图,并在运行时自动调度 CUDA、TensorRT 和 cuB…...

CrewAI 任务优先级排序:智能体团队处理多任务的调度算法

CrewAI 任务优先级排序:智能体团队处理多任务的调度算法 一、引言 (Introduction) 1.1 钩子 (The Hook) 你有没有遇到过这样的场景?用 CrewAI 搭了一支由文案生成Agent、竞品调研Agent、代码审查Agent组成的“创业小团队”,为下季度的产品发布会赶进度: 市场经理(临时设…...

记录复现多模态大模型论文OPERA的一周工作()投

pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...

OpenClaw 太难装了?试试 LangTARS:一行命令部署 + WebUI 管理面板,还能接入 Dify/Coze/nn??促

1. 什么是 Apache SeaTunnel? Apache SeaTunnel 是一个非常易于使用、高性能、支持实时流式和离线批处理的海量数据集成平台。它的目标是解决常见的数据集成问题,如数据源多样性、同步场景复杂性以及资源消耗高的问题。 核心特性 丰富的数据源支持&#…...

云端炼丹新思路:在趋动云Linux环境无缝运行秋葉aaaki的SD整合包

1. 为什么要在云端运行Stable Diffusion整合包 最近两年AI绘画工具爆发式增长,其中Stable Diffusion凭借开源免费、效果出众等优势成为最受欢迎的选项之一。B站知名UP主秋葉aaaki制作的整合包更是让普通用户也能轻松上手,解压即用。但现实情况是&#xf…...

养殖场环境控制系统:远程控制,足不出户管全场

一、应用背景 当前我国畜禽养殖正从传统散户养殖向规模化、集约化转型,而环境因素(温湿度、有害气体、光照等)是影响畜禽生长发育、繁殖效率、疫病防控的核心要素。据行业数据显示,2023年全球智慧农业市场规模达2200亿美元,畜牧养殖环境监控系…...

STM32F429外设时钟分配详解:为什么你的定时器速度总是不对?

STM32F429定时器时钟配置实战:破解速度偏差的底层逻辑 第一次在项目中遇到定时器速度异常时,我盯着示波器上飘忽不定的PWM波形百思不得其解——明明代码里的分频系数计算无误,为什么实际输出频率总是偏离预期?这个困扰无数STM32开…...

【.NET 9 容器化配置终极指南】:90%开发者忽略的5个生产级配置陷阱与自动修复方案

第一章:.NET 9 容器化配置的核心演进与生产就绪定义.NET 9 将容器化支持从“可运行”推向“生产就绪”,其核心演进体现在配置生命周期管理、启动时验证机制和原生容器镜像优化三大维度。与早期版本依赖外部脚本或手动环境适配不同,.NET 9 内置…...

Postgres - Listen/Notify构建轻量级发布订阅系统

概述原先设计一个内部系统的消息模块和缓存模块时,只有一个Postgres依赖。想着没多大用户量,没必要额外安装Redis,徒增运维工夫。缓存好解决,配个UNLOGGED表即可。吭吭哧哧琢磨怎么用数据表实现消息的时候,发现Postgre…...

【车辆控制】基于matlab电动车静态PID与动态自适应巡航控制策略分析【含Matlab源码 15302期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…...

Aurix Tricore开发避坑指南:从零理解Trap机制,手把手教你写异常处理程序

Aurix Tricore开发实战:Trap机制深度解析与异常处理程序编写指南 引言 在嵌入式系统开发中,异常处理往往是区分新手与资深工程师的关键能力。Aurix Tricore系列微控制器凭借其强大的实时性能和安全性,广泛应用于汽车电子、工业控制等领域。然…...

为什么你的.NET 9边缘服务在Raspberry Pi 5上启动慢400ms?——基于JIT预编译+LLVM IR优化的3层根因定位法

第一章:为什么你的.NET 9边缘服务在Raspberry Pi 5上启动慢400ms?——基于JIT预编译LLVM IR优化的3层根因定位法在 Raspberry Pi 5(Broadcom BCM2712,4Cortex-A76 2.4GHz,LPDDR4X-4267)上运行 .NET 9 自托…...

ECDH密钥交换:椭圆曲线加密在安全通信中的核心作用

1. 为什么我们需要ECDH密钥交换? 想象一下,你和朋友需要在咖啡馆的公共WiFi上传输一份机密文件。这个网络可能被黑客监听,就像在嘈杂的餐厅里大声报出银行卡密码。传统的加密方法相当于你们提前约定好"第三个单词倒着念"这样的规则…...

SolidWorks新手必看:7个实用技巧让你快速上手3D建模

SolidWorks新手必看:7个实用技巧让你快速上手3D建模 刚接触SolidWorks时,面对复杂的界面和众多功能按钮,很多初学者会感到无从下手。作为一款广泛应用于机械设计、工业制造等领域的3D建模软件,SolidWorks的学习曲线并不平缓。但掌…...

基于模型参考自适应系统的改进滑模观测器:反电势优化方法及其仿真模型

基于模型参考自适应系统的改进滑模观测器 1.采用基于模型参考自适应系统的反电势优化方法,对SMO中低通滤波后的反电势进一步优化,从而减小抖振,提高转速和位置估计精度; 2.提供算法对应的参考文献和仿真模型。滑膜观测器这玩意儿在…...

[R3nzSkin]无限视距技术解析:突破MOBA视野限制的实现与应用

[R3nzSkin]无限视距技术解析:突破MOBA视野限制的实现与应用 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3n/R3nzSkin 一、视野革新:重新定义MOBA竞技格局 重构战场感知维度…...

5步掌握抖音无水印下载终极指南:从零到批量处理高效方案

5步掌握抖音无水印下载终极指南:从零到批量处理高效方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback sup…...

微信小程序与H5深度交互:实现扫码功能的无缝传递与数据回传

1. 微信小程序与H5交互的核心技术解析 微信小程序与H5页面的交互一直是移动开发中的热门话题。在实际项目中,我们经常需要在小程序内嵌H5页面,同时又要调用小程序原生功能。这种混合开发模式既能利用H5的跨平台特性,又能享受小程序的原生能力…...

Go语言全栈开发从入门到精通:微服务架构与云原生实战指南

Go语言全栈开发从入门到精通:微服务架构与云原生实战指南 这不是一篇停留在 Demo 层面的 Go 教程,而是一篇面向真实业务系统的工程化实践文章。我们将围绕“高并发订单中心”这个典型场景,从语言特性、架构演进、分布式通信、数据一致性、可观测性、Kubernetes 部署到生产问…...

微信小程序表格实战:我是如何用原生组件解决数据展示和‘文本无法选中’这个坑的

微信小程序表格实战:原生组件解决数据展示与文本选中难题 第一次在小程序里实现表格功能时,我遇到了一个看似简单却让人头疼的问题——用户无法选中单元格里的文本进行复制。这个在Web开发中根本不是问题的问题,在小程序里却成了影响用户体验…...

IAR堆栈优化实战:如何精准配置与监控嵌入式内存布局

1. 嵌入式开发中的内存管理痛点 刚入行嵌入式开发那会儿,我最怕遇到系统莫名其妙崩溃的情况。有一次做智能家居控制器项目,设备运行几天后就会死机,排查了一周才发现是线程栈溢出导致的。这种内存问题就像定时炸弹,可能在任何时候…...

Vue3 + marked + highlight.js 打造实时Markdown编辑器(附完整代码)

Vue3 marked highlight.js 打造企业级Markdown编辑器实战指南 在当今内容创作和技术文档编写的场景中,Markdown已经成为开发者首选的轻量级标记语言。本文将带你从零开始,在Vue3项目中构建一个功能完善、性能优异的实时Markdown编辑器,集成…...

深入解析.ko驱动模块加载报错:unknown symbol问题排查与依赖管理

1. 遇到unknown symbol报错时的心态调整 第一次看到"unknown symbol in module"这个报错时,我正熬夜调试一个摄像头驱动。当时整个人都是懵的——明明编译通过了,为什么加载时会说找不到符号?后来才发现,这是Linux内核驱…...

5分钟搞定OpenClaw安装:千问3.5-9B本地部署指南

5分钟搞定OpenClaw安装:千问3.5-9B本地部署指南 1. 为什么选择OpenClaw千问3.5-9B组合 上周我在整理历年技术笔记时,被上千个零散的Markdown文件折磨得够呛。直到尝试用OpenClaw千问3.5-9B搭建本地自动化助手,才真正体会到"AI提效&quo…...

告别混乱移植:LVGL v8.3输入设备(indev)驱动模块化配置实战(STM32+Touchpad/Keypad)

LVGL v8.3输入设备驱动模块化设计:从混沌到优雅的STM32工程实践 在嵌入式GUI开发中,LVGL的输入设备驱动移植往往是项目进度中最令人头疼的环节之一。当你的工程需要同时支持触摸屏、物理按键和旋转编码器时,传统的移植方式会让lv_port_indev.…...

系统自动启动管理,文件粉碎、软件卸载、WIFI密码查看、硬盘测速、系统优化等

有人言,改变世界需要惊天动地的创举。但仍有人坚信“蝴蝶效应”的浪漫:微小的振翅,亦可能掀起巨澜。当每一个产品都选择做正确而非容易的事,当每一次迭代都坚守初心而非盲从潮流,科技便会慢慢褪去繁复与喧嚣&#xff0…...

OpenAI结构化输出(Structured Outputs)进阶实战:从JSON Schema到企业级应用架构

1. 结构化输出的企业级价值与应用场景 在复杂的企业环境中,数据格式的标准化程度直接影响系统间的协作效率。想象一下财务部门需要从销售报告中提取关键指标,如果每个系统的输出格式都不一样,光是数据清洗就要耗费大量时间。这就是为什么Open…...

Span<T>引发的StackOverflowException?揭秘.NET Runtime 7.0中未公开的栈帧校验机制与安全边界(仅限高级开发者)

第一章&#xff1a;Span<T>引发的StackOverflowException现象复现与初步诊断在 .NET Core 3.0 及更高版本中&#xff0c;Span<T> 因其栈上分配特性和零拷贝语义被广泛用于高性能场景。然而&#xff0c;不当的递归使用或跨栈帧传递可能触发 StackOverflowException—…...