目录

作业基本要求

数据来源

其他要求

一、源代码

二、可视化展示

1.绘制随时间变化曲线图

2.绘制某一时点下污染物占比

3.绘制北京地图下的各个检测站污染情况

​编辑 4.分析变量之间的相关性(污染物含量与气象状态)


作业基本要求

数据来源

经济管理中通常有大量的数据以csv等结构化格式存在,如本次作业要用的空气质量数据。数据见在线平台,格式说明如https://archive.ics.uci.edu/ml/datasets/Beijing+Multi-Site+Air-Quality+Data

其他要求

1. 至少实现一个数据分析类,以提供数据的读取及基本的时间(如某区域某类型污染物随时间的变化)和空间分析(某时间点或时间段北京空气质量的空间分布态势)方法。

2. 至少实现一个数据可视化类,以提供上述时空分析结果的可视化,如以曲线、饼、地图等形式对结果进行呈现。

3. 如果数据中包含空值等异常值(可人工注入错误数据以测试异常抛出与处理的逻辑),在进行数据分析以及可视化前需要检查数据。因此需要实现NotNumError类,继承ValueError,并加入新属性region, year,month,day,hour,pollutant,对数据进行检测,若取到的一列数据中包含空值等明显错误,则抛出该异常,并提供异常信息。在此基础上,利用try except捕获该异常,打印异常信息,并对应位置的数据进行适当的填充。

4. (附加)污染物含量与气象状态本身是否有相关性?请丰富数据分析类和数据可视化类,增加关于这些相关性探索的方法。

5. (附加)思考不同区域时间变化的趋势及差异的管理意义。

一、源代码

