Wolfram|Alpha 中的数据格式
简介
除了表示图形结果外,Wolfram|Alpha 也提供另一种包含额外的信息或适于某种任务的表示方式. 这些可替代的表示方式被统称为数据格式. 不是所有的结果都具有这些格式;确实,很难设想一个简单的结果可以具有所有这些表示方式. 因此,存在交互式和编程式机制来决定和索取各种格式.
有一数据格式的分组被称为"公开的数据格式(exposed data formats)". 其目的是使人们可以从 Wolfram|Alpha 中提取有用的数据. 比如,可能返回绘图所需的数据点,允许用户自创可视化. 删除某些或所有格式、注释和其它外部细节以便专注于数据. 下表列出了当前公开的数据格式的名称,以及对所提取元素的描述. 这些名称与出现在互动菜单中的名称相同.
| |
| 由结果表示的数据,包括数字、文本和数学元素. 该格式尝试去掉尽可能多的格式,使得结果可被机器处理. 这意味着 Grid、Column 等被去除;单位也从量中去除,只剩下数字部分;日期以 DateList 格式返回. |
| 由结果表示的数据,包括数字、文本和数学元素. 它尝试着尽可能保留结果的外观,包括特殊头 . |
| 结果中的数学和 Mathematica 表达式列表,是未计算形式 |
| 结果为单个数值列表和单个量列表的数值部分 |
| 结果为单个量列表(具有单位的数值) |
| 结果为声音对象列表 |
| 结果为时间序列列表 |
公开的数据格式.
附加的数据格式更特殊化. 两个是 Mathematica 格式,事实上被自由格式输入机制所使用. 最后一个为结果中的非图形元素提供纯文本表示.
| |
| Mathematica 表达式执行产生结果的计算 |
| 普通的 Mathematica 表达式表示结果 |
| 结果以纯文本表示 |
附加的数据格式.
交互式探索数据格式
Wolfram|Alpha 查询和自由格式输入方法使您可以得到各种可用的数据格式. 由于 Wolfram|Alpha 查询在默认情况下显示所有结果,所以它是访问这些格式的一个很方便的方法.
Wolfram|Alpha 查询
基本工作流程
考虑以下 Wolfram|Alpha 查询.
integrate sinx from 0 to 2pi
这是产生的三个结果. 每个具有圆形灰色边界的白色区域被称为一个 pod. 点击每个 pod 的右上角的加号,将会有一个下拉菜单,可以要求 pod 以各种形式显示. 比如 "Definite integral" pod 有以下下拉菜单:
前两项, 和 总是存在. 第一条分隔线后的项表示该 pod 包含 、、和 . 最后,在第二条分隔线后,列出可用的公开数据格式,该例为 、 和 .
如果您从下拉菜单中选择 ,将会在 Wolfram|Alpha 查询结果下面产生一个单元,就像下面的单元,它会自动被计算. 该单元计算到 Pod 中方程左边的积分,也就是这个 Pod 所执行的计算.
| Out[12]= |  |
重复 的过程将产生方程的右边或来自计算的
Mathematica 输出.
| Out[13]= |  |
最后 产生一个公式,标准
Mathematica 语法的完整公式.
| Out[14]= |  |
点击 "Visual representation of the integral" pod 中的加号产生一个更短的菜单. 该 pod 没有可用的公开的数据格式,只有附加数据格式中的 :
该 pod 的
Mathematica 输入是一个生成图形的普通的
Plot 表达式. 允许
Plot 表达式计算后,图形没有被填充. 一般来说,
Mathematica 输入格式相对于 Wolfram|Alpha 返回的结果而言被简化了,因此您可以应用您自己的样式.
| Out[33]= |  |
| Out[34]= |  |
公开的数据不必类似于图形的结果
在以上的例子中,公开的数据本质上与结果一致. 但并不总是这样,看一下以下查询.
msft close Jan 1, 2011 to Jan 21 2011
点击 "History" pod 的加号,选择 产生如下. 产生一个用于创建图的实际数据点列表,而不是一个图;它公开了基本数据.
| Out[16]= |  |
前面输出的 InputForm 包含特殊格式封装
. 这个头,以及公开数据格式所期望的输出类型,在 公开的数据例子 一节有进一步讨论.
Out[17]//InputForm= |
| |  |
第二个参变量的结构
值得注意的是,单元中 WolframAlpha 函数的第二个参变量的结构,它可以通过点击上下文下拉菜单得到. 在任何情况下,该结构是
.
是由 Wolfram|Alpha 产生的字符串,用来识别 pod,
是要提取的属性名称. subpodid 是一个整数,表明 pod 中特殊结果的位置. 所有上面的例子在 pod 中只有一个子 pod,因此索引总是1. 以下是一个在每个 pod 中产生多个子 pod 的查询例子.
在两个图间的和 pod 一样长的细灰线是多个子 pod 的分界线( tell-tale sign). 在这种情况下,从"Plots" pod 下拉菜单中选择 将产生两次调用 WolframAlpha,每个子 pod 调用一次.
| Out[19]= |  |
该语法可延伸为从多个 pod 中提取多个格式,在 "编程式获取数据格式" 中将有更详细的解释.
自由格式输入
考虑上面使用自由格式输入的积分例子.
| Out[20]= |  |
首先要注意的是,直接在自由格式表达式下方生成的 Integrate 表达式,与第一个例子中所看到的 Mathematica 输入表达式无任何不同. 这恰恰是自由格式输入机制的工作原理:它从 Wolfram|Alpha 的结果中搜索 Mathematica 输入和输出表达式,并在本地运算这些表达式.
单击自由格式表达式右边的加号,将显示所有的结果. 对于每个结果,Mathematica 输入表达式如果存在的话,将直接显示在结果上方的灰框中. 之所以能这样做,正是因为 Mathematica 的输入格式在自由形式输入机制中所起的关键作用.
尽管只有 Mathematica 输入表达式显示在 Pod 一侧,所有其他格式也可在上下文菜单中选用. 例如,要访问积分的可计算数据,右击并选择
现在您可以把数据粘贴到任何地方,例如在下面的单元中.
您也可以选择 产生一个类似 Wolfram|Alpha 查询的输入单元.
这将在结果下面直接产生以下单元. 然而,不向 Wolfram|Alpha 查询,该单元不会自动被计算.
| Out[42]= |  |
编程式获取数据格式
作为子 pod 属性的数据格式
正如前面的例子所示,数据格式是与特别子 pod 相关联的属性. 因此它们可以利用 WolframAlpha 函数的标准语法
和
来请求. 各种格式的编程属性名称是利用驼峰式命名法,将各自菜单名称的字符串组合而成. 这样, 是
, 是
,Input 是
,等等.
决定可用的格式
一个特定子 pod 可用的数据格式包含在每个子 pod 的
属性中. 此属性可以像计算任何其他子 Pod 属性一样进行计算.
这里的每个子 pod 只有一个数据格式:输入("Input") pod 是纯文本,两个绘图("Plot")子 pod 是
Mathematica 输入.
| Out[21]= |  |
该查询的每个 pod 有多个可用的数据格式,在第二个和第三个 pod 中包括多个公开的数据格式.
| Out[22]= |  |
由
属性返回的格式列表可用于取代字符串
来索取实际的数据.
| Out[23]= |  |
作为 WolframAlpha 函数的一个标准,如果选择单个子 pod 的单个属性,则只返回值.
| Out[24]= |  |
直接请求数据
不是首先决定哪种格式可用,然后才请求,您也可以直接请求数据格式. 这一般可以用 WolframAlpha 函数中的
语法来完成.
如果您查询所有 pod 中的某种属性,只有实际上包含那些格式的 pod 才会显示.
| Out[25]= |  |
| Out[26]= |  |
您也可以请求某个 pod 的所有属性,然后选择想要的特定结果. 再次,只有实际上可用的属性才会显示.
| Out[27]= |  |
最后,您可以从某个特殊的子 pod 中索取特定的格式. 这种情况下(在规范中没有
All 时),如果没有某种特定的格式,您将仍然获得右边为
Missing["NotAvailable"] 的规则.
| Out[28]= |  |
注意如果您只给出没有子 pod 的 pod ID,您有一个隐式的
All 索取所有子 pod.
| Out[29]= |  |
如果您对公开数据感兴趣,WolframAlpha 的
参数将以普通的
格式返回所有可能的公开数据. 使用
以确保如果添加了新的公开数据,它们也会被列出.
| Out[30]= |  |
WolframAlpha 的
和
参数可以很容易使用 WolframAlpha 的
语法复制.

