52phm简介


专注于工业智能预警系统研发, 通过机理算法和数据驱动算法分析振动信号、音频、DCS、PLC信号、SCADA信号等设备运行状态数据对机器设备进行看病预诊,为机器设备健康运行保驾护航。 网站正在不断建设和完善过程中,欢迎大家给予建议和参与社区建设

联系我们


投稿说明


52phm,专注于预测性维护知识学习和交流,欢迎广大从事预测性维护行业人员投稿,投稿请联系管理员(wx: www52phmcn),投稿内容可以是:

  • 学习笔记
  • 技术理论
  • 工程案例
  • 行业资讯

加入我们


官方公众号:52phm,专注预测性维护的学习平台

2021-12-21 11:05:25    互联网    649    当前专栏:工业异常检测    分类:算法开发    本站官网:www.52phm.cn   

公众号 ...

Python趋势自动化描述最终(最新)

目录

说明:
1、旧代码描述部分内容较多,还有一些不确定性

2、新代码:增加了前几篇内容的突变分析代码,增加了线性的R方以及P值得检验分析,对不满足上述条件的,需要进行阶段性分析:突变点分析,整体波动性大小分析由之前的通过突变点个数来决定改为利用0-1标准化之后得差分进行描述,去掉了定基比的计算,线性趋势度描述部分增加了致命点去除之后的重新线性回归的逻辑(最终描述的结果中可以增加致命点描述,在这就没有增加)

1、旧代码

def trend_desc(inputdata,conf_level=0.95):
    overall_num = len(inputdata)
    # Sen's slope
    trend_result = sens_slope_trend_detection(inputdata,conf_level)
    # trend desc
    # 99% ——> —2.576
    # 95% ——> —1.96
    # 90% ——> —1.645
    change_rate = trend_result[0]
    # fixed base ratio
    fixed_base_ratio_value = fixed_base_ratio(inputdata)
    # temp_result = []
    # overall trend
    linear_result = linear_trend_degree(inputdata)
    #
    overall_change_degree = temp_trend_desc(linear_result[0])
    if linear_result[0] < 0:
        overall_trend = '下降'
    elif linear_result[0] > 0:
        overall_trend = '上升'
    else:
        overall_trend = '无显著线性趋势'
    # begin
    if fixed_base_ratio_value * overall_change_degree[0] > 0:
        if np.abs(overall_change_degree[0]) > 10:
            trend_degree_desc = '大幅'
        else:
            trend_degree_desc = '小幅'
    else :
        judging = judging_fatal_point(inputdata)
        have_or_not = judging[0]
        if have_or_not:
            delete_fatal_point = judging[1]
            noFaltalPoint_linear_result = linear_trend_degree(delete_fatal_point)
            noFaltalPoint_fixed_base_ratio = fixed_base_ratio(delete_fatal_point)
            noFaltalPoint_overall_change_degree = temp_trend_desc(noFaltalPoint_linear_result[0])
            if noFaltalPoint_fixed_base_ratio * noFaltalPoint_overall_change_degree[0] > 0:
                if np.abs(noFaltalPoint_overall_change_degree[0]) > 10:
                    trend_degree_desc = '大幅'
                    if noFaltalPoint_linear_result[0] < 0:
                        overall_trend = '下降存在致命点'
                    elif noFaltalPoint_linear_result[0] > 0:
                        overall_trend = '上升存在致命点'
                    else:
                        overall_trend = '不明显趋势但存在致命点'
                else:
                    trend_degree_desc = '小幅'
            else:
                trend_degree_desc = '不明显'
        else:
            trend_degree_desc = '不明显'
    if linear_result[1] < 0.05:
        final_desc = {<!-- -->'整体趋势':[trend_degree_desc  overall_trend],
                      '整体定基比(%)':[fixed_base_ratio_value],
                      '整体变化角度':[overall_change_degree[0]],
                      '突变点个数':['-'],
                      '突变点位置':['-'],
                      'Mann-Kendall突变位置':['-'] ,
                      'Pettitt突变位置':['-'] ,
                      'Buishand_U突变位置':['-'] ,
                      'SNHT突变位置':['-'] ,
                      '详情':['-']}
    else:
        # overall trend desc (wave)
        # the same of overall fixed base ratio
        # four change point methods
        Kendall_change_point_result    = Kendall_change_point_detection(inputdata)
        Pettitt_change_point_result    = Pettitt_change_point_detection(inputdata)
        Buishand_U_change_point_result = Buishand_U_change_point_detection(inputdata)
        SNHT_change_point_result       = SNHT_change_point_detection(inputdata)
        # Logical determination of change point
        temp_result = Kendall_change_point_result  [Pettitt_change_point_result, Buishand_U_change_point_result, SNHT_change_point_result]
        # Calculate the trend degree of each segment.
        # desc begin
        if Kendall_change_point_result==[]:
            overall_wave = '小波动'
            final_desc = {<!-- -->'整体趋势':[overall_wave  trend_degree_desc  overall_trend],
                          '整体定基比(%)':[fixed_base_ratio_value],
                          '整体变化角度':[overall_change_degree[0]],
                          '突变点个数':['-'],
                          '突变点位置':['-'],
                          'Mann-Kendall突变位置':['-'] ,
                          'Pettitt突变位置':['-'] ,
                          'Buishand_U突变位置':['-'] ,
                          'SNHT突变位置':['-'] ,
                          '详情':['-']}
        else:
            #temp_result = Series(temp_result).value_counts()
            #change_point_mode = list((temp_result.loc[temp_result==max(temp_result)]).index)
            # change_point_list = temp_result.drop_duplicates( keep='first', inplace=False)
            # change_point_num = len(change_point_list)
            temp_change_point_listT = np.array(temp_result)
            temp_change_point_list = list(temp_change_point_listT[temp_change_point_listT &gt; 2])
            temp_change_point_list = list(set(temp_change_point_list))
            temp_change_point_list.sort()
            delete_aj = []
            for i in range(len(temp_change_point_list) - 1):
                for j in range(i1,len(temp_change_point_list)):
                    temp_ij = np.abs(temp_change_point_list[j]-temp_change_point_list[i])
                    if temp_ij &lt;=5:
                        delete_aj.append(temp_change_point_list[j])
                temp_change_point_list = [x for x in temp_change_point_list if x not in delete_aj]
            change_point_list = temp_change_point_list
            change_point_num = len(change_point_list)
            if change_point_num &lt;=2 and len(temp_change_point_list) &lt;= 3:
                if fixed_base_ratio_value * overall_change_degree[0] &lt; 0 :
                    overall_wave = '大波动'
                else:
                    overall_wave = '小波动'
            else:
                overall_wave = '大波动'
            if change_point_num &lt;= 2:
                #overall_wave = '小波动'
                if change_point_num == 1:
                    first_trend_desc01  = linear_trend_degree(inputdata[:change_point_list[0]-1],conf_level)
                    first_trend_desc1 = temp_trend_desc(first_trend_desc01[0])
                    second_trend_desc02  = linear_trend_degree(inputdata[change_point_list[0]:],conf_level)
                    second_trend_desc2 = temp_trend_desc(second_trend_desc02[0])
                    second_num = overall_num - change_point_list[0]
                    if (change_point_list[0]-1) &lt;= 3:
                        first_fixed_base_ratio  = '数据量太少'
                    else:
                        first_fixed_base_ratio  = fixed_base_ratio(inputdata[:change_point_list[0]-1])
                    first_change_degree = first_trend_desc1[0]
                    first_change_trend = first_trend_desc1[1]
                    if second_num &lt;= 3:
                        second_fixed_base_ratio  = '数据量太少'
                    else:
                        second_fixed_base_ratio  = fixed_base_ratio(inputdata[change_point_list[0]:])
                    second_change_degree = second_trend_desc2[0]
                    second_change_trend = second_trend_desc2[1]
                    final_desc = {<!-- -->'整体趋势':[overall_wave  trend_degree_desc  overall_trend],
                                  '整体定基比(%)':[fixed_base_ratio_value],
                                  '整体变化角度':[overall_change_degree[0]],
                                  '突变点个数':[change_point_num],
                                  '突变点位置':[change_point_list],
                                  'Mann-Kendall突变位置':[Kendall_change_point_result] ,
                                  'Pettitt突变位置':[Pettitt_change_point_result] ,
                                  'Buishand_U突变位置':[Buishand_U_change_point_result] ,
                                  'SNHT突变位置':[SNHT_change_point_result] ,
                                  '详情':[{<!-- -->'第一段趋势':{<!-- -->'变化角度':first_change_degree,'趋势':first_change_trend,'定基比(%)':first_fixed_base_ratio},
                                  '第二段趋势':{<!-- -->'变化角度':second_change_degree,'趋势':second_change_trend,'定基比(%)':second_fixed_base_ratio}}]}
                elif change_point_num == 2:
                    first_trend_desc01  = linear_trend_degree(inputdata[:change_point_list[0]-1],conf_level)
                    first_trend_desc1 = temp_trend_desc(first_trend_desc01[0])
                    second_trend_desc02  = linear_trend_degree(inputdata[change_point_list[0]:change_point_list[1]-1],conf_level)
                    second_trend_desc2 = temp_trend_desc(second_trend_desc02[0])
                    third_trend_desc03  = linear_trend_degree(inputdata[change_point_list[1]:],conf_level)
                    third_trend_desc3 = temp_trend_desc(third_trend_desc03[0])
                    second_num = overall_num - change_point_list[0] - 1
                    third_num = overall_num - change_point_list[1]
                    if (change_point_list[0]-1) &lt;= 3:
                        first_fixed_base_ratio  = '数据量太少'
                    else:
                        first_fixed_base_ratio  = fixed_base_ratio(inputdata[:change_point_list[0]-1])
                    first_change_degree = first_trend_desc1[0]
                    first_change_trend = first_trend_desc1[1]
                    if second_num &lt;= 3:
                        second_fixed_base_ratio  = '数据量太少'
                    else:
                        second_fixed_base_ratio  = fixed_base_ratio(inputdata[change_point_list[0]:change_point_list[1]-1])
                    second_change_degree = second_trend_desc2[0]
                    second_change_trend = second_trend_desc2[1]
                    if third_num &lt;= 3:
                        third_fixed_base_ratio  = '数据量太少'
                    else:
                        third_fixed_base_ratio  = fixed_base_ratio(inputdata[change_point_list[1]:])
                    third_change_degree = third_trend_desc3[0]
                    third_change_trend = third_trend_desc3[1]
                    final_desc = {<!-- -->'整体趋势':[overall_wave  trend_degree_desc  overall_trend],
                                  '整体定基比(%)':[fixed_base_ratio_value],
                                  '整体变化角度':[overall_change_degree[0]],
                                  '突变点个数':[change_point_num],
                                  '突变点位置':[change_point_list],
                                  'Mann-Kendall突变位置':[Kendall_change_point_result] ,
                                  'Pettitt突变位置':[Pettitt_change_point_result] ,
                                  'Buishand_U突变位置':[Buishand_U_change_point_result] ,
                                  'SNHT突变位置':[SNHT_change_point_result] ,
                                  '详情':[{<!-- -->'第一段趋势':{<!-- -->'变化角度':first_change_degree,'趋势':first_change_trend,'定基比(%)':first_fixed_base_ratio},
                                  '第二段趋势':{<!-- -->'变化角度':second_change_degree,'趋势':second_change_trend,'定基比(%)':second_fixed_base_ratio},
                                  '第三段趋势':{<!-- -->'变化角度':third_change_degree,'趋势':third_change_trend,'定基比(%)':third_fixed_base_ratio}}]}
            else:
                #overall_wave = '大波动'
                final_desc = {<!-- -->'整体趋势':[overall_wave  trend_degree_desc  overall_trend],
                              '整体定基比(%)':[fixed_base_ratio_value],
                              '变化角度':[overall_change_degree[0]],
                              '突变点个数':['-'],
                              '突变点位置':['-'],
                              'Mann-Kendall突变位置':['-'] ,
                              'Pettitt突变位置':['-'] ,
                              'Buishand_U突变位置':['-'] ,
                              'SNHT突变位置':['-'] ,
                              '详情':['-']}
    # final_desc = pd.DataFrame(final_desc,index=[0])
    return final_desc