from pyecharts import Line,Pie,Map
import pandas as pd
import numpy as np
from seaborn.matrix import heatmap  #绘制热力图
import matplotlib.pyplot as plt
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType
import pyechartsclass Data_ana:'''这是一个提高数据读取操作的类'''def __init__(self,path_list,station_list):'''初始化传入一个路径列表和检测站列表'''self.path_list = path_listself.station_list = station_listdef read_csv(self,station):'''这是一个根据传入的监测站,读入对应csv文件的函数'''i = self.station_list.index(station)df = pd.read_csv(self.path_list[i],header=0)return dfdef time_ana(self,station,pollutant):passdef area_ana(self,time):passclass Data_plt:'''数据可视化类'''def __init__(self,path_list,station_list):'''初始化,把路径和检查站名称列表传入'''self.path_list = path_listself.station_list = station_listdef station_pollutant_graph(self,station,pollutant):'''绘制出某一个检测站某种污染物随时间的变化'''A = Data_ana(self.path_list, self.station_list)df = A.read_csv(station)data_array = np.array(df)data_list =data_array.tolist() #将dataframe转化为listtime_list = []num_list = []row_name = ['No','year','month','day','hour','PM2.5','PM10','SO2','NO2','CO','O3','TEMP','PRES','DEWP','RAIN','wd','WSPM','station']index1 = row_name.index(pollutant) for i in data_list[1:1000]:time_list.append(str(i[1])+'.'+str(i[2])+'.'+str(i[3])+'.'+str(i[4])) #对应的时间num_list.append(i[index1]) #对应的值line = Line("在{},{}随着时间的变化折线图".format(station,pollutant))line.add(station, time_list, num_list, mark_point=["average"])line.render()def time_station_pie(self,time_str,station):'''绘制在某一时间下,某一检测站不同污染物的占比的饼图'''A = Data_ana(self.path_list, self.station_list)df = A.read_csv(station)data_array = np.array(df)data_list =data_array.tolist()  #将dataframe转化为listtime = time_str.split('.')year = int(time[0]);month = int(time[1]);day = int(time[2]);hour = int(time[3])i = 0;flag = 1while i < len(data_list) and flag == 1:if year == data_list[i][1] and month == data_list[i][2] and day == data_list[i][3] and hour == data_list[i][4]:num_list = data_list[i][5:11]flag = 0i = i + 1pollutants = ['PM2.5','PM10','SO2','NO2','CO','O3']pie = Pie('{}{}'.format(station,time_str))pie.add("", pollutants, num_list, is_label_show=True)pie.render()def bj_time_pollutant_map(self,time_str,pollutant):'''传入时间和污染物,在北京地图上绘制不同检查站的数据'''values = []A = Data_ana(self.path_list, self.station_list)  #将A实例化为第一个类row_name = ['No','year','month','day','hour','PM2.5','PM10','SO2','NO2','CO','O3','TEMP','PRES','DEWP','RAIN','wd','WSPM','station']index1 = row_name.index(pollutant) #找出我们选定的污染物在数据中的列数time = time_str.split('.')year = int(time[0]);month = int(time[1]);day = int(time[2]);hour = int(time[3]) #将我们传入的数据分割for station in self.station_list:  #对每个监测站进行遍历df = A.read_csv(station)data_array = np.array(df)data_list =data_array.tolist() #由dataframe转化为listi = 0;flag = 1while i < len(data_list) and flag == 1:#对比时间if year == data_list[i][1] and month == data_list[i][2] and day == data_list[i][3] and hour == data_list[i][4]:value = data_list[i][index1]values.append(value)flag = 0i = i + 1#下面开始地图绘制环节city = '北京'g = pyecharts.charts.Geo()g.add_schema(maptype=city)# 定义坐标对应的名称,添加到坐标库中 add_coordinate(name, 经度, 纬度)g.add_coordinate('奥体中心', 116.401665, 39.985069)g.add_coordinate('昌平', 116.23128, 40.22077)g.add_coordinate('定陵', 116.10098901489258, 40.36113569243784)g.add_coordinate('东四', 116.42371240356445, 39.92600162086124)g.add_coordinate('官园', 116.35916772583008, 39.93495273529134)g.add_coordinate('古城', 116.197319, 39.908829)g.add_coordinate('怀柔', 116.64601388671875, 40.32397764738031)g.add_coordinate('农展馆', 116.46147790649414, 39.94127046425559)g.add_coordinate('顺义', 116.66146341064453, 40.15966193736629)g.add_coordinate('天坛', 116.41189990551759, 39.88038235336456)g.add_coordinate('万柳', 116.28929076702882, 39.972465789671865)g.add_coordinate('万寿西宫', 116.35602412731934, 39.878933304535224)data_pair = []#通过一个循环,得到一个数据对for i in range(len(values)):data_pair.append((self.station_list[i],values[i]))# 将数据添加到地图上g.add('', data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=7)# 设置样式g.set_series_opts(label_opts=opts.LabelOpts(is_show=False))# 自定义分段 color 可以用取色器取色pieces = [{'max': 1, 'label': '0以下', 'color': '#50A3BA'},{'min': 1, 'max': 10, 'label': '1-10', 'color': '#3700A4'},{'min': 10, 'max': 20, 'label': '10-20', 'color': '#81AE9F'},{'min': 20, 'max': 30, 'label': '20-30', 'color': '#E2C568'},{'min': 30, 'max': 50, 'label': '30-50', 'color': '#FCF84D'},{'min': 50, 'max': 100, 'label': '50-100', 'color': '#DD0200'},{'min': 100, 'max': 200, 'label': '100-200', 'color': '#DD675E'},{'min': 200, 'label': '200以上', 'color': '#D94E5D'}  # 有下限无上限]#  is_piecewise 是否自定义分段, 变为true 才能生效g.set_global_opts(visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces),title_opts=opts.TitleOpts(title="{},{}各地{}检测".format(time_str,city,pollutant)),)g.render()def station_heatmap(self,station):'''这是一个绘制不同变量相关系数热力图的函数'''A = Data_ana(self.path_list, self.station_list)df = A.read_csv(station)df1 = df.iloc[:,1:]heatmap(df1.corr(),annot = True,fmt = ".2f",vmax = 1,square = True, xticklabels = False,cmap = "Reds",annot_kws={'size':7})class NotNumError(Exception):   #NotNumError类,用来检验是否有空值def __init__(self,station_list,pollutants,station,df):'''初始化函数'''self.station_list = station_listself.pollutants = pollutantsself.station = stationself.df = dfdef check(self):'''检查函数,传入一个dataframe'''data_array = np.array(self.df)data_list =data_array.tolist() #由dataframe转化为listflag = 0for row in data_list:for index in range(len(row)):if row[index] == None:self.message = f'在{self.station}监测站,第{row[0]}行,第{index+1}个数据为空'flag = 1if flag == 0:self.message  = '没有错误'def __str__(self):'''抛出异常信息的初始化函数'''return self.message  #抛出异常实例def main():path_list = ["D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Aotizhongxin_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Changping_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Dingling_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Dongsi_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Guanyuan_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Gucheng_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Huairou_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Nongzhanguan_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Shunyi_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Tiantan_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Wanliu_20130301-20170228.csv","D:\学习文件\大三上\现代程序设计\第七次作业\PRSA_Data_20130301-20170228\PRSA_Data_Wanshouxigong_20130301-20170228.csv"]row_name = ['No','year','month','day','hour','PM2.5','PM10','SO2','NO2','CO','O3','TEMP','PRES','DEWP','RAIN','wd','WSPM','station']station_list = ['奥体中心','昌平','定陵','东四','官园','古城','怀柔','农展馆','顺义','天坛','万柳','万寿西宫']PLT = Data_plt(path_list, station_list)#PLT.station_heatmap('奥体中心')PLT.station_pollutant_graph('奥体中心','PM2.5')#PLT.bj_time_pollutant_map('2015.10.20.12','NO2')PLT.time_station_pie('2015.9.6.20','古城')main()

二、可视化展示

1.绘制随时间变化曲线图

2.绘制某一时点下污染物占比

