news 2026/5/16 1:23:04

通过网络可视化展示健美史

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
通过网络可视化展示健美史

原文:towardsdatascience.com/the-history-of-bodybuilding-through-network-visualization-2527f81c1f01

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/bd146591ffce8b7b7ca859a76f5d9738.png

所有图像和代码均由作者创建,除非另有说明来源。

我对举重已经热情了大约十年,所以是时候用数据驱动的方法来描绘这项运动最伟大的传奇人物,特别是由阿诺德·施瓦辛格象征化的竞技健美了。因此,在这里,我首先收集了每个欧普利亚先生比赛前三名的数据,并创建了获胜者的共享领奖台网络。这个网络后来在 Gephi 中可视化,应该会突出显示这个运动的不同时代及其关键人物。

此外,本文旨在说明如何使用数据科学和网络可视化来描绘任何社会生态系统中隐藏的联系,无论其规模大小,来自体育界还是艺术界,具有微小的或巨大的商业价值。

1. 数据准备

1.1. 收集数据

我通常从数据收集开始,比如编写爬虫或调用 API。然而,对于这次练习,一个极其简单的解决方案效果最好——选择正确的Wikipedia 网站(也感谢 Wiki 的开放使用许可),向下滚动查看前三名位置表,如下所示,并将其复制粘贴到名为olimpia.xlsx的 Excel 电子表格中。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ccaaad01abd357ed3c3f310ec3fe114f.png

欧普利亚先生前三名的最初几年。来源:en.wikipedia.org/wiki/Mr._Olympia

1.2. 解析和清理数据

现在让我们转到 Python 终端,解析、清理并显示电子表格作为 Pandas DataFrame:

importpandasaspd# parsing the data framedf=pd.read_excel('olimpia.xlsx')# getting ride of some data cleaning issues resulted from the manual copy-pastingdf=df.apply(lambdax:x.str.strip()ifx.dtype=="object"elsex)# getting some stats:print('The start of the data set:',min(df.year))print('The end of the data set:',max(df.year))# taking a quick look:df.head(3)

输出:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/107e42db2fd99a2aa4d328729e5ab272.png

现在让我们创建一个所有曾进入前三名的所有人的列表:

athletes=pd.unique(df.drop(columns=['year']).values.ravel())len(set(athletes))athletes[0:15]

输出:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/984cd1dc9f95843b4c169f4e91207f1d.png

这里可能会注意到,关于数据清理还有一些工作要做,因为在某些年份,同一位置由两个人并列获得——例如 1976 年的第三名,迈克·卡特和弗兰克·赞恩。

因此,我现在创建了一个新的、清理过的运动员列表,通过将并列情况拆分到列表中,去除 nan 值,并将所有人打包到名为 athletes_clean 的新列表中:

athletes_clean=[]forathleteinathletes:iftype(athlete)isstr:athletes_clean+=[a.strip().rstrip()forainathlete.replace('xa0',' ').split('&')]athletes_clean=list(set(athletes_clean))print(len(athletes_clean))

这个过程将导致一个包含 56 名运动员的列表。

1.3. 概述统计

因此,我现在创建了一个新的、清理过的运动员列表,通过将并列情况拆分到列表中,去除 nan 值,并将所有人打包到名为 athletes_clean 的新列表中:

athlete_cnt={athlete:df.applymap(lambdax:athleteinstr(x)).sum().sum()forathleteinathletes_clean}pd.DataFrame(athlete_cnt.items(),columns=['Name','Number_of_Times']).sort_values(by='Number_of_Times',ascending=False).head(10)

此代码块的输出显示了所有时间排名前 10 的知名运动员:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/34f742663ee3f46ae7534098355ccb32.png

史上最频繁出现在奥林匹亚先生比赛前三名的 10 位运动员。

2. 网络

2.1. 构建网络

现在,我将逐行遍历 DataFrame,将给定年份的所有名字存储在一个列表中,并在每对年份之间添加一个强度为 1 的边。这意味着节点将被定义为运动员,并且他们将与共享领奖台相连。一个共享领奖台计为一个宽度,无论他们达到的位置如何,而且他们共同出演的频率越高,链接就越强。

