Wolfram|Alpha 中的数据格式

简介
除了表示图形结果外,Wolfram|Alpha 也提供另一种包含额外的信息或适于某种任务的表示方式. 这些可替代的表示方式被统称为数据格式. 不是所有的结果都具有这些格式;确实,很难设想一个简单的结果可以具有所有这些表示方式. 因此,存在交互式和编程式机制来决定和索取各种格式.
有一数据格式的分组被称为公开的数据格式(exposed data formats). 其目的是使人们可以从 Wolfram|Alpha 中提取有用的数据. 比如,可能返回绘图所需的数据点,允许用户自创可视化. 删除某些或所有格式、注释和其它外部细节以便专注于数据. 下表列出了当前公开的数据格式的名称,以及对所提取元素的描述. 这些名称与出现在互动菜单中的名称相同.
格式名称
描述
可计算数据(Computable data)
由结果表示的数据,包括数字、文本和数学元素. 该格式尝试去掉尽可能多的格式,使得结果可被机器处理. 这意味着 GridColumn 等被去除;单位也从量中去除,只剩下数字部分;日期以 DateList 格式返回.
格式化的数据(Formatted data)
由结果表示的数据,包括数字、文本和数学元素. 它尝试着尽可能保留结果的外观,包括特殊头 WolframAlphaDate.
公式化的数据(Formula data)
结果中的数学和 Wolfram 语言表达式列表,是未计算形式
数值数据(Number data)
结果为单个数值列表和单个量列表的数值部分
量数据(Quantity data)
结果为单个量列表(具有单位的数值)
声音数据(Sound data)
结果为声音对象列表
时间序列数据(Time series data)
结果为时间序列列表
公开的数据格式.
附加的数据格式更特殊化. 两个是 Wolfram 语言格式,事实上被自由格式输入机制所使用. 最后一个为结果中的非图形元素提供纯文本表示.
格式名称
描述
输入(Input)
Wolfram 语言表达式执行产生结果的计算
输出(Output)
普通的 Wolfram 语言表达式表示结果
纯文本(Plaintext)
结果以纯文本表示
附加的数据格式.
交互式探索数据格式
Wolfram|Alpha 查询和自由格式输入方法使您可以得到各种可用的数据格式. 由于 Wolfram|Alpha 查询在默认情况下显示所有结果,所以它是访问这些格式的一个很方便的方法.

Wolfram|Alpha 查询

基本工作流程

考虑以下 Wolfram|Alpha 查询.
integrate sinx from 0 to 2pi
这是产生的三个结果. 每个具有圆形灰色边界的白色区域被称为一个 pod. 点击每个 pod 的右上角的加号,将会有一个下拉菜单,可以要求 pod 以各种形式显示. 比如 "Definite integral" pod 有以下下拉菜单:

2.gif

前两项,格式化的pod子pod的内容 总是存在. 第一条分隔线后的项表示该 pod 包含 纯文本输入、和 输出. 最后,在第二条分隔线后,列出可用的公开数据格式,该例为 可计算数据格式化的数据公式化的数据.
如果您从下拉菜单中选择 输入,将会在 Wolfram|Alpha 查询结果下面产生一个单元,就像下面的单元,它会自动被计算. 该单元计算到 Pod 中方程左边的积分,也就是这个 Pod 所执行的计算:
重复 输出 的过程将产生方程的右边或来自计算的 Wolfram 语言输出:
最后 格式化的数据 产生一个公式,标准 Wolfram 语言语法的完整公式:
点击 "Visual representation of the integral" pod 中的加号产生一个更短的菜单. 该 pod 没有可用的公开的数据格式,只有附加数据格式中的 输入:

3.gif

该 pod 的 Wolfram 语言输入是一个生成图形的普通的 Plot 表达式. 允许 Plot 表达式计算后,图形没有被填充. 一般来说,Wolfram 语言输入格式相对于 Wolfram|Alpha 返回的结果而言被简化了,因此您可以应用您自己的样式:

公开的数据不必类似于图形的结果

在以上的例子中,公开的数据本质上与结果一致. 但并不总是这样,看一下以下查询.
msft close Jan 1, 2011 to Jan 21 2011
点击 "History" pod 的加号,选择 格式化的数据 产生如下. 产生一个用于创建图的实际数据点列表,而不是一个图;它公开了基本数据.
前面输出的 InputForm 包含特殊格式封装 WolframAlphaDate. 这个头,以及公开数据格式所期望的输出类型,在 公开的数据例子 一节有进一步讨论.