输出案例:

例1:

{‘整体趋势’: [‘大波动大幅上升’], ‘整体定基比(%)’: [-10.96], ‘整体变化角度’: [4.07], ‘突变点个数’: [2], ‘突变点位置’: [[8, 20]], ‘Mann-Kendall突变位置’: [[8]], ‘Pettitt 突变位置’: [8], ‘Buishand_U突变位置’: [20], ‘SNHT突变位置’: [20], ‘详情’: [{‘第一段趋势’: {‘变化角度’: 35.02, ‘趋势’: ‘上升’, ‘定基比(%)’: 4.48}, ‘第二段趋势’: {‘变化角度’: -34.79, ‘趋势’: ‘下降’, ‘定基比(%)’: -15.58}, ‘第三段趋势’: {‘变化角度’: 0.0, ‘趋势’: ‘稳定’, ‘定基比(%)’: ‘数据量太少’}}]}

例2:

{‘整体趋势’: [‘小波动不明显上升’], ‘整体定基比(%)’: [-19.04], ‘整体变化角度’: [0.14], ‘突变点个数’: [’-’], ‘突变点位置’: [’-’], ‘Mann-Kendall突变位置’: [’-’], ‘Pettitt突变位置’: [’-’], ‘Buishand_U突变位置’: [’-’], ‘SNHT突变位置’: [’-’], ‘详情’: [’-’]}

例3:

{‘整体趋势’: [‘大波动大幅下降存在致命点’], ‘整体定基比(%)’: [-10.96], ‘整体变化角度’: [4.07], ‘突变点个数’: [2], ‘突变点位置’: [[8, 20]], ‘Mann-Kendall突变位置’: [[8]], ‘Pettitt突变位置’: [8], ‘Buishand_U突变位置’: [20], ‘SNHT突变位置’: [20], ‘详情’: [{‘第一段趋势’: {‘变化角度’: 35.02, ‘趋势’: ‘上升’, ‘定基比(%)’: 4.48}, ‘第二段趋势’: {‘变化角度’: -34.79, ‘趋势’: ‘下降’, ‘定基比(%)’: -15.58}, ‘第三段趋势’: {‘变化角度’: 0.0, ‘趋势’: ‘稳定’, ‘定基比(%)’: ‘数据量太少’}}]}

