(2)Python数据处理及Javascript可视化(基础)-北京AQI

该文使用Python对2017年北京八达岭、大兴区、奥体中心的空气质量数据进行处理,计算各监测点每日PM2.5、PM10、NO2、CO、O3、SO2的平均浓度和AQI值。通过AQI_Calculation_24mean函数计算了每天的空气质量指数,并用JS代码展示数据图表,比较了这三个地区的空气质量状况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 (接上文)

接下来整理数据并选取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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值