Python项目实践之二:下载数据(CSV和JSON )

下载数据的可视化着重点在于从网上下载数据进行分析后,进行可视化处理,网上的数据格式多的难以置信,且大多未经过仔细检查,如果能够对这些数据进行分析,你就能发现别人没有发现的规律和关联。

一、CSV 文件格式

要在文本文件中存储数据,最简单的方式是将数据作为一系列以逗号分隔的值(CSV)写入文件。这样的文件称为CSV文件。例如,下面是一行CSV格式的天气数据:

2014-1-5,61,44,26,18,7,-1,56,30,9,30.34,30.27,30.15,,,,10,4,,0.00,0,,195

本章用到的文件已上传至博客资源:链接

1、分析 CSV 文件头

csv 模块包含在Python标准库中,可用于分析CSV文件中的数据行,创建 highs_lows.py ,导入本章提供的文件 highs_lows.csv :

import csvfilename = 'sitka_weather_07-2014.csv'
with open(filename) as f:reader = csv.reader(f)header_row = next(reader)print(header_row)

运行结果:

['AKDT', 'Max TemperatureF', 'Mean TemperatureF', 'Min TemperatureF', 'Max Dew PointF', 'MeanDew PointF', 'Min DewpointF', 'Max Humidity', ' Mean Humidity', ' Min Humidity', ' Max Sea Level PressureIn', ' Mean Sea Level PressureIn', ' Min Sea Level PressureIn', ' Max VisibilityMiles', ' Mean VisibilityMiles', ' Min VisibilityMiles', ' Max Wind SpeedMPH', ' Mean Wind SpeedMPH', ' Max Gust SpeedMPH', 'PrecipitationIn', ' CloudCover', ' Events', ' WindDirDegrees']
知识点:

1、csv.reader(f):通过文件句柄获取一个csv的迭代器对象,通过next()可以读取文件的每一行数据
2、reader 处理文件中以逗号分隔的第一行数据,并将每项数据都作为一个元素存储在列表中。

2、打印文件头及其位置

import csvfilename = 'sitka_weather_07-2014.csv'
with open(filename) as f:#返回一个迭代器对象reader = csv.reader(f)header_row = next(reader)#打印文件头及位置for index, column_header in enumerate(header_row):print(index, column_header)
知识点:

1、enumerate() 获取每个元素的索引及其值

3、提取并读取数据

知道需要哪些列中的数据后,我们来读取一些数据。首先读取每天的最高气温:

 highs = []for row in reader:highs.append(row[1])print(highs)

由于highs列表内读取的元素是字符串格式,所以使用 int() 将这些字符串转换为数字,让matplotlib能够读取它们:

    highs = []for row in reader:highs.append(int(row[1]))print(highs)

4、绘制气温图表

使用matplotlib创建一个显示每日最高气温的简单图形:

from matplotlib import pyplot as plt
.......
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(highs, c='red')# 设置图形的格式 
plt.title("2014年7月每日最高气温曲线", fontproperties="SimHei", fontsize=24)
plt.xlabel('日期', fontproperties="SimHei", fontsize=16)
plt.ylabel("温度(F)", fontproperties="SimHei", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=16)plt.show()

运行结果:

5、在图表中添加日期

根据下载的csv数据,日期是在第一列,因此,先把第一列数据读取(利用datetime转换成标准格式日期)到列表,然后使用matplotlib绘制到图中:

import csv
from matplotlib import pyplot as plt
from datetime import datetimefilename = 'sitka_weather_07-2014.csv'
with open(filename) as f:#返回一个迭代器对象reader = csv.reader(f)header_row = next(reader)# #打印文件头及位置# for index, column_header in enumerate(header_row):#     print(index, column_header)dates, highs = [], []for row in reader:current_date = datetime.strptime(row[0], "%Y-%m-%d")dates.append(current_date)highs.append(int(row[1]))print(dates)print(highs)fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red')# 设置图形的格式 
plt.title("2014年7月每日最高气温曲线", fontproperties="SimHei", fontsize=24)
plt.xlabel('日期', fontproperties="SimHei", fontsize=16)
fig.autofmt_xdate()
plt.ylabel("温度(F)", fontproperties="SimHei", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=16)plt.show()
知识点:

