【数据分析特辑】空气质量网格化监测数据分析

前言

一般城市均有空气质量的网格化监测设施,本文将对其监测数据进行分析。

分析说明

本文仅对数据缺失情况、颗粒物浓度及超标记录、噪声强度进行分析。原始数据格式如下:

优良率
(图片右键新标签页打开会很清晰)

核心代码解析

(1)数据获取

def data_capture(file_path_list):
    if len(file_path_list) == 0:
        logger.get_log().info("输入文件数目为零")
        return
    else:
        try:
            df = pd.read_excel(io=file_path_list[0], skiprows=1, header=None)
            for file_path in file_path_list:
                if file_path is not file_path_list[0]:
                    dfx = pd.read_excel(io=file_path, skiprows=1, header=None)
                    df = pd.concat([df, dfx], axis=0)
            df = df.iloc[:, [0, 2, 4, 5, 8, 17]]
            df.columns = ['企业名称', '所属区域', '监测时间', 'PM2.5', 'PM10', 'DB']
            df['date'] = pd.to_datetime(df['监测时间'], format='%Y%m%d')
            df.set_index('date', inplace=True)
            df['year'] = df.index.year
            df['month'] = df.index.month
            df['day'] = df.index.day
            df['PM10_STD'] = [150] * len(df['PM10'])
            df['PM2.5_STD'] = [75] * len(df['PM2.5'])
            logger.get_log().info("数据时间范围:" + str(df.index[0]) + " ~ " + str(df.index[-1]))

            return df.drop_duplicates(keep='first')
        except Exception as e:
            logger.get_log().error(e)
            return

(2)数据缺失检测,时间段之间(不含首尾)极为缺失时间段

def lack_detect(df, enterprise, address):
    if df.index[0].day != 1:
        logger.get_log().info(
            address + enterprise + '缺失时间段: ' + datetime.datetime(df.index[0].year, df.index[0].month, 1).strftime(
                "%Y-%m-%d") + ' ~ ' + str(
                df.index[0]))
    if df.index[-1].day != calendar.mdays[df.index[0].month]:
        logger.get_log().info(
            address + enterprise + '缺失时间段: ' + str(df.index[-1]) + ' ~ ' + datetime.datetime(df.index[0].year,
                                                                                             df.index[0].month,
                                                                                             calendar.monthrange(
                                                                                                 df.index[0].year,
                                                                                                 df.index[0].month)[
                                                                                                 1]).strftime("%Y-%m-%d"))
    for i in range(df.index.size - 1):
        if (df.index[i + 1] - df.index[i]).days != 1:
            logger.get_log().info(enterprise + '缺失时间段: ' + str(df.index[i]) + ' ~ ' + str(df.index[i + 1]))

(3)超标状况检测

def over_standard_detect(df):
    df_10 = df[(df['PM10_STD'] <= df['PM10'])]
    df_25 = df[(df['PM2.5_STD'] <= df['PM2.5'])]
    df_25.to_csv(PATH / '监测站点PM2.5超标统计.csv', encoding='gbk')
    df_10.to_csv(PATH / '监测站点PM10超标统计.csv', encoding='gbk')

(4)颗粒物浓度及噪声强度日变化趋势

def ent_plot(df, enterprise, address):
    index = pd.date_range(start=df.index[0], end=df.index[-1], freq='5D')

    new_path = Path(PATH / address)
    if not os.path.exists(new_path):
        os.mkdir(new_path)

    fig = plt.figure()

    plt.subplot(211)
    plt.plot(df['PM2.5'], label='PM$_{2.5}$', linewidth=2, color='black', marker='o', markerfacecolor='red',
             markersize=4)
    plt.plot(df['PM10'], label='PM$_{10}$', linewidth=2, color='red', marker='o', markerfacecolor='black', markersize=4)
    plt.plot(df['PM2.5_STD'], label='PM$_{2.5}$二级标准', linewidth=2, color='black', linestyle='--')
    plt.plot(df['PM10_STD'], label='PM$_{10}$二级标准', linewidth=2, color='red', linestyle='--')
    plt.xticks(index, '')
    plt.ylabel('浓度(${μg}$/m${^3}$)')
    # plt.tick_params(axis='y', labelsize=18)
    plt.legend(loc='upper left', fontsize=18)
    plt.legend(bbox_to_anchor=(1, 0.6))

    plt.subplot(212)
    plt.plot(df['DB'], label='噪声', linewidth=2, color='green', marker='o', markerfacecolor='y', markersize=4)
    plt.xticks(index, index.strftime('%Y-%m-%d'), rotation=15)
    plt.ylabel('分贝(dB)')
    plt.legend(bbox_to_anchor=(1.22, 0.2))
    plt.savefig(
        new_path / (enterprise + '站' + str(df.index[0].year) + '年' + str(
            df.index[0].month) + '月' + '颗粒物浓度及噪声强度变化曲线.jpg'),
        bbox_inches='tight')
    plt.show()

分析结果

仅展示图片结果,生成的超标情况记录在csv文件中,数据缺失状况在日志文件中。可以看出,颗粒物存在超标的情况。

优良率
(图片右键新标签页打开会很清晰)

以下是本人独自运营的微信公众号,用于分享个人学习及工作生活趣事,大佬们可以关注一波。

优良率
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

⁣北潇

老板大气!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值