【Wolfram语言】45.2 真实数据集

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@xx//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"]
相关推荐
The Sheep 20232 小时前
MongoDB与.Net6
数据库·mongodb
予枫的编程笔记2 小时前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法
BryceBorder2 小时前
SCAU--数据库
数据库·oracle·dba
ohoy2 小时前
RedisTemplate 使用之Set
java·开发语言·redis
mjhcsp2 小时前
C++ 后缀数组(SA):原理、实现与应用全解析
java·开发语言·c++·后缀数组sa
有味道的男人2 小时前
京东关键词API接口获取
数据库
8***f3952 小时前
Spring容器初始化扩展点:ApplicationContextInitializer
java·后端·spring
罗光记2 小时前
《人工智能安全治理研究报告(2025年)发布
数据库·其他·百度·新浪微博
r_oo_ki_e_2 小时前
java22--常用类
java·开发语言