利用Python进行数据分析1-数据加载,存储与文件格式

目录

  • 读取文本数据
    • 逐块读取⽂本⽂件
    • 将数据写出到⽂本格式
    • 处理分隔符格式
    • JSON数据
    • XML和HTML:Web信息收集
    • 利⽤lxml.objectify解析XML
  • ⼆进制数据格式
    • 使⽤HDF5格式
    • 读取Microsoft Excel⽂件
  • Web APIs交互
  • 数据库交互

本文参考《利用python进行数据分析》,价格书中所含代码均运行了一遍,其中Web APIs交互部分的网站无法访问所以未展示我的运行结果。为了笔记所以在此记录。

读取文本数据

pandas提供了⼀些⽤于将表格型数据读取为DataFrame对象的函数。

函数 说明
read_csv 从文件、URL、 文件型对象中加载带分隔符的数据。默认分隔符为逗号
read_table 从文件、URL、 文件型对象中加载带分隔符的数据。默认分隔符为制表符(t)
read_fwf 读取定宽列格式数据(也就是说没有分隔符)
read_clipboard 读取剪贴板中的教据,可以看做read tatle的剪贴板版。再将网页转挽为表格时很有用
read_excel 从Exced XLS或XLSX fle读取表格数据
read_hdf 读取pandas写的HDF5文件
read_html 读取HTML文档中的所有表格
read_json 读取JSON(JavaScipt Object Notatiom)字符串中的数据
read_msgpack 二进制格式编码的pandas数据
read_pickle 读取Pythom pickle中存储的任意对象
resd_sas 读取存储于SAS系统自定义存储格式的SAS数据集
read_sql (使用SQL Aldemy)读取SQL查询结果为pands的DataFrame
read_stata 读取Stata文件格式的数据集
red_feather 读取eather进制文件格式

我将⼤致介绍⼀下这些函数在将⽂本数据转换为DataFrame时所⽤到的⼀些技术。这些函数的选项可以划分为以下⼏个⼤类:
索引:将⼀个或多个列当做返回的DataFrame处理,以及是
否从⽂件、⽤户获取列名。
1、 类型推断和数据转换:包括⽤户定义值的转换、和⾃定义的缺失值标记列表等。
2、 ⽇期解析:包括组合功能,⽐如将分散在多个列中的⽇期时间信息组合成结果中的单个列。
3、 迭代:⽀持对⼤⽂件进⾏逐块迭代。
4、 不规整数据问题:跳过⼀些⾏、⻚脚、注释或其他⼀些不重要的东⻄(⽐如由成千上万个逗号隔开的数值数据)。因为⼯作中实际碰到的数据可能⼗分混乱,⼀些数据加载函数(尤其read_csv)的选项逐渐变得复杂起来。⾯对不同的参数,感到头痛很正常(read_csv有超过50个参数)。pandas⽂档有这些参数的例⼦,如果你感到阅读某个⽂件很难,可以通相似的⾜够多的例⼦找到正确的参数。

⽇期和其他⾃定义类型的处理需要多花点⼯夫才⾏。⾸先我们来看⼀个以逗号分隔的(CSV)⽂本⽂件:(在Windows系统中利用type查看文件内容)

利用Python进行数据分析1-数据加载,存储与文件格式_第1张图片

由于该⽂件以逗号分隔,所以我们可以使⽤read_csv将其读⼊⼀个DataFrame:
利用Python进行数据分析1-数据加载,存储与文件格式_第2张图片

