利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

6.2 二进制数据格式

实现数据的高效二进制格式存储最简单的办法之一,是使用Python内置的pickle序列化。

pandas对象都有一个用于将数据以pickle格式保存到磁盘上的to_pickle方法:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

通过pickle直接读取被pickle化的数据,或使用更为方便的pandas.read_pickle:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

Ps:pickle仅建议用于短期存储格式。因其很难保证该格式是永远稳定的。

pandas内置支持两个二进制数据格式:HDF5和MessagePack。pandas或Numpy数据的其他存储格式有:

  • bcolz:一种可压缩的列存储二进制格式,基于Blosc压缩库
  • Feather:跨语言的列存储文件格式。其使用了Apache Arrow的列式内存格式。

6.2.1 使用HDF5格式

HDF5是一种存储大规模科学数组数据的非常好的文件格式。它可被作为C标准库,带有许多语言的接口,如Java、Python和Matlab等。

HDF5中的HDF指的是层次型数据格式。每个HDF5文件都含有一个文件系统式的节点结构,使得能够存储多个数据集并支持元数据。

相较其他简单格式,HDF5支持多种压缩器的即时压缩,还能更高效地存储重复模式数据。对于非常大地无法直接放入内存的数据,HDF5可以高效地分块读写。

pandas提供地高级接口HDFStore类,可以像字典一样处理低级的细节,可以简化存储Series和DataFrame对象。(此外,也可用PyTables或h5py库直接访问HDF5文件,不如HDFStore高级简便):

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

Ps:此处需要先安装tables库

HDF5文件中的对象可以通过与字典一样的API进行获取:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

HDFStore支持两种存储模式,‘fixed’和‘table’。后者通常会更慢,但是支持使用特殊语法进行查询操作,如下:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

Ps:put是store['obj2'] = frame方法的显示版本,允许设置其他选项,如格式。

  pandas.read_hdf函数可以快捷使用这些工具:

  利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

  注意:如果需要处理的数据位于远程服务器,比如Amazon S3或HDFS,使用专门为分布式存储(比如Apache Parquet)的二进制格式也许更加合适。

  如需要本地处理海量数据,需好好研究PyTables和h5py。由于许多数据分析问题都是IO密集型(非CPU密集型),利用HDF5这类工具能显著提升应用程序的效率。(HDF5不是数据库,是最适合用作“一次写多次读”的数据集)

6.2.2 读取Microsoft Excel文件

pandas的ExcelFile类或pandas.read_excel函数支持读取存储在Excel2003(或更高版本)中的表格型数据。

这两个工具分别使用扩展包xlrd和openpyxl读取XLS和XLSX文件。需安装这两个包。

1)创建一个实例

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

2)用read_excel读取表单中的数据到DataFrame:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

3)也可将文件名传递到pandas.read_excel:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

问题:如何一次性同时读取一个文件中的多个表单?

    如何同时读取同一个excl中的多个sheet?

4)如果要将pandas数据写入为Excel格式,你必须首先创建一个ExcelWriter,然后用pandas对象的to_excel方法将数据写入其中:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

ps:将frame中的数据copy到ex2.xlsx中

Ps:也可不使用ExcelWriter,而是传递文件的路径到to_excel

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

结果:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2) 

6.3 Web APIs交互

许多网站有一些通过JSON或其他格式提供数据的公共API。通过Python访问这些API的方法很多,较为简单的方法(比较推荐的方法)是requests包。

如,搜索最新的30个GitHub上的pandas主题,可以发一个HTTP GET请求,使用requests扩展库:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

响应对象的json方法会返回一个包含被解析过的JSON字典,加载到一个Python对象中:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

data中的每个元素都是一个包含所有GitHub主题页数据的字典。可以直接传递数据到DataFrame,并提取感兴趣的字段。

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

6.4 数据库交互

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

然后插入几行数据:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

从表中选取数据时, 大部分Python SQL驱动器(PyODBC、psycopg2、MySQLdb、pymssql等)都会返回一个元组列表:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

可将这个元组列表传给DataFrame构造器,但还需要列名(位于光标的description属性中):

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

如果不想每查一次数据库就重写一次,可使用另一个流行的Python SQL工具SQLAlchemy项目。pandas有一个read_sql函数,可以轻松的从SQLAlchemy连接读取数据。

如下,使用SQLAlchemy连接SQLite数据库,并从之前创建的表读取数据:

利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

(这一块需要深入学习)

6.5 总结

访问数据通常是数据分析的第一步。本章已经介绍学习了一些有用的工具,接下来的章节中,将深入研究数据规整、数据可视化、时间序列分析和其他主题。

上一篇:FastClick用法


下一篇:Java消息队列三道面试题详解!