是由
{All, "PodPlaintext"} 返回的规则的右边部分.
| Out[31]= |  |
| Out[32]= |  |

给出由
{All, {"Input", "Output"}} 返回的规则的右边部分. 然而,结果可能会有不同的顺序,因为前者根据 Pod 对结果进行分组,而后者根据属性对结果进行分组.
| Out[14]= |  |
| Out[15]= |  |
| Out[16]= |  |
公开的数据例子
一般事项
不是所有的 Wolfram|Alpha 结果都有数据格式表示,更不用说公开的数据,虽然 Wolfram|Alpha 结果在任何时候均被改良以提供数据格式. 此外,当有多个公开数据格式时,会有两个甚至三个格式是一致的. 这个均取决于单个 pod 的内容. 一般来说,可计算数据和格式化的数据是最常用的;如果有任何公开数据,它们一般也会出现,可能包含不同种类的数据. 其它格式追寻更深层的和提供数据的具体类型,因此更具有预测性. 下面的例子是根据它们所包含数据类型编组的.
量与数
与 Mathematica 的 Quantity 对象相似,Wolfram|Alpha 中的量由带单位的数值组成. 可以直接访问整个量或只是使用公开的数据的数字部分. 第一个 Pod 来自前面的金融例子,为如何处理提供了一个很好的例证.
| Out[61]= |  |
格式化的数据和可计算数据给出不同形式的结果.
格式化数据几乎与输出看上去一样. 日期注释被去掉了,网格分割线也没有了,而字体对于
Mathematica 而言也是本地的,但是其它差别则很小. 正如在简介中所说的,格式和外部细节的去除是经过仔细考虑的.
| Out[62]= |  |
相比之下,可计算数据显然更简单. 它返回一个纯矩阵,而不是
Grid.
| Out[65]= |  |
另外,量数据和数值数据仅返回结果的数量部分,而忽略文本.
| Out[66]= |  |
量数据只返回量. 它使用

