基于Sen+MK的多站点不同季节和年尺度的SPEI趋势分析.md

再大的风浪,不过只短暂喧哗。


前言

1. 概述

2.1 问题情景

  • 假设目前我们有若干个站点的春、夏、秋、冬和四季的spei,需要利用Sen+MK方法计算各站点四季和年尺度的SPEI的趋势。

2.2 说明

2. 版本

2.1 天津,2024年5月4日,Version1

3. 微信公众号GISRSGeography

  • 欢迎大家关注公众号 GISRSGeography,谢谢!。
    GISRSGeography

一、数据

1. 输入数据

  • 存储在同一个excel文件中的三个站点的四季和年尺度的SPEI。
    输入数据

2. 输出数据

  • 存储在一个excel文件中的三个站点的四季和年的SPEI的SEN+MK的趋势分析结果。
    输出数据

二、程序代码

# -*- coding: utf-8 -*-
"""
1. 程序目的
   (1) 基于SEN+MK分析不同站点四季和年的干旱趋势

2. 2024年5月4日 Version 1

3. 数据
   3.1 输入数据
       '...\JJJ_SensonYearSPEI.xlsx'
       
   3.2 输出数据
       '...\JJJ_SensonYearSPEI_SEN.xlsx'
   
"""
# %% 包的导入
# 包的导入
import numpy as np
import pandas as pd

import pymannkendall as mk

# %% 四季和年spei数据读取
def spei_get(
        inpath: str
        ) -> list:
    """
    (1) 功能:
        1) 读取四季和年的SPEI
    ----------
    
    (2) 输入参数
        1) inpath: str
           文件存储绝对路径
    ----------
      
    (3) 输出参数
        1) spei_data: DataFrame
           spei数据
  
    """
    spei_data = pd.read_excel(inpath)
    
    return spei_data

# %%   
def spei_trend(
        speidata: pd.DataFrame,
        styr: int,
        edyr: int
        )  -> pd.DataFrame:
    """
    (1) 功能
        1) 提取目标时段的spei
        2) 计算不同时段的spei的sen趋势,并利用mk进行显著性检验
    ----------
    
    (2) 输入参数
    speidata : pd.DataFrame
               存储着目标站点四季和年尺度的SPEI
    -------
    
    (3) 输出数据
    spei_senslope : pd.DataFrame
                    存储着目标站点四季和年尺度的SPEI的Sen+MK的趋势分析结果

    """
    # 目标时段数据选取
    speidata_aim = speidata.loc[(speidata['Year']>=styr) & (speidata['Year']<=edyr),:]
    
    # 特定站点数据提取并调用pymannkendall进行趋势计算和显著性检验
    seasonyear = ['Spring','Summer','Autumn','Winter','YearSPEI']
    sen_p = ['_SenSlope','_PValue']
    columns = ['Sta_ID','Period']
    for seasonyear_temp in seasonyear:
        for senp_temp in sen_p:
           columns.append(seasonyear_temp+senp_temp) 
    
    spei_senslope = pd.DataFrame([],columns=columns)
    sta_all = np.unique(speidata_aim.Sta_ID)
    ii = 0
    for sta_temp in sta_all:
        # 站点数据提取
        spei_sta = speidata_aim.loc[speidata_aim['Sta_ID']==sta_temp,:] 
        
        # Sen趋势度计算和显著性检验
        for seasonyear_temp in seasonyear:
            spei_sta_seasonyear = spei_sta[seasonyear_temp]
            
            senmkresult = mk.original_test(spei_sta_seasonyear)
            spei_senslope.loc[ii,seasonyear_temp+'_SenSlope']=senmkresult.slope
            spei_senslope.loc[ii,seasonyear_temp+'_PValue']=senmkresult.p
            #print(senmkresult)
        
        spei_senslope.loc[ii,'Sta_ID'] = sta_temp
        
        ii = ii + 1
        
        print(ii)
            
    spei_senslope['Period'] = str(styr) + '-' + str(edyr)
    
   
    return spei_senslope

                     
# %%
if __name__ == '__main__':
    
# %% 路径处理和变量预定义
    infile = r'...\JJJ_SensonYearSPEI.xlsx'     # 需要修改为自己的路径
    outfile = r'...\JJJ_SensonYearSPEI_SEN.xlsx' # 需要修改为自己的路径
    
    styr=1980;
    edyr=2020;
       
# %% spei数据读取
    spei_data  = spei_get(infile)
    
# %% Sen+MK
    spei_sen = spei_trend(spei_data,styr,edyr)
    
# %% 结果写出
    spei_sen.to_excel(outfile,index=False,sheet_name='JJJ')
    
    print('Finished.')


三、参考资料

  1. pymannkendall 1.4.3
SEN MK趋势分析是一种用于研究和预测股票市场中股票价格变动趋势的技术分析方法。SEN MK指的是用于测量股票价格趋势的指标。 SEN MK趋势分析基于股票价格历史数据,通过计算移动平均线来观察股票价格的趋势。移动平均线是用于平滑价格波动并确定趋势的一种统计工具。 SEN MK趋势分析的主要原理是当股票价格在短期移动平均线之上且短期移动平均线在长期移动平均线之上时,表明股票价格处于上升趋势;当股票价格在短期移动平均线之下且短期移动平均线在长期移动平均线之下时,表明股票价格处于下降趋势。通过观察SEN MK指标的变化,投资者可以判断股票价格的趋势,并据此做出买入或卖出的决策。 SEN MK趋势分析在股票市场中被广泛应用。它可以帮助投资者更好地理解股票市场中价格走势的规律性,并根据趋势的变化做出相应的操作策略。虽然SEN MK趋势分析只是市场分析中的一个方法,但它能够为投资者提供重要的参考依据,增加投资决策的准确性。 然而,需要注意的是,任何一种技术分析方法都不能百分之百地预测股票价格的走势。市场中存在许多不确定因素,如政策变化、宏观经济环境等,这些因素可能会对股票价格产生较大影响。因此,在使用SEN MK趋势分析时,投资者应该综合考虑其他因素,并谨慎决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

EWBA_GIS_RS_ER

如有帮助,赏杯茶吧。

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

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

打赏作者

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

抵扣说明:

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

余额充值