- 积分
- 3628
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-10-21
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 15195775117 于 2021-1-31 17:58 编辑
一、需求由来
平时的工作经常遇到序列分析的内容,
比如PM2.5从何时到何时升高了,从何时到何时又降低了,
为了实现自动分析,我写了个函数up_down(x),
原先我准备用wave()命名,搜索发现已经存在这个包了,不能重名。
二、python代码
# -*- coding: utf-8 -*-
"""
Created on Sun Jun 14 16:14:40 2020
该程序用于对序列的精确升降分析
曲线变化分为升、降、平三态,分别对应1、-1、0
结果格式:起始索引-终止索引-个数-升降平
处理参数x是一维向量
@author: Administrator
"""
import time
import numpy as np
import random
def up_down(x):
dx=x[1:]-x[0:-1]
#增大的都换成1:
p=np.where(dx > 0)
count=np.array(p).size
if count > 0:
dx[p]=1
#减小的都换成-1:
p=np.where(dx < 0)
count=np.array(p).size
if count > 0:
dx[p]=-1
n=len(dx)#元素个数
book=[0,0,0,0]#用于堆叠每次的结果
#以下循环有点绕,目的是把连续的升降平连到一起:
count=0
i=0
while 1:
i=i+count
if i > n-1:
break
t=dx
count=0
for j in np.arange(i,n):
if dx[j] != t:
break
count=count+1
book=np.vstack((book,[i,i+count,count+1,t]))
book=book[1:,:]#切割掉第一行
n=int(book.size/4)#求升降段数目
#字典中保存一个字符串用来说明含义:
note='book列含义:起始索引,终止索引,个数,升降平标识;有n段变化'
re={'note':note,'book':book,'n':n}
return re
if __name__ == "__main__":
print('测试:')
num=50000
x=np.arange(0,num)
random.shuffle(x)#洗牌算法
t1=time.process_time()#记录函数开始的时间
result=up_down(x)
costime=time.process_time()-t1#函数运行的时间长度
print('数据量=',num,'程序耗时{:.2f}秒'.format(costime))#精确到小数点后2位
三、计算效率
在我的电脑上5万个乱序数,需要0.77秒,虽然难以支持海量数据,但就我目前的需求是满足的
|
|