use of water.rapids.vals.ValFrame in project h2o-3 by h2oai.
the class AstBinOp method scalar_op_frame.
/**
* Auto-widen the scalar to every element of the frame
*/
private ValFrame scalar_op_frame(final String str, Frame fr) {
Frame res = new MRTask() {
@Override
public void map(Chunk[] chks, NewChunk[] cress) {
BufferedString vstr = new BufferedString();
for (int c = 0; c < chks.length; c++) {
Chunk chk = chks[c];
NewChunk cres = cress[c];
Vec vec = chk.vec();
// String Vectors: apply str_op as BufferedStrings to all elements
if (vec.isString()) {
final BufferedString conStr = new BufferedString(str);
for (int i = 0; i < chk._len; i++) cres.addNum(str_op(conStr, chk.atStr(vstr, i)));
} else if (vec.isCategorical()) {
// categorical Vectors: convert string to domain value; apply op (not
// str_op). Not sure what the "right" behavior here is, can
// easily argue that should instead apply str_op to the categorical
// string domain value - except that this whole operation only
// makes sense for EQ/NE, and is much faster when just comparing
// doubles vs comparing strings.
final double d = (double) ArrayUtils.find(vec.domain(), str);
for (int i = 0; i < chk._len; i++) cres.addNum(op(d, chk.atd(i)));
} else {
// mixing string and numeric
// false or true only
final double d = op(1, 2);
for (int i = 0; i < chk._len; i++) cres.addNum(d);
}
}
}
}.doAll(fr.numCols(), Vec.T_NUM, fr).outputFrame(fr._names, null);
return new ValFrame(res);
}
use of water.rapids.vals.ValFrame in project h2o-3 by h2oai.
the class AstSumAxis method rowwiseSum.
/**
* Compute Frame sum for each row. This returns a frame consisting of a single Vec of sums in each row.
*/
private ValFrame rowwiseSum(Frame fr, final boolean na_rm) {
String[] newnames = { "sum" };
Key<Frame> newkey = Key.make();
// Determine how many columns of different types we have
int n_numeric = 0, n_time = 0;
for (Vec vec : fr.vecs()) {
if (vec.isNumeric())
n_numeric++;
if (vec.isTime())
n_time++;
}
// Compute the type of the resulting column: if all columns are TIME then the result is also time; otherwise
// if at least one column is numeric then the result is also numeric.
byte resType = n_numeric > 0 ? Vec.T_NUM : Vec.T_TIME;
// Construct the frame over which the sum should be computed
Frame compFrame = new Frame();
for (int i = 0; i < fr.numCols(); i++) {
Vec vec = fr.vec(i);
if (n_numeric > 0 ? vec.isNumeric() : vec.isTime())
compFrame.add(fr.name(i), vec);
}
Vec anyvec = compFrame.anyVec();
//Certain corner cases
if (anyvec == null) {
Frame res = new Frame(newkey);
anyvec = fr.anyVec();
if (anyvec != null) {
// All columns in the original frame are non-numeric? Return a vec of NAs
res.add("sum", anyvec.makeCon(Double.NaN));
}
// else the original frame is empty, in which case we return an empty frame too
return new ValFrame(res);
}
if (!na_rm && n_numeric < fr.numCols() && n_time < fr.numCols()) {
// If some of the columns are non-numeric and na_rm==false, then the result is a vec of NAs
Frame res = new Frame(newkey, newnames, new Vec[] { anyvec.makeCon(Double.NaN) });
return new ValFrame(res);
}
// Compute the sum over all rows
final int numCols = compFrame.numCols();
Frame res = new MRTask() {
@Override
public void map(Chunk[] cs, NewChunk nc) {
for (int i = 0; i < cs[0]._len; i++) {
double d = 0;
int numNaColumns = 0;
for (int j = 0; j < numCols; j++) {
double val = cs[j].atd(i);
if (Double.isNaN(val))
numNaColumns++;
else
d += val;
}
if (na_rm ? numNaColumns < numCols : numNaColumns == 0)
nc.addNum(d);
else
nc.addNum(Double.NaN);
}
}
}.doAll(1, resType, compFrame).outputFrame(newkey, newnames, null);
// Return the result
return new ValFrame(res);
}
use of water.rapids.vals.ValFrame in project h2o-3 by h2oai.
the class AstSumAxis method colwisesum.
/**
* Compute column-wise sums and return a frame having a single row.
*/
private ValFrame colwisesum(Frame fr, final boolean na_rm) {
Frame res = new Frame();
Vec vec1 = Vec.makeCon(null, 0);
assert vec1.length() == 1;
for (int i = 0; i < fr.numCols(); i++) {
Vec v = fr.vec(i);
boolean valid = (v.isNumeric() || v.isTime() || v.isBinary()) && v.length() > 0 && (na_rm || v.naCnt() == 0);
Vec newvec = vec1.makeCon(valid ? v.mean() * (v.length() - v.naCnt()) : Double.NaN, v.isTime() ? Vec.T_TIME : Vec.T_NUM);
res.add(fr.name(i), newvec);
}
vec1.remove();
return new ValFrame(res);
}
use of water.rapids.vals.ValFrame in project h2o-3 by h2oai.
the class AstRepLen method apply.
@Override
public ValFrame apply(Env env, Env.StackHelp stk, AstRoot[] asts) {
Val v = asts[1].exec(env);
long length = (long) asts[2].exec(env).getNum();
Frame ff;
if (v instanceof ValFrame)
ff = stk.track(v).getFrame();
else
return new ValFrame(new Frame(Vec.makeCon(v.getNum(), length)));
final Frame fr = ff;
if (fr.numCols() == 1) {
Vec vec = Vec.makeRepSeq(length, fr.numRows());
new MRTask() {
@Override
public void map(Chunk c) {
for (int i = 0; i < c._len; ++i) c.set(i, fr.anyVec().at((long) c.atd(i)));
}
}.doAll(vec);
vec.setDomain(fr.anyVec().domain());
return new ValFrame(new Frame(vec));
} else {
Frame f = new Frame();
for (int i = 0; i < length; ++i) f.add(Frame.defaultColName(f.numCols()), fr.vec(i % fr.numCols()));
return new ValFrame(f);
}
}
use of water.rapids.vals.ValFrame in project h2o-3 by h2oai.
the class AstMatch method apply.
@Override
public ValFrame apply(Env env, Env.StackHelp stk, AstRoot[] asts) {
Frame fr = stk.track(asts[1].exec(env)).getFrame();
if ((fr.numCols() != 1) || !(fr.anyVec().isCategorical() || fr.anyVec().isString()))
throw new IllegalArgumentException("can only match on a single categorical/string column.");
final MRTask<?> matchTask;
double noMatch = asts[3].exec(env).getNum();
if (asts[2] instanceof AstNumList) {
matchTask = new NumMatchTask(((AstNumList) asts[2]).sort().expand(), noMatch);
} else if (asts[2] instanceof AstNum) {
matchTask = new NumMatchTask(new double[] { asts[2].exec(env).getNum() }, noMatch);
} else if (asts[2] instanceof AstStrList) {
String[] values = ((AstStrList) asts[2])._strs;
Arrays.sort(values);
matchTask = fr.anyVec().isString() ? new StrMatchTask(values, noMatch) : new CatMatchTask(values, noMatch);
} else if (asts[2] instanceof AstStr) {
String[] values = new String[] { asts[2].exec(env).getStr() };
matchTask = fr.anyVec().isString() ? new StrMatchTask(values, noMatch) : new CatMatchTask(values, noMatch);
} else
throw new IllegalArgumentException("Expected numbers/strings. Got: " + asts[2].getClass());
Frame result = matchTask.doAll(Vec.T_NUM, fr.anyVec()).outputFrame();
return new ValFrame(result);
}
Aggregations