2、更新代码

import connectck
import json
import math
import sys

import numpy as np
import pandas as pd
import pandas.io.sql as sq
from pandas import Series
from scipy import stats
from scipy.stats import norm
from sklearn import linear_model

reload(sys)
sys.setdefaultencoding('utf8')


# sen's slope trend

def sens_slope_trend_detection(inputdata,conf_level=0.95):
    inputdata = Series(inputdata)
    n  = inputdata.shape[0]
    t  = inputdata.value_counts()
    tadjs = sum(t * (t - 1) * (2 * t  5))
    varS = (n * (n - 1) * (2 * n  5) - tadjs)/18.0
    k = 0
    d = []
    for i in range(n-1):
        for j in range(i1,n):
            k = k1
            d.append((inputdata[j]*1.0 - inputdata[i])/(j - i))
    b_sen = np.median(d)
    C = norm.ppf(1 - (1 - conf_level)/2.0) * np.sqrt(varS)
    rank_up = int(round((k  C)/2.0  1))
    rank_lo = int(round((k - C)/2.0))
    rank_d = sorted(d)
    lo = rank_d[rank_lo - 1]
    up = rank_d[rank_up - 1]
    S = 0
    for m in range(n):
        S = S  np.sum(np.sign(inputdata[m] - inputdata[0:m1]))
    sg = np.sign(S)
    z = sg * (np.abs(S) - 1.0)/np.sqrt(varS)
    pval = 2 * min(0.5, 1-norm.cdf(np.abs(z)))
    return b_sen,z,pval


# mann-kendall

def Kendall_change_point_detection(inputdata):
    inputdata = np.array(inputdata)
    n=inputdata.shape[0]
    Sk             = [0]
    UFk            = [0]
    s              =  0
    Exp_value      = [0]
    Var_value      = [0]
    for i in range(1,n):
        for j in range(i):
            if inputdata[i] &gt; inputdata[j]:
                s = s1
            else:
                s = s0
        Sk.append(s)
        Exp_value.append((i1)*(i2)/4.0 )                     # Sk[i]的均值
        Var_value.append((i1)*i*(2*(i1)5)/72.0 )            # Sk[i]的方差
        UFk.append((Sk[i]*1.0-Exp_value[i])/np.sqrt(Var_value[i]))
    Sk2             = [0]
    UBk             = [0]
    UBk2            = [0]
    s2              =  0
    Exp_value2      = [0]
    Var_value2      = [0]
    inputdataT = list(reversed(inputdata))
    for i in range(1,n):
        for j in range(i):
            if inputdataT[i] &gt; inputdataT[j]:
                s2 = s21
            else:
                s2 = s20
        Sk2.append(s2)
        Exp_value2.append((i1)*(i2)/4.0)                     # Sk[i]的均值
        Var_value2.append((i1)*i*(2*(i1)5)/72.0 )            # Sk[i]的方差
        UBk.append((Sk2[i]*1.0-Exp_value2[i])/np.sqrt(Var_value2[i]))
        UBk2.append(-UBk[i])
    UBkT = list(reversed(UBk2))
    diff = np.array(UFk) - np.array(UBkT)
    K    = list()
    for k in range(1,n):
        if diff[k-1]*diff[k]&lt;0:
            K.append(k)
    return K


# Pettitt

def Pettitt_change_point_detection(inputdata):
    inputdata = np.array(inputdata)
    n         = inputdata.shape[0]
    k = range(n)
    inputdataT = pd.Series(inputdata)
    r = inputdataT.rank()
    Uk = [2*np.sum(r[0:x])-x*(n  1) for x in k]
    Uka = list(np.abs(Uk))
    U = np.max(Uka)
    K = Uka.index(U)
    pvalue         = 2.0 * np.exp((-6.0 * (U**2))/(n**3  n**2))
    if pvalue &lt;= 0.05:
        change_point_desc = u'显著'
    else:
        change_point_desc = u'不显著'
    #Pettitt_result = {'突变点位置':K,'突变程度':change_point_desc}
    return K #,Pettitt_result


# Buishand U test

def Buishand_U_change_point_detection(inputdata):
    inputdata = np.array(inputdata)
    inputdata_mean = np.mean(inputdata)
    n  = inputdata.shape[0]
    k = range(n)
    Sk = [np.sum(inputdata[0:x1] - inputdata_mean) for x in k]
    sigma = np.sqrt(np.sum((inputdata-(np.mean(inputdata))*1.0)**2)/(n-1))
    U = np.sum((Sk[0:(n - 2)]/(sigma*1.8))**2)/(n * (n  1))
    Ska = np.abs(Sk)
    S = np.max(Ska)
    K = list(Ska).index(S)  1
    Skk = (Sk/(sigma*1.0))
    return K