我们还可以使⽤read_table,并指定分隔符:
利用Python进行数据分析1-数据加载,存储与文件格式_第3张图片
并不是所有⽂件都有标题⾏。看看下⾯这个⽂件:
在这里插入图片描述
读⼊该⽂件的办法有两个。你可以让pandas为其分配默认的列名,也可以⾃⼰定义列名:
利用Python进行数据分析1-数据加载,存储与文件格式_第4张图片利用Python进行数据分析1-数据加载,存储与文件格式_第5张图片
假设你希望将message列做成DataFrame的索引。你可以明确表要将该列放到索引4的位置上,也可以通过index_col参数指定"message":
利用Python进行数据分析1-数据加载,存储与文件格式_第6张图片
如果希望将多个列做成⼀个层次化索引,只需传⼊由列编号或列名组成的列表即可:
利用Python进行数据分析1-数据加载,存储与文件格式_第7张图片
有些情况下,有些表格可能不是⽤固定的分隔符去分隔字段的(⽐如空⽩符或其他模式)。有些表格可能不是⽤固定的分隔符去分隔字段的(⽐如空⽩符或其他模式来分隔字段)。看看下⾯这个⽂本⽂件:
利用Python进行数据分析1-数据加载,存储与文件格式_第8张图片
虽然可以⼿动对数据进⾏规整,这⾥的字段是被数量不同的空⽩字符间隔开的。这种情况下,你可以传递⼀个正则表达式作为read_table的分隔符。可以⽤正则表达式表达为\s+,于是有:
利用Python进行数据分析1-数据加载,存储与文件格式_第9张图片
这⾥,由于列名⽐数据⾏的数量少,所以read_table推断第⼀列应是DataFrame的索引。这⾥,由于列名⽐数据⾏的数量少,所以read_table推断第⼀列应该是DataFrame的索引。这些解析器函数还有许多参数可以帮助你处理各种各样的异形⽂件格式(下表列出了⼀些)。⽐如说,你可以⽤skiprows跳过⽂件的第⼀⾏、第三⾏和第四⾏:
利用Python进行数据分析1-数据加载,存储与文件格式_第10张图片
缺失值处理是⽂件解析任务中的⼀个重要组成部分。缺失数据经常是要么没有(空字符串),要么⽤某个标记值表示。默认情况下,pandas会⽤⼀组经常出现的标记值进⾏识别,⽐如NA及NULL
利用Python进行数据分析1-数据加载,存储与文件格式_第11张图片
利用Python进行数据分析1-数据加载,存储与文件格式_第12张图片
na_values可以⽤⼀个列表或集合的字符串表示缺失值:
利用Python进行数据分析1-数据加载,存储与文件格式_第13张图片
字典的各列可以使⽤不同的NA标记值:
利用Python进行数据分析1-数据加载,存储与文件格式_第14张图片
我们常用的是read_csv以及read_table,下面我们列出两者常用的选项。

参数 说明
path 表示文件系统位置,URL,文件型对象的字符串
sep or delimiter 对于行中各个字段可进行拆分的字符序列或正则表达式
header 用作列名的行号,默认为0,若没有header行就应该设置为None
index_col 用作行索引的列编号或列名。可以是单个名称/数字或由多个名称/数字组成的列表(层次化索引)
names 用于结果的列名列表,结合 header=None
skirrows 需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)
na_values 一组用于替换NA的值
comment 用于将注释信息从行尾拆分出去的字符(一个或多个)
parse_dates 尝试将数据解析为日期,默认为Fase。如果为True,则尝试解析所有列。此外,还可以指定需要解析的一组列号或列名。如果列表的元素为列表或元组,就会将多个列组合到一起再进行日期解析工作(例如,日期/时间分别位于两个列中)
keep_ date_col 如果连接多列解析日期,则保持参与连接的列。默认为 False
converters 由列号/列名跟函数之间的映射关系组成的字典。例如,foo:f)会对foo列的所有值应用函数f
dayfirst 当解析有歧义的日期时,将其看做国际格式(例如7/6/2012→June7.2012),默认为 False
date_parser 用于解析日期的函数
nrows 需要读取的行数(从文件开始处算起)
iterator 返回一个 Text Parser以便逐块读取文件
chunksize 文件块的大小(用于选代)
skip_footer 需要忽略的行数(从文件末尾处算起)
verbose 打印各种解析器输出的信息
encoding 用于Unicode的文本编码格式
squeeze 如果数据解析后仅仅含有一列则返回Series
thousands 千分位分隔符

逐块读取⽂本⽂件