1、datetime.strptime(row[0], “%Y-%m-%d”):由于 python 读取的日期是数字形式,本方式是把数字形式的日期转为标准格式
2、fig.autofmt_xdate() :因横着放不下日期标签(会有重叠现象),调用此方法绘制斜的日期标签

6、涵盖更长的时间

导入 sitka_weather_2014.csv 文件,该文件涵盖2014年全年的数据,我们用此数据绘制最高气温曲线,其实很简单,只用修改导入数据和设置图名称即可:

filename = 'sitka_weather_2014.csv'
plt.title("2014年每日最高气温曲线", fontproperties="SimHei", fontsize=24)

7、再绘制一个数据系列

给图中添加添加最低气温数据
1、读取数据:

 dates, highs, lows = [], [], []for row in reader:current_date = datetime.strptime(row[0], "%Y-%m-%d")dates.append(current_date)highs.append(int(row[1]))lows.append(int(row[3]))

2、绘制数据:

plt.plot(dates, lows, c='blue')

3、修改图名:

plt.title("2014年每日最高最低气温曲线", fontproperties="SimHei", fontsize=24)

8、给图表区域着色

添加两个数据系列后,我们就可以了解每天的气温范围了。下面来给这个图表做最后的修饰,通过着色来呈现每天的气温范围。为此,我们将使用方法 fill_between() ,它接受一个x值系列和两个y值系列,并填充两个y值系列之间的空间:

plt.plot(dates, highs, c='red', alpha=0.5)
plt.plot(dates, lows, c='blue', alpha=0.5)
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)
知识点:

1、alpha=0.5 :透明度百分之五十。
2、fill_between():接受一个x值系列和两个y值系列,并填充两个y值系列之间的空间。

9、错误检查

我们应该能够使用有关任何地方的天气数据来运行highs_lows.py中的代码,但有些气象站会偶尔出现故障,未能收集部分或全部其应该收集的数据。缺失数据可能会引发异常,如果不妥善地处理,还可能导致程序崩溃。

例如,我们来看看生成加利福尼亚死亡谷的气温图时出现的情况。将文件death_valley_2014.csv复制到本章程序所在的文件夹,再修改highs_lows.py,使其生成死亡谷的气温图:

filename = 'death_valley_2014.csv'

运行结果:

ValueError: invalid literal for int() with base 10: ''

分析:该traceback指出,Python无法处理其中一天的最高气温,因为它无法将空字符串( ’ ’ )转换
为整数。

经过检查原始数据发现:没有记录2014年2月16日的数据,表示最高温度的字符串为空。为解决这种问题,我们在从CSV文件中读取值时执行错误检查代码,对分析数据集时可能出现的异常进行处理,如下所示:

        try:current_date = datetime.strptime(row[0], "%Y-%m-%d")high = int(row[1])low = int(row[3])except ValueError:print(current_date, 'missing data')else:dates.append(current_date)highs.append(high)lows.append(low)

解释:对于每一行,我们都尝试从中提取日期、最高气温和最低气温。只要缺失其中一项数据,Python就会引发 ValueError 异常,而我们可这样处理:打印一条错误消息,指出缺失数据的日期。打印错误消息后,循环将接着处理下一行。如果获取特定日期的所有数据时没有发生错误,将运行 else 代码块,并将数据附加到相应列表的末尾。鉴于我们绘图时使用的是有关另一个地方的信息,我们修改了标题,在图表中指出了这个地方。

二、制作世界人口地图:JSON 格式

在本节中,你将下载JSON格式的人口数据,并使用 json 模块来处理它们。Pygal提供了一个适合初学者使用的地图创建工具,你将使用它来对人口数据进行可视化,以探索全球人口的分布情况。

1、下载世界人口数据

将文件population_data.json复制到本章程序所在的文件夹中,这个文件包含全球大部分国1960~2010年的人口数据。

本章用到的文件已上传至博客资源:链接

2、提取相关的数据

首先,用下载好的 visual studio 打开 population_data.json :

分析:这个文件实际上就是一个很长的 Python 列表,其中每个元素都是一个包含四个键的字典:国家名、国别码、年份以及表示人口数量的值。

打印每个国家 2010年 的人口数据:

import json# 将数据加载到一个列表中
filename = 'population_data.json'
with open(filename) as f:pop_data = json.load(f)# 打印每个国家2010年的人口数量 
for pop_dict in pop_data:if pop_dict['Year'] == '2010':country_name = pop_dict['Country Name']population = pop_dict['Value']print(country_name + ": " + population)
知识点:json.load() :将json格式转换成python的字典格式。

3、将字符串转换为数字值

     country_name = pop_dict['Country Name']population = int(float(pop_dict['Value']))print(country_name + ": " + str(population))

解释:因人口数据(population)中含有小数,python 不能使用 int 直接把字符串形式的小数转换成整数,因此要先转换成 float 类型。

4、获取两个字母的国别码

制作地图前,还需要解决数据存在的最后一个问题。Pygal中的地图制作工具要求数据为特定的格式:用国别码表示国家,以及用数字表示人口数量。处理地理政治数据时,经常需要用到几个标准化国别码集。population_data.json中包含的是三个字母的国别码,但Pygal使用两个字母的国别码。我们需要想办法根据国家名获取两个字母的国别码。

查看 Pygal 的国别码必须先安装模块 pygal_maps_world,然后进行查看:

import pygalfor code,name in pygal.maps.world.COUNTRIES.items():print(code, name)

为获取国别码,我们将编写一个函数,它在 COUNTRIES 中查找并返回国别码。我们将这个函数放在一个名为 country_codes 的模块中,以便能够在可视化程序中导入它:

import pygaldef get_country_code(country_name):"""根据指定的国家,返回Pygal使用的两个字母的国别码"""for code, name in pygal.maps.world.COUNTRIES.items():if name == country_name:return codereturn None

接下来,在world_population.py中导入 get_country_code :

import json
from country_codes import get_country_code
# 将数据加载到一个列表中
filename = 'population_data.json'
with open(filename) as f:pop_data = json.load(f)# 打印每个国家2010年的人口数量 
for pop_dict in pop_data:if pop_dict['Year'] == '2010':country_name = pop_dict['Country Name']population = int(float(pop_dict['Value']))code = get_country_code(country_name)if code:print(code + ": " + str(population))else:print('ERROR - ' + country_name)

解释:提取国家名和人口数量后,我们将国别码存储在 code 中,如果没有国别码,就在其中存储 None。如果返回了国别码,就打印国别码和相应国家的人口数量。如果没有找到国别码,就显示一条错误消息,其中包含无法找到国别码的国家的名称。如果你运行这个程序,将看到一些国别码和相应国家的人口数量,还有一些错误消息。

导致显示错误消息的原因有两个。首先,并非所有人口数量对应的都是国家,有些人口数量对应的是地区(阿拉伯世界)和经济类群(所有收入水平)。其次,有些统计数据使用了不同的完整国家名(如Yemen, Rep.,而不是Yemen)。当前,我们将忽略导致错误的数据,看看根据成功恢复了的数据制作出的地图是什么样的。

5、制作世界地图

有了国别码后,制作世界地图易如反掌。pygal_maps_world提供了图表类型 World ,可帮助你制作呈现各国数据的世界地图。为演示如何使用 World ,我们来创建一个突出北美、中美和南美的简单地图(americas.py):

import pygal_maps_world.maps as pygwm = pyg.World()
wm.title = 'North, Central, and South America'
wm.add('North America', ['ca', 'mx', 'us'])
wm.add('Central America', ['bz', 'cr', 'gt', 'hn', 'ni', 'pa', 'sv'])
wm.add('South America', ['ar', 'bo', 'br', 'cl', 'co', 'ec', 'gf', 'gy', 'pe', 'py', 'sr', 'uy', 've'])
wm.render_to_file('americas.svg')

在浏览器中打开 americas.svg ,运行结果:

解释:
1、pyg.World():创建一个World实例
2、wm.title :设置图表标题
3、add() :它接受一个标签和一个列表,其中后者包含我们要突出的国家的国别码。每次调用 add() 都将为指定的国家选择一种新颜色,并在图表左边显示该颜色和指定的标签。我们要以同一种颜色显示整个北美地区,因此第一次调用 add() 时,在传递给它的列表中包含 ‘ca’ 、 'mx’和 ‘us’ ,以同时突出加拿大、墨西哥和美国。接下来,对中美和南美国家做同样的处理。
4、wm.render_to_file(‘americas.svg’):将生成的文件保存在目录下。

