前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Wolfram 分析:您知道奥运奖牌的价值吗?

Wolfram 分析:您知道奥运奖牌的价值吗?

作者头像
WolframChina
发布2022-03-29 21:10:46
2580
发布2022-03-29 21:10:46
举报
文章被收录于专栏:WOLFRAMWOLFRAM

想必大家都在早晚刷屏北京冬奥会,作为“狼粉”的我们也来刷刷 Wolfram 语言能为奥运会干点啥吧。

上面的奥运环就是用 Wolfram 语言写的哦:

代码语言:javascript
复制
circ = Cases[
    ParametricPlot3D[{Cos[t], Sin[t], Cos[3 t]}, {t, 0, 2 Pi}], _Line,
     Infinity][[1, 1]];
min = 2;
max = 3;
colorNames = {"Gold", "Emerald", "Blue", "Black", "Red", "Maroon", 
   "Orange", "Brown", "Purple"};
colors = Interpreter["Color"] /@ colorNames;
coloriter = 1;
Graphics3D[
 Table[{Directive[Black, Glow[colors[[coloriter++]]]], 
   Tube[Composition[
      TranslationTransform[{12 (max - i) + 24 j, 11 (i - min), 0}/10],
       RotationTransform[Mod[i, 2]*Pi/3, {0, 0, 1}]] /@ circ, 
    1/8]}, {i, min, max}, {j, 1, i}], Method -> {"TubePoints" -> 30}, 
 ViewPoint -> {0, 0, Infinity}, Boxed -> False]

你要是在 Mathematica 中用鼠标稍微旋转一下,就成下面这样了:

这背后的环相锁和 3D 的原理请参见社区的讨论。稍作改动还可以画出不同的环数。

奧運環

下面这个是用 Wolfram 语言中的 UnityLink 制作的奥运环:

代码太长就不贴了,大家请移步Wolfram社区:https://community.wolfram.com/groups/-/m/t/2325991 下载或查看源代码。

Wolfram 知識庫

Wolfram 知识库里有很多令人兴奋的历史数据。

您知道吗,2008年是中国获取金牌和奖牌数量最多的一年,虽然总的奖牌数量低于美国,但是含金量确是第一哦!

美国拿了最多的奖牌。但是问任何体育迷,从小联盟的 tee-ball 到世界级的比赛,你会听到同样的重复:整个社区都参与了运动员的培养。考虑到这句格言,我不禁想知道:一个国家的人口规模是否与其奥运选手的成功相关?美国、中国和俄罗斯都是人口相当多的国家,但如果除以人口规模,他们赢了多少奖牌呢?

幸运的是,我們可以使用单击窗格右上角的 + 按钮时可用的输出选项之一,以一种很好的可计算形式轻松获取数据以供 Wolfram 语言进行分析。通过选择“Computable Data”,Wolfram 语言将创建我們需要的代码并将结果作为列表提供给我。

然后我们利用2008年的人口数据:

代码语言:javascript
复制
medals = Drop[%, 1];
populationIn2008[nation_] := CountryData[nation, {"Population", 2008}]
medalsPerPop = 
  Table[{row[[1]], row[[-1]]/populationIn2008[row[[1]]]}, {row, 
    medals}];
sortedPerPop = Reverse[SortBy[medalsPerPop, Last]];
(*The five highest and the five lowest nations in terms of medals per \
person*)
{sortedPerPop[[1 ;; 5]], sortedPerPop[[-5 ;; -1]]} // TableForm

牙買加的总奖牌数量是第20位,但人均奖牌数量却是第一。

Money