3.绘制北京地图下的各个检测站污染情况

 4.分析变量之间的相关性(污染物含量与气象状态)

在RAIN(雨天),WSPM9(风速)大的情况下,污染情况都比较小

'PM2.5','PM10','SO2','NO2','CO’这五类污染物之间相关性比较强,尤其是PM2.5和PM10

O3比较独立

Python——定义一个类来进行北京污染物的可视化(pyecharts绘制折线图、饼图、北京地图)相关推荐

  1. Python基于周立功盒子接收特定报文信号并实时绘制折线图(二)

    Python基于周立功盒子接收特定报文信号并实时绘制折线图(二) 一.背景     根据在上一篇文件Python基于周立功盒子接收特定报文信号并实时绘制折线图(一)的基础上需要做一些优化,原因是,因为 ...

  2. Python可视化:绘制折线图、设置线条形状和marker样式

    绘制折线图.设置线条形状和marker样式 Python可视化:绘制折线图.设置线条形状和marker样式 修改线形:线形可选集合 修改marker:marker可选集合 Python可视化:绘制折线 ...

  3. Python基于周立功盒子接收特定报文信号并实时绘制折线图(一)

    Python基于周立功盒子接收特定报文信号并实时绘制折线图(一) 一.背景     为了节省成本,最大限度利用资源,放弃了用Vector的盒子,采用周立功盒子来做二次开发,以方便来进行压力测试 二.需 ...

  4. 【Plotly】python数据可视化神器——绘制折线图

    Plotly简介 Plotly是用于机器学习.数据挖掘等领域的数据可视化包. 其图标视觉效果简洁大气,可互动性强,成为我工作中进行数据可视化的一大利器,接下来我们就从最简单的折线图,带领大家逐渐入门p ...

  5. python定义一个类和子类_Python定义类、定义子类以及super()函数的使用

    代码实验展示: # 继承关系 object -> Person -> Student -> SchoolBoy # python2的语法: # class Person(object ...

  6. python定义一个类怎么弄_Python怎么创建一个类

    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. Python使用class语句来创建一个新类,class之后为类的名称并以冒号结尾:clas ...

  7. python定义一个类和子类_Python面向对象class类属性及子类用法分析

    本文实例讲述了Python面向对象class类属性及子类用法.分享给大家供大家参考,具体如下: class类属性 class Foo(object): x=1.5 foo=Foo() print fo ...

  8. python定义一个类描述数字时钟_python自定义时钟类、定时任务类

    这是我使用python写的第一个类(也算是学习面向对象语言以来正式写的第一个解耦的类),记录下改进的过程. 分析需求 最初,因为使用time模块显示日期时,每次都要设置时间字符串的格式,挺麻烦,但还是 ...

  9. python定义一个类描述数字时钟_定义一个时间类Time,能提供和设置由时、分、秒组成的时间,编写出应用程序,定义时间对象t...

    展开全部 [基本题]定义一个时间类,提供设定时间.显示时间和秒数增加e68a8432313133353236313431303231363533313334336361371的功能,其中设定时间的方法 ...

最新文章

  1. SQL语句性能优化--LECCO SQL Expert
  2. Chrome常用快捷键整理汇总
  3. pip 设置超时时间_Python pip使用超时问题解决方案
  4. Linux 字符设备驱动开发基础(五)—— ioremap() 函数解析
  5. Typora用法教程小结
  6. MongoDB 复制集节点增加移除及节点属性配置
  7. 安防无战事:一场 10213 亿元的误会
  8. python跟我学_灞桥区跟我学python
  9. 网络中计算机传输信息时所遵从的不同规则,2012年上海市高中学业水平考试信息科技试卷(第6套)...
  10. Codeforces Round #580 (Div. 1)(CF1205)A-E
  11. 软考之软件设计师之第一战计算机系统概论重点和坑
  12. Java中类与对象的定义与使用
  13. 神经网络模型分类总结
  14. Tuxera NTFS2022产品密钥 mac读取ntfs格式驱动程序
  15. WebStorm下载及破解
  16. QC4+充电协议_原来那么多手机支持QC4+快充,小米最多,只是之前用错了充电头...
  17. 启明欣欣STM32开发板 --- 运行LWIP (无RTOS)
  18. android 微信 https 证书,微信https未授权证书究竟是什么意思
  19. Latent semantic analysis (LSA)
  20. Android万能遥控菜单选择添加,将小米米家万能遥控器添加到Home Assistant

热门文章

  1. 移动运营商劫持注入用户流量显示代码
  2. Linux用户密码信息存储目录,Linux用户目录
  3. 用于一般光学系统的光栅元件
  4. .NET Core之 ABP从入门到精通
  5. linux拨号上网指令,linux中的pppoe拨号上网
  6. CSS 学习成长笔记(3)
  7. torch优化器sgd源码
  8. 实习碰到的问题,和解决方法
  9. 滑模控制学习笔记(四)
  10. daysmatter安卓版_倒数日 · DaysMatter