JSON数据

我们在日常的开发中,经常会用到JSON数据,JSON已经成为通过HTTP请求在Web浏览器和其他应用程序之间发送数据的标准格式之一。它是一种比表格更加灵活可变的数据格式。下面给一个小例子:

obj = """
{"name": "Wes","places_lived": ["United States", "Spain", "Germany"],"pet": null,"siblings": [{"name": "Scott", "age": 30, "pets": ["Zeus", "Zuko"]},{"name": "Katie", "age": 38,"pets": ["Sixes", "Stache", "Cisco"]}]
}
"""

除其空值null和一些其他的细微差别(如列表末尾不允许存在多余的逗号)之外,JSON非常接近于有效的Python代码。基本类型有对象(字典)、数组(列表)、字符串、数值、布尔值以及null。对象中所有的键都必须是字符串。许多Python库都可以读写JSON数据。我将使用json,因为它是构建于Python标准库中的。通过json.loads即可将JSON字符串转换成Python形式:

In [62]: import jsonIn [63]: result = json.loads(obj)In [64]: result
Out[64]:
{'name': 'Wes','pet': None,'places_lived': ['United States', 'Spain', 'Germany'],'siblings': [{'age': 30, 'name': 'Scott', 'pets': ['Zeus', 'Zuko']},{'age': 38, 'name': 'Katie', 'pets': ['Sixes', 'Stache', 'Cisco']}]}

json.dumps则将Python对象转换成JSON格式:

In [65]: asjson = json.dumps(result)

如何将(一个或一组)JSON对象转换为DataFrame或其他便于分析的数据结构就由你决定了。最简单方便的方式是:向DataFrame构造器传入一个字典的列表(就是原先的JSON对象),并选取数据字段的子集:

In [66]: siblings = pd.DataFrame(result['siblings'], columns=['name', 'age'])In [67]: siblings
Out[67]: name  age
0  Scott   30
1  Katie   38

pandas.read_json可以自动将特别格式的JSON数据集转换为Series或DataFrame。例如:

In [68]: !type examples/example.json
[{"a": 1, "b": 2, "c": 3},{"a": 4, "b": 5, "c": 6},{"a": 7, "b": 8, "c": 9}]

pandas.read_json的默认选项假设JSON数组中的每个对象是表格中的一行:

In [69]: data = pd.read_json('examples/example.json')In [70]: data
Out[70]: a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

如果你需要将数据从pandas输出到JSON,可以使用to_json方法:

In [71]: print(data.to_json())
{"a":{"0":1,"1":4,"2":7},"b":{"0":2,"1":5,"2":8},"c":{"0":3,"1":6,"2":9}}In [72]: print(data.to_json(orient='records'))
[{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6},{"a":7,"b":8,"c":9}]

XML、HTML

Python有很多可以读写常见的XML、HTML格式数据的库。包括lxml、Beautiful Soup和html5lib。lxml的速度比较快,但其它的库处理有误的HTML或XML文件更好。

pandas有一个内置的功能,read_html,它可以使用lxml和Beautiful Soup自动将HTML文件中的表格解析为DataFrame对象。为了进行展示,我从美国联邦存款保险公司下载了一个HTML文件(pandas文档中也使用过),它记录了银行倒闭的情况。首先,你需要安装read_html用到的库:

conda install lxml
pip install beautifulsoup4 html5lib

如果你用的不是conda,可以使用pip install lxml

pandas.read_html有一些选项,默认条件下,它会搜索、尝试解析标签内的的表格数据。结果是一个列表的DataFrame对象:

In [73]: tables = pd.read_html('examples/fdic_failed_bank_list.html')In [74]: len(tables)
Out[74]: 1In [75]: failures = tables[0]In [76]: failures.head()
Out[76]: Bank Name             City  ST   CERT  \
0                   Allied Bank         Mulberry  AR     91
1  The Woodbury Banking Company         Woodbury  GA  11297
2        First CornerStone Bank  King of Prussia  PA  35312
3            Trust Company Bank          Memphis  TN   9956
4    North Milwaukee State Bank        Milwaukee  WI  20364   Acquiring Institution        Closing Date       Updated Date
0                         Today's Bank  September 23, 2016  November 17, 2016
1                          United Bank     August 19, 2016  November 17, 2016
2  First-Citizens Bank & Trust Company         May 6, 2016  September 6, 2016
3           The Bank of Fayette County      April 29, 2016  September 6, 2016
4  First-Citizens Bank & Trust Company      March 11, 2016      June 16, 2016

