Python应用实例(二)数据可视化(四)

news2024/11/27 7:45:13

数据可视化(四)下载数据

  • 1.CSV文件格式
    • 1.1 分析CSV文件头‘
    • 1.2 打印文件头及其位置
    • 1.3 提取并读取数据
    • 1.4 绘制温度图表
    • 1.5 在图表中添加日期

从网上下载数据,并对其进行可视化。网上的数据多得令人难以置信,大多未经仔细检查。如果能够对这些数据进行分析,就能发现别人没有发现的规律和关联。

访问并可视化的数据以两种常见格式存储:CSV和JSON。我们将使用Python模块csv来处理以CSV格式存储的天气数据,找出两个地区在一段时间内的最高温度和最低温度。然后,使用Matplotlib根据下载的数据创建一个图表,展示两个不同地区的温度变化:阿拉斯加州锡特卡和加利福尼亚州死亡谷。然后,使用模块json访问以JSON格式存储的地震数据,并使用Plotly绘制一幅散点图,展示这些地震的位置和震级。

1.CSV文件格式

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

"USW00025333","SITKA AIRPORT, AK US","2018-01-01","0.45",,"48","38"

这是阿拉斯加州锡特卡2018年1月1日的天气数据,其中包含当天的最高温度和最低温度,还有众多其他的数据。CSV文件对人来说阅读起来比较麻烦,但程序可轻松提取并处理其中的值,有助于加快数据分析过程。

我们将首先处理少量CSV格式的北京天气数据,将文件beijing_weather_07-2018_simple.csv复制到存储本章程序的文件夹中。

1.1 分析CSV文件头‘

csv模块包含在Python标准库中,可用于分析CSV文件中的数据行,让我们能够快速提取感兴趣的值。先来查看这个文件的第一行,其中的一系列文件头指出了后续各行包含的是什么样的信息:sitka_highs.py

  import csv

  filename = 'data/sitka_weather_07-2018_simple.csv'with open(filename) as f:
❷     reader = csv.reader(f)
❸     header_row = next(reader)
      print(header_row)

导入模块csv后,将要使用的文件的名称赋给filename。接下来,打开这个文件,并将返回的文件对象赋给f(见❶)。然后,调用csv.reader()并将前面存储的文件对象作为实参传递给它,从而创建一个与该文件相关联的阅读器对象(见❷)。这个阅读器对象被赋给了reader。

模块csv包含函数next(),调用它并传入阅读器对象时,它将返回文件中的下一行。在上述代码中,只调用了next()一次,因此得到的是文件的第一行,其中包含文件头(见❸)。将返回的数据存储到header_row中。如你所见,header_row包含与天气相关的文件头,指出了每行都包含哪些数据:

['STATION', 'NAME', 'DATE', 'PRCP', 'TAVG', 'TMAX', 'TMIN']

reader处理文件中以逗号分隔的第一行数据,并将每项数据都作为一个元素存储在列表中。文件头STATION表示记录数据的气象站的编码。这个文件头的位置表明,每行的第一个值都是气象站编码。文件头NAME指出每行的第二个值都是记录数据的气象站的名称。其他文件头则指出记录了哪些信息。当前,我们最关心的是日期(DATE)、最高温度(TMAX)和最低温度(TMIN)。这是一个简单的数据集,只包含降水量以及与温度相关的数据。你自己下载天气数据时,可选择涵盖众多测量值,如风速、风向以及详细的降水量数据。

1.2 打印文件头及其位置

为了让文件头数据更容易理解,将列表中的每个文件头及其位置打印出来:sitka_highs.py

  --snip--
  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)

在循环中,对列表调用了enumerate()(见❶)来获取每个元素的索引及其值。(请注意,我们删除了代码行print(header_row),转而显示这个更详细的版本。)输出如下,指出了每个文件头的索引:

0 STATION
1 NAME
2 DATE
3 PRCP
4 TAVG
5 TMAX
6 TMIN

1.3 提取并读取数据

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

  --snip--
  with open(filename) as f:
      reader = csv.reader(f)
      header_row = next(reader)

      # 从文件中获取最高温度。
❶     highs = []for row in reader:
❸         high = int(row[5])
          highs.append(high)

  print(highs)

创建一个名为highs的空列表(见❶),再遍历文件中余下的各行(见❷)。阅读器对象从其停留的地方继续往下读取CSV文件,每次都自动返回当前所处位置的下一行。由于已经读取了文件头行,这个循环将从第二行开始——从这行开始包含的是实际数据。每次执行循环时,都将索引5处(TMAX列)的数据附加到highs末尾(见❸)。在文件中,这项数据是以字符串格式存储的,因此在附加到highs末尾前,使用函数int()将其转换为数值格式,以便使用。

highs现在存储的数据如下:

[62, 58, 70, 70, 67, 59, 58, 62, 66, 59, 56, 63, 65, 58, 56, 59, 64, 60, 60,
 61, 65, 65, 63, 59, 64, 65, 68, 66, 64, 67, 65]

提取每天的最高温度并将其存储到列表中之后,就可以可视化这些数据了。

1.4 绘制温度图表

为可视化这些温度数据,首先使用Matplotlib创建一个显示每日最高温度的简单图形,如下所示:sitka_highs.py

  import csv

  import matplotlib.pyplot as plt

  filename = 'data/sitka_weather_07-2018_simple.csv'
  with open(filename) as f:
      --_snip_—

  # 根据最高温度绘制图形。
  plt.style.use('seaborn')
  fig, ax = plt.subplots()
❶ ax.plot(highs, c='red')

  # 设置图形的格式。
❷ ax.set_title("2018年7月每日最高温度", fontsize=24)
❸ ax.set_xlabel('', fontsize=16)
  ax.set_ylabel("温度 (F)", fontsize=16)
  ax.tick_params(axis='both', which='major', labelsize=16)

  plt.show()

将最高温度列表传给plot()(见❶),并传递c='red’以便将数据点绘制为红色。(这里使用红色显示最高温度,用蓝色显示最低温度。)接下来,设置了一些其他的格式,如名称和字号(见❷),这些都在第15章介绍过。鉴于还没有添加日期,因此没有给[插图]轴添加标签,但ax.set_xlabel()确实修改了字号,让默认标签更容易看清❸。图显示了绘制的图表:一个简单的折线图,显示了阿拉斯加州锡特卡2018年7月的每日最高温度。

在这里插入图片描述

1.5 在图表中添加日期

现在,可以通过提取日期和最高温度并将其传递给plot(),对温度图形进行改进,如下所示:sitka_highs.py

  import csv
  from datetime import datetime

  import matplotlib.pyplot as plt

  filename = 'data/sitka_weather_07-2018_simple.csv'
  with open(filename) as f:
      reader = csv.reader(f)
      header_row = next(reader)

      # 从文件中获取日期和最高温度。
❶     dates, highs = [], []
      for row in reader:
❷         current_date = datetime.strptime(row[2], '%Y-%m-%d')
          high = int(row[5])
          dates.append(current_date)
          highs.append(high)

  # 根据最高温度绘制图形。
  plt.style.use('seaborn')
  fig, ax = plt.subplots()
❸ ax.plot(dates, highs, c='red')

  # 设置图形的格式。
  ax.set_title("2018年7月每日最高温度", fontsize=24)
  ax.set_xlabel('', fontsize=16)
❹ fig.autofmt_xdate()
  ax.set_ylabel("温度 (F)", fontsize=16)
  ax.tick_params(axis='both', which='major', labelsize=16)

  plt.show()

我们创建了两个空列表,用于存储从文件中提取的日期和最高温度(见❶)。然后,将包含日期信息的数据(row[2])转换为datetime对象(见❷),并将其附加到列表dates末尾。在❸处,将日期和最高温度值传递给plot()。在❹处,调用fig.autofmt_xdate()来绘制倾斜的日期标签,以免其彼此重叠。图显示了改进后的图表。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能车打开usb相机和激光雷达录制数据包的过程记录

首先,智能车的遥控器启动之后,要解除驻车挡位(尾灯不亮红色才可以),然后右上角的那个拨杆是喇叭,对应的左上角的那个拨杆是控制挡位的,包括前进档,后退档。假如是前进,往…

【我们一起60天准备考研算法面试(大全)-第十五天 15/60】【摩尔投票法】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

CSAPP Lab入门探索

此为记录 虚拟机准备工作 下载VMware 直接在浏览器中搜索VMware Workstation即可 等待 安装就是直接下一步下一步即可,那个安装路径也改下,默认是装在系统盘中 许可证: 直接在百度中搜索VMware Workstation 17 Pro密钥大全即可 这里给出一个参考的&…

人体姿态估计动作识别调研报告

人体姿态估计&动作识别 视频演示 Refs: https://www.zhihu.com/zvideo/1227562268420235264 姿态估计与行为识别(行为检测、行为分类)的区别 Refs:姿态估计与行为识别(行为检测、行为分类)的区别 姿态估计 定…

两分钟倒计时 - 啊哈C语言 第4章第5节

题目要求&#xff1a; 尝试编写一个两分钟的倒计时&#xff0c;形如&#xff1a;2:00 1:59 1:58 … 1:00 0:59 0:58 … 0:02 0:01 0:00 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<windows.h> int main(){int a2,b0;while(a>0 &…

SpringMVC的XML配置解析-spring18

SpringMVC的有很多组件&#xff1a;&#xff08;这些我们都可以用配件进行配置&#xff09; 1、充沛器 2、映射器 3、视图解析器 默认情况下他们要使用哪个组件&#xff0c;我们可以挖一下&#xff1a; 第一个重叠器映射器 第二个 重叠器适配器 第三个 视图适配器 打开看…

Vue生命周期详解学习笔记

生命周期 生命周期又名生命周期回调函数&#xff0c;生命周期函数&#xff0c;生命周期钩子。生命周期是Vue在关键时刻帮我们调用的一些特殊名称的函数。生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求编写的。生命周期中的this指向vm或组件实例对象…

