与公众号同步更新,详细内容及相关ipynb文件在公众号中,公众号:AI入门小白
输入输出通常可以划分为几个大类:读取文本文件和其他更高效的磁盘存储格式,加载数据库中的数据,利用Web API操作网络资源。
1、读写文本格式的数据
pandas提供了一些用于将表格型数据读取为DataFrame对象的I函数。下表对它们进行了总结,其中read_csv和read_table可能会是你今后用得最多的。
大致介绍一下这些函数在将文本数据转换为DataFrame时所用到的一些技术。这些函数的选项可以划分为以下几个大类:
• 索引:将一个或多个列当做返回的DataFrame处理,以及是否从文件、用户获取列名。
• 类型推断和数据转换:包括用户定义值的转换、缺失值标记列表等。
• 日期解析: 包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。
• 迭代:支持对大文件进行逐块迭代。
• 不规整数据问题: 跳过一些行、页脚、注释或其他一些不重要的东西(比如由成千上万个逗号隔开的数值数据)。
2、JSON数据
JSON (JavaScript Object Notation的简称)已经成为通过HTTP请求在Web浏览器和其他应用程序之间发送数据的标准格式之一。它是一种比表格型文本格式(如CSV)灵活得多的数据格式。下面是一个例子:
除其空值null和一些其他的细微差别(如列表末尾不允许存在多余的逗号)之外,JSON非常接近于有效的Python代码。基本类型有对象(字典)、数组(列表)、字符串、数值、布尔值以及null。对象中所有的键都必须是字符串。许多Python库都可以读写JSON数据。我将使用json,因为它是构建于Python标准库中的。通过json.loads即可将JSON 字符串转换成Python形式:
3、XML和HTML: Web信息收集
Python有许多可以读写HTML和XML格式数据的库。lxml(http://lxml.de) 就是其中之一,它能够高效且可靠地解析大文件。lxml有多个编程接口。首先我要用lxml.html处理HTML,然后再用lxml.objectify做一些XML处理。
许多网站都将数据放到HTML表格中以便在浏览器中查看,但不能以一种更易于机器阅读的格式(如JSON、HTML或XML) 进行下载。我发现Ya hoo! Finance的股票期权数据就是这样。可能你对这种数据不熟悉:期权是指使你有权从现在开始到未来某个时间(到期日)内以某个特定价格(执行价)买进(看涨期权)或卖出(看跌期权)某公司股票的衍生合约。人们的看涨和看跌期权交易有多种执行价和到期日,这些数据都可以在Yahoo! Finance的各种表格中找到。
首先,找到你希望获取数据的URL,利用urllib2将其打开,然后用lxml解析得到的数据流,如下所示:
通过这个对象,你可以获取特定类型的所有HTML标签 (tag),比如含有所需数据的table标签。给这个简单的例子加点启发性,假设你想得到该文档中所有的URL链接。HTML中的链接是a标签。使用文档根节点的findall方法以及一个XPath(对文档的“查询"的一种表示手段):
但这些是表示HTML元素的对象。要得到URL和链接文本,你必须使用各对象的get方法(针对URL)和text _content方法(针对显示文本):
因此,编写下面这条列表推导式即可获取文档中的全部URL:
4、二进制数据格式
实现数据的二进制格式存储最简单的办法之一是使用Python内置的pickle序列化。为了使用方便,pandas对象都有一个用于将数据以pickle形式保存到磁盘上的to_pickle方法:
可通过另一个也很好用的pickle函数pandas.read_pickle将数据读回到Python:
警告:pickle仅建议用于短期存储格式。其原因是很难保证该格式永远是稳定的;今天pickle的对象可能无法被后续版本的库unpickle出来。虽然我尽力保证这种事情不会发生在pandas中,但是今后的某个时候说不定还是得“打破"该pickle格式。
5、读取Microsoft Excel文件
pandas的ExcelFile类或pandas.read_excel函数⽀持读取存储在Excel 2003(或更⾼版本)中的表格型数据。这两个⼯具分别使⽤扩展包xlrd和openpyxl读取XLS和XLSX⽂件。你可以⽤pip或conda安装它们。要使⽤ExcelFile,通过传递xls或xlsx路径创建⼀个实例:
存储在表单中的数据可以read_excel读取到DataFrame:
如果要读取⼀个⽂件中的多个表单,创建ExcelFile会更快,但你也可以将⽂件名传递到pandas.read_excel:
如果要将pandas数据写⼊为Excel格式,你必须⾸先创建⼀个ExcelWriter,然后使⽤pandas对象的to_excel⽅法将数据写⼊到其中:
还可以不使用ExcelWriter,而是传递文件的路径到to_excel: