【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@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"]
相关推荐
大侠归来10 分钟前
事务能回滚吗?Pipeline 算事务吗?
java·数据库·oracle
蜗牛互联网11 分钟前
Python调用Gemini Structured Outputs实现工单路由门禁
java·开发语言·人工智能·python
临床数据科学和人工智能兴趣组23 分钟前
字符串转换为句子风格
大数据·数据库·人工智能·r语言·r语言-4.2.1
Wang's Blog31 分钟前
Java 项目实战: 交友项目 - 产品定位、功能模块与客户端原型解读
java·开发语言·交友
Wang's Blog33 分钟前
Java 项目实战:交友项目 —— 项目导读与整体架构
java·架构·交友
夕除34 分钟前
PostgreSQL基础
数据库·oracle
今年下半年1 小时前
【短信发送】Spring Boot整合多种短信接口的实现(附源码)
java·spring boot·后端·sms·qcloudsms
zyseo81 小时前
谷歌SEO 站点地图优化实战:sitemap 是索引候选清单的运营工具
网络·数据库·经验分享·笔记·搜索引擎
wespaul1 小时前
VeapAI 自然语言操作实战|第 04 篇:系统数据加工——把系统自身的元数据吃成知识
java·大数据·运维·数据库·人工智能
用户84913717547161 小时前
数据库迁移总出问题?学会这个工具,让团队协作效率翻倍!
数据库·sql