【问题】

天气数据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库,是专门用于统计数据,于是

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

首先读取csv文件,导入csv

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

python中判断某响应中包含某值 为真_python

python中判断某响应中包含某值 为真_python_02

# 数据整理 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()