数据科学程序开发者面临的首要问题:如何访问数据,并用Python的数据结构让这些数据持续可用。掌握使用Python访问数据的诀窍是非常有用的,能让你避过纷扰,直接面对问题的核心内容。
一般数据是以文本形式存放的,用逗号或者tab作为分隔符。我们可以采用Python的内置文件对象工具来进行处理。如前所述,文件对象实现了_iter_()和next()方法,这让我们可以处理非常大的文件,这些文件无法一次全部装载到内存里,只能每次读取一小部分。
Python的机器学习库,(如scikit-learn)就是基于numpy库,在这节中,我们将研究如何搞笑地读取外部数据,并将之转为NumPy的数组以便后续的数据处理。
示例代码:
#1. 我们先用StringIO来模拟一个小型的表格数据
import numpy as np
#python2 “from StringIO import StringIO”
#python3 “from io import StringIO ”,运行成功。
from io import StringIO
#使用StringIO来模拟表格数据,有3行3列,行通过换行表示,列则通过通过逗号分隔。
in_data = StringIO("10,20,30\n56,89,90\n33,46,89")
#2.使用NumPy的genfromtxt来读取数据,并创建一个NumPy数组。
#np.genfromtxt() 参数1:文件源和文件名 参数2:输入类型 参数3:输入分隔符
data = np.genfromtxt (in_data,dtype=int,delimiter = ',')
print (data)
#3.清除掉一些我们不需要的列
in_data = StringIO("10,20,30\n56,89,90\n33,46,89")
data = np.genfromtxt(in_data,dtype=int,delimiter=",",usecols=(0,1))
print (data)
#4.设定列名
in_data = StringIO("10,20,30\n56,89,90\n33,46,89")
data = np.genfromtxt(in_data,dtype=int,delimiter=",",names="a,b,c")
print (data)
#5.使用列名来处理数据
in_data = StringIO("10,20,30\n56,89,90\n33,46,89")
data = np.genfromtxt(in_data,dtype=int,delimiter=",",names=True)
print (data)
代码输出:
[[10 20 30]
[56 89 90]
[33 46 89]]
[[10 20]
[56 89]
[33 46]]
[(10, 20, 30) (56, 89, 90) (33, 46, 89)]
[(56, 89, 90) (33, 46, 89)]
函数扩展:
genfromtxt函数:Load data from a text file, with missing values handled as specified.
genfromtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
1.唯一必备的参数是数据源的名字,本例中是一个StringIO对象,它可以是一个文件名或者带有read方法的类似于文件的对象,也可以是一个远程的URL。
2.当文件被读取时,genfromtxt将非空行切分成一个字符串序列,空行和注释行会被忽略。我们指定的分隔符将字符串切分为列。常用的分隔符是","和“/t”制表符。函数默认的分隔符是None。
3,列被转换为字符串序列后,列被萃取出来,但是每个独立的列并没有被清除前导或者后导的空格。设置参数autostrip=True有助于避免这类问题。
4.指定跳过前n行或者最后n行,采用headers和footers参数。设置skip_header=n会在读文件时跳过最开始的n行,类似的设置skip_footer=n会跳过最后的n行。
5.usecols可以指定一个包含所需要的列的列表。
6.使用names参数,可以自定义列名,如names="a,b,c".
7.设置names参数为真,输入文件的第一行会被当成列名。
8.Numpy里有一个loadtxt的方法可以方便地从文件中创建NumPy数组。另外,若仅需将数据加载到列表中,可以采用csv库。