在本课程中,我们广泛地使用了Python列表和元组。Python还提供了一种额外的数据结构来存储数据,那就是字典。字典本质上是键/值对的列表。
例如,下面的字典countryData存储了有关一个国家的事实,如人口、面积和GDP。
countryData = {'code':'USA', 'pop':327167434, 'area':9833520}
您可以使用类似于列表或元组的索引语法的语法访问字典的条目。唯一的区别是您使用字典的键来代替整数索引。
print(‘这个国家的面积是’+str(countryData['area']))
您还可以使用索引表示法向字典中添加新的键/值对。
countryData['gdp'] = 20891000000
字典经常用于这样的情况:您需要构造数据包,但又希望在决定每个包中包含哪些内容时保持一定的灵活性。例如,假设我们正在编写软件,收集分布在城市周围的站点网络的读数。每个站点的读数将包括站点ID号和时间戳,但除此之外,每个读数中包含的数据可能会有所不同,因为不同的站点配备了不同的测量量。例如,一个监测站可以测量温度和降雨量,而另一个监测站可以测量空气污染和噪音水平。这将导致测量看起来像
{“ID”:45,“时间”:“14:05”,“温度”:71年,“雨”:0.2}{52岁的“ID”:“时间”:“十四10”,“采购经理人指数”:2.5,“噪声”:42岁的“氮”:12.1}
收集这些读数的软件可以通过使用以下语法检查是否存在特定的键:
如果‘pmi’ in reading.keys(): #做一些事情阅读['pmi']
JSON,即JavaScript对象表示法,是一种专门的数据描述语言。这种语言最常用于生成数据的结构化文本表示,包括数字和文本等基本类型,以及列表和字典等结构化类型。JSON最初的设计目的是为JavaScript语言中的数据提供文本表示。由于JavaScript中的对象具有与Python字典非常接近的结构,JavaScript数组与Python列表非常接近,因此当我们将JSON数据表示转换为Python数据结构时,转换非常直接。
例如,下面是一个JSON表达式:
“绿色”[12日,{“选项”:“是的”,“数量”:3}]
将此JSON文本转换为Python会生成一个包含数字、字符串和字典的列表。
要将JSON形式的文本转换为Python数据结构,可以使用Python JSON包。
您可能需要处理JSON数据的一种场景是将一些JSON数据存储在文件中。下面的示例程序设计用于处理包含大量国家人口数据的文件。该文件包含一个大型数组,其典型元素如下所示
{“国家名称”:“墨西哥”,“国家代码”:“MEX”, “年份”:“1966”,“值”:“46229966”}
该程序提示用户输入三个字母的国家代码,然后计算该国家1995年至1996年的人口增长率:
将数据加载到一个列表中。Filename = ‘population_data. ’json‘ with open(filename) as f: pop_data = json.load(f) def findPopulation(code, year):对于pop_data中的条目:如果条目[’国家代码‘]==代码和条目[’年‘]== str(year):返回float(条目[’Value‘])返回0 code = input(’输入国家代码:‘)pop95 = findPopulation(code,1995) pop96 = findPopulation(code,1996)如果pop95 != 0和pop96 != 0: rate = 100*(pop96-pop95)/pop95 print(’增长率‘+code+’是‘+str(rate))否则:print(’缺失数据')
JSON .load()函数提供了一种简单方便的方式从文件中加载JSON数据。我们所要做的就是将文件的文件描述符传递给该函数,它将整个文件从JSON转换为Python数据。
由于本例中的文件转换为Python字典列表,因此我们使用循环和一些字典代码的组合来查找1995年和1996年给定国家的条目。
JSON出现的另一个非常常见的场景是互联网上的信息传输。最近,在Internet上设置使用REST架构的数据服务器变得非常流行。在这种体系结构中,客户端使用HTTP (web浏览器用来与web服务器通信的语言)向数据服务器发送数据请求。REST服务器不再发送网页的HTML,而是发送客户端请求的一些数据的JSON表示。
在Python中,从REST服务器获取数据是一项非常流行的活动,因此自然有几个包被设计来简化这一操作。请求包就是这样一个包。请求包包含一个有用的函数request .get(),您可以使用它从REST服务器获取JSON数据。大多数REST服务器使用特殊构造的url来管理信息请求。要与这样的服务器交互,您所要做的就是将URL传递给request.get()。该函数将返回一个特殊的响应对象。该对象实现了一个json()方法,该方法将为您返回响应json转换为Python数据结构。
下面的程序说明了这个过程是如何工作的。在示例程序中,我将向位于api.darksky.net的服务器发送一个获取天气预报信息的请求。要使用此服务器,您必须首先在浏览器中访问darksky.net/dev并注册一个免费的开发人员帐户。注册后,您将获得一个api密钥,您需要将其插入到下面代码中URL中的<key>占位符的位置。
导入请求导入时间#得到24小时的时间从现在timeTomorrow = int (time.time()) + 60 * 60 * 24 #设置休息的URL请求URL = ' https://api.darksky.net/forecast/ <关键> / 44.26,-88.39,”+ str (timeTomorrow) #发送请求和响应从JSON响应= requests.get翻译(URL) data = response.json() #打印预测打印(的天气明天这个时候将+数据(目前的)['总结'])打印(的温度将+ str(数据(目前的)(“温度”)))
上面的代码假设对从api.darksky.net返回的响应的结构有一定的了解。您可以使用调试器检查数据的内容,也可以使用程序构造URL,然后将URL复制到浏览器中,以查看服务器作为响应返回的内容。无论采用哪种方式,您都可以检查响应以了解其结构,然后编写深入数据内容以获取所需信息的代码。
下面是一个包含两个大数据集的zip文件的链接。第一个数据集是我在上面的示例程序中使用的人口数据JSON文件。这里的条目使得根据标准国家代码查找不同年份的人口数据成为可能。第二个数据集是我从世界银行下载的一个大型CSV文件。该数据集提供了许多国家多年来国内生产总值的历史数据。第二个数据集使用与第一个数据集相同的国家代码来识别国家,因此这应该为您提供一种汇总大量国家的人口和GDP数据的方法。您可以使用pandas来加载这个CSV文件并查找GDP数据。为了更容易地通过国家代码找到国家,您应该使用以下代码将CSV文件的国家代码列设置为数据框架的索引:
Df = Df。set_index(国家代码)
然后可以使用语法查找数据帧中的单个单元格
df.loc(代码,坳)
其中code包含要查找的国家的国家代码,col包含要查找的列的名称。
一个国家的人口增长率与其经济增长率之间是否存在相关性?在本练习中,您将汇总和绘制一些相关数据,以帮助回答这个问题。
要做这个分析,你需要从收集1995年和2005年这两年的人口和GDP数据开始。对于分析中的每个国家,计算该时期该国人口的百分比变化以及该国人均GDP的百分比变化。(注:要计算人均GDP,你需要用每个国家的GDP除以该国的人口。)
接下来,使用pyplot构建人口变化与人均GDP变化的图。如果人口增长和人均GDP增长之间存在任何相关性,它应该以你绘制的数据云的形式显示出来。