当您开始使用丰富多样的开放数据集时,CSV、JSON 和 XML 等格式术语就会泛滥成灾。如何有效地阅读它们,为后续的整理和分析做准备?这篇文章一步一步的给大家展示了这个过程,大家也可以自己动手实践一下。

需要
人工智能的算法再高明,没有数据,“无米难煮”。

数据很宝贵,开放数据尤其宝贵。无论是公众号、微博还是朋友圈,很多人一听到“开放数据”、“数据资源”、“数据链接”等关键词,都激动不已。
终于拿到梦寐以求的数据链接后,你会发现下载的数据可能有各种奇怪的格式。
最常见的有以下几种:
您希望能够调用来清理和分析它们,从而完成您自己的“数据炼金术”。
第一步是学习如何阅读这些开放数据格式。
在本文中,我们将使用实际的开放数据示例,向您介绍如何将三种常见的网络开放数据格式CSV、XML和JSON读入结构化数据框,方便您后续分析。操作。
你准备好尝试了吗?
数据
我们选择的开放数据平台,是的。

是一个财经数据平台。这包括昂贵的和付费的数据,以及大量免费的开放数据。
您需要免费注册一个帐户才能正常访问其免费数据收集。

要注册,只需填写上面的表格。注册后,使用您的新帐户和密码登录。
登录后,点击首页“核心数据”部分的“数据”。

您将立即看到令人眼花缭乱的数据集合。

不要太高兴。仔细看数据集右侧的标签,首页基本都是“”(仅限会员),只有付费用户才能使用。
您无需自己翻页即可找到免费的开放数据。单击页面左上角过滤器 ( ) 下的“免费”选项。
这次显示的所有数据都是免费的。

这些数据包含什么?如果您有兴趣,请花时间自己浏览。
我们在其中使用“Real”,这是一个非常大的房地产数据集。

房地产数据来自美国城市。您可以根据自己的爱好选择感兴趣的城市。我的选择是肯塔基州列克星敦。
为什么不选择纽约、洛杉矶,而是选择它?
因为我在美国读书的时候,周末经常去。
我参观的大学就在村子里。当地没有华人超市,一些常见的食品和调味品是买不到的。
如果你想去华人超市,就到最近的“大城市”列克星敦。

学校到那里的距离和天津到北京差不多。
自己没买车,公共交通不方便,一开始很苦恼。
幸运的是,海外学生周末经常去列克星敦购物。我总是跟着车。
一个半小时的车程到镇上,我们去了一家真正的中餐厅吃自助午餐,然后去商场。他们逛了大约2个小时。找了个咖啡厅或者休息区,闭上眼睛,戴着耳机听罗胖子的故事。

他们买完之后,我们一起去华人超市买。
这座拥有大商场、正宗中餐厅、多辆公交车、甚至是华人超市的“大城市”,给我留下了难忘的回忆。
以它为例。
获得
搜索“ky”会返回很多结果。

我们选择“Home Value Index (Metro): Home Sales (SA) - , KY”,点击查看该数据集的页面。

这是列克星敦 ( ) 一段时间内房屋销售价格中位数的记录。
用折线图帮助我们绘制历史价格信息的变化,已经很周到了。通过选择“TABLE”选项卡,我们可以查看原始数据。

接下来我们将数据下载到本地。右上角有一个按钮,我们点击它。

如您所见,我们提供 4 种格式的数据,即
这里先不说Excel(因为是微软独有的格式),只依次下载其他三类数据。
我们在对应的数据类别上右击,在弹出的浏览器菜单中选择“将链接另存为”,然后存储到本地。
我已经为您下载了相关的 3 种数据格式并将它们存储在一个项目中。请访问此链接,下载压缩包后解压即可查看。

在压缩包中,列克星敦的房地产交易信息有三种不同的格式。从这张图中,可以看到同样的数据内容,csv文件占用空间最小,其次是json;占用空间最大的格式是 XML。
有了数据,我们来准备编程环境。
环境
我们使用集成的运行时环境。
请到本网站下载最新版本。向下滚动页面以找到下载位置。根据您当前使用的系统,网站会自动推荐合适的版本供您下载。我使用的是 macOS,下载文件格式为 pkg。

下载页面区域左侧为3.6版本,右侧为2.7版本。请选择 2.7 版本。
双击下载的pkg文件,按照中文提示一步一步安装。

