45.2 真实数据集
词汇表
| 表达式 | 说明 |
|---|---|
ResourceData |
获取数据集 |
Catenate[{assoc1, ...}] |
串联多个关联,合并其元素 |
f@*g |
函数组合;应用于 x 时为 f[g[x]] |
f/*g |
右组合;应用于 x 时为 g[f[x]] |
回顾上一节有关数据集的概念和操作。
现在看一些更现实的例子。
火流星数据集
一个来自 Wolfram 数据库的火流星数据集(2009-2015):

要获取此数据集,只需使用 ResourceData。
直接通过名称将数据传给 ResourceData 即可获取数据集:
wl
In[]:=fireballs = ResourceData["Fireballs and Bolides"]

以上是该数据集的局部内容。
从每一行提取坐标并绘制观测地图:
wl
In[]:=GeoListPlot[fireballs[All, "Coordinates"]]

制作火流星高度的直方图:
wl
In[]:=Histogram[fireballs[All, "Altitude"]]

行星和卫星数据集
导入一个包含行星和卫星属性的数据集。
数据集具有层次结构:每个行星有自身的质量和半径,并且每个行星还包含一组卫星,每个卫星有自己的属性。
这种结构在实践中很常见(例如学生与成绩、客户与订单等)。
从云端获取行星与卫星的层次数据集:
wl
In[]:=planets = CloudGet["http://wolfr.am/7FxLgPm5"]

行星半径
找出所有行星的半径:
wl
In[]:=planets[All, "Radius"]

可视化
制作行星半径的柱状图:
wl
In[]:=BarChart[planets[All, "Radius"], ChartLabels -> Automatic]

火星卫星
如果查询火星的卫星,将得到一个数据集,可以进一步查询。
获取关于火星卫星的数据集:
wl
In[]:=planets["Mars", "Moons"]

火星卫星------半径
"钻取"以制作火星所有卫星半径的表格:
wl
In[]:=planets["Mars", "Moons", All, "Radius"]

行星卫星
我们可以针对所有行星的卫星做计算。
行星卫星------数量
首先,统计每个行星列出的卫星数量。
为每个行星制作列出卫星数量的数据集:
wl
In[]:=planets[All, "Moons", Length]

行星卫星------总质量
找出每个行星所有卫星的总质量:
wl
In[]:=planets[All, "Moons", Total, "Mass"]

筛选
卫星数大于 10 的行星
获取相同结果,但仅针对卫星数大于 10 的行星:
wl
In[]:=planets[Select[Length[#Moons] > 10 &], "Moons", Total, "Mass"]

对结果制作饼图:
wl
In[36]:=PieChart[%, ChartLegends -> Automatic]

超过地球质量 1% 的卫星
获取质量超过地球质量 1% 的卫星数据集。
选择所有行星中卫星质量大于 0.01 × 地球质量 的卫星:
wl
In[]:=planets[All, "Moons", Select[#Mass > Quantity[0.01, "EarthMass"] &]]

获取结果关联中键(即卫星名字)列表:
wl
In[38]:=planets[All, "Moons",
Select[#Mass > Quantity[0.01, "EarthMass"] &]][All, Keys]

获取底层的关联:
wl
In[]:=Normal[%]

将所有键的列表拼接(串联)在一起:
wl
In[]:=Catenate[%]
Out[]={Moon, Callisto, Ganymede, Io, Titan}
整条计算的一行写法:
wl
In[]:=planets[All, "Moons", Select[#Mass > Quantity[0.01, "EarthMass"] &]][
Catenate, Keys] // Normal
Out[]={Moon, Callisto, Ganymede, Io, Titan}
卫星质量可视化
再举一个例子:对每个卫星求质量的对数,然后为每个行星绘制这些值的数轴图(number line plot)。
为每个行星的卫星质量对数制作数轴图:
wl
In[]:=planets[All, "Moons", NumberLinePlot[Values[#]] &, Log[#Mass/Quantity[1, "EarthMass"]] &]

卫星词云
最后一个例子:根据卫星质量大小为卫星名称制作词云。
为此,我们需要一个将每个卫星名字与其质量关联的单一关联。
当给出一个关联时,WordCloud 会根据关联中的值确定大小:
wl
In[]:=WordCloud[<|"A" -> 5, "B" -> 4, "C" -> 3, "D" -> 2, "E" -> 1|>]

函数 Association 合并关联:
wl
In[]:=Association[<|"a" -> 1, "b" -> 2|>, <|"c" -> 3|>]
Out]=<|"a" -> 1, "b" -> 2, "c" -> 3|>
生成卫星质量的词云:
wl
In[]:=planets[WordCloud[Association[Values[#]]] &, "Moons", All, "Mass"]

语法:(纯)函数组合
以上这些代码相当简洁。
可以通过使用 @* 或 /* 使其更精简。
我们之前见过可以把复合函数 f[g[x]] 写成 f@g@x 或 x//g//f。
也可以将其改写成纯函数形式 f[g[#]]&[x]。
那么 f[g[#]]& 有没有简短写法?
答案是有的,用函数组合运算符 @* 和 /*。
纯复合函数对x应用 |
左组合等价形式 | 右组合等价形式 |
|---|---|---|
f@g@h[#]&[x] |
(f@*g@*h)[x] |
(h/*g/*f)[x] |
下面是以前的代码使用组合 @* 改写的版本:
wl
In[]:=planets[WordCloud@*Association@*Values, "Moons", All, "Mass"]
以及使用右组合 /* 的版本:
wl
In[]:=planets[Values/*Association/*WordCloud, "Moons", All, "Mass"]