推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

如何用Python读取开放数据?

   2023-08-30 网络整理佚名2210
核心提示:第一步,你先得学会如何用读取这些开放数据格式。我已经为你下载好了相关的3种数据格式,并且存储在了一个项目中。下面我们使用,将该csv数据文件读入,并且可视化。对csv数据最为友好,提供了命令,可以直接读取csv数据。我们需要的数据都在里面,下面我们回到笔记本文件ipynb中,尝试读取JSON数据内容。首先我们读取json工具包。json文件,读取数据到变量data。

当你开始接触丰富多彩的开放数据集时,CSV、JSON、XML等格式名称就会涌入。如何高效地读取它们,为后续的排序和分析做准备? 本文逐步向您展示了该过程,您可以自己练习。

(由于微信公众号外部链接限制,文章中部分链接可能无法正确打开,如有需要,请点击文末“阅读原文”按钮访问该版本可以正常显示外部链接。)

需要

人工智能的算法再精妙,没有数据,就是“巧妇难为无米之炊”。

数据是宝贵的,开放数据尤其有价值。 无论是公众号、微博还是朋友圈,一听到“开放数据”、“数据资源”、“数据链接”等关键词,很多人都兴奋不已。

终于得到你梦寐以求的数据链接后,你会发现下载的数据可能有各种奇怪的格式。

最常见的是以下几种:

您希望可以调用它们来清理和分析它们,进行您自己的“数据炼金术”。

第一步,你必须学会​​如何读取这些开放数据格式。

在本文中,我们将通过实际的开放数据示例,介绍如何读取互联网上常见的三种开放数据格式,即CSV、XML和JSON,形成结构化的数据框架,以供您后续分析。 操作。

你是否跃跃欲试?

数据

是的,我们选择的开放数据平台。

是一个金融经济数据平台。 其中不仅有昂贵的收费数据,还有大量的免费开放数据。

您需要免费注册一个账户,才能正常访问其免费收集的数据。

要注册,只需填写上面的表格即可。 注册后,使用新帐户和密码登录。

登录后,点击首页“核心数据”栏中的“数据”。

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

别太高兴。 仔细查看数据集右侧的标签。 第一页基本都是“”(仅限会员),只有付费用户才能使用。

您无需亲自翻页即可找到免费的开放数据。 单击页面左上方“过滤器”( ) 下的“免费”选项。

这次显示的所有数据都是免费的。

这些数据包含什么? 如果您有兴趣,欢迎您花点时间浏览一下。

我们在其中使用“Real”,这是一个非常大的房地产数据集。

房地产数据均来自美国城市。 您可以根据自己的爱好选择您感兴趣的城市。 我选择了肯塔基州列克星敦。

为什么选择它而不是纽约和洛杉矶?

因为我在美国读书的时候,经常周末去那里。

我参观的大学位于村里。 当地没有华人超市,一些常见的食品和调料买不到。

如果你想去华人超市,就必须到最近的“大城市”列克星敦。

从学校到那里的距离与从天津到北京的距离差不多。

我自己没有车,公共交通也不方便,所以一开始我很苦恼。

幸运的是,周末同学们经常去列克星敦购物。 我总是跟着车。

一个半小时的车程进城,我们去了一家真正的中餐厅吃了自助午餐,然后去购物中心。 他们逛了大约2个小时。 我找了个咖啡馆或者休息区休息一下眼睛,戴着耳机听罗胖讲故事。

他们买完东西后,我们一起去华人超市采购。

这座拥有大型购物中心、正宗中餐馆、多辆公交车、甚至还有华人超市的“大城市”给我留下了难忘的回忆。

以此为例。

获得

搜索“ky”会返回相当多的结果。

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

以下是列克星敦随时间推移的房屋销售价格中位数 ( )。

已经很周到的帮我们用折线图绘制出了历史价格信息的变化。 选择“TABLE”选项卡,我们可以查看原始数据。

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

正如你所看到的,我们提供了4种格式的数据,即

这里先不说Excel(因为是微软独家格式),只依次下载其他三类的数据。

我们右键点击对应的数据类别,在弹出的浏览器菜单中选择“链接另存为”,然后存储在本地。

我已经为你下载了相关的3种数据格式,并将它们存储在一个项目中。 请访问此链接,下载 zip 文件,解压并查看。

压缩包中包含三种不同格式的列克星敦房产交易信息。 从这张图中可以看到,同样的数据内容,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数据来更直观的看到效果。

如图所示,当我们用Excel打开csv数据时,Excel自动将其识别为数据表格。 逗号没了,变成了被分割的两列几行数据。

下面我们使用、读入csv数据文件,并将其可视化。

读入工具包。 它可以帮助我们处理数据框,是数据分析的基本工具。

import pandas as pd

然后,为了让图片能够正确的显示在网页上,我们使用下面的语句来允许图片嵌入到页面中。

%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标签下。

其中,日期数据的类型为“date”,交易中价的类型为“float”。

我们首先尝试使用该函数提取所有日期数据:

dates = soup.find_all('datum', type='date')

让我们看看提取结果的前 5 行:

dates[:5]

[<datum type="date">2016-06-30portant;word-break: inherit !important;white-space: inherit !important;">datum>,
<datum type="date">2016-05-31portant;word-break: inherit !important;white-space: inherit !important;">datum>,
<datum type="date">2016-04-30portant;word-break: inherit !important;white-space: inherit !important;">datum>,
<datum type="date">2016-03-31portant;word-break: inherit !important;white-space: inherit !important;">datum>,
<datum type="date">2016-02-29portant;word-break: inherit !important;white-space: inherit !important;">datum>]

太好了,数据提取正确。 问题是前后都有标签数据,此时我们不需要它们。

我们来处理一下吧。 对于列表中的每个项目,使用文本属性来提取内容。

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]

[<datum type="float">64.0portant;word-break: inherit !important;white-space: inherit !important;">datum>,
<datum type="float">163.0portant;word-break: inherit !important;white-space: inherit !important;">datum>,
<datum type="float">118.0portant;word-break: inherit !important;white-space: inherit !important;">datum>,
<datum type="float">110.0portant;word-break: inherit !important;white-space: inherit !important;">datum>,
<datum type="float">83.0portant;word-break: inherit !important;white-space: inherit !important;">datum>]

这次还有标签,需要去掉。

注意,这里我们要将结果存储为浮点数,因此除了使用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平台上学习数据库课程。

祝你好运!

讨论

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

如果您对我的文章感兴趣,请点赞,关注并置顶我的微信公众号“玉树之兰”()。

如果本文对您的亲朋好友有帮助,欢迎您通过微博或朋友圈分享这篇文章给他们。 让他们一起参与我们的讨论。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON