def kfactor(source, signal=None): ''' 计算source中相邻信号的k因子 k因子指值差除以距离 返回的是浮点数 这里不设置interval参数,是因为如果interval>1,则有kfactor的交叠问题 如1-->3,2-->4,则1-->2用13的斜率,而2-4用24斜率,直觉无意义 ''' if len(source) == 0: return np.array([]) if signal == None: #对于数值正好为0的情况,需要signal signal = source else: assert len(source) == len(signal) rev = np.zeros(len(source), np.float) si = np.nonzero(signal)[0] if len(si) == 0: return rev ss = source[si] drev = nsubd(ss) * 1.0 / nsubd(si) rev[rollx(si)] = drev rev = extend2next(rev) #rev[si] = rev[si-1] #起点/转折点斜率为0 rev = np.select([signal != 0], [rollx(rev)], rev) return rev
def kfactor(source,signal=None): ''' 计算source中相邻信号的k因子 k因子指值差除以距离 返回的是浮点数 这里不设置interval参数,是因为如果interval>1,则有kfactor的交叠问题 如1-->3,2-->4,则1-->2用13的斜率,而2-4用24斜率,直觉无意义 ''' if len(source)==0: return np.array([]) if signal == None: #对于数值正好为0的情况,需要signal signal = source else: assert len(source) == len(signal) rev = np.zeros(len(source),np.float) si = np.nonzero(signal)[0] if len(si) == 0: return rev ss = source[si] drev = nsubd(ss) * 1.0 / nsubd(si) rev[rollx(si)] = drev rev = extend2next(rev) #rev[si] = rev[si-1] #起点/转折点斜率为0 rev = np.select([signal!=0],[rollx(rev)],rev) return rev
def ssub(source): ''' 相邻信号量相减 约等于rsub(source,source),当第一个元素不等于0时第一个元素不相同 ''' isc = np.nonzero(source) ssource = nsubd(source[isc]) rev = np.zeros_like(source) if(len(isc[0])>0): rev[isc] = ssource return rev
def ssub(source): ''' 相邻信号量相减 约等于rsub(source,source),当第一个元素不等于0时第一个元素不相同 ''' isc = np.nonzero(source) ssource = nsubd(source[isc]) rev = np.zeros_like(source) if (len(isc[0]) > 0): rev[isc] = ssource return rev
def sresume(source,length=5,covered=1): ''' 连续>=length个零随后covered个非零日 ''' rev = np.zeros_like(source) nzeros = np.where(source != 0)[0] sdiff = nsubd(nzeros) indice = nzeros[sdiff>=length] if len(indice) > 0: rlen = len(rev) for i in range(covered): cur_indice = indice + i cur_indice[cur_indice>=rlen] = rlen-1 #防止溢出 rev[cur_indice] = 1 return rev
def sresume(source, length=5, covered=1): ''' 连续>=length个零随后covered个非零日 ''' rev = np.zeros_like(source) nzeros = np.where(source != 0)[0] sdiff = nsubd(nzeros) indice = nzeros[sdiff >= length] if len(indice) > 0: rlen = len(rev) for i in range(covered): cur_indice = indice + i cur_indice[cur_indice >= rlen] = rlen - 1 #防止溢出 rev[cur_indice] = 1 return rev
def fnma(source,length): #自然ma算法,前length个元素为各自的累积和除以累积元素个数 """ 计算移动平均线,返回浮点数 @param source 源数组 @param length 均线跨度 @return 移动平均序列 """ dividen = np.arange(len(source))+1 dividen[dividen > length] = length acc = np.add.accumulate(source) rev = nsubd(acc,length) rev = rev*1.0/dividen return rev
def fnma(source, length): #自然ma算法,前length个元素为各自的累积和除以累积元素个数 """ 计算移动平均线,返回浮点数 @param source 源数组 @param length 均线跨度 @return 移动平均序列 """ dividen = np.arange(len(source)) + 1 dividen[dividen > length] = length acc = np.add.accumulate(source) rev = nsubd(acc, length) rev = rev * 1.0 / dividen return rev
def rsub2(source,signal,distance=1): ''' 相邻信号日signal的减法(相当于比较) d(n+1) = src(n+1) - s(n) d(0) = src(0) ''' assert len(source) == len(signal) isc = np.nonzero(signal) ssource = nsubd(source[isc],distance) if(len(ssource)>0): #前distance元素应该减去序列的第一个,因为它没东西减 for i in range(distance): ssource[i] -= source[0] rev = np.zeros_like(source) if(len(isc[0])>0): #print isc,len(isc) rev[isc] = ssource return rev
def rsub(source,signal): ''' 相邻信号日signal的减法(相当于比较) d(n+1) = src(n+1) - s(n) d(0) = src(0) ''' assert len(source) == len(signal) if len(source) == 0: return source.copy() isc = np.nonzero(signal) ssource = nsubd(source[isc]) if(len(ssource)>0): #第一个元素应该减去序列的第一个,因为它没东西减 ssource[0] -= source[0] rev = np.zeros_like(source) if(len(isc[0])>0): rev[isc] = ssource return rev
def rsub2(source, signal, distance=1): ''' 相邻信号日signal的减法(相当于比较) d(n+1) = src(n+1) - s(n) d(0) = src(0) ''' assert len(source) == len(signal) isc = np.nonzero(signal) ssource = nsubd(source[isc], distance) if (len(ssource) > 0): #前distance元素应该减去序列的第一个,因为它没东西减 for i in range(distance): ssource[i] -= source[0] rev = np.zeros_like(source) if (len(isc[0]) > 0): #print isc,len(isc) rev[isc] = ssource return rev
def rsub(source, signal): ''' 相邻信号日signal的减法(相当于比较) d(n+1) = src(n+1) - s(n) d(0) = src(0) ''' assert len(source) == len(signal) if len(source) == 0: return source.copy() isc = np.nonzero(signal) ssource = nsubd(source[isc]) if (len(ssource) > 0): #第一个元素应该减去序列的第一个,因为它没东西减 ssource[0] -= source[0] rev = np.zeros_like(source) if (len(isc[0]) > 0): rev[isc] = ssource return rev
def nma(source,length): #自然ma算法,前length个元素为各自的累积和除以累积元素个数 """ 计算移动平均线 @param source 源数组 @param length 均线跨度 @return 移动平均序列 """ dividen = np.arange(len(source)) + 1 dividen[dividen > length] = length pps = dividen/2 #用于整数四舍五入尾数 acc = np.add.accumulate(source) rev = nsubd(acc,length) rev += pps #这种in place方式要快于 sum = (sum + pps) / length rev /= dividen return rev
def nma(source, length): #自然ma算法,前length个元素为各自的累积和除以累积元素个数 """ 计算移动平均线 @param source 源数组 @param length 均线跨度 @return 移动平均序列 """ dividen = np.arange(len(source)) + 1 dividen[dividen > length] = length pps = dividen / 2 #用于整数四舍五入尾数 acc = np.add.accumulate(source) rev = nsubd(acc, length) rev += pps #这种in place方式要快于 sum = (sum + pps) / length rev /= dividen return rev
def nsubd2(source,distance=1): #自然的偏移减法,distance必须大于0,返回结果中前distance个元素不变 if source.ndim == 1: return d1.nsubd(source) rs = roll02(source,distance) return source - rs
def nsubd2(source, distance=1): #自然的偏移减法,distance必须大于0,返回结果中前distance个元素不变 if source.ndim == 1: return d1.nsubd(source) rs = roll02(source, distance) return source - rs