package water.rapids.ast.prims.advmath;
import water.fvec.Frame;
import water.fvec.Vec;
import water.rapids.Env;
import water.rapids.ast.AstPrimitive;
import water.rapids.ast.AstRoot;
import water.rapids.vals.ValNums;
public class AstKurtosis extends AstPrimitive {
@Override
public String[] args() {
return new String[]{"ary", "na_rm"};
}
@Override
public String str() {return "kurtosis";}
@Override
public int nargs() {return 1 + 2;} // (kurtosis ary na.rm)
@Override
public ValNums apply(Env env, Env.StackHelp stk, AstRoot asts[]) {
Frame fr = stk.track(asts[1].exec(env)).getFrame();
boolean narm = asts[2].exec(env).getNum() == 1;
double[] ds = new double[fr.numCols()];
Vec[] vecs = fr.vecs();
for (int i = 0; i < fr.numCols(); i++)
ds[i] = (!vecs[i].isNumeric() || vecs[i].length() == 0 || (!narm && vecs[i].naCnt() > 0)) ? Double.NaN : kurtosis(vecs[i]);
return new ValNums(ds);
}
public static double kurtosis(Vec v) {
return AstHist.fourth_moment(v);
}
}