求助一个很复杂的因子如何计算 - 2

图见  https://ask.dolphindb.net/question/1904

原帖描述的不太清楚,我整理了下,逻辑如下:

1.目标是计算第三行(称为本行”)的f1

 

2.确定窗口大小,第三行的barlen=3,所以此次计算中窗口大小为3

 

3.确定第一个窗口的起始位置。按“第一个窗口的最后一行为本行”的原则,并且窗口大小为3,就确定了第一个窗口在黄色处(我标了窗口序号为1,帮助理解)

 

4.后面的窗口为滚动窗口,如窗口序号1-9,以及后面更多。窗口之间不重叠。

 

5.把每个窗口的最小值挑出,组成一个序列叫minarr,在本例中,minarr=[3,3,6,7,7,8,7,5,2]。他们依次是各个窗口中的最小值。

 

6.根据minarr计算X序列。X序列长度应和minarr序列长度相等

逻辑:X序列的每个值为MINARR序列同行的值往前推 比当前MINARR[M]值小的MINARR值中两次变小的值,如果没有足够窗口计算,就令X[M]=MINARR[M])

解释:

X[0]=3,没足够窗口让我找两次变小的值因为MINARR[0]=3,所以X[0]=3. 

X[1]=3同理。 

X[2],MINARR[2]为6,向前找比6两次变小的值(要依次往前寻找,不能跳),MINARR[1]为3,3比6小,这是第一次变小,再往前MINARR[0]还是3,相对于MINARR[1]=3没有变小,所以找不到相对于6第二次变小的值,故取第一次变小的值就可以,则X[2]=3。

X[3]=3,MINARR[3]=7,往前找相比于7第二次变小的值,6比7小,3比6小, 所以取3作为X序列该索引的值.

X[4]=3,同样逻辑,7不比7小,忽略,往前仍然是6<7,3<6,取3作为X序列该索引的值

X[5]=6,MINARR[5]=8,往前找,7<8,7=7,6<7,6是第二次变小的值,所以X[5]=6。

X[6]=6,MINARR[6]=7,往前找,8不小于7,7<8(这是第一次边小)7=7,6<7(第二次变小),所以为6

X[7]=6,跟X[6]计算是一样的逻辑

上述逻辑计算出X序列全部值。

此时:

minarr=[3,3,6,7,7,8,7,5,2]

X=[333336666]

根据minarr来计算x,此过程是array in ,array out.


7. 有了这些值后,开始计算f1目标:p值什么时候小于上一个窗口的X序列的值取那时候的p值。

具体过程:

(1)我们是计算第三行的f1,从第四行的p值(也就是3)开始推演

(2)从第四行p(也就是第二个窗口的第一行)=3开始,此时比较窗口为上一个窗口(也就是序号为1的窗口)p跟窗口的X值比较(也就是3和X[0]=3比较),看p是否小于X[上一个窗口的索引]

(3)此处,第二个窗口中p的值3->5->7他们都没有小于3这个3X[0]

(4)然后p的值往下来到6,也即是窗口3的第一行,从6开始跟上一个窗口这时,上一个窗口为序号2的窗口X值比,也就是6和X[1]=3比较,6,8,6,同样没有符合小于条件的情况。

(5)依次向后比较下去,直到第一次发现p值小于上一个窗口的X值。 记录该p值作为f1的值。

(6)在本行f1计算中,p一直到第8个窗口中,6,6,5时, 5<X[6]=6第一次出现了符合条件的情况,第一次条件成立。 取这个5(标红的那个5)作为f1(图中第3f12,不管他,正确答案为5)

总结:上面全部的文字为计算第三行f1的流程。 如果要计算下一行的f1,还是按照以上所有流程去计算。

请先 登录 后评论

1 个回答

mhxiang

你的中间计算逻辑讲的很清楚,还有一个疑问"总结:上面全部的文字为计算第三行f1的流程。 如果要计算下一行的f1,还是按照以上所有流程去计算",如果计算第四行的f1,因为第四行的barlen=2,既窗口长度为2,根据“第一个窗口的最后一行为本行”的原则”,去确定第四行的窗口序列,是吧?你的原始输入就是p值和barlen,输出为相应的f1?

p=3 4 4 3 5 7 6 8 6 7 8 7 8 7 9 8 9 8 9 8 7 6 6 5 4 3 2
barlen= 2 3 3 2 4 5 3 2 3 2  2 3 3 2 4 5 3 2 3 2 2 3 3 2 4 5 3
def select_Xvalue(MINARR,i){
	if (i<2){
		return MINARR[i]
		}
	count=0
	res=int()
	for (k in sort(2..i,false) ){
		if (MINARR[k]>MINARR[k-1]){
			count=count+1
			res=MINARR[k-1]
			}
		if (count>=2){
			return res
			}
		}
	return res
}

def select_Pvalue(wind,X){
	for (i in 1..size(wind)){
		tmp=wind[i]
		if (sum(tmp<X[i-1])){
			return tmp[tmp<X[i-1]][0]
			}
		}
	return int()
	}

def f(p,barlen,i,select_Xvalue,select_Pvalue){
	if (barlen[i]>(i+1)){
		return int()
		}
	wind=cut(p[i+1-barlen[i]:],barlen[i])
	MINARR=each(min,wind)
	X=each(select_Xvalue{MINARR,},0..(size(MINARR)-1))
	return select_Pvalue(wind,X)-p[i+1]
	
	}
f1=each(f{p,barlen,,select_Xvalue,select_Pvalue},0..(size(p)-12))

attachments-2022-07-D18hSoe062c4e98ceaa45.png


请先 登录 后评论
  • 1 关注
  • 0 收藏,826 浏览
  • ddbuserex 提出于 2022-07-03 20:51

相似问题