安装后,我们还需要确保安装了一些必要的软件包。
请转到您的“终端”(Linux、macOS)或“命令提示符”()并进入我们刚刚下载并解压缩示例的目录。
执行以下命令:
pip install json
pip install bs4
安装后执行:
jupyter notebook

这将进入笔记本环境。我们创建了一个新的 2 个笔记本。

出现一个空白笔记本。

点击左上角的笔记本名称,修改为有意义的笔记本名称“demo--read-open-data-”。

至此,准备工作就完成了,现在我们可以开始读取不同格式的数据了。
CSV
让我们从最简单的 CSV 格式开始。
所谓CSV,是英文“Comma”(逗号分隔值)的缩写。
我们先回到根目录。

打开我们的示例 csv 文件 -.csv 进行查看。

如您所见,第一行是标题,它描述了每一列的名称。之后,每一行都是数据,即日期和相应的中位售价。
每行中的两列数据用逗号分隔。
我们可以用Excel打开csv数据python 中位数,更直观的看到效果。

如图,当我们用Excel打开csv数据时,Excel会自动将其识别为数据表格。逗号没了,变成了两列几行的数据。
下面我们使用,读取csv数据文件并将其可视化。
阅读工具包。它帮助我们处理数据框,是数据分析的基本工具。
import pandas as pd
然后,为了让图片在页面上正确显示python 中位数,我们使用下面的语句来允许图片嵌入到页面中。
%matplotlib inline
接下来我们读入 csv 文件。它对csv数据最友好,提供直接读取csv数据的命令。
df = pd.read_csv("ZILLOW-M550_SALES.csv")
我们将 csv 数据存储到数据框变量 df 中。下面展示数据读取效果。
df.head()

如您所见,日期和中间交易价格记录均被正确读取。
让我们编写一个函数来帮助我们组织数据框。它主要实现以下功能:
def arrange_time_dataframe(df):
df.columns = ['date', 'value']
df.sort_values(by='date', inplace=True)
df.set_index('date', inplace=True)
return df
接下来我们调用这个函数来整理数据框变量df。
df = arrange_time_dataframe(df)
让我们显示 df 的前 5 行。
df.head()

您将看到日期数据被索引并按升序排序。
现在是我们画画的时候了。数据框工具为我们提供了非常方便的时间序列绘图功能。
为了显示更美观,我们设置了图形的纵横比。
df.plot(figsize=(16, 6))

将我们绘制的图像与示例图形进行比较,是否一致?
JSON
JSON,简称( ),是一种轻量级的数据交换格式。与 CSV 一样,它也是一个文本文件。
我们在其中打开下载的 JSON 文件并查看其内容:

我们需要的数据都在里面,让我们回到文件ipynb,尝试读取JSON数据内容。
首先我们阅读 json 工具包。
import json
打开我们下载的.json文件,将数据读入变量data。
with open("M550_SALES.json") as f:
data = json.load(f)
为了更直观的看到,让我们输出正确缩进的 JSON。这里我们只展示前面的一些行。
print(json.dumps(data, indent=2))
{
"dataset": {
"dataset_code": "M550_SALES",

"column_names": [
"Date",
"Value"
],
"newest_available_date": "2016-06-30",
"description": "The Zillow Home Value Index is Zillow's estimate of the median market value of home sales (nsa) within the metro of Morehead City, NC. This data is calculated by Zillow Real Estate Research (www.zillow.com/research) using their database of 110 million homes.",
"end_date": "2016-06-30",
"data": [
[
"2016-06-30",
64.0
],
[
"2016-05-31",
163.0
],
如您所见,JSON 文件就像一个大字典()。我们选择其中一个索引来获取对应的数据。
我们选择””:
data['dataset']
下面是结果的前几行。
{u'collapse': None,
u'column_index': None,
u'column_names': [u'Date', u'Value'],
u'data': [[u'2016-06-30', 64.0],
[u'2016-05-31', 163.0],
[u'2016-04-30', 118.0],
我们关心的数据在“数据”下。继续:
data['dataset']['data']
或者只显示前几行:
[[u'2016-06-30', 64.0],
[u'2016-05-31', 163.0],
[u'2016-04-30', 118.0],
这不是我们要读取的数据吗?
为了和csv数据区分开来,这次我们读取数据,存储在df1变量中。
df1 = pd.Dataframe(data['dataset']['data'])
显示前几行:
df1.head()

数据是正确的,但列名很奇怪。
没关系,我们不是只编译了排序函数吗?不管列名多么奇怪,都可以整理出来。
df1 = arrange_time_dataframe(df1)
完成后,我们再次调用绘图函数来绘制df1的数据:
df1.plot(figsize=(16, 6))

画图正确,证明我们的JSON数据读取成功。
XML
XML 是可扩展标记语言 ( ) 的首字母缩写词。它看起来有点像我们每天上网时使用的 HTML 源代码,但还是有区别的。它的初衷不是显示网页,而是交换数据。
我们打开下载的 XML 文件。

在页面底部,我们看到了我们感兴趣的数据部分,但是数据被包裹在很多标签中。
下面我们尝试用它来提取和组织 XML 数据。
首先,我们阅读网络分析工具。
from bs4 import BeautifulSoup
这是一个非常重要的网页信息提取工具,也是爬虫编写的基本功之一。
本文将只使用一些简单的命令。所以即使你以前没有接触过,也没关系,再做一次,获得一些感性的知识和经验。以后学习系统。
我推荐的系统学习方法是在文档页面上仔细阅读和学习。

如果英文文档阅读有困难,可以阅读翻译的中文文档,地址在这里。
然后,我们读入下载的 XML 数据并将其存储在变量数据中。
with open("M550_SALES.xml") as f:
data = f.read()
接下来,我们使用“lxml”工具对数据数据进行分析解析,并将其存储在soup变量中。
soup = BeautifulSoup(data, "lxml")
解析后,我们可以利用强大的搜索功能。
这里我们观察 XML 文件:

如您所见,我们关心的日期和交易中位数记录存储在 datum 标签下。
其中,日期数据类型为“日期”,中位数成交价类型为“浮动”。
让我们先试试这个函数,提取所有的日期数据:
dates = soup.find_all('datum', type='date')
我们看一下提取结果的前5行:
dates[:5]
[2016-06-30 ,
2016-05-31 ,
2016-04-30 ,
2016-03-31 ,
2016-02-29 ]
太好了,数据提取正确。问题是前后还是有标签数据,此时我们不需要它们。
让我们来处理它。对于列表中的每个项目,使用 text 属性提取内容。
dates = [item.text for item in dates]
看一下这次的提取结果:
dates[:5]
[u'2016-06-30', u'2016-05-31', u'2016-04-30', u'2016-03-31', u'2016-02-29']
好的,没问题。
下面我们以同样的方式处理中间价交易记录:
values= soup.find_all('datum', type='float')
显示结果:
values[:5]
[64.0 ,
163.0 ,
118.0 ,
110.0 ,
83.0 ]
这次还有一个标签需要去掉。
请注意,这里我们要将结果存储为浮点数,因此除了使用 text 属性提取值外,我们还使用 float() 函数进行转换。
values = [float(item.text) for item in values]
显示前 5 行:
values[:5]
[64.0, 163.0, 118.0, 110.0, 83.0]
数据正确转换为浮点数。
在我们手中,我们分别拥有中间日期和交易价格的记录列表。接下来我们将其转换为数据框并将其存储在 df2 变量中。
df2 = pd.Dataframe({'dates':dates, 'values':values})
看一下df2的前几行:
df2.head()

有了数据,我们用我们自己写的函数整理一下:
df2 = arrange_time_dataframe(df2)
然后我们尝试绘制 df2:
df2.plot(figsize=(16, 6))

成功读取和查看 XML 数据。
概括
至此,您已经尝试了如何将 CSV、JSON 和 XML 数据读入数据框,并做了最基本的时间序列可视化。
您可能有以下问题:
既然 CSV 文件如此之小且易于阅读,为什么还要学习如何阅读如此难以使用的 JSON 和 XML 数据呢?
这是一个很好的问题!
我至少能想到两个原因。
首先,我们找到的平台提供了全系列的数据下载格式,几乎涵盖了所有常见的数据格式类别。但这只是个例外。大多数开放数据平台并没有提供这么多的数据格式供您下载。因此,当您只获取 JSON 或 XML 格式的数据时,了解如何读取它们很重要。
其次,加入 JSON 或 XML 绝非没有意义。他们可以帮助您检查数据的完整性和合法性。您甚至可以定义自己的语义标准,以便与他人进行有效的数据交换。
如果你对 JSON 和 XML 格式感兴趣,想系统地学习,那么我推荐你在这个 MOOC 平台上学习数据库课程。

祝进步!
讨论
您通常从哪些开放数据平台下载数据?您接触过哪些数据格式?您使用什么工具来组织和分析它们?还有比这篇文章更有效的方法吗?欢迎留言,和大家分享你的经验和想法,我们一起交流讨论。