在处理很⼤的⽂件时,或找出⼤⽂件中的参数集以便于后续处理时,你可能只想读取⽂件的⼀⼩部分或逐块对⽂件进⾏迭代。
在看⼤⽂件之前,我们先设置pandas显示地更紧些:
在这里插入图片描述
然后有:
利用Python进行数据分析1-数据加载,存储与文件格式_第15张图片
如果只想读取⼏⾏(避免读取整个⽂件),通过nrows进⾏指定即可:
利用Python进行数据分析1-数据加载,存储与文件格式_第16张图片
要逐块读取⽂件,可以指定chunksize(⾏数):
在这里插入图片描述
read_csv所返回的这个TextParser对象使你可以根据chunksize对⽂件进⾏逐块迭代。⽐如说,我们可以迭代处理ex6.csv,将值计数聚合到"key"列中,如下所示:
利用Python进行数据分析1-数据加载,存储与文件格式_第17张图片
然后有:
利用Python进行数据分析1-数据加载,存储与文件格式_第18张图片
TextParser还有⼀个get_chunk⽅法,它使你可以读取任意⼤⼩的块。

将数据写出到⽂本格式

数据也可以被输出为分隔符格式的⽂本。我们再来看看之前读过的⼀个CSV⽂件:
利用Python进行数据分析1-数据加载,存储与文件格式_第19张图片
利⽤DataFrame的to_csv⽅法,我们可以将数据写到⼀个以逗号分隔的⽂件中:
利用Python进行数据分析1-数据加载,存储与文件格式_第20张图片
当然,还可以使⽤其他分隔符(由于这⾥直接写出到sys.stdout所以仅仅是打印出⽂本结果⽽已):
利用Python进行数据分析1-数据加载,存储与文件格式_第21张图片
缺失值在输出结果中会被表示为空字符串。你可能希望将其表示为别的标记值:
利用Python进行数据分析1-数据加载,存储与文件格式_第22张图片
如果没有设置其他选项,则会写出⾏和列的标签。当然,它们也都可以被禁⽤:
在这里插入图片描述
此外,你还可以只写出⼀部分的列,并以你指定的顺序排列:
利用Python进行数据分析1-数据加载,存储与文件格式_第23张图片
Series也有⼀个to_csv⽅法:
利用Python进行数据分析1-数据加载,存储与文件格式_第24张图片

处理分隔符格式

⼤部分存储在磁盘上的表格型数据都能⽤pandas.read_table进⾏加载。然⽽,有时还是需要做⼀些⼿⼯处理。由于接收到含有畸形的⽂件⽽使read_table出⽑病的情况并不少⻅。为了说明这些基本⼯具,看看下⾯这个简单的CSV:
在这里插入图片描述
对于任何单字符分隔符⽂件,可以直接使⽤Python内置的csv模块。将任意已打开的⽂件或⽂件型的对象传给csv.reader:
在这里插入图片描述
对这个reader进⾏迭代将会为每⾏产⽣⼀个元组(并移除了所有的引号):
利用Python进行数据分析1-数据加载,存储与文件格式_第25张图片
现在,为了使数据格式合乎要求,你需要对其做⼀些整理⼯作。我们⼀步⼀步来做。⾸先,读取⽂件到⼀个多⾏的列表中:
在这里插入图片描述
然后,我们将这些⾏分为标题⾏和数据⾏:
在这里插入图片描述
然后,我们可以⽤字典构造式和zip(*values),后者将⾏转置为列,创建数据列的字典:
在这里插入图片描述
CSV⽂件的形式有很多。只需定义csv.Dialect的⼀个⼦类即可定义出新格式(如专⻔的分隔符、字符串引⽤约定、⾏结束符等):
在这里插入图片描述
各个CSV语⽀的参数也可以关键字的形式提供给csv.reader,⽽⽆需定义⼦类:
在这里插入图片描述
可⽤的选项(csv.Dialect的属性)及其功能如下表所示。