# Standard Normal Homogeneity Test (SNHT)

def SNHT_change_point_detection(inputdata):
    inputdata = np.array(inputdata)
    inputdata_mean = np.mean(inputdata)
    n  = inputdata.shape[0]
    k = range(1,n)
    sigma = np.sqrt(np.sum((inputdata-(np.mean(inputdata))*1.0)**2)/(n-1))
    Tk = [x*(np.sum((inputdata[0:x]-inputdata_mean)/(sigma*1.0))/x)**2  (n-x)*(np.sum((inputdata[x:n]-inputdata_mean)/(sigma*1.0))/(n-x))**2 for x in k]
    T = np.max(Tk)
    K = list(Tk).index(T)  1
    return K


# change degree

def temp_trend_desc(change_rate):
    change_degree = (math.atan(change_rate))*180.0/math.pi
    if change_rate &gt; 0:
        result_desc = '上升'
    elif change_rate &lt; 0:
        result_desc = '下降'
    else:
        result_desc = u'稳定'
    change_degree = round(change_degree,2)
    return change_degree,result_desc


# simple linear trend degree (0-1 standardized rawdata)

def simple_linear_trend(inputdata,conf_level=0.95):
    # clf_result = [slope, intercept, r_value, p_value, std_err]
    inputdataT = (np.array(inputdata)-np.min(inputdata))/(np.max(inputdata)-np.min(inputdata))
    x = list(range(1,len(inputdata)1))
    xT = 1.0*(np.array(x)-np.min(x))/(np.max(x)-np.min(x))
    clf_result = stats.linregress(xT,inputdataT)
    linearTrendDegree = clf_result[0]
    p_value = clf_result[3]
    p_value = round(p_value,3)
    intercept = clf_result[1]
    stderr = clf_result[-1]
    r_squared = clf_result[2]**2
    # diff1 = inputdataT[0:-1] - inputdataT[1:]
    # if sum(np.abs(diff1)&gt;0.3)
    return linearTrendDegree,p_value,intercept,stderr,r_squared,x,xT,inputdataT


# linear trend degree (0-1 standardized rawdata)

def linear_trend_degree(inputdata,conf_level=0.95):
    # clf_result = [slope, intercept, r_value, p_value, std_err]
    if np.max(inputdata) &gt; np.min(inputdata):
        linear_model_result = simple_linear_trend(inputdata,conf_level=0.95)
        linearTrendDegree = linear_model_result[0]
        p_value = linear_model_result[1]
        intercept = linear_model_result[2]
        stderr = linear_model_result[3]
        r_squared = linear_model_result[4]
        x = linear_model_result[5]
        xT = linear_model_result[6]
        inputdataT = linear_model_result[-1]
        fatal_point = []
        for xi in x:
            y_up   = linearTrendDegree*xT[xi-1]  intercept  3*stderr
            y_down = linearTrendDegree*xT[xi-1]  intercept - 3*stderr
            if inputdataT[xi-1]&gt;y_up or inputdataT[xi-1]&lt;y_down:
                fatal_point.append(xi-1)
            else:
                pass
        print(fatal_point)
        if fatal_point:
            xT = list(xT)
            inputdataT = list(inputdataT)
            for index in sorted(fatal_point, reverse=True):
                del xT[index]
                del inputdataT[index]
            xT = np.array(xT)
            inputdataT = np.array(inputdataT)
            clf_result = stats.linregress(xT,inputdataT)
            linearTrendDegree = clf_result[0]
            r_squared = clf_result[2]**2
            p_value = clf_result[3]
            p_value = round(p_value,3)
        else:
            pass
    else:
        linearTrendDegree = 0
        p_value = 0.000
        r_squared = 1
    return linearTrendDegree,p_value,r_squared


# desc begin

def trend_desc(inputdata,conf_level=0.95):
    global final_desc
    overall_num = len(inputdata)
    # Sen's slope
    trend_result = sens_slope_trend_detection(inputdata,conf_level)
    # trend desc
    change_rate = trend_result[0]
    linear_result = linear_trend_degree(inputdata)
    overall_change_degree = temp_trend_desc(linear_result[0])
    if linear_result[0] &lt; 0:
        overall_trend = '下降'
    elif linear_result[0] &gt; 0:
        overall_trend = '上升'
    else:
        overall_trend = '无显著线性趋势'
    # begin
    if np.abs(overall_change_degree[0]) &gt; 10:
        trend_degree_desc = '大幅'
    else:
        trend_degree_desc = '小幅'
    # 满足R方&gt;0.7且p值通过检验的,只做线性回归分析
    if linear_result[1] &lt; 0.05 and linear_result[-1] &gt; 0.7:
        final_desc = {<!-- -->'整体趋势':[trend_degree_desc  overall_trend],
                      '整体变化角度':[overall_change_degree[0]],
                      '突变点个数':['-'],
                      '突变点位置':['-'],
                      'Mann-Kendall突变位置':['-'] ,
                      'Pettitt突变位置':['-'] ,
                      'Buishand_U突变位置':['-'] ,
                      'SNHT突变位置':['-'] ,
                      '详情':['-']}
    # 不满足上述条件的,需要进行阶段性分析:突变点分析,整体波动性大小分析
    else:
        # overall trend desc (wave)
        # four change point methods
        Kendall_change_point_result    = Kendall_change_point_detection(inputdata)
        Pettitt_change_point_result    = Pettitt_change_point_detection(inputdata)
        Buishand_U_change_point_result = Buishand_U_change_point_detection(inputdata)
        SNHT_change_point_result       = SNHT_change_point_detection(inputdata)
        # Logical determination of change point
        temp_result = Kendall_change_point_result  [Pettitt_change_point_result, Buishand_U_change_point_result, SNHT_change_point_result]
        # Volatility description(波动性大分为两种情况:1、多波;2、少波但波动幅度大)
        inputdataT = (np.array(inputdata)-np.min(inputdata))/(np.max(inputdata)-np.min(inputdata))
        diff1 = inputdataT[0:-1] - inputdataT[1:]
        if (sum(np.abs(diff1)&gt;0.3) &gt;= 3) or (sum(np.abs(diff1)&gt;0.4) &gt;= 1):
            overall_wave = '大波动'
        else:
            overall_wave = '小波动'
        # Calculate the trend degree of each segment.
        # desc begin
        if Kendall_change_point_result==[]:
            final_desc = {<!-- -->'整体趋势':[overall_wave  trend_degree_desc  overall_trend],
                          '整体变化角度':[overall_change_degree[0]],
                          '突变点个数':['-'],
                          '突变点位置':['-'],
                          'Mann-Kendall突变位置':['-'] ,
                          'Pettitt突变位置':['-'] ,
                          'Buishand_U突变位置':['-'] ,
                          'SNHT突变位置':['-'] ,
                          '详情':['-']}
        else:
            temp_change_point_listT = np.array(temp_result)
            temp_change_point_list = list(temp_change_point_listT[temp_change_point_listT &gt; 2])
            temp_change_point_list = list(set(temp_change_point_list))
            temp_change_point_list.sort()
            delete_aj = []
            for i in range(len(temp_change_point_list) - 1):
                for j in range(i1,len(temp_change_point_list)):
                    temp_ij = np.abs(temp_change_point_list[j]-temp_change_point_list[i])
                    if temp_ij &lt;=5:
                        delete_aj.append(temp_change_point_list[j])
                temp_change_point_list = [x for x in temp_change_point_list if x not in delete_aj]
            change_point_list = temp_change_point_list
            change_point_num = len(change_point_list)
            if change_point_num &lt;= 2:
                if change_point_num == 1:
                    first_trend_desc01  = simple_linear_trend(inputdata[:change_point_list[0]-1],conf_level)
                    first_trend_desc1 = temp_trend_desc(first_trend_desc01[0])
                    second_trend_desc02  = simple_linear_trend(inputdata[change_point_list[0]:],conf_level)
                    second_trend_desc2 = temp_trend_desc(second_trend_desc02[0])
                    second_num = overall_num - change_point_list[0]
                    first_change_degree = first_trend_desc1[0]
                    first_change_trend = first_trend_desc1[1]
                    second_change_degree = second_trend_desc2[0]
                    second_change_trend = second_trend_desc2[1]
                    final_desc = {<!-- -->'整体趋势':[overall_wave  trend_degree_desc  overall_trend],
                                  '整体变化角度':[overall_change_degree[0]],
                                  '突变点个数':[change_point_num],
                                  '突变点位置':change_point_list,
                                  'Mann-Kendall突变位置':Kendall_change_point_result ,
                                  'Pettitt突变位置':[Pettitt_change_point_result] ,
                                  'Buishand_U突变位置':[Buishand_U_change_point_result] ,
                                  'SNHT突变位置':[SNHT_change_point_result] ,
                                  '详情':[{<!-- -->'第一段趋势':{<!-- -->'变化角度':first_change_degree,'趋势':first_change_trend},
                                  '第二段趋势':{<!-- -->'变化角度':second_change_degree,'趋势':second_change_trend}}]}
                elif change_point_num == 2:
                    first_trend_desc01  = simple_linear_trend(inputdata[:change_point_list[0]-1],conf_level)
                    first_trend_desc1 = temp_trend_desc(first_trend_desc01[0])
                    second_trend_desc02  = simple_linear_trend(inputdata[change_point_list[0]:change_point_list[1]-1],conf_level)
                    second_trend_desc2 = temp_trend_desc(second_trend_desc02[0])
                    third_trend_desc03  = simple_linear_trend(inputdata[change_point_list[1]:],conf_level)
                    third_trend_desc3 = temp_trend_desc(third_trend_desc03[0])
                    second_num = overall_num - change_point_list[0] - 1
                    third_num = overall_num - change_point_list[1]
                    first_change_degree = first_trend_desc1[0]
                    first_change_trend = first_trend_desc1[1]
                    second_change_degree = second_trend_desc2[0]
                    second_change_trend = second_trend_desc2[1]
                    third_change_degree = third_trend_desc3[0]
                    third_change_trend = third_trend_desc3[1]
                    final_desc = {<!-- -->'整体趋势':[overall_wave  trend_degree_desc  overall_trend],
                                  '整体变化角度':[overall_change_degree[0]],
                                  '突变点个数':[change_point_num],
                                  '突变点位置':change_point_list,
                                  'Mann-Kendall突变位置':Kendall_change_point_result ,
                                  'Pettitt突变位置':[Pettitt_change_point_result] ,
                                  'Buishand_U突变位置':[Buishand_U_change_point_result] ,
                                  'SNHT突变位置':[SNHT_change_point_result] ,
                                  '详情':[{<!-- -->'第一段趋势':{<!-- -->'变化角度':first_change_degree,'趋势':first_change_trend},
                                  '第二段趋势':{<!-- -->'变化角度':second_change_degree,'趋势':second_change_trend},
                                  '第三段趋势':{<!-- -->'变化角度':third_change_degree,'趋势':third_change_trend}}]}
            else:
                final_desc = {<!-- -->'整体趋势':[overall_wave  trend_degree_desc  overall_trend],
                              '变化角度':[overall_change_degree[0]],
                              '突变点个数':[change_point_num],
                              '突变点位置':change_point_list,
                              'Mann-Kendall突变位置':Kendall_change_point_result ,
                              'Pettitt突变位置':[Pettitt_change_point_result] ,
                              'Buishand_U突变位置':[Buishand_U_change_point_result] ,
                              'SNHT突变位置':[SNHT_change_point_result] ,
                              '详情':['-']}
    # final_desc = pd.DataFrame(final_desc,index=[0])
    return final_desc



原文链接:https://wanpingdou.blog.csdn.net/article/details/82627185

免责声明


[推荐] 基于Python的频谱泄露分析

2021-12-14 14:06:09    互联网    820    分类:算法开发    专栏:数字信号处理   


[推荐] window系统Python安装教程(新手)

2021-12-15 14:47:52    互联网    1455    分类:开发环境    专栏:下载安装   


[推荐] 突变点检测:时序平稳性检验之ADF检验(python)

2021-12-21 10:58:04    互联网    799    分类:算法开发    专栏:工业异常检测   



转发此文章到社区


关注公众号进群

让志同道合读者学习交流



频域特征提取的Python实现(频谱、功率谱、倒频谱)

频域特征提取的Python实现(频谱、功率谱、倒频谱)本文只对 频域特征值提取的MATLAB代码实现(频谱、功率谱、倒频谱) 做代码翻译,用python重写一遍,以加强对这些特征的理解1. 频谱from scipy.fftpack import fft, fftshift, ifftfrom scipy.fftpack import fftfreqimport numpy as npi...

2021-12-14 14:05:51    互联网    1628    分类:算法开发    专栏:数字信号处理   


Linux 安装最新版本python3

新安装了Linux系统(CentOS 6),发现已安装的python版本是2.6. 在网上搜索研究之后总结了一下怎么在保留python2的同时安装最新版的python3。1. 查看 Python 的版本号:命令行输入以下命令就可以查看python版本:#python -V 或# python --version2. 下载3.x新版本可以访问python的官方网站查看最新的python版本以及下载...

2021-12-16 17:35:07    互联网    924    分类:开发环境    专栏:下载安装   


气象数据分析之突变检验及python的实现:MK突变、Pettitt方法、滑动T检验

什么是突变?常见的气候突变是把它定义为气候从一个平均值到另 一个平均值的急剧变化, 它表现为气候变化的不连续性(符淙斌,1992)。下图总结了四种常见的突变:(a)均值突变:从一个均值到另一个均值的变化,表现气候变化的不连续性(b)变率突变:平均值没有变但是方差变了©跷跷板突变(d)转折突变:某一 时段持续减少 ( 增加 ) , 然后突然在某点开 始 持续增加 (减少 )检验突变的方法有很多,介绍几种常用的~1. MK突变分析1.1原理3. 滑动T检验...

2021-12-20 11:02:22    互联网    1331    分类:算法开发    专栏:工业异常检测   


突变点检测:Buishand U test突变点检测(python)

