findcrest2.py-20170814

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Aug  2 14:28:09 2017

@author: vicky
"""

from numpy import *;
import numpy as np;
import pandas as pd;
import math 

#y=np.delete(y,range(152,163),axis=1)

[n,p]=np.shape(y); #输入y=原始数据,t=时间点

#------------------------平滑处理-------------------------
#f=y的四个区间累计
f=np.zeros((n,p), dtype=np.int)
for i in range(0,n-3): 
    for j in range (0,p):
        f[i+3,j]=y[i,j]+y[i+1,j]+y[i+2,j]+y[i+3,j]
#-----------------------取f的二阶差分----------------------

#f的一,二,三阶差分df1,df2
df1=np.zeros((n,p), dtype=np.int)
df2=np.zeros((n,p), dtype=np.int)
#df3=np.zeros((n,p), dtype=np.int)
for j in range (0,p):
    for i in range (0,n-1):
        df1[i+1,j]=f[i+1,j]-f[i,j]
    for i in range (0,n-2):
        df2[i+2,j]=f[i+2,j]-2*f[i+1,j]+f[i,j]
#    for i in range(0,n-3):
#        df3[i+3,j]=f[i+3,j]-3*f[i+2,j]+3*f[i+1,j]-f[i,j]

#-------------------------波峰判断--------------------------
#起点波峰fmax=f的极大值且df2的局部极小值
del fmax
fmax=np.zeros((n,p), dtype=np.int)
for j in range(0,p):
    for i in range(2,n-2):
        if (f[i,j]>=max(f[0:i,j]) and 
            f[i,j]>=max(f[i+1:i+3,j]) and 
            (df2[i,j]<=min(df2[i-1,j],df2[i+1,j])  or 
             df2[i+1,j]<=min(df2[i,j],df2[i+2,j]) or 
             df2[i-1,j]<=min(df2[i-2,j],df2[i,j]))):
            fmax[i,j]=f[i,j]

#-------------------------时间段处理-------------------------
#ffmax=fmax去0,且8点以后,且>100;ttmax=ffmax对应的时间点
del ffmax
del ttmax
ffmax=np.zeros((n,p), dtype=np.int)
ttmax=np.zeros((n,p), dtype=np.int)
for j in range(0,p):  
    k=0
    for i in range(97,n):
        if (fmax[i,j]!=0 and fmax[i,j]>100):
            ffmax[k,j]=fmax[i,j]
            ttmax[k,j]=i
            k=k+1
            
#ffmax=fmax去0,且8点以后
#--------------------------去除假波峰-------------------------
[n1,p1]=np.shape(ffmax)
rffmax=np.zeros(ffmax.shape) #rffmax=波峰的增长率
for j in range(0,p1):
    for i in range(1,n1):
        if ffmax[i,j]!=0:
            rffmax[i,j]=np.abs(ffmax[i,j]-ffmax[i-1,j])/ffmax[i-1,j]


#找阈值的下界c:取每列第1行到最大值之间的最大值b,再取所有列计算结果的最大值max(b)
del b
b=np.zeros((1,p))
for j in range(0,p1): 
    tm=np.array(np.where(rffmax[:,j]!=0))
    ma=np.array(np.where(rffmax[:,j]==max(rffmax[:,j])))[0,0]
    if size(tm)>2:
        b[0,j]=max(rffmax[0:ma,j])
    else:
        b[0,j]=0

c=np.max(b)

#去除rffmax大于阈值c的假波峰          
fffmax=np.zeros((n,p), dtype=np.int)
tmp=np.zeros((1,p))
for j in range(0,p):  
     tmp = np.array(np.where(rffmax[:,j]>c))
     if size(tmp)!=0:
         fffmax[0,j] = ffmax[tmp[0,0],j]
     else:
         fffmax[0,j] = 0
         
tttmax=np.zeros((1,p))         
for j in range(0,p): #波峰fffmax在f中的位置tttmax(对应时间)
    np.where(f[:,j]==fffmax[j])
    tttmax[j]=min(np.where(f[:,j]==fffmax[j]))

#-------------------------返回对应到y------------------------
yymax=np.zeros((1,p))
for j in range(0,p): #yymax=在y中取tttmax往前4个内的最大值
    if tttmax[j]>4:
        yymax[j]=max(y(tttmax[j]-4:tttmax[j],j))

tt=np.zeros((1,p))
for j in range(0,p): #tt=yymax对应的时间点
    if yymax[j]!=0:
        np.where(y[:,j]==yymax[j]
    tt[j]=t[min(np.where(y[:,j]==yymax[j])),1]
   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值