我正在嘗試創建第 99 和第 1 個百分位數的串列。而不是今天的一個百分位數。我想要使??用前 500 天的 500 天的百分位數。我為此使用的功能如下
swin:{[f;w;s] f each { 1_x,y }\[w#0;s]}
percentile:{[x;y] y (100 xrank y:asc y) bin x}
swin[percentile[99;];500;List].
我遇到的問題是第 99 個百分位計算得很好,但是第一個百分位使整個串列 = 0。對于它為什么會這樣做有點迷茫。建議贊賞!
uj5u.com熱心網友回復:
導致零的原因有兩個:
- 在沒有 500 天的歷史可使用的情況下,您希望最早的 500 天有什么行為?第 1 天只有 1 個資料點,第 2 天只有 2 個,依此類推。只有第 500 天才有 500 天的實際資料可供使用。默認情況下,該
swin函式用一些種子值填補空白 - 您使用零作為種子值,又名
w#0
例如,每個日期的 5 天回溯看起來像:
q)swin[::;5;1 2 3 4 5]
0 0 0 0 1
0 0 0 1 2
0 0 1 2 3
0 1 2 3 4
1 2 3 4 5
在你有資料之前你有零,所以很自然地,第一個百分位數會在前大約 500 個日期中取零。
因此,您可以決定使用不同的值作為種子,或者可能從您的百分位函式中排除零:
q)List:1000?1000
q)percentile:{[x;y] y (100 xrank y:asc y except 0) bin x}
q)swin[percentile[1;];500;List]
908 360 360 257 257 257 90 90 90 90 90 90 90 90...
如果零是串列中的合法值并且不能被排除,那么可以swin使用您知道不會在串列中的其他值(負數?無窮大?空?)作為種子,然后從百分位函式中排除該種子.
編輯:最后一種選擇是使用不同的滑動視窗函式,它不會用種子值填充間隙,例如
q)swin2:{[f;w;s] f each(),/:{neg[x]sublist y,z}[w]\[s]}
q)swin2[::;5;1 2 3 4 5]
,1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
q)percentile:{[x;y] y (100 xrank y:asc y) bin x}
q)swin2[percentile[99;];500;List]
908 908 908 908 908 908 908 908 908 908 908 959 959..
q)swin2[percentile[1;];500;List]
908 360 360 257 257 257 90 90 90 90 90 90 90 90 90..
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512652.html
下一篇:葉函式和非葉函式到底有什么區別?