参数 说明
delimiter 用于分隔字段的单字符字符串。默认为“,“
lineterminator 用于写操作的行结束符,默认为"\r\n",读操作将忽略此选项,它能认出跨平台的行结束符
quotechar 用于带有特殊字符(如分隔符)的字段的引用符号。默认为"."
quoting 引用约定。可选值包括csv. QUOTE ALL(引用所有字段)、csvQUOTE MINIMAL(只引用带有诸如分隔符之类特殊字符的字段)CSV. QUOTE NONNUMERIC以及 CSV. QUOTE NON(不引用),完整信息请参考 Python的文档。默认为 QUOTE MINIMAL
skipinitialspace 忽略分隔符后面的空白符。默认为False
doublequote 如何处理字段内的引用符号。如果为True,则双写,完整信息及行为请参见在线文档
escapechar 用于对分隔符进行转义的字符串(如果 quoting被设置为 CSV QUOTENONE的话),默认禁用

要⼿⼯输出分隔符⽂件,你可以使⽤csv.writer。它接受⼀个已打开且可写的⽂件对象以及跟csv.reader相同的那些语⽀和格式化选项:
利用Python进行数据分析1-数据加载,存储与文件格式_第26张图片

JSON数据

JSON(JavaScript Object Notation的简称)已经成为通过HTTP请求在Web浏览器和其他应⽤程序之间发送数据的标准格式之⼀。它是⼀种⽐表格型⽂本格式(如CSV)灵活得多的数据格式。下⾯是⼀个例⼦:

利用Python进行数据分析1-数据加载,存储与文件格式_第27张图片
json.dumps则将Python对象转换成JSON格式:
在这里插入图片描述
如何将(⼀个或⼀组)JSON对象转换为DataFrame或其他便于分析的数据结构就由你决定了。最简单⽅便的⽅式是:向DataFrame构造器传⼊⼀个字典的列表(就是原先的JSON对象),并选取数据字段的⼦集:
利用Python进行数据分析1-数据加载,存储与文件格式_第28张图片
pandas.read_json可以⾃动将特别格式的JSON数据集转换为Series或DataFrame。例如:
在这里插入图片描述
pandas.read_json的默认选项假设JSON数组中的每个对象是表格中的⼀⾏:
利用Python进行数据分析1-数据加载,存储与文件格式_第29张图片
如果你需要将数据从pandas输出到JSON,可以使⽤to_json⽅法:
利用Python进行数据分析1-数据加载,存储与文件格式_第30张图片

XML和HTML:Web信息收集

Python有许多可以读写常⻅的HTML和XML格式数据的库,包lxml、Beautiful Soup和html5lib。lxml的速度⽐较快,但其它的库处理有误的HTML或XML⽂件更好。pandas有⼀个内置的功能,read_html,它可以使⽤lxml和Beautiful Soup⾃动将HTML⽂件中的表格解析为DataFrame对象。为了进⾏展示,我从美国联邦存款保险公司下载了⼀个HTML⽂件(pandas⽂档中也使⽤过),它记录了银⾏倒闭的情况。
pandas.read_html有⼀些选项,默认条件下,它会搜索、尝试解析<‘table>标签内的的表格数据。结果是⼀个列表的DataFrame对象:
利用Python进行数据分析1-数据加载,存储与文件格式_第31张图片
因为failures有许多列,pandas插⼊了⼀个换⾏符\。
这⾥,我们可以做⼀些数据清洗和分析(后⾯会进⼀步讲解),⽐如计算按年份计算倒闭的银⾏数:
利用Python进行数据分析1-数据加载,存储与文件格式_第32张图片

利⽤lxml.objectify解析XML

XML(Extensible Markup Language)是另⼀种常⻅的⽀持分层、嵌套数据以及元数据的结构化数据格式。前⾯,我介绍了pandas.read_html函数,它可以使⽤lxml或Beautiful Soup从HTML解析数据。XML和HTML的结构很相似,danXML更为通⽤。这⾥,我会⽤⼀个例⼦演示如何利⽤lxml从XML格式解析数据。纽约⼤都会运输署发布了⼀些有关其公交和列⻋服务的数据资料http://www.mta.info/developers/download.html这⾥,我们将看看包含在⼀组XML⽂件中的运⾏情况数据。每项列⻋或公交服务都有各⾃的⽂件(如Metro-North Railroad的⽂件是Performance_MNR.xml),其中每条XML记录就是⼀条⽉度数。
利用Python进行数据分析1-数据加载,存储与文件格式_第33张图片
我们先⽤lxml.objectify解析该⽂件,然后通过getroot得到该XML⽂件的根节点的引⽤:
在这里插入图片描述
root.INDICATOR返回⼀个⽤于产⽣各个<'INDICATOR>XML元素的⽣成器。对于每条记录,我们可以⽤标记名(如YTD_ACTUAL)和数据值填充⼀个字典(排除⼏个标记):
利用Python进行数据分析1-数据加载,存储与文件格式_第34张图片
最后,将这组字典转换为⼀个DataFrame:
利用Python进行数据分析1-数据加载,存储与文件格式_第35张图片
XML数据可以⽐本例复杂得多。每个标记都可以有元数据。看看下⾯这个HTML的链接标签(它也算是⼀段有效的XML):
在这里插入图片描述
现在就可以访问标签或链接⽂本中的任何字段了(如href):
利用Python进行数据分析1-数据加载,存储与文件格式_第36张图片

