【问题】
天气数据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))#结果是<class 'pandas.core.frame.DataFrame'>
- 整理数据,按照时间进行整理 找到相关类 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"]))#<class 'pandas.core.series.Series'>
- 取出值,并且去掉无用的值 在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
import matplotlib.ticker as ticker
#中文设置
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["Ir"].dropna()
dataIws = dataIws.resample("1M").mean()
monthList = list(data["month"].drop_duplicates())
pm25_x = list(dataPm25.index.strftime("%Y-%m"))
pm25_y = list(dataPm25)
temp_x = list(dataTemp.index.strftime("%Y-%m"))
temp_y = list(dataTemp)
press_x = list(dataTemp.index.strftime("%Y-%m"))
press_y = list(dataTemp)
ir_x = list(dataTemp.index.strftime("%Y-%m"))
ir_y = list(dataTemp)
# 分成2x2,占用第1个 5年内PM2.5趋势图
ax=plt.subplot(221)
ax.set_title("5年内PM2.5")
ax.plot(pm25_x,pm25_y,color='red',linewidth=2.0,linestyle='--')
ax.xaxis.set_major_locator(ticker.MultipleLocator(12))
# 分成2x2,占用第2个 5年内气温趋势图
ax=plt.subplot(222)
ax.set_title("5年内气温")
ax.plot(temp_x,temp_y,color='blue',linewidth=3.0,linestyle='--')
ax.xaxis.set_major_locator(ticker.MultipleLocator(12))
#分成2x2,占用第3个 5年内气压趋势图
ax=plt.subplot(223)
ax.set_title("5年内气压")
ax.plot(press_x,press_y,color='yellow',linewidth=3.0,linestyle='--')
ax.xaxis.set_major_locator(ticker.MultipleLocator(12))
#分成2x2,占用第4个 5年内累计降雨量趋势图
ax=plt.subplot(224)
ax.set_title("5年内累计降雨量")
ax.plot(ir_x,ir_y,color='black',linewidth=3.0,linestyle='--')
ax.xaxis.set_major_locator(ticker.MultipleLocator(12))
'''
(3) 统计每年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))
pm25Max5Month.append(tmpPm25Max5Month)
for i in range(len(tmpPm25Max5Month)):
tmpDayList.append(i+1)
dayList.append(tmpDayList)
fig,ax = plt.subplots()
ax.set_title("每年PM2.5指数平均值最高的5个月,获取每天的PM2.5指数")
fig.canvas.set_window_title('每年PM2.5指数平均值最高的5个月,获取每天的PM2.5指数')
for i in range(len(dayList)):
ax.plot(dayList[i],pm25Max5Month[i],color=cnames[i],linewidth=1.0,linestyle='-.')
ax.xaxis.set_major_locator(ticker.MultipleLocator(30))
plt.show()