2017-05-16 1 views
1

Supposons que j'ai une table d'événements, avec horodatage et type.kdb comment calculer le nombre de roulement

t1, 'b' 
t2, 'x' 
t3, 's' 
t4, 'b' 

Comment puis-je obtenir un compte roulant tel qu'il me donnerait une liste de tous les horodateurs et le nombre cummulative d'événements jusqu'à Taht ts, un peu comme une version de comptage des sommes

for example for 'b' I d like a table 

't1', 1 
't2', 1 
't3', 1 
't4', 2 

Répondre

1

Voici une façon de le faire, bien qu'il puisse y avoir un moyen plus intelligent utilise cette somme:

//table definition 
tab:([]a:`t1`t2`t3`t4;b:"bxsb") 

//rolling sum of 1 by column b 
update sums count[i]#1 by b from tab 

Résultats dans:

a b x 
------ 
t1 b 1 
t2 x 1 
t3 s 1 
t4 b 2 

Si vous voulez remplacer b, vous devez simplement mettre b: devant le sums.

1

Une façon:

q)t:([]p:asc 4?.z.p+til 1000;t:`b`x`s`b) 
q)asc `p xcols ungroup select p,til count i by t from t 
p        t x 
--------------------------------- 
2017.05.16D09:42:48.259062090 b 0 
2017.05.16D09:42:48.259062585 x 0 
2017.05.16D09:42:48.259062683 s 0 
2017.05.16D09:42:48.259062858 b 1 

Ps: Notez que j'ai commencé la séquence à 0 comme pour dire «J'ai eu 0 événements avant cette ligne » au lieu de commencer à 1 par votre exemple. Il va avec votre req "nombre d'événements jusqu'à ce ts". Si vous avez besoin de 1, ajoutez 1 '1 + til count i'. Assurez-vous également que votre temps est trié de façon à ce qu'il soit logique au début de la séquence.

1

Avec table t comme ci-dessous:

q)show t: ([]ts:.z.t - desc "u"$(til 4);symb:`b`x`z`b) 
ts   symb 
----------------- 
09:46:56.384 b 
09:47:56.384 x 
09:48:56.384 z 
09:49:56.384 b 

utilisant un vecteur conditionnel:

q)select ts, cum_count:sums ?[symb=`b;1;0] from t 
ts   cum_count 
---------------------- 
09:46:56.384 1 
09:47:56.384 1 
09:48:56.384 1 
09:49:56.384 2 

La même chose, mais avec une fonction prise symb comme paramètre:

q){select ts, cum_count:sums ?[symb=x;1;0] from t}[`b] 
ts   cum_count 
---------------------- 
09:46:56.384 1 
09:47:56.384 1 
09:48:56.384 1 
09:49:56.384 2 

En fait, vous n'avez pas besoin d'un vecteur conditionnel, car vous pouvez simplement additionner les booléens directement:

q){select ts, cum_count:sums symb=x from t}[`b] 
ts   cum_count 
---------------------- 
09:46:56.384 1 
09:47:56.384 1 
09:48:56.384 1 
09:49:56.384 2