Python 获取原始数据,函数raw_data()
类似于第3章的例子,但有一些重要的变化。该应用程序中用到了如下内容:
from Chapter_3.ch03_ex5 import (
series, head_map_filter, row_iter)
from typing import (
NamedTuple, Callable, List, Tuple, Iterable, Dict, Any)
RawPairIter = Iterable[Tuple[float, float]]
class Pair(NamedTuple):
x: float
y: float
pairs: Callable[[RawPairIter], List[Pair]] \
= lambda source: list(Pair(*row) for row in source)
def raw_data() -> Dict[str, List[Pair]]:
with open("Anscombe.txt") as source:
data = tuple(head_map_filter(row_iter(source)))
mapping = {
id_str: pairs(series(id_num, data))
for id_num, id_str in enumerate(
['I', 'II', 'III', 'IV'])
}
return mapping
函数raw_data()
会打开本地数据文件,并利用row_iter()
函数将解析后的文件的每一行返回单独的项目行中。上面运用head_map_filter()
函数删除了文件的头部,结果创建了一个列表元组结构,并将其赋给data
变量,这可以将输入解析为有用的结构。生成的结构是NamedTuple
的子类Pair
的一个实例,且其中两个字段的类型提示为float
。
上面使用字典推导式构建了从id_str
到由series()
函数结果组合配对的映射。函数series()
从输入文档中提取 (x,y)
对。文档中的每个序列都在两个相邻的列中。名为I
的序列在第0列和第1列,函数series()
从中提取相关列对。
创建的函数pairs()
是匿名函数对象,因为它是带有单个参数的小型生成器函数。该函数根据series()
函数创建的匿名元组序列构建所需的NamedTuple
对象。
由于raw_data()
函数的输出是映射,因此通过名称选取某个特定的序列,示例如下:
>>> raw_data()['I']
[Pair(x=10.0, y=8.04), Pair(x=8.0, y=6.95), ...
给定一个键,例如I
,该序列是一个Pair
对象的列表,且该序列中的每一项都具有x
值和y
值。