⼆进制数据格式

实现数据的⾼效⼆进制格式存储最简单的办法之⼀是使⽤Python置的pickle序列化。pandas对象都有⼀个⽤于将数据以pickle格式保存到磁盘上的to_pickle⽅法:
利用Python进行数据分析1-数据加载,存储与文件格式_第37张图片
你可以通过pickle直接读取被pickle化的数据,或是使⽤更为⽅便的pandas.read_pickle:
利用Python进行数据分析1-数据加载,存储与文件格式_第38张图片
pickle仅建议⽤于短期存储格式。其原因是很难保证该格式永远是稳定的;今天pickle的对象可能⽆法被后续版本的库unpickle出来。

pandas内置⽀持两个⼆进制数据格式:HDF5和MessagePack。下面,我会给出⼏个HDF5的例⼦,但我建议你尝试下不同的⽂件格式,看看它们的速度以及是否适合你的分析⼯作。
pandas或NumPy数据的其它存储格式有:
bcolz:⼀种可压缩的列存储⼆进制格式,基于Blosc压缩库。Feather:⼀种跨语⾔的列存储⽂件格式。Feather使⽤了Apache Arrow的列式内存格式。

使⽤HDF5格式

HDF5是⼀种存储⼤规模科学数组数据的⾮常好的⽂件格式。它可以被作为C库,带有许多语⾔的接⼝,如Java、Python和MATLAB等。HDF5中的HDF指的是层次型数据格式(hierarchical data format)。每个HDF5⽂件都含有⼀个⽂件系统式的节点结构,它使你能够存储多个数据集并⽀持元数据。与其他简单格式相⽐,HDF5⽀持多种压缩器的即时压缩,还能更⾼效地存储重复模式数据。对于那些⾮常⼤的⽆法直接放⼊内存的数据集,HDF5就是不错的选择,因为它可以⾼效地分块读写。
虽然可以⽤PyTables或h5py库直接访问HDF5⽂件,pandas提供了更为⾼级的接⼝,可以简化存储Series和DataFrame对象。
HDFStore类可以像字典⼀样,处理低级的细节:
利用Python进行数据分析1-数据加载,存储与文件格式_第39张图片
HDF5⽂件中的对象可以通过与字典⼀样的API进⾏获取:
利用Python进行数据分析1-数据加载,存储与文件格式_第40张图片
HDFStore⽀持两种存储模式,‘fixed’和’table’。后者通常会更慢,但是⽀持使⽤特殊语法进⾏查询操作:
利用Python进行数据分析1-数据加载,存储与文件格式_第41张图片在这里插入图片描述
put是store[‘obj2’] = frame⽅法的显示版本,允许我们设置其它的选项,⽐如格式。
pandas.read_hdf函数可以快捷使⽤这些⼯具:
利用Python进行数据分析1-数据加载,存储与文件格式_第42张图片
如果需要本地处理海量数据,建议好好研究⼀下PyTables和h5py,看看它们能满⾜你的哪些需求。。由于许多数据分析问题都是IO密集型(⽽不是CPU密集型),利⽤HDF5这样的⼯具能显著提升应⽤程序的效率。
注意:HDF5不是数据库。它最适合⽤作“⼀次写多次读”的数据集。虽然数据可以在任何时候被添加到⽂件中,但如果同时发⽣多个写操作,⽂件就可能会被破坏。