封装传递额外的信息,例如单位和精度,与格式化数据一样.
| Out[67]= |  |
时间序列
历史图是时间序列的典型例子,给出每个日期序列的
值. 以下是前面例子的历史图.
| Out[31]= |  |
格式化数据包含值的列表,加上表明

值的单位. 注解,象通常一样被去掉了. 第一列的日期使用

封装.
| Out[68]= |  |
Out[69]//InputForm= |
| |  |
对于时间序列,可计算数据返回标准
Mathematica 格式的时间序列:对列表中第一个元素是
DateList,第二个元素是可计算的值.
| Out[72]= |  |
在这个例子中,时间序列数据与可计算数据是一样的,因为整个结果是由图点构成的. 如果结果中有其它元素,时间序列数据可能是一个严格的子集.
| Out[70]= |  |
注意在该 pod 中没有数值数据. 虽然数据中有许多数值,但是没有任何数字可以自己表示结果. 这与
"量与数"一节中"结果" Pod 中的表格不同,例如在表格中,19.055是百分比形式的波动率.
| Out[71]= |  |
公式
在 "交互式探索数据格式" 中的简介例子,显示了公式化的数据是如何返回一个方程. 它也可以返回多个方程,以下查询的 "Equation" pod 就是这样一个例子.
Newton's second law 5 kg 2 gs
该例子中的格式化数据很类似于由 Wolfram|Alpha 返回的结果. 然而,多个公式被识别且被
Hold 封装.
| Out[53]= |  |
公式化的数据只返回公式,以展平的列表形式,忽略文本元素.
| Out[54]= |  |
声音
Wolfram|Alpha 知道脉冲星 LGM-1 的许多有趣的属性. 其中之一是其脉冲的声频示意图.
| Out[55]= |  |
对于这个特殊的 pod,唯一公开的数据是声音数据; 该格式最有可能出现,而没有相应的格式化的数据或可计算数据.
| Out[56]= |  |
Out[57]//InputForm= |
| |  |
Wolfram|Alpha 除了采样声音外,还可以生成音乐.
| Out[58]= |  |
而且,这种声音可以毫无损失地导入到
Mathematica 中.
| Out[59]= |  |
Out[60]//InputForm= |
| |  |