6、在世界地图上呈现数字数据

为练习在地图上呈现数字数据,我们来创建一幅地图,显示三个北美国家的人口数量(na_populations.py):

import pygal_maps_world.maps as pygwm = pyg.World()
wm.title = 'Populations of Countries in North America'
wm.add('North America', {'ca': 34126000, 'us': 309349000, 'mx': 113423000})
wm.render_to_file('na_populations.svg')

在浏览器中打开 na_populations.svg ,运行结果:

解释:使用方法 add() ,但这次通过第二个实参传递了一个字典而不是列表。这个字典将两个字母的Pygal国别码作为键,将人口数量作为值。Pygal根据这些数字自动给不同国家着以深浅不一的颜色(人口最少的国家颜色最浅,人口最多的国家颜色最深)

7、绘制完整的世界人口地图

要呈现其他国家的人口数量,需要将前面处理的数据转换为Pygal要求的字典格式:键为两个字母的国别码,值为人口数量。为此,在world_population.py中添加如下代码:

import json
import pygal_maps_world.maps as pyg
from country_codes import get_country_code
# 将数据加载到一个列表中
filename = 'population_data.json'
with open(filename) as f:pop_data = json.load(f)# 创建一个包含人口数量的字典
cc_populations = {}
for pop_dict in pop_data:if pop_dict['Year'] == '2010':country_name = pop_dict['Country Name']population = int(float(pop_dict['Value']))code = get_country_code(country_name)if code:cc_populations[code] = population
wm = pyg.World()
wm.title = '2010年世界人口分布图'
wm.add('2010', cc_populations)
wm.render_to_file('world_population.svg')

在浏览器中打开world_population.svg ,运行结果:

8、根据人口数量将国家分组

印度和中国的人口比其他国家多得多,但在当前的地图中,它们的颜色与其他国家差别较小。中国和印度的人口都超过了10亿,接下来人口最多的国家是美国,但只有大约3亿,所以在显示图片区别的时候就导致别的国家的显示并不是那么清晰,因此,我们应该通过分组来实现显示清晰的目的,下面我们根据人口数量分成三组——少于1000万的、介于1000万和10亿之间的以及超过10亿的:

            ......cc_populations[code] = population# 根据人口数量将所有的国家分成三组
cc_pops_1, cc_pops_2, cc_pops_3 = {}, {}, {}
for cc, pop in cc_populations.items():if pop < 10000000:cc_pops_1[cc] = popelif pop < 1000000000:cc_pops_2[cc] = popelse:cc_pops_3[cc] = pop
# 看看每组分别包含多少个国家 
print(len(cc_pops_1), len(cc_pops_2), len(cc_pops_3))
wm = pyg.World()
wm.title = '2010年世界人口分布图'
wm.add('0-10m', cc_pops_1)
wm.add('10m-1bn', cc_pops_2)
wm.add('>1bn', cc_pops_3)
wm.render_to_file('world_population.svg')

在浏览器中打开world_population.svg ,运行结果:

现在使用了三种不同的颜色,让我们能够看出人口数量上的差别。在每组中,各个国家都按人口从少到多着以从浅到深的颜色。

9、设置世界地图的样式

在这个地图中,根据人口将国家分组虽然很有效,但默认的颜色设置很难看。我们也让Pygal使用一种基色,但将指定该基色,并让三个分组的颜色差别更大:

from pygal.style import RotateStyle
print(len(cc_pops_1), len(cc_pops_2), len(cc_pops_3))wm_style = RotateStyle('#336699')
wm = pyg.World(style=wm_style)
wm.title = '2010年世界人口分布图'

在浏览器中打开world_population.svg ,运行结果:

10、加亮颜色主题

Pygal通常默认使用较暗的颜色主题。为方便印刷,我使用 LightColorizedStyle 加亮地图的颜色。

from pygal.style import RotateStyle, LightColorizedStyle
wm_style = RotateStyle('#336699', base_style=LightColorizedStyle)

分析:首先导入加亮地图颜色的类 LightColorizedStyle ,然后通过实例 RotateStyle 类时传入 LightColorizedStyle ,然后再通过实例 pyg.World 类的时候传入 RotateStyle 的实例即可。