读取Microsoft Excel⽂件

pandas的ExcelFile类或pandas.read_excel函数⽀持读取存储在Excel 2003(或更⾼版本)中的表格型数据。这两个⼯具分别使⽤扩展包xlrd和openpyxl读取XLS和XLSX⽂件。
要使⽤ExcelFile,通过传递xls或xlsx路径创建⼀个实例:
在这里插入图片描述
存储在表单中的数据可以read_excel读取到DataFrame:
利用Python进行数据分析1-数据加载,存储与文件格式_第43张图片
如果要读取⼀个⽂件中的多个表单,创建ExcelFile会更快,但也可以将⽂件名传递到pandas.read_excel:
利用Python进行数据分析1-数据加载,存储与文件格式_第44张图片
如果要将pandas数据写⼊为Excel格式,⾸先创建⼀个ExcelWriter,然后使⽤pandas对象的to_excel⽅法将数据写⼊到其中:
在这里插入图片描述
可以不使⽤ExcelWriter,⽽是传递⽂件的路径到to_excel:
在这里插入图片描述

Web APIs交互

许多⽹站都有⼀些通过JSON或其他格式提供数据的公共API。通过Python访问这些API的办法有不少。⼀个简单易⽤的办法(推荐)是requests包(http://docs.python-requests.org)。
为了搜索最新的30个GitHub上的pandas主题,可以发⼀个HTTP GET请求,使⽤requests扩展库:
在这里插入图片描述
(现在该网址已经无法访问)若访问成功则:
在这里插入图片描述
响应对象的json⽅法会返回⼀个包含被解析过的JSON字典,加
载到⼀个Python对象中:
在这里插入图片描述在这里插入图片描述

data中的每个元素都是⼀个包含所有GitHub主题⻚数据(不包含评论)的字典。我们可以直接传递数据到DataFrame,并提取感兴趣的字段:

利用Python进行数据分析1-数据加载,存储与文件格式_第45张图片
花费⼀些精⼒,你就可以创建⼀些更⾼级的常⻅的Web API的接⼝,返回DataFrame对象,⽅便进⾏分析。

数据库交互

在商业场景下,⼤多数数据可能不是存储在⽂本或Excel⽂件中。基于SQL的关系型数据库(如SQL Server、PostgreSQL和MySQ等)使⽤⾮常⼴泛,其它⼀些数据库也很流⾏。数据库的选择通常取决于性能、数据完整性以及应⽤程序的伸缩性需求。
将数据从SQL加载到DataFrame的过程很简单,此外pandas还有⼀些能够简化该过程的函数。例如,我将使⽤SQLite数据库(通过Python内置的sqlite3驱动器):
利用Python进行数据分析1-数据加载,存储与文件格式_第46张图片
然后插⼊⼏⾏数据:
利用Python进行数据分析1-数据加载,存储与文件格式_第47张图片
从表中选取数据时,⼤部分Python SQL驱动器(PyODBC,psycopg2,MySQLdb,pymssql等)都会返回⼀个元组列表:
利用Python进行数据分析1-数据加载,存储与文件格式_第48张图片
可以将这个元组列表传给DataFrame构造器,但还需要列名(位于光标的description属性中):
利用Python进行数据分析1-数据加载,存储与文件格式_第49张图片
这种数据规整操作相当多,你肯定不想每查⼀次数据库就重写⼀次。SQLAlchemy项⽬是⼀个流⾏的Python SQL⼯具,它抽象出了SQL数据库中的许多常⻅差异。pandas有⼀个read_sql函数,可以让你轻松的从SQLAlchemy连接读取数据。
这⾥,我们⽤SQLAlchemy连接SQLite数据库,并从之前创建的表读取数据:
利用Python进行数据分析1-数据加载,存储与文件格式_第50张图片

访问数据通常是数据分析的第⼀步。在本文中,我们已经学了⼀些有⽤的⼯具。在接下来的博客中,我们将深⼊研究数据规整、数据可视化、时间序列分析和其它主题。

你可能感兴趣的:(利用Python进行数据分析)