(接上文)
接下来整理数据并选取2017年八达岭,大兴区,奥体中心监测点的数据
import pandas as pd
import numpy as np
df=pd.read_csv('beijing_17_18_aq.csv')
def set_time(dataframe):
dataframe['date']=dataframe['utc_time'].str.split(' ',expand=True)[0]
dataframe['time']=dataframe['utc_time'].str.split(' ',expand=True)[1]
dataframe['time']=dataframe['time'].str.split(':',expand=True)[0]+':'+dataframe['time'].str.split(':',expand=True)[1]
del dataframe['utc_time']
set_time(df)
df.dropna(inplace=True)
df=df.sort_values(by='date')
df['year']=df['date'].str.split('-',expand=True)[0]
df=df[df['year']=='2017']
del df['year'],df['time']
ao_2017=df[df['stationId']=='aotizhongxin_aq']
ba_2017=df[df['stationId']=='badaling_aq']
da_2017=df[df['stationId']=='daxing_aq']
del ao_2017['stationId'],ba_2017['stationId'],da_2017['stationId']
ba_2017=ba_2017.reset_index(drop=True)
da_2017=da_2017.reset_index(drop=True)
ao_2017=ao_2017.reset_index(drop=True)
print(ao_2017)
PM2.5 PM10 NO2 CO O3 SO2 date 0 453.0 467.0 156.0 7.2 3.0 9.0 2017-01-01 1 453.0 520.0 157.0 7.6 4.0 9.0 2017-01-01 2 420.0 484.0 139.0 7.4 3.0 9.0 2017-01-01 3 395.0 467.0 141.0 6.9 3.0 8.0 2017-01-01 4 417.0 443.0 143.0 6.8 2.0 8.0 2017-01-01 ... ... ... ... ... ... ... ... 5459 33.0 68.0 64.0 1.1 2.0 9.0 2017-12-31 5460 36.0 69.0 59.0 1.0 3.0 9.0 2017-12-31 5461 17.0 38.0 41.0 0.7 12.0 5.0 2017-12-31 5462 16.0 35.0 45.0 0.7 10.0 5.0 2017-12-31 5463 63.0 126.0 75.0 1.4 3.0 13.0 2017-12-31
先计算每个监测点每个指标每日24小时平均浓度,在根据AQI24小时平均浓度标准计算三个监测点每天AQI值,并打印相关数据,复制到JS
def calcluate_mean_day(data):
mean_day=[]
for x in data['date'].unique():
data1=list(round(data[data['date']==x].mean(),1))+[x]
mean_day.append(data1)
return(mean_day)
mean_day_ao=calcluate_mean_day(ao_2017)
mean_day_ba=calcluate_mean_day(ba_2017)
mean_day_da=calcluate_mean_day(da_2017)
df_ao=pd.DataFrame(mean_day_ao,columns=['PM2.5', 'PM10', 'NO2', 'CO', 'O3', 'SO2','time'])
df_ba=pd.DataFrame(mean_day_ba,columns=['PM2.5', 'PM10', 'NO2', 'CO', 'O3', 'SO2','time'])
df_da=pd.DataFrame(mean_day_da,columns=['PM2.5', 'PM10', 'NO2', 'CO', 'O3', 'SO2','time'])
def AQI_Calculation_24mean(data):
AQI=[]
PM2_D=[0,35,75,115,150,250,350,500]
PM10_D=[0,50,150,250,350,420,500,600]
NO2_D=[0,40,80,180,280,565,750,940]
CO_D=[0,2,4,14,24,36,48,60]
O3_D=[0,160,200,300,400,800,1000,1200]
SO2_D=[0,50,150,475,800,1600,2100,2620]
IAQI=[0,50,100,150,200,300,400,500]
for i in range(len(data)):
day=[]
for j in range(len(PM2_D)):
if data['PM2.5'][i]<PM2_D[j]:
break
day.append(((IAQI[j]-IAQI[j-1])/(PM2_D[j]-PM2_D[j-1]))*(data['PM2.5'][i]-PM2_D[j-1])+IAQI[j-1])
for j in range(len(PM10_D)):
if data['PM10'][i]<PM10_D[j]:
break
day.append(((IAQI[j]-IAQI[j-1])/(PM10_D[j]-PM10_D[j-1]))*(data['PM10'][i]-PM10_D[j-1])+IAQI[j-1])
for j in range(len(NO2_D)):
if data['NO2'][i]<NO2_D[j]:
break
day.append(((IAQI[j]-IAQI[j-1])/(NO2_D[j]-NO2_D[j-1]))*(data['NO2'][i]-NO2_D[j-1])+IAQI[j-1])
for j in range(len(CO_D)):
if data['CO'][i]<CO_D[j]:
break
day.append(((IAQI[j]-IAQI[j-1])/(CO_D[j]-CO_D[j-1]))*(data['CO'][i]-CO_D[j-1])+IAQI[j-1])
for j in range(len(O3_D)):
if data['O3'][i]<O3_D[j]:
break
day.append(((IAQI[j]-IAQI[j-1])/(O3_D[j]-O3_D[j-1]))*(data['O3'][i]-O3_D[j-1])+IAQI[j-1])
for j in range(len(SO2_D)):
if data['SO2'][i]<SO2_D[j]:
break
day.append(((IAQI[j]-IAQI[j-1])/(SO2_D[j]-SO2_D[j-1]))*(data['SO2'][i]-SO2_D[j-1])+IAQI[j-1])
AQI.append(max(day))
return(AQI)
AQI_ao= AQI_Calculation_24mean(df_ao)
AQI_ba= AQI_Calculation_24mean(df_ba)
AQI_da= AQI_Calculation_24mean(df_da)
ao=[]
ba=[]
da=[]
for x in AQI_ao:
ao.append(int(x))
for x in AQI_ba:
ba.append(int(x))
for x in AQI_da:
da.append(int(x))
print(list(df_ao['time'].values))
print(list(df_da['time'].values))
print(list(df_ba['time'].values))
print(ao)
print(ba)
print(da)
JS代码:
option={
title:{
text:'AQI in Beijing in 2017'
},
tooltip:{
trigger:'axis'
},
xAxis:{
type:'category',
data:time
},
grid:{},
yAxis:{},
toolbox:{
feature:{
dataZoom:{
yAxisIndex:'none'
},
restore:{},
saveAsImage:{}
}
},
visualMap:{
top:50,
right:10,
pieces:[{
gt:0,
lte:50,
color:'#93CE07'
},{
gt:50,
lte:100,
color:'#FBDB0F'
},{
gt:100,
lte:150,
color:'#FC7D02'
},{
gt:150,
lte:200,
color:'#FD0100'
},{
gt:200,
color: '#AC3B2A'
}],
outOfRange: {
color: '#999'
}
},
series:{
name:'Beijing AQI',
type:'line',
data:aqi,
markLine:{
silent:true,
lineStyle:{color:'#333'},
data:[{yAxis:50},{yAxis: 100},{yAxis: 150},{ yAxis: 300}]
}
}
}
option={
title:{
text:'Badaling monitoring site VS Daxing monitoring site',
left:'center'
},
legend:{
data:['Daxing','Badaling'],
left:10
},
toolbox:{
feature:{
dataZoom:{
yAxisIndex:'none'
},
restore:{},
saveAsImage:{}
}
},
dataZoom:[{
show:true,
realtime:true,
start:50,
end:100,
xAxisIndex:[0,1]
},{
type: 'inside',
realtime: true,
start: 30,
end: 70,
xAxisIndex: [0, 1]
},],
grid: [
{
left: 60,
right: 50,
height: '35%'
},
{
left: 60,
right: 50,
top: '55%',
height: '35%'
}
],
xAxis:[{
type:'category',
data:BaTime,
axisLine:{onZero:true}
},{
gridIndex:1,
type:'category',
axisLine:{onZero:true},
data:DaTime,
position:'top'
}],
yAxis:[{
name:'Badaling',
type:'value',
max:500
},{
gridIndex:1,
name:'Daxing',
type:'value',
inverse:true,
max:500
}],
series:[{
name:'Badaling',
type:'line',
symbolSize:8,
data:Ba
},{
name:'Daxing',
type:'line',
xAxisIndex:1,
yAxisIndex:1,
symbolSize:8,
data:Da
}]
}
最后摘出奥体中心,大兴区,八达岭三处监测点各项指标及污染程度,然后作图
ao31=ao[:31]
ba31=ba[:31]
da31=da[:31]
def pollution(li):
situation=[]
for x in range(len(li)):
if li[x]<51:
situation.append('优')
elif li[x]<101:
situation.append('良')
elif li[x]<151:
situation.append('轻度污染')
elif li[x]<201:
situation.append('中度污染')
elif li[x]<301:
situation.append('重度污染')
else:
situation.append('严重污染')
return(situation)
ao31_p=pollution(ao31)
ba31_p=pollution(ba31)
da31_p=pollution(da31)
aoti=[]
badaling=[]
daxing=[]
for i in range(31):
aoti.append([i+1]+[ao[i]]+[df_ao.iloc[i,0]]+[df_ao.iloc[i,1]]+[df_ao.iloc[i,2]]+[df_ao.iloc[i,3]]+[df_ao.iloc[i,5]]+[df_ao.iloc[i,5]]+[ao31_p[i]])
for i in range(31):
badaling.append([i+1]+[ao[i]]+[df_ba.iloc[i,0]]+[df_ba.iloc[i,1]]+[df_ba.iloc[i,2]]+[df_ba.iloc[i,3]]+[df_ba.iloc[i,5]]+[df_ba.iloc[i,5]]+[ba31_p[i]])
for i in range(31):
daxing.append([i+1]+[da[i]]+[df_da.iloc[i,0]]+[df_da.iloc[i,1]]+[df_da.iloc[i,2]]+[df_da.iloc[i,3]]+[df_da.iloc[i,5]]+[df_da.iloc[i,5]]+[da31_p[i]])
print(aoti)
print(badaling)
print(daxing)
作图代码参考:Examples - Apache ECharts