importnetworkxasnx edges={}foriinrange(len(df)):# get the row valuesrow=df.iloc[i].dropna().to_list()# keep the names (strings)top3=[tfortinrowiftype(t)isstr]# transform the tiestie=[tfortintop3if'xa0'int]iflen(tie)>0:tie=[a.strip().rstrip()foraintie[0].replace('xa0',' ').split('&')]top3=[tfortintop3if'xa0'notint]top3+=tie# now link the athletes taking the top 3 positionsforidx,t1inenumerate(top3):fort2intop3[idx+1:]:edge='t'.join(sorted([t1,t2]))ifedgenotinedges:edges[edge]=1else:edges[edge]+=1
# initiatie an empty graphG=nx.Graph()# pack the edges into the Graphforedge,weightinedges.items():e1,e2=edge.split('t')G.add_edge(e1,e2,weight=weight)# Check the basic stats of the graph - number of nodes and linksG.number_of_nodes(),G.number_of_edges()

此代码段的输出显示,我们构建的网络包含 56 个节点(作为运动员),通过总共 120 条链接连接。

2.2. 可视化网络

虽然我使用了 Gephi 进行可视化,以下是我用来导出和准备最终可视化文件的几行代码,您将在下面的图中找到。

# export the graphnx.write_gexf(G,'olympia.gexf')# export the count tabledf_out=pd.DataFrame(athlete_cnt.items(),columns=['Id','Cnt']).set_index('Id')df_out.to_csv('cnt.csv')

这最后的视觉图像生动地展示了健美领域的演变。首先,人们可能会注意到,辉煌的日子,老派时代在完全分离的组件中,以施瓦辛格和弗兰克·赞尼为中心。我们还可以进一步确定黄金时代的其他标志性人物,特别是在银色社区中,如弗朗哥·科伦布和塞尔吉奥·奥利瓦。

然后,在第二个网络社区中,我们可以清楚地看到时间的推移,从 80 年代开始,由李·汉尼统治,然后过渡到现代时代的巨人,包括多里安·耶茨、凯文·莱弗龙,然后是过去三位长期冠军:罗尼·科尔曼、杰伊·卡特勒和菲尔·希特。

此图以及文章整体,也作为一个例子,展示了我们如何利用数据科学和网络可视化来描绘各种细分的社会结构,无论是来自体育界还是幻想世界,而方法和工具同样适用于银行或人力资源领域。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/748f92101234f11cbd6b0480ad8ac08f.png

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 1:22:33

视频里的字幕和文案怎么批量提取?从ASR到内容复用的工具拆解

很多团队在复盘短视频素材时,会遇到一个非常实际的问题:视频已经拍完或发布了,但原始文案、字幕稿、口播脚本没有统一保存。后续想做二次剪辑、拆条、重发、改标题或整理知识库时,只能一条条打开视频手动听写。对内容团队来说&…

作者头像 李华
网站建设 2026/5/16 1:21:48

DSU并查集 拓展欧几里得-逆元

并查集(Disjoint Set Union,简称 DSU)是一种专门处理集合合并与连通性查询问题的高效数据结构,是算法竞赛、图论问题里的 “神器”。 一、并查集能干嘛? 它核心解决两个问题: 合并(Union/Mer…

作者头像 李华
网站建设 2026/5/16 1:20:05

策略驱动路由引擎:构建高可用微服务架构的核心组件

1. 项目概述与核心价值最近在折腾一个需要处理大量网络路由逻辑的微服务项目,团队里的小伙伴提到了一个叫osippay/routeiq的开源库。乍一看这个名字,结合route这个关键词,直觉告诉我这玩意儿肯定和路由管理、智能路由或者流量调度有关。果不其…

作者头像 李华
网站建设 2026/5/16 1:18:06

基于CircuitPython与BLE HID打造自定义无线键盘:从硬件到代码全解析

1. 项目概述与核心价值 如果你和我一样,对市面上那些功能单一、按键布局固定的无线键盘感到厌倦,或者手头有一些需要快速输入特定指令、短语的自动化场景,那么自己动手打造一个完全自定义的无线键盘,绝对是一件既酷又实用的事情。…

作者头像 李华
网站建设 2026/5/16 1:15:29

基于RISC-V与电子墨水屏的桌面日历时钟:从硬件选型到低功耗实践

1. 项目概述:打造你的桌面电子墨水日历时钟如果你和我一样,既喜欢桌面上有个能随时瞥一眼就知道日期和星期的日历,又对传统纸质日历每日一撕的浪费感到些许不安,那么这个项目可能就是为你准备的。今天我们要动手制作的&#xff0c…

作者头像 李华