J'ai un fichier csv qui stocke les valeurs temporaires. Je dois trouver la moyenne du groupe pour certains ensembles d'échantillons selon les étapes ci-dessous:
1.Faites en sorte que toutes les valeurs temporaires inférieures à 25 soient égales à zéro post_processus iecolumn
2. La colonne group_avg est dérivée en ignorant les lignes avec plus de ou égal à 4 zéros consécutifs. Suivi du calcul de la moyenne du groupe d'échantillons comme indiqué ci-dessous
3. La colonne final_average correspond aux résultats générés à partir de la colonne group_avg
Comment pouvons-nous écrire ce processus en utilisant jsl?
Joindre le fichier csv
Le résultat final est définitif _average comme dans le tableau ci-dessous:

Voici un script qui crée votre table de données avec uniquement la colonne TEMP, puis les colonnes restantes sont créées et une formule est utilisée pour les remplir.
Names Default To Here( 1 );
dt = New Table( "temp_temp",
Add Rows( 54 ),
New Column( "TEMP",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[23.23019577, 23.44946668, 23.56111955, 23.47601143, 23.36428639,
23.24016499, 32.42091411, 23, 32.26821731, 32.14990084, 32.42091411,
32.26821731, 32.14990084, 23.23019577, 23.44946668, 23.56111955,
23.47601143, 23.36428639, 23.24016499, 32.15353181, 32.16785998, 21,
32.502366, 32.16261133, 32.15757688, 32.16790474, 23.23019577,
23.44946668, 23.56111955, 23.47601143, 23.36428639, 23.24016499,
32.42091411, 10, 32.26821731, 32.14990084, 32.41334166, 32.17456755,
32.52383338, 32.17310331, 19.28571429, 19.28571429, 19.28571429,
19.28571429, 34.62948075, 34.28766971, 34.29470736, 34.61532486,
34.386807, 34.36554216, 34.58410721, 34.28726312, 23.57142857,
23.57142857]
)
)
);
dt << New Column( "post process", formula( If( :TEMP <= 25, 0, :TEMP ) ) );
dt:post process << delete formula;
dt << New Column( "group_avg",
formula(
value = .;
If( Row() == 1,
flag = 0;
zeroCounter = 0;
);
If( flag == 0 & :post process > 0,
flag = 1;
captureMatrix = [];
Show( "start", Row(), flag );
);
If( :post process == 0 & flag == 1,
zeroCounter
++);
If( flag == 1,
captureMatrix = captureMatrix || Matrix( :post process );
Show( "cap", Row(), captureMatrix );
If( zeroCounter == 4 | Row() == N Rows( dt ),
For( i = N Cols( captureMatrix ), i >= 1, i--,
If( captureMatrix[i] != 0,
Break(),
captureMatrix[i] = .
)
);
value = Mean( captureMatrix );
Show( value );
Show( Row(), captureMatrix, zeroCounter, Index( 1, N Cols( captureMatrix ) - (zeroCounter - 1) ) );
flag = 0;
zeroCounter = 0;
Show( flag );
captureMatrix = [];
);
);
value;
)
);
dt << new column("final Avg",
formula(
if(row()==1,
theRows = current data table() << get rows where(isMissing(:group_avg)==0);
);
If(row()<= nrows(theRows),
value=:group_avg[theRows[Row()]],
value=.
)
)
);
Ce script fonctionne très bien pour les petits fichiers. Mais dans le cas de fichiers volumineux où nous avons 16000 zéros au lieu de 4 JMP cesse de répondre. Existe-t-il un moyen d'empêcher cela et d'exécuter le script sans se bloquer?
Je soupçonne que le problème est que, par erreur, j'ai laissé plusieurs instructions "Show ()" dans le code, ce qui a forcé beaucoup d'écriture dans le journal JMP.
Ci-dessous se trouve la spécification de la colonne «post-process», qui est la partie que je suppose avoir le problème qui bloque JMP.Essayez de l'exécuter et voyez s'il fonctionnera sans se bloquer
dt << New Column( "group_avg",
formula(
value = .;
If( Row() == 1,
flag = 0;
zeroCounter = 0;
);
If( flag == 0 & :post process > 0,
flag = 1;
captureMatrix = [];
);
If( :post process == 0 & flag == 1,
zeroCounter
++);
If( flag == 1,
captureMatrix = captureMatrix || Matrix( :post process );
If( zeroCounter == 4 | Row() == N Rows( dt ),
/*For( i = N Cols( captureMatrix ), i >= 1, i--,
If( captureMatrix[i] != 0,
Break(),
captureMatrix[i] = .
)
);*/
if( Row() == N Rows( dt ), zerocounter++ );
value = Mean( captureMatrix[ 1:: ncols(captureMatrix) - (zeroCounter - 1)] );
flag = 0;
zeroCounter = 0;
captureMatrix = [];
);
);
value;
)
);Le premier script donne la bonne réponse mais la sortie des deux scripts n'est pas la même, pourquoi avez-vous commenté une partie du code
La deuxième version du code est plus efficace. Compte tenu de la quantité de données que vous utilisez, j'ai pensé que cela aiderait.Il devrait fournir les mêmes résultats.Si ce n'est pas le cas, vous pouvez simplement essayer de supprimer toutes les instructions Show () de la première version du code, et si cela fonctionne.