python数据统计与可视化(Pandas库)统计pm2.5

Adalia ·
更新时间:2024-11-13
· 701 次阅读

【问题】

天气数据pollution.csv,完成如下数据分析和可视化要求

pollution.csv

No,year,month,day,hour,pm2.5,DEWP,TEMP,PRES,cbwd,Iws,Is,Ir 1,2010,1,1,0,NA,-21,-11,1021,NW,1.79,0,0 2,2010,1,1,1,NA,-21,-12,1020,NW,4.92,0,0 3,2010,1,1,2,NA,-21,-11,1019,NW,6.71,0,0 4,2010,1,1,3,NA,-21,-14,1019,NW,9.84,0,0 5,2010,1,1,4,NA,-20,-12,1018,NW,12.97,0,0

(1) 统计每年的日平均PM2.5指数,日平均气温,并分别用柱状图显示,要求图有中文标题和坐标轴说明;

(2) 采用2X2子图,以折线展示5年内PM2.5,气温,气压,累计降雨量趋势图;

(3) 统计每年PM2.5指数平均值最高的5个月,获取每天的PM2.5指数,并在同一图表上汇出其折线图(不同年份用不同的颜色表示)。

【问题分析】

先决条件 安装 matplotlib pandas

命令:pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

  第一时间想到的用数组,但是发现如果不知道数据有多少天,多少年,时间是否齐整。代码里面会多很多的判断。于是开始上网冲浪,发现有个python库,是专门用于统计数据,于是

 pip install pandas 安装完后查看相关API   PandasAPI

首先读取csv文件,导入csv

#读取pollution.csv filePath = './res/pollution.csv' data = pandas.read_csv(filePath) print(type(data))#结果是 整理数据,按照时间进行整理 找到相关类  PeriodIndex 和相关例子

# 数据整理 freq是按照小时索引 data["xxx"]是对data进行切片 只取xxx一列 periode = pandas.PeriodIndex(year=data["year"],month=data["month"],day=data["day"],\ hour=data["hour"],freq="H") data["datatime"] = periode # 设置时间为索引 ->2010-01-02 data.set_index("datatime",inplace = True) print(type(data["year"]))# 取出值,并且去掉无用的值 在Series类中查找相关方法 与时间序列有关的方法 #取出值,并且去掉无用的值 按照一年进行重新 dataPm25 = data["pm2.5"].dropna() dataPm25 = dataPm25.resample("1Y").mean() dataTemp = data["TEMP"].dropna() dataTemp = dataTemp.resample("1Y").mean()

同理进行其他分析

总代码:

from matplotlib import pyplot as plt import csv import matplotlib import pandas #中文设置 zhfoot = matplotlib.font_manager.FontProperties(fname="./res/SimHei.ttf") plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False #读取pollution.csv filePath = './res/pollution.csv' data = pandas.read_csv(filePath) print(type(data)) # 数据整理 periode = pandas.PeriodIndex(year=data["year"],month=data["month"],day=data["day"],\ hour=data["hour"],freq="H") data["datatime"] = periode # 设置时间为索引 data.set_index("datatime",inplace = True) print(type(data["pm2.5"])) # dataPm25 = data["pm2.5"].dropna() dataPm25 = dataPm25.resample("1Y").mean() dataTemp = data["TEMP"].dropna() dataTemp = dataTemp.resample("1Y").mean() #显示数据 plt.figure("每年的日平均PM2.5指数,日平均气温") yearList = list(data["year"].drop_duplicates()) pm25_x = dataPm25.index pm25_y = list(dataPm25) temp_x = list(dataTemp.index) temp_y = list(dataTemp) #显示 def autolabel(rects1): i = 0 for rect1 in rects1: i += 1 height = rect1.get_height() plt.text(rect1.get_x()+rect1.get_width()/2. - 0.1, 1.01*height, '%.3f' % height) x = list(range(len(pm25_x))) total_width, n = 0.8, 2 width = total_width / n pm25_z = plt.bar(x, pm25_y, width=width, label=u'每年的日平均PM2.5指数', fc='b') for i in range(len(x)): x[i] += width temp_z = plt.bar(x,temp_y, width=width, label=u'每年的日平均气温', tick_label=yearList, fc='g') plt.legend() autolabel(pm25_z) autolabel(temp_z) ''' (2) 采用2X2子图,以折线展示5年内PM2.5,气温,气压,累计降雨量趋势图; ''' plt.figure("5年内PM2.5,气温,气压,累计降雨量趋势图") dataPm25 = data["pm2.5"].dropna() dataPm25 = dataPm25.resample("1M").mean() dataTemp = data["TEMP"].dropna() dataTemp = dataTemp.resample("1M").mean() dataPress = data["TEMP"].dropna() dataPress = dataPress.resample("1M").mean() dataIws = data["Iws"].dropna() dataIws = dataIws.resample("1M").mean() monthList = list(data["month"].drop_duplicates()) pm25_x = list(dataPm25.index.strftime("%Y-%M-%D")) pm25_y = list(dataPm25) temp_x = list(dataTemp.index.strftime("%Y-%M-%D")) temp_y = list(dataTemp) press_x = list(dataTemp.index.strftime("%Y-%M-%D")) press_y = list(dataTemp) iws_x = list(dataTemp.index.strftime("%Y-%M-%D")) iws_y = list(dataTemp) # 分成2x2,占用第1个 5年内PM2.5趋势图 plt.subplot(221) plt.plot(pm25_x,pm25_y,color='red',linewidth=2.0,linestyle='--') # 分成2x2,占用第2个 5年内气温趋势图 plt.subplot(222) plt.plot(temp_x,temp_y,color='blue',linewidth=3.0,linestyle='--') #分成2x2,占用第3个 5年内气压趋势图 plt.subplot(223) plt.plot(press_x,press_y,color='yellow',linewidth=3.0,linestyle='--') plt.subplot(224) #分成2x2,占用第4个 5年内累计降雨量趋势图 plt.plot(iws_x,iws_y,color='black',linewidth=3.0,linestyle='--') ''' (3) 统计每年PM2.5指数平均值最高的5个月,获取每天的PM2.5指数, 并在同一图表上汇出其折线图(不同年份用不同的颜色表示)。 ''' plt.figure("每年PM2.5指数平均值最高的5个月,获取每天的PM2.5指数") cnames = [ 'black', 'blue', 'brown', 'gold', 'gray', 'green', 'navy', 'orange', 'pink', 'plum', 'purple', 'red', 'yellow' ] pm25Max5Month = [] dataPm25 = data["pm2.5"].resample("1M").mean() dayList = [] #确定5年中的最高几个月然后再取值 for year in yearList: tmpPm25Max5Month=[] tmpDayList=[] for month in dataPm25[str(year)].nlargest(5).sort_index().index.month: tmp = data["pm2.5"][str(year)+'-'+str(month)].resample("1D").mean() tmpPm25Max5Month+=(list(tmp.values)) tmpDayList+=(list(tmp.index.strftime("%m%d"))) pm25Max5Month.append(tmpPm25Max5Month) dayList.append(tmpDayList) for i in range(len(dayList)): plt.plot(dayList[i],pm25Max5Month[i],color=cnames[i],linewidth=1.0,linestyle='-.') plt.show()
作者:tangyoha



pm2 可视化 pandas Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号