Python项目实践之二:下载数据(CSV和JSON )相关推荐

  1. Python 数据可视化—下载数据(CSV文件格式、JSON格式)

    Python 数据可视化-下载数据CSV文件格式.JSON格式 网上下载数据,并对这些数据进行可视化,可视化以两种常见格式存储的数据:CSV 和JSON. 我们将使用Python模块csv 来处理以C ...

  2. 以下关于python二维数据的描述中错误的是_关于二维数据CSV存储问题,以下选项中描述错误的是‪‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‫:...

    [单选题]C语言中最基本的数据类型包括( ). [单选题]计算机的性能可以用很多指标来衡量,除了用其运算速度.字长等指标以外,( )也作为主要指标. [单选题]Word2010文档文件的扩展名是( ) ...

  3. 【机器学习】python使用matplotlib进行二维数据绘图并保存为png图片

    端到端机器学习导航: [机器学习]python借助pandas加载并显示csv数据文件,并绘制直方图 [机器学习]python使用matplotlib进行二维数据绘图并保存为png图片 [机器学习]p ...

  4. Python项目实践之三:添加 Play 按钮和提高游戏等级

    Python项目实践之三:添加 Play 按钮和提高游戏等级 现在外星人入侵游戏项目已经实现了武装飞船和外星人群的功能,本章主要添加一些辅助功能,如添加一个开始按钮,计分板信息和随着游戏的进行加快游戏 ...

  5. python项目实践之微信公众号历史文章批量下载

    项目: 有的微信公众号文章经常会被删或者和谐,所以想有个工具能一键导出公众号文章,正逢有想学python的想法,找到下面这个python项目: vWeChatCrawl-小V公众号文章下载(开源版) ...

  6. python项目实践_python实践项目

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 文章节选自<机器学习--python实践>文末评论赠送本书,欢迎留言 ...

  7. SRv6项目实践(二):基本的P4框架

    1.数据包头的定义 在实现SRv6之前,有很多的工作需要做,首先先阅读一下p4的代码总体框架,数据包的包头格式一共有如下这些,我们需要把他们的协议逐一完善 struct parsed_headers_ ...

  8. Python 项目实践二(下载数据)第四篇

    接着上节继续学习,在本节中,你将下载JSON格式的人口数据,并使用json模块来处理它们.Pygal提供了一个适合初学者使用的地图创建工具,你将使用它来对人口数据进行可视化,以探索全球人口的分布情况. ...

  9. Python 项目实践二(生成数据)第二篇

    接着上节继续学习,在本节中,我们将使用Python来生成随机漫步数据,再使用matplotlib以引人瞩目的方式将这些数据呈现出来.随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向 ...

最新文章

  1. commit your changes or stash them before you can merge
  2. php parsekit,php 5.5 parsekit 扩展问题
  3. C#控件 Datagriview控件
  4. 机器学习-分类之多层感知机原理及实战
  5. EditText的 焦点事件 setOnFocusChangeListener
  6. ASP.NET Core文件上传与下载(多种上传方式)
  7. 【渝粤教育】广东开放大学 计量经济学 形成性考核 (21)
  8. keep-alive和多路复用
  9. Windows Server Failover Cluster 使用的协议和端口
  10. 如何给小朋友解释单摆运动_单摆的教案
  11. 11.28.cookie
  12. 结构体对齐 大小 位域问题
  13. html简单网页代码 案例_HTML+CSS静态网页练习案例(转动的八卦图)
  14. Hibernate 入门
  15. Linux下Socket通信(TCP实现)
  16. 安装RabbitMQ无法访问(http://localhost:15672)解决方案
  17. HP P2000 G3阵列故障经历
  18. 计算机boot进入u盘启动,深度u盘装系统进入boot设置教程
  19. ASP.NET设置背景图案
  20. 1024 程序员节|用代码,改变世界

热门文章

  1. 腾讯电脑管家 透明皮肤修改 教程
  2. 基于ThreeJs的3D农业大棚模拟远程监测系统
  3. DeepFreeze (冰点还原)完全使用手册
  4. 2022年高级软件水平考试考前复习题及答案
  5. PyQt5学习—1介绍
  6. 一款好用的markdown编辑器Typora
  7. 橙游资讯正式发布V1.0
  8. 小顶堆关键算法 - 算神码男人系列
  9. APS中生产计划排程模块的基本原理
  10. 智能电话机器人话术开发接口