因为failures有许多列,pandas插入了一个换行符\。

这里,我们可以做一些数据清洗和分析(后面章节会进一步讲解),比如计算按年份计算倒闭的银行数:

In [77]: close_timestamps = pd.to_datetime(failures['Closing Date'])In [78]: close_timestamps.dt.year.value_counts()
Out[78]:
2010    157
2009    140
2011     92
2012     51
2008     25...
2004      4
2001      4
2007      3
2003      3
2000      2
Name: Closing Date, Length: 15, dtype: int64

利用lxml.objectify解析XML

XML(Extensible Markup Language)是另一种常见的支持分层、嵌套数据以及元数据的结构化数据格式。本书所使用的这些文件实际上来自于一个很大的XML文档。

前面,我介绍了pandas.read_html函数,它可以使用lxml或Beautiful Soup从HTML解析数据。XML和HTML的结构很相似,但XML更为通用。这里,我会用一个例子演示如何利用lxml从XML格式解析数据。

纽约大都会运输署发布了一些有关其公交和列车服务的数据资料(http://www.mta.info/developers/download.html),其中每条XML记录就是一条月度数据,如下所示:

<INDICATOR><INDICATOR_SEQ>373889</INDICATOR_SEQ><PARENT_SEQ></PARENT_SEQ><AGENCY_NAME>Metro-North Railroad</AGENCY_NAME><INDICATOR_NAME>Escalator Availability</INDICATOR_NAME><DESCRIPTION>Percent of the time that escalators are operationalsystemwide. The availability rate is based on physical observations performedthe morning of regular business days only. This is a new indicator the agencybegan reporting in 2009.</DESCRIPTION><PERIOD_YEAR>2011</PERIOD_YEAR><PERIOD_MONTH>12</PERIOD_MONTH><CATEGORY>Service Indicators</CATEGORY><FREQUENCY>M</FREQUENCY><DESIRED_CHANGE>U</DESIRED_CHANGE><INDICATOR_UNIT>%</INDICATOR_UNIT><DECIMAL_PLACES>1</DECIMAL_PLACES><YTD_TARGET>97.00</YTD_TARGET><YTD_ACTUAL></YTD_ACTUAL><MONTHLY_TARGET>97.00</MONTHLY_TARGET><MONTHLY_ACTUAL></MONTHLY_ACTUAL>
</INDICATOR>

我们先用lxml.objectify解析该文件,然后通过getroot得到该XML文件的根节点的引用:

from lxml import objectifypath = 'datasets/mta_perf/Performance_MNR.xml'
parsed = objectify.parse(open(path))
root = parsed.getroot()

root.INDICATOR返回一个用于产生各个XML元素的生成器。对于每条记录,我们可以用标记名(如YTD_ACTUAL)和数据值填充一个字典(排除几个标记):

data = []skip_fields = ['PARENT_SEQ', 'INDICATOR_SEQ','DESIRED_CHANGE', 'DECIMAL_PLACES']for elt in root.INDICATOR:el_data = {}for child in elt.getchildren():if child.tag in skip_fields:continueel_data[child.tag] = child.pyvaldata.append(el_data)

最后,将这组字典转换为一个DataFrame:

In [81]: perf = pd.DataFrame(data)In [82]: perf.head()
Out[82]:
Empty DataFrame
Columns: []
Index: []

XML数据可以比本例复杂得多。每个标记都可以有元数据。看看下面这个HTML的链接标签(它也算是一段有效的XML):

from io import StringIO
tag = '<a href="http://www.baidu.com">Baidu</a>'
root = objectify.parse(StringIO(tag)).getroot()

现在就可以访问标签或链接文本中的任何字段了(如href):

In [84]: root
Out[84]: <Element a at 0x7f6b15817748>In [85]: root.get('href')
Out[85]: 'http://www.baidu.com'In [86]: root.text
Out[86]: 'Baidu'

啃书:《利用python进行数据分析》第六章——数据加载(三)相关推荐

  1. 《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式

    第1章 准备工作 第2章 Python语法基础,IPython和Jupyter 第3章 Python的数据结构.函数和文件 第4章 NumPy基础:数组和矢量计算 第5章 pandas入门 第6章 数 ...

  2. 利用python进行数据分析——第13章 python建模库介绍

    文章目录 一.pandas与建模代码的结合 二.使用patsy创建模型描述 2.1Patsy公式中的数据转换 2.2分类数据与Patsy 三.statsmodels介绍 3.1评估线性模型 3.2评估 ...

  3. 《利用python进行数据分析》——第6章 数据加载、存储与文件格式——读书笔记

    第6章 数据加载.存储与文件格式 6.1 读写文本格式的数据 pandas提供了一些用于将表格型数据读取为DataFrame对象的函数. 其中read_csv和read_talbe用得最多 panda ...

  4. Knockout应用开发指南 第六章:加载或保存JSON数据

    原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...

  5. 利用python进行数据分析数据集_《利用Python进行数据分析》终章·数据分析案例·学习笔记(二)...

    一.第14章 数据分析案例 本书正文的最后一章,我们来看一些真实世界的数据集.对于每个数据集,我们会用之前介绍的方法,从原始数据中提取有意义的内容.展示的方法适用于其它数据集,也包括你的.本章包含了一 ...

  6. 第六篇 数据加载、存储与⽂件格式

    输⼊输出通常可以划分为⼏个⼤类:读取⽂本⽂件和其他更⾼效的磁盘存储格式,加载数据库中的数据,利⽤Web API操作⽹络资源. 一.读写文本格式的数据 pandas提供了⼀些⽤于将表格型数据读取为Dat ...

  7. 动手学数据分析(一)- 数据加载及探索性数据分析

    1 初心 本系列笔记用于记录自己第一次参加Datawhale的组队学习.自己马上开启研究生学习生涯,因此熟练掌握数据分析这一重要技能对未来的学习能够提供很大的帮助,Datawhale团队在项目初衷里说 ...

  8. 啃书:《利用Python进行数据分析》第一章

    1.1本书内容 本书系统阐述了Python进行数据控制.处理.整理.分析等多方面的具体细节和基本要点.我再学习这本书的过程中进行一个汇总和总结,通过笔记来强化牢记知识点. 数据的类别 本书中出现的数据 ...

  9. 利用python进行数据分析——第11章时间序列

    文章目录 时间序列 一.日期和时间数据类型及工具 1.1字符串与datetime互相转换 二.时间序列基础 2.1索引.选取.子集构造 2.2 含有重复索引的时间序列 三.日期的范围.频率以及移动 3 ...

最新文章

  1. DOS命令-创建删除文件和文件夹
  2. 前端二十九:两个盒子居中的练习
  3. 7.使用php描述冒泡排序,PHP 数据结构 算法描述 冒泡排序 bubble sort
  4. [NOI 2017]整数
  5. C++为什么空格无法输出_OOP 面向对象编程:由 C 到 C++
  6. vps如何linux内核4.19,Linux kernel 4.19 RC1 发布,一个相当大的版本
  7. 西威变频器 服务器显示,西威变频器故障查询及操作方法;
  8. matlab gpu加速,Matlab之GPU加速方法
  9. 基础软件“好用”指南:必须跨越这两道鸿沟!
  10. 首日回顾:新一代区块链开发平台初步建成 | ArcBlock Devcon 2020
  11. ASO优化秘籍:0成本让一个马甲包月新增15w+自然用户
  12. html5 人脸活体识别,基于HTML5的人脸识别活体认证的实现方法.pdf
  13. edgy trees_在Ubuntu Edgy上安装TrueCrypt
  14. HTML5中的SVG是什么?
  15. 世界 6 大航空动力巨头企业
  16. Windows 11 任务栏、菜单栏无故消失解决方案
  17. echarts地图导航飞线与层级穿透
  18. 基于阿里云生态构建网聚宝业务监控系统
  19. 中国广告公司恶意感染8500万台手机:月赚200万
  20. OpenCV Error:(mtype == CV_8U || mtype == CV_8S) _mask.sameSize(*psrc1) in function ‘binary_op‘

热门文章

  1. 标签传播算法(LPA)
  2. 第二章计算机网络答案,计算机网络第二章作业参考答案
  3. HAN:Heterogeneous Graph Attention Network 算法理论
  4. 双循环是什么意思c语言,什么是双循环
  5. PyGmae:有限状态机实践(十三)
  6. Lambda表达式_Stream流_File类
  7. 323篇论文被ACM全部撤稿!放眼望去都是中国作者,原因令人无语...
  8. 关于射频和微波PCB设计注意事项
  9. 正在保存备份的驱动器与启动计算机,如何备份Mac
  10. 会写Python代码的人工智能Kite宣布支持Linux,“程序猿”要失业了?