第二个参变量的结构

值得注意的是,单元中 WolframAlpha 函数的第二个参变量的结构,它可以通过点击上下文下拉菜单得到. 在任何情况下,该结构是 {{"podid",subpodid},"property"}. "podid" 是由 Wolfram|Alpha 产生的字符串,用来识别 pod, "property" 是要提取的属性名称. subpodid 是一个整数,表明 pod 中特殊结果的位置. 所有上面的例子在 pod 中只有一个子 pod,因此索引总是1. 以下是一个在每个 pod 中产生多个子 pod 的查询例子.
plot sinx
在两个图间的和 pod 一样长的细灰线是多个子 pod 的分界线( tell-tale sign). 在这种情况下,从"Plots" pod 下拉菜单中选择 输入 将产生两次调用 WolframAlpha,每个子 pod 调用一次.
该语法可延伸为从多个 pod 中提取多个格式,在 "编程式获取数据格式" 中将有更详细的解释.

自由格式输入

考虑上面使用自由格式输入的积分例子.
首先要注意的是,直接在自由格式表达式下方生成的 Integrate 表达式,与第一个例子中所看到的 Wolfram 语言输入表达式无任何不同. 这恰恰是自由格式输入机制的工作原理:它从 Wolfram|Alpha 的结果中搜索 Wolfram 语言输入和输出表达式,并在本地运算这些表达式.
单击自由格式表达式右边的加号,将显示所有的结果. 对于每个结果,Wolfram 语言输入表达式如果存在的话,将直接显示在结果上方的灰框中. 之所以能这样做,正是因为 Wolfram 语言的输入格式在自由形式输入机制中所起的关键作用.
尽管只有 Wolfram 语言输入表达式显示在 Pod 一侧,所有其他格式也可在上下文菜单中选用. 例如,要访问积分的可计算数据,右击并选择 复制为 可计算数据.

6.gif

现在您可以把数据粘贴到任何地方,例如在下面的单元中.
您也可以选择 粘贴输入 可计算数据 产生一个类似 Wolfram|Alpha 查询的输入单元.

7.gif

这将在结果下面直接产生以下单元. 然而,不向 Wolfram|Alpha 查询,该单元不会自动被计算.
编程式获取数据格式

作为子 pod 属性的数据格式

正如前面的例子所示,数据格式是与特别子 pod 相关联的属性. 因此它们可以利用 WolframAlpha 函数的标准语法{"podid","property"}{{"podid",subpodid},"property"} 来请求. 各种格式的编程属性名称是利用驼峰式命名法,将各自菜单名称的字符串组合而成. 这样,Computable data"ComputableData"Time series data"TimeSeriesData"Input"Input",等等.

决定可用的格式

一个特定子 pod 可用的数据格式包含在每个子 pod 的 "DataFormats" 属性中. 此属性可以像计算任何其他子 Pod 属性一样进行计算.
这里的每个子 pod 只有一个数据格式:输入("Input") pod 是纯文本,两个绘图("Plot")子 pod 是 Wolfram 语言输入:
该查询的每个 pod 有多个可用的数据格式,在第二个和第三个 pod 中包括多个公开的数据格式:
"DataFormats" 属性返回的格式列表可用于取代字符串 "DataFormats" 来索取实际的数据.
作为 WolframAlpha 函数的一个标准,如果选择单个子 pod 的单个属性,则只返回值.

直接请求数据

不是首先决定哪种格式可用,然后才请求,您也可以直接请求数据格式. 这一般可以用 WolframAlpha 函数中的 {"podid","property"} 语法来完成.
如果您查询所有 pod 中的某种属性,只有实际上包含那些格式的 pod 才会显示:
您也可以请求某个 pod 的所有属性,然后选择想要的特定结果. 再次,只有实际上可用的属性才会显示:
最后,您可以从某个特殊的子 pod 中索取特定的格式. 这种情况下(在规范中没有 All 时),如果没有某种特定的格式,您将仍然获得右边为 Missing["NotAvailable"] 的规则:
注意如果您只给出没有子 pod 的 pod ID,您有一个隐式的 All 索取所有子 pod:
如果您对公开数据感兴趣,WolframAlpha"DataRules" 参数将以普通的 {{"podid",subpodid},"property"}->data 格式返回所有可能的公开数据. 使用 "DataRules" 以确保如果添加了新的公开数据,它们也会被列出.
WolframAlpha"PodPlaintext""WolframForms" 参数可以很容易使用 WolframAlpha{{"podid",subpodid},"property"} 语法复制.
"PodPlaintext" 是由 {All,"PodPlaintext"} 返回的规则的右边部分:
"WolframForms" 给出由 {All,{"Input","Output"}} 返回的规则的右边部分. 然而,结果可能会有不同的顺序,因为前者根据 Pod 对结果进行分组,而后者根据属性对结果进行分组:
公开的数据例子

