qq_57806868 2023-03-12 12:41 采纳率: 33.3%
浏览 170
已结题

基于MAIAC AOD和 ERA-5再分析数据的北京地区PM2.5反演问题

标题如下,本人大四,做毕业设计因为之前没有任何气象相关的基础,在这个问题上没有思路,希望得到help:
问题描述如下:
1.MAIAC AOD和ERA-5相关的气象数据在哪里获取最合适,该怎么获取,因为考虑到文件大小希望给一个可行的下载方案
2.本人目前已经得到了北京地区的PM2.5站点数据,但是只是站点记录的数据,该怎么做才能将这种离散的数据值在图片上画出并显示,
3.在得到MAIAC AOD数据和ERA-5再分析数据后应该怎么做,是将其转换成csv文件然后找到对应站点的经纬度坐标然后将前面的PM2.5站点数据放在一起做成一个综合所有数据的csv表格吗
4.输入到神经网络或者各种深度学习网络的数据格式是怎么样的?
综上所述:希望可以得到具体的实施方案和措施(细化,指出每步该怎么做,把数据处理成什么样子,处理要求之类的,主要是前期的数据预处理工作,在后续估计PM2.5算法这里不用说的太明细),总体的实施措施需要用python实现,如果能给出可行的建议并在后续中予以指导,本人会继续给予有偿回报

  • 写回答

6条回答 默认 最新

  • CodeBytes 2023-03-12 13:14
    关注

    该回答引用ChatGPT

    如有疑问,可以回复我!

    1、要将离散的站点数据绘制成图像,您需要使用地图绘图软件,例如QGIS或ArcGIS。在软件中,您可以将站点数据导入为点图层,并将其叠加在地图上。您可以选择使用插值方法(例如克里金插值)来创建光滑的表面,并将其绘制在地图上以显示PM2.5浓度的空间分布。您还可以使用Python的Matplotlib和Basemap库来绘制地图和点。

    2、如果您想将MAIAC AOD和ERA-5再分析数据与PM2.5站点数据结合起来,可以根据站点的经纬度坐标将这些数据合并到一个表格中。您可以使用Python的pandas库来读取和合并不同的数据文件。您需要确保每个数据文件都有相同的时间戳,并将它们按照时间戳进行合并。

    3、输入到神经网络或其他深度学习模型的数据格式取决于模型的类型和输入要求。例如,卷积神经网络(CNN)通常使用图像格式作为输入,因此您可能需要将数据转换为图像格式。其他模型可能需要将数据作为向量或矩阵输入。您还需要对数据进行预处理和归一化,以确保数据在训练期间具有相似的尺度和分布。您可以使用Python的TensorFlow或PyTorch等深度学习框架来处理数据并构建模型。

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    1、将站点数据在地图上绘制成图像:
    使用Python的pandas库读取站点数据的csv文件。
    使用Python的geopandas库将站点数据转换为点图层。
    使用Python的QGIS库或ArcGIS软件将点图层绘制在地图上。
    使用Python的interpolation库对数据进行插值,以创建平滑的表面。

    2、在地图上显示插值表面,以显示PM2.5浓度的空间分布。
    将MAIAC AOD和ERA-5数据与站点数据合并:
    使用Python的pandas库读取MAIAC AOD和ERA-5数据的csv文件。
    将数据按时间戳进行排序,并使用Python的merge函数将数据合并为一个表格。
    在合并的表格中,只保留与站点坐标匹配的数据。

    3、数据预处理:
    将合并的数据按照时间序列进行排序,以便后续训练模型。
    对数据进行清洗和去噪,例如去除空值和异常值。
    对数据进行归一化,以确保数据在训练期间具有相似的尺度和分布。
    可以使用Python的sklearn.preprocessing库进行数据预处理。

    4、将处理后的数据输入到神经网络或其他深度学习模型:
    使用Python的TensorFlow或PyTorch等深度学习框架来处理数据并构建模型。
    将数据转换为模型所需的格式,例如图像格式或矩阵格式。
    在模型中训练和测试数据,并进行模型优化和调整。

    5、输出结果:
    使用Python的pandas库将模型输出的结果保存为csv文件。
    将输出结果绘制在地图上,以显示PM2.5浓度的空间分布。
    可以使用Python的matplotlib库或QGIS库来绘制地图。

    6、获取北京地区的PM2.5站点数据:

    可以从国家环境保护部的“空气质量监测数据查询”页面下载北京地区的PM2.5站点数据:http://beijingair.sinaapp.com/#%E3%80%82%E9%80%89%E6%8B%A9%E2%80%9C%E6%9F%A5%E8%AF%A2%E5%B0%8F%E6%97%B6%E6%95%B0%E6%8D%AE%E2%80%9D%E6%88%96%E2%80%9C%E6%9F%A5%E8%AF%A2%E6%97%A5%E6%95%B0%E6%8D%AE%E2%80%9D%EF%BC%8C%E7%84%B6%E5%90%8E%E9%80%89%E6%8B%A9%E2%80%9C%E5%8C%97%E4%BA%AC%E5%B8%82%E2%80%9D%E5%92%8C%E6%97%A5%E6%9C%9F%E8%8C%83%E5%9B%B4%EF%BC%8C%E7%82%B9%E5%87%BB%E2%80%9C%E6%9F%A5%E8%AF%A2%E2%80%9D%E6%8C%89%E9%92%AE%E3%80%82%E4%B8%8B%E8%BD%BD%E7%9A%84%E6%95%B0%E6%8D%AE%E5%B0%86%E4%BF%9D%E5%AD%98%E4%B8%BAcsv%E6%96%87%E4%BB%B6%E3%80%82

    3)将站点数据在地图上绘制成图像:

    
    import pandas as pd
    import geopandas as gpd
    import matplotlib.pyplot as plt
    from interpolation import Rbf
    
    # 读取站点数据
    df = pd.read_csv('beijing_pm25_data.csv', parse_dates=['time'])
    # 将经纬度转换为点图层
    gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df['longitude'], df['latitude']))
    # 创建地图
    world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
    ax = world[world.name == 'China'].plot(color='white', edgecolor='black', figsize=(10, 6))
    # 将点图层叠加在地图上
    gdf.plot(column='PM2.5', ax=ax, legend=True)
    # 插值
    rbf = Rbf(df['longitude'], df['latitude'], df['PM2.5'], function='multiquadric', smooth=0.5)
    xi = np.linspace(df['longitude'].min(), df['longitude'].max(), 100)
    yi = np.linspace(df['latitude'].min(), df['latitude'].max(), 100)
    Xi, Yi = np.meshgrid(xi, yi)
    zi = rbf(Xi, Yi)
    # 在地图上显示插值表面
    ax.contourf(Xi, Yi, zi, cmap='Reds', alpha=0.5)
    plt.show()
    
    

    7、将MAIAC AOD和ERA-5数据与站点数据合并:

    
    
    import pandas as pd
    
    # 读取MAIAC AOD数据
    df_aod = pd.read_csv('MAIAC_L2_AOD_20210101.csv', parse_dates=['time'])
    # 读取ERA-5数据
    df_era5 = pd.read_csv('era5_hourly_t2m_2021-01-01.csv', parse_dates=['time'])
    # 合并MAIAC AOD和ERA-5数据
    df = pd.merge(df_aod, df_era5, on='time')
    # 读取站点数据
    df_pm25 = pd.read_csv('beijing_pm25_data.csv', parse_dates=['time'])
    # 合并站点数据和MAIAC AOD和ERA-5数据
    df = pd.merge(df, df_pm25[['time', 'longitude', 'latitude', 'PM2.5']], on=['time', 'longitude', 'latitude'], how='left')
    
    

    8、数据预处理:

    from sklearn.preprocessing import MinMaxScaler
    
    # 清洗和去噪
    df = df.dropna()  # 去除空值
    df = df[df['PM2.5'] > 0]  # 去除PM2.5小于等于0的值
    # 归一化
    scaler = MinMaxScaler()
    df[['AOD', 'temperature']] = scaler.fit_transform(df[['AOD', 'temperature']])
    
    

    9、将处理后的数据输入到神经网络或其他深度学习模型:

    
    
    import tensorflow as tf
    
    # 将数据转换为模型所需的格式
    X = df[['AOD', 'temperature']].values.reshape(-1, 2, 1)
    y = df['PM2.5'].values.reshape(-1, 1)
    
    # 构建模型
    model = tf.keras.Sequential([
        tf.keras.layers.Conv1D(filters=32, kernel_size=3, activation='relu'),
        tf.keras.layers.MaxPooling1D(pool_size=2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(units=64, activation='relu'),
        tf.keras.layers.Dense(units=1)
    ])
    model.compile(optimizer='adam', loss='mse')
    
    # 训练模型
    model.fit(X, y, epochs=10)
    
    # 测试模型
    X_test = np.array([[[0.1], [0.5]], [[0.2], [0.4]]])
    y_pred = model.predict(X_test)
    
    

    10、输出结果:

    
    import pandas as pd
    import matplotlib.pyplot as plt
    import geopandas as gpd
    
    # 将模型输出的结果保存为csv文件
    df_pred = pd.DataFrame({'longitude': df['longitude'], 'latitude': df['latitude'], 'PM2.5_pred': model.predict(X).flatten()})
    df_pred.to_csv('beijing_pm25_pred.csv', index=False)
    
    # 在地图上显示PM2.5浓度的空间分布
    gdf_pred = gpd.GeoDataFrame(df_pred, geometry=gpd.points_from_xy(df_pred['longitude'], df_pred['latitude']))
    world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
    ax = world[world.name == 'China'].plot(color='white', edgecolor='black', figsize=(10, 6))
    gdf_pred.plot(column='PM2.5_pred', ax=ax, legend=True)
    plt.show()
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月16日
  • 创建了问题 3月12日