【PHP面试题48】Redis的事务?事务都有哪些注意的地方?

文章目录 一、关于事务1.1 事务的概念和优势1.2 Redis事务的基本用法 二、Redis事务的注意事项2.1 使用WATCH监视关键变量2.2 避免长时间事务2.3 避免事务中的循环2.4 处理事务执行结果2.5 考虑使用管道2.6 使用合适的事务隔离级别2.7 考虑事务的并发性2.8 监控事务执行情况 总…

项目管理进度管理神器:有效方法分享

在项目管理中&#xff0c;进度管理是至关重要的环节&#xff0c;它可以帮助项目团队及时发现和解决问题&#xff0c;确保项目按计划顺利进行。一个有效的进度管理方案需要考虑多方面的因素&#xff0c;包括任务分解、时间控制、资源分配、风险管理等。 如何有效的管理项目进度&…

剑指 Offer 68 - II. 二叉树的最近公共祖先

题目介绍 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

FL Studio2023最新中文版混音编曲宿主软件及电脑配置要求

现在大部分音乐的制作过程都是在宿主软件中完成的&#xff0c;宿主软件又称数字音频工作站&#xff0c;简写为DAW软件。目前市面上有非常多的宿主软件供大家选择&#xff0c;例如Cubase、Logic Pro以及我一直使用的FL Studio。每款不同的宿主软件都有不同的优缺点&#xff0c;所…

MFC第十七天 CFont类与LOGFONT结构体、记事本文件打开和保存及是否保存的逻辑流程分析、PreTranslateMessage虚函数与快捷键

文章目录 CFont类与LOGFONT结构体CFontDialog字体信息结构体与HFONT句柄的关系 记事本文件拖入、打开和保存及是否保存的逻辑流程分析PreTranslateMessage虚函数与快捷键附录 CFont类与LOGFONT结构体 CFontDialog 构造函数介绍 public: //用于指定字体对话框的初始字体属性&…

C# Modbus通信从入门到精通(4)——Modbus RTU(0x02功能码)

1、02(0x02)读线圈输入 使用该功能码能从远程地址中读取1到2000个输入线圈的状态,每个线圈的状态只能是0或者1,读取的线圈数量由主站读取时指定。 2、发送报文格式 更详细的格式如下: 从站地址+功能码+起始地址高位+起始地址低位+线圈数量高位+线圈数量低位+CRC,一共8个…

Linux进程理解【程序地址空间】

Linux进程理解【程序地址空间】 文章目录 Linux进程理解【程序地址空间】1. 话题引入2. 进程地址空间2.1 虚拟地址2.2 写时拷贝 3. 知识扩展 我们先来看看C/C程序地址空间的分布图 如此多区域的划分是为了更好的使用和管理空间&#xff0c;但是真实的内存空间也是按照图上的地址…

nginx的下载与安装

https://nginx.org/en/download.html 下载地址&#xff08;我下载的是1.20.2&#xff09; 1、首先保证可以连接外网 2、将包拖入opt/nginx 3、安装gcc环境 &#xff08;如果出现问题可以参考https://www.cnblogs.com/lzxianren/p/4254059.html&#xff09; yum -y install gc…

你还在手动对比代码差异?这些高质量工具太香了

B站|公众号&#xff1a;啥都会一点的研究生 我发现相当一部分初学者&#xff08;甚至搬砖多年的老同志&#xff09;在对比文件差异的时候居然还是 观察法 文本内容少还凑活能用&#xff0c;成百上千行的时候把眼睛累坏了不说&#xff0c;关键还容易漏信息 接触的人与事多了会…

volatile的可见性探讨

我跟volatile修饰对象和数组能保证其内部元素的可见性&#xff1f;一文的作者有类似的疑惑&#xff0c;按语义&#xff0c;volatile修饰数组时&#xff0c;只是保证其引用地址的可见性&#xff0c;可为什么给数组加了volatile之后&#xff0c;似乎单个数组元素也有了可见性&…

Android Glide同步阻塞方式submit获得Bitmap,kotlin

droid Glide同步阻塞方式submit获得Bitmap&#xff0c;kotlin 需要放入后台线程&#xff0c;不能在主线程。 Android Glide预加载preload ,kotlin_zhangphil的博客-CSDN博客【代码】Android Paging 3,kotlin&#xff08;1&#xff09;在实际的开发中&#xff0c;虽然Glide解决了…

AC+AP 旁挂式连接配置(华为)

AR1路由器配置 # interface GigabitEthernet0/0/0 ip address 10.1.30.1 255.255.255.0 ip route-static 10.1.20.0 255.255.255.0 10.1.30.2 # LSW1核心交换机 # dhcp enable vlan batch 10 20 30 interface Vlanif20 ip address 10.1.20.1 255.255.255.0 dhcp select in…

nacos启动多个集群

nacos启动多个集群,只需要改动集群的名称,然后再次实例服务即可。