一般事项

不是所有的 Wolfram|Alpha 结果都有数据格式表示,更不用说公开的数据,虽然 Wolfram|Alpha 结果在任何时候均被改良以提供数据格式. 此外,当有多个公开数据格式时,会有两个甚至三个格式是一致的. 这个均取决于单个 pod 的内容. 一般来说,可计算数据和格式化的数据是最常用的;如果有任何公开数据,它们一般也会出现,可能包含不同种类的数据. 其它格式追寻更深层的和提供数据的具体类型,因此更具有预测性. 下面的例子是根据它们所包含数据类型编组的.

量与数

与 Wolfram 语言的 Quantity 对象相似,Wolfram|Alpha 中的量由带单位的数值组成. 可以直接访问整个量或只是使用公开的数据的数字部分. 第一个 Pod 来自前面的金融例子,为如何处理提供了一个很好的例证.
格式化的数据和可计算数据给出不同形式的结果.
格式化数据几乎与输出看上去一样. 日期注释被去掉了,网格分割线也没有了,而字体对于 Mathematica 而言也是本地的,但是其它差别则很小. 正如在简介中所说的,格式和外部细节的去除是经过仔细考虑的:
相比之下,可计算数据显然更简单. 它返回一个纯矩阵,而不是 Grid
另外,量数据和数值数据仅返回结果的数量部分,而忽略文本.
数值数据只返回纯数值和量的数值部分:
量数据仅以 Mathematica Quantity 对象的形式返回量:

时间序列

历史图是时间序列的典型例子,给出每个日期序列的 值. 以下是前面例子的历史图.
格式化数据包含值的列表,加上表明 值的单位. 注解,象通常一样被去掉了. 第一列的日期使用 WolframAlphaDate 封装:
WolframAlphaDate 是一个轻量级的封装,仿照 Wolfram|Alpha 样式的日期. InputForm 表明 WolframAlphaDate 的内容是一个普通的 DateList
对于时间序列,可计算数据返回标准 Wolfram 语言格式的时间序列:对列表中第一个元素是 DateList,第二个元素是可计算的值:
在这个例子中,时间序列数据与可计算数据是一样的,因为整个结果是由图点构成的. 如果结果中有其它元素,时间序列数据可能是一个严格的子集:
注意在该 pod 中没有数值数据. 虽然数据中有许多数值,但是没有任何数字可以自己表示结果. 这与"量与数"一节中结果 Pod 中的表格不同,例如在表格中,19.055是百分比形式的波动率:

公式

"交互式探索数据格式" 中的简介例子,显示了公式化的数据是如何返回一个方程. 它也可以返回多个方程,以下查询的 "Equation" pod 就是这样一个例子.
Newton's second law 5 kg 2 gs
该例子中的格式化数据很类似于由 Wolfram|Alpha 返回的结果. 然而,多个公式被识别且被 Hold 封装:
公式化的数据只返回公式,以展平的列表形式,忽略文本元素:

声音

Wolfram|Alpha 知道脉冲星 LGM-1 的许多有趣的属性. 其中之一是其脉冲的声频示意图.
对于这个特殊的 pod,唯一公开的数据是声音数据; 该格式最有可能出现,而没有相应的格式化的数据或可计算数据.

12.gif

声音数据产生一个普通的 Sound 对象:
有趣的是该例子返回的声音的 InputForm. 由 Wolfram|Alpha 产生的SampledSoundFunction 无损地传输到 Wolfram 语言:
Wolfram|Alpha 除了采样声音外,还可以生成音乐.
而且,这种声音可以毫无损失地导入到 Wolfram 语言中: