Python:如何基于滑动窗口进行气候因子间的相关系数分析?(逐像元)

news2024/10/1 5:41:42

目录

01 常规的相关系数简单说明

 02 滑动窗口下的相关系数分析


最近处理一些气候因子的统计分析,遇到一些问题,记录一下。

01 常规的相关系数简单说明

在研究滑动窗口前,我们先来研究一下常规的相关系数分析,为了简化问题,假定我们现在有四川省范围内2019年每月的降水量数据和NDVI影像,我们想研究不同区域降水量和NDVI的相关性,即研究降水量和NDVI的空间关联性。

基本思路就是:对于每一个像元,都有1~12月共计12个值的降水量和NDVI指数,那么基于这两列数据我们可以计算出该像元位置降水量和NDVI的相关系数(这里我比较推荐使用斯皮尔曼系数,因为皮尔逊系数要求我们的这两列数据满足正态分布,但实际上我们往往都是假定我们的数据满足正态分布,这样计算的相关系数其实是有偏差的),对于每一个像元我们都可以计算出一个相关系数,如此便可以得到四川省范围内的相关系数的空间分布图。

思路讲完了,我们就可以得到如下的影像。

 02 滑动窗口下的相关系数分析

重点来了,我们想看看在一定范围内的相关系数,怎么办?

说明:我当前有4个excel文件,分别为降水量数据,NDVI数据,地表温度数据,土壤水分数据。对于每一个excel文件,前5列表示地形因子数据,往后13列为2003年~2015年的降水量/NDVI/地表温度/土壤水分数据,每一行表示一个像元的地形因子值、气候因子值。

大致如下:

 思路:假定滑动窗口为3*3(想想ArcGIS中空间分析工具-区域统计-焦点统计,有一点点类似),从第一个像元位置开始,对于该像元的移动窗口(包括其本身和周围8个像元),我们对于窗口内的每一个像元,都进行如下处理:获取窗口像元的降水量值(2003年~2015年共计13个值)和NDVI值,计算该像元位置的相关系数。那么对于该窗口我们一共计算了9个相关系数,然后我们计算这9个相关系数的平均值作为中心像元的相关系数值。类似的,对于降水量和地表温度、降水量和土壤水分均是如此操作。

以下是使用python实现的代码:

# @炒茄子  2023-05-18

import numpy as np
import pandas as pd
from scipy.stats import spearmanr
# 注意: 此处使用皮尔逊系数进行相关系数的计算, 但是皮尔逊系数要求数据满足正态分布, 但是实际上很多数据并不满足正态分布, 因此在此处尝试使用斯皮尔曼系数进行相关系数的计算
# 注意: 斯皮尔曼系数要求数据必须是有序的, 即数据具有可比较的大小关系
"""
当前程序用计算不同空间窗口下两两变量之间的相关系数,探索二者之间在空间上是否存在一定的关联。
"""
# 读取年平均降水量和 NDVI 数据、地表温度数据、土壤水分数据
precip_data_year = pd.read_excel(r'E:\PRCP\table\kinds_aver\precipitation_sc_year.xlsx', sheet_name='降水年平均值数据')
ndvi_data_year = pd.read_excel(r'E:\PRCP\table\kinds_aver\ndvi_sc_year.xlsx', sheet_name='NDVI年平均值数据')
temperature_data_year = pd.read_excel(r'E:\PRCP\table\kinds_aver\temperature_sc_year.xlsx', sheet_name='地表温度年平均值数据')
soil_moisture_data_year = pd.read_excel(r'E:\PRCP\table\kinds_aver\soil_moisture_sc_year.xlsx', sheet_name='土壤水分年平均值数据')
# 读取降水量数据和NDVI等数据(不读取地形因子和经纬度列)
_precip_data_year = precip_data_year.iloc[:, 5:]
_ndvi_data_year = ndvi_data_year.iloc[:, 5:]
_temperature_data_year = temperature_data_year.iloc[:, 5:]
_soil_moisture_data_year = soil_moisture_data_year.iloc[:, 5:]
# 创建空的三维数组,用于维度转换后的结果(83, 113, number_of_years)
precip_data_year = np.zeros((83, 113, len(_precip_data_year.columns)), dtype=np.float32)
ndvi_data_year = np.zeros((83, 113, len(_ndvi_data_year.columns)), dtype=np.float32)
temperature_data_year = np.zeros((83, 113, len(_temperature_data_year.columns)), dtype=np.float32)
soil_moisture_data_year = np.zeros((83, 113, len(_soil_moisture_data_year.columns)), dtype=np.float32)
# 将二维数组转换为三维数组
for i in range(len(_precip_data_year.columns)):
    precip_data_year[:, :, i] = _precip_data_year.iloc[:, i].values.reshape(83, 113)
    ndvi_data_year[:, :, i] = _ndvi_data_year.iloc[:, i].values.reshape(83, 113)
    temperature_data_year[:, :, i] = _temperature_data_year.iloc[:, i].values.reshape(83, 113)
    soil_moisture_data_year[:, :, i] = _soil_moisture_data_year.iloc[:, i].values.reshape(83, 113)

# 窗口大小列表
window_sizes = [5, 7, 9, 11, 13, 15, 17, 19, 21]
# 初始化相关系数DataFrame
correlation_dict = {}

for window_size in window_sizes:
    # 初始化相关系数矩阵(np.nan初始化)
    correlation_matrix = np.zeros((precip_data_year.shape[0], precip_data_year.shape[1], 3), dtype=np.float32)
    correlation_matrix[:] = np.nan

    # 对于每个窗口,计算斯皮尔曼相关系数
    for i in range(precip_data_year.shape[0] - window_size):
        for j in range(precip_data_year.shape[1] - window_size):
            # 提取窗口中的数据
            window_precipitation = precip_data_year[i:i + window_size, j:j + window_size, :]
            window_ndvi = ndvi_data_year[i:i + window_size, j:j + window_size, :]
            window_temperature = temperature_data_year[i:i + window_size, j:j + window_size, :]
            window_soil_moisture = soil_moisture_data_year[i:i + window_size, j:j + window_size, :]

            # 在窗口中的每个像素上计算相关系数
            corr_per_pixel = np.zeros((window_size, window_size, 3), dtype=np.float32)
            for k in range(window_size):
                for l in range(window_size):
                    corr_per_pixel[k, l, 0], _ = spearmanr(window_precipitation[k, l, :], window_ndvi[k, l, :])
                    corr_per_pixel[k, l, 1], _ = spearmanr(window_precipitation[k, l, :], window_temperature[k, l, :])
                    corr_per_pixel[k, l, 2], _ = spearmanr(window_precipitation[k, l, :], window_soil_moisture[k, l, :])

            # 计算窗口内的平均相关系数
            correlation_matrix[i, j, 0] = np.mean(corr_per_pixel[:, :, 0])
            correlation_matrix[i, j, 1] = np.mean(corr_per_pixel[:, :, 1])
            correlation_matrix[i, j, 2] = np.mean(corr_per_pixel[:, :, 2])

    # 将相关系数矩阵添加到correlation_matrices中
    correlation_dict['precipitation_ndvi_' + str(window_size)] = pd.Series(
        correlation_matrix[:, :, 0][~np.isnan(correlation_matrix[:, :, 0])].flatten())
    correlation_dict['precipitation_temperature_' + str(window_size)] = pd.Series(
        correlation_matrix[:, :, 1][~np.isnan(correlation_matrix[:, :, 1])].flatten())
    correlation_dict['precipitation_soil_moisture_' + str(window_size)] = pd.Series(
        correlation_matrix[:, :, 2][~np.isnan(correlation_matrix[:, :, 2])].flatten())
# 将相关系数矩阵保存到Excel文件中
df = pd.concat(correlation_dict, axis=1)
df.to_excel(r'E:\PRCP\table\window_corr\correlation_matrices.xlsx', index=False, sheet_name='年平均相关系数')

注意,建议运行时将窗口window_sizes的值进行编辑修改,由于我没有使用并行处理,所以如此多的窗口大小循环会导致运行时间长。

最后,我们将输出的excel数据进行小提琴图的绘制(只使用了其中窗口大小为5的数据进行绘制):

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/545046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《The Element of Style》阅读笔记 —— 章节 I Elementary Rules of Usage

前言:本科期间担任科研助理时,有幸从导师那里借来这本书通读,只记得自己当时在本子上做了一些笔记,但是想不起来具体记了什么😂前段时间再次从学院的讲座活动中听闻这本书,决定重温一遍,本篇为此…

实验一 结构化分析与设计——数据流图DFD与模块结构图SC

一、实验目的: 掌握传统结构化分析方法中功能建模的基本思想,即数据流分析技术。数据流图DFD是软件系统的逻辑模型,描绘数据在系统中从输入到输出所经历的变换(即加工处理)。 同时,了解变换型和事务型数据…

Copernicus DEM 30 metre dataset now freely available01 December 2020

欧空局宣布,除2019年发布的哥白尼DEM 90米分辨率外,30米分辨率数据的访问权限现已延长,数据集对任何注册用户开放和免费。 自2019年以来,哥白尼方案配备了全球一致的高分辨率数字高程模型,供所有用户使用,以处理各种应用。 哥白尼DEM结合了平坦的水体、连贯的河流流、编…

外汇客户收支风险管理系统助力外汇业务便利化

外管局2019年开始发文推行跨境投资便利化政策,2023年商务部等17部门又发文支持贸易外汇收支便利化政策,从一个小范围试点政策,到各部委大力推广支持,银行业内重点推广,这3年间外汇业务便利化经历了什么? …

狂飙,ChatGPT 官方 iOS 版本应用上线

ChatGPT正式发布App,可在苹果应用商店下载,安卓版也不远了 在手机上也能玩ChatGPT了!当地时间周四(5月18日),人工智能研究公司OpenAI在官网宣布,其在美国推出了聊天机器人ChatGPT的iPhone应用&a…

写公开信可别等被喷,才发现其实可以这样

正文共 1022 字,阅读大约需要 4 分钟 公务员必备技巧,您将在4分钟后获得以下超能力: 快速生成公开信 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Le…

Unity A* Pathfinding Project

先下载免费版 https://arongranberg.com/astar/download# 教程首页 https://arongranberg.com/astar/docs/getstarted.html 创建一个plane 当地面 创建一个gameobject 添加组件 PathFinder 长这样 调整每个格子大小的 创建两个layer 一个是阻挡物的 一个是地面的 这里填入阻…

Helm方式部署 zookeeper+kafka 集群 ——2023.05

文章目录 一、添加helm仓库二、安装部署集群2.1 在线安装zookeeperkafka集群2.2 离线安装zookeeperkafka集群 三、验证kafka与zookeeper是否绑定四、测试集群附:可改善地方卸载应用 一、添加helm仓库 # 添加bitnami和官方helm仓库: helm repo add bitna…

独立版:云贝O2O-V2-2.6.3 优化区域代理登录刷新问题

独立版:v2云贝O2O平台版本、版本更新至2.6.3,微信小程序在线上传、后端可开源,即刻源码持续维护更新中,最新全插件(4个)包更新,包修复、这个是源码,独立版; 支持一键更新…

C++——模板(初阶) + string

作者:几冬雪来 时间:2023年5月19日 内容:C模板 string讲解 目录 前言: 1.模板: 1.函数模板的隐/显示实例化: 2.类模板: 2.STL: 1. 什么是STL: 2.STL六大组件…

【Java入门】Java的语言概述

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Java入门篇系列,该专栏主要讲解:什么是java、java的数据类型与变…

JavaSE入门篇——类和对象(实例理解)

文章目录 一、面向对象简述二、类与对象的基本概念三、类的定义与使用四、this引用五、对象的构造及初始化六、static成员七、 代码块 一、面向对象简述 面向对象是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的面向对象…

DRMS全国服务中心第一期讲师特训会圆满召开

,时长01:00 近日,【DRMS】数字权益管理系统在美丽的泉城济南展开了为期两天一夜的“【DRMS】全国服务中心首期讲师特训”。此次特训主要针对服务中心的负责人和讲师进行的一场从认知到理念、从规划到执行、从机制到流程的全方位特训。特训中,…

麒麟信安操作系统里安装达梦数据库无法通过./DmServiceDMSERVER启动数据库实例服务的处理

问题现象如下: 但是通过./dmserver pathxxx/dm.ini又能正常启动 查看日志发现有生成日志:/home/dmdba/dmdbms/log/ dm_unknown_yyyymm.log。 日志内容如下: fail to load libpmem.so, libpmem.so: cannot open shared object file: No such …

Nexus私服搭建与使用

文章目录 1 私服简介2 私服安装步骤1:下载解压步骤2:启动Nexus步骤3:浏览器访问步骤4:首次登录重置密码 3 私服仓库分类4 本地仓库访问私服配置步骤1:私服上配置仓库步骤2:配置本地Maven对私服的访问权限步骤3:配置私服的访问路径 5 私服资源上传与下载步骤1:配置工程上传私服的…

css属性选择器、css3结构选择器、伪元素选择器、仿土豆网隐藏遮罩层案例、伪元素清除浮动

属性选择器 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>属性选择器</title><style>…

Kafka在Java项目中的应用

Kafka在Java项目中的应用 Docker 安装Kafka 一.首先需要安装docker,可看这篇文章安装docker 二.拉取zookeeper和KafKa镜像 docker pull wurstmeister/zookeeperdocker pull wurstmeister/kafkaKafka组件需要向zookeeper进行注册,所以也需要安装zookeeper 三.启动zookeeper…

被00后卷的油尽灯枯了...

内卷的来源 内卷最早的“出处”是几张名校学霸的图片。 大学生们刷爆朋友圈的几张“内卷”图片是这样的&#xff1a;有的人骑在自行车上看书&#xff0c;有的人宿舍床上铺满了一摞摞的书&#xff0c;有的人甚至边骑车边端着电脑写论文。这些图片最早在清华北大的学霸之间流传。…

手机APP性能测试工具PerfDog安装教程及简单使用

一、下载PerfDog PerfDog下载安装传送带&#xff1a;PerfDog | 全平台性能测试分析专家 点击下载对应系统版本&#xff0c;Darren这里下载的是windows版本&#xff0c;苹果电脑可下Mac OS版本。 二、解压文件包 我们在想要存放PerfDog的文件路径先建立一个文件夹&#xff08;方…

远程桌面连接工具在哪里下载?

在市场上&#xff0c;有很多种不同的工具可用。一些远程桌面连接工具&#xff08;如RayLink&#xff09;具有高清流畅、操作简单和连接速度快的特点。而其他一些连接工具则更注重保护安全和数据保密性。不同的远程桌面连接工具各有特点&#xff0c;需要根据不同的需求进行选择。…