import numpy as npimport pandas as pddef Buishand_U_change_point_detection(inputdata): inputdata = np.array(inputdata) inputdata_mean = np.mean(inputdata) n = inputdata.shape[0] k...

2021-12-21 11:07:15    互联网    668    分类:算法开发    专栏:工业异常检测   


时间序列特征构造:以电力负荷预测为例讲解(python语言)

大家好,我是yudengwu时间序列特征构造时间序列问题,首先不管是回归问题,还是分类问题。一个模型的好坏,决定因素由数据集的大小,特征值的选取和处理,算法。其中最重要的是特征值的选取和处理。今天与总来讲解下时间序列的特征构造问题。该特征构造部分可以用于其他数值数据。时间序列特征构造分类为 :时间特征,时间历史特征,时间交叉特征时间特征连续时间:持续时间,间隔时间离散时间:年,季度,季节,月,星期,日,等节假日,节假日第几天上午,早上,中午,晚上年初,年末,月初,月末,周

2021-12-21 15:54:27    互联网    1011    分类:算法开发    专栏:时间序列预测   


python编码和声明

python编码和声明 1、window环境下,在完成hello world运行后,已经初步掌握了python运行的机制,下面将介绍python编码方式。一般在pycharm编辑器中新建.py文件后,可以看到首行出现一行注释,例如

2022-01-17 23:15:26    博客笔记    841    分类:算法开发    专栏:python基础   


python内置关键字

python内置关键字python内置关键字是指变量、常量、函数、属性、类、模块标识符,比如def表示函数标识符,if表示条件语句标识符等。下面列出python常见的关键字:1、获取关键字import keywordprint(keyword.kwlist)""" 输出['False', 'None', 'True', 'and', 'as','assert','break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except

2022-01-17 23:48:03    博客笔记    795    分类:算法开发    专栏:python基础   


python代码注释方式

python代码注释方式代码注释从大的方面来说,主要分为单行注释和多行注释。1、单行注释使用#进行注释,如# 这是单行注释样例# 初始化一个变量 namename = "52phm"name = "52phm" # 初始化一个变量 name2、多行注释使用单引号注释name = '''52phm,工业互联网人的技术交流社区,网站地址:http://www.52phm.cn'''使用双引号注释name = """52phm,工业互联网人的技术交流社区,网站地址:http

2022-01-17 23:54:38    博客笔记    854    分类:算法开发    专栏:python基础   


python数据类型

python数据类型python编程语言中有6个标准的数据类型,如下:String(字符串)Number(数字)Tuple(元组)List(列表)Dictionary(字典)Set(集合)其中,python的6大数据类型中,又可以分为可变数据和不可变数据,具体如下:可变数据类型:列表、字典、集合不可变数据类型:字符串、数字、元组如何理解可变、不可变数据类型呢?小知解答:可变是指在初始化相应数据之后,仍然可以编辑;不可变是指初始化相应数据之后,不可以再次编辑下面分别对各个

2022-01-19 13:19:38    博客笔记    914    分类:算法开发    专栏:python基础   


python 编码规范PEP8

python 编码规范主要有以下5个方面: 代码布局——导入——表达式和语句中的空格——注释——命名约定 1.代码布局:上下左右总体的布局 (1)缩进:4个空格一个缩进层次,通常在if语句、for语句和while语句等等后面,一个【Tab】键等于4个空格。 (2)行的最大长度:一般每行不超过80字符。 (3)空行:用两行空行分割顶层函数和类的定义;类内方法的定义用单个空行分割;当空行用于分割方法(method)的定义时,在'class'行和第一个方法定义之间也要有一个空行.

2022-03-26 12:16:15    博客笔记    1087    分类:开发环境    专栏:编码规范   


  • 52phm公告

  • 在这里,可以学习接触到工业互联网技术知识以及落地案例,其中涵盖工业数据集、工业标准库、机理模型、设备知识、机器学习、 深度学习、特征工程、振动分析、工业视觉、边缘硬件及传感器等技术知识!


工业异常检测   
  • 关于站长


  •         从事设备故障预测与健康管理行业多年的PHM算法工程师(机器医生)、国际振动分析师, 实践、研发和交付的项目涉及“化工、工业机器人、风电机组、钢铁、核电、机床、机器视觉”等领域。专注于工业智能预警系统研发, 通过机理算法和数据驱动算法分析振动信号、音频、DCS、PLC信号、SCADA信号等设备运行状态数据对机器设备进行看病预诊,为机器设备健康运行保驾护航。


当前文章目录


52phm社区

52phm社区,专注预测性维护的学习平台!

Saas体验

+ 工业demo学习系统

技术博客

+ 博客首页    + 算法开发    + 边缘感知   

+ 设备机理    + 开发环境

+ 论文速递   

友情链接

+ 在码圈

联系我

Copyright© 2021 52phm社区

京ICP备2021029973号-1