让我们考虑一下:如果牙買加获得的不是奖牌,而是获得金牌的金属的总市场价格,该怎么計算呢? 使用美国地质调查局关于矿产和材料商品的数据(https : // pubs . usgs . gov/sir/2012/5188/tables/),这是一个很容易估算的问题——包括铜在内的金属的价值全年波动很大,而且奥运会奖牌的构成因奥运会主办国而异。 对于金属的成分,我使用了当时各种不同的文章(特别是这篇文章:https://www.forbes.com/sites/anthonydemarco/2012/07/26/a-closer-look-at-the-olympic-gold-medal/?sh=617ebaa86d27)来得出一个合理的估计。 尽管奖牌组成的数据以克为单位,而 USGS 的数据以金衡盎司为单位,但 Wolfram 语言可以轻松地为我处理单位转换。

代码语言:javascript
复制
usgsData[filename_] := 
 UnitConvert[
  Quantity[Cases[Import[filename], {2008., __}, Infinity][[1]][[3]], 
   "USDollars"/"TroyOunces"], "USDollars"/"Grams"]
   prices = AssociationMap[
  usgsData[StringJoin[#, ".xlsx"]] &, {"gold", "silver", "copper", 
   "zinc", "tin"}]
代码语言:javascript
复制
<|"gold" -> Quantity[28.0837, ("USDollars")/("Grams")], 
 "silver" -> Quantity[0.482261, ("USDollars")/("Grams")], 
 "copper" -> Quantity[10.2613, ("USDollars")/("Grams")], 
 "zinc" -> Quantity[0.0285904, ("USDollars")/("Grams")], 
 "tin" -> Quantity[0.362982, ("USDollars")/("Grams")]|>

注意到上面的数据中铜的文件单位不一致,所以单独计算铜:

代码语言:javascript
复制
usgsCopperData[filename_] := 
 UnitConvert[
  Quantity[Cases[Import[filename], {2008., __}, Infinity][[1]][[3]], 
   "USCents"/"Pounds"], "USDollars"/"Grams"
代码语言:javascript
复制
copperPrice = usgsData["copper.xlsx"]
Quantity[0.00703634, ("USDollars")/("Grams")]

最後看看把獎牌換成美元是多少:

代码语言:javascript
复制
medalGrosses = 
 Table[{row[[1]], 
   costOfGoldMedal*row[[2]] + costOfSilverMedal*row[[3]] + 
    costOfBronzeMedal*row[[4]]}, {row, medals}]

中国的奖牌数虽然屈居第二,但是价值却超过奖牌数第一的美国!

奖牌分布

Wolfram|Alpha, Wolfram 庞大的知识库还有啥数据呢?

我们来看看2020年中国的奖牌数分布:

代码语言:javascript
复制
medalsBySport[country_, year_, more_ : 99] := 
 With[{waResults = 
    WolframAlpha[
     country <> " at the " <> ToString[year] <> 
      " summer olympics", {{"OlympicMedalistResults:OlympicData", 
       All}, {"Title", "ComputableData"}}, 
     PodStates -> {ToString[more] <> 
        "@OlympicMedalistResults:OlympicData__More"}, 
     TimeConstraint -> Infinity]}, {Last[#1], 
     Length[Last[#2]] - 1} & @@@ 
   GatherBy[waResults[[2 ;;]], #[[1, 1]] &]]

chartifyMedalsBySport[results_] := 
 PieChart[Last /@ results, 
  ChartLabels -> Placed[First /@ results, "RadialCallout"], 
  ChartStyle -> 54]

medalsBySport["China", 2020]~SortBy~Last

{{"Basketball", 1}, {"Cycling", 1}, {"Fencing", 1}, {"Taekwondo", 
  1}, {"Boxing", 2}, {"Karate", 2}, {"Sailing", 
  2}, {"Synchronised swimming", 2}, {"Canoeing", 3}, {"Rowing", 
  3}, {"Wrestling", 4}, {"Track & field", 5}, {"Badminton", 
  6}, {"Swimming", 6}, {"Table tennis", 7}, {"Weightlifting", 
  8}, {"Gymnastics", 11}, {"Shooting", 11}, {"Diving", 12}}

2020年奧運會中国拿到奖牌数最多的前六名運動是跳水、射击、体操、举重、乒乓球、游泳、羽毛球。

最后我们看一下自 1984 年以来中国获得的奖牌数的分布:

代码语言:javascript
复制
olympicyears = Range[1984, 2020, 4]
allChinaMedals = medalsBySport["China", #] & /@ olympicyears;
aggregateMedals[allMedals_] := {First[First[#]], Total[Last /@ #]} & /@
   GatherBy[Flatten[allMedals, 1], First]
aggregateMedals[allChinaMedals]~SortBy~Last;
chartifyMedalsBySport[%]

历年来拿到奖牌数最多的前六名是体操 (84)、跳水 (81)、射击 (67)、举重(65)、乒乓球(60)、游泳(49)。

以上代码来源于 Wolfram 社区:https://community.wolfram.com/groups/-/m/t/908874

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WOLFRAM 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档