package cookbook;
import java.io.File;
import org.junit.Test;
import water.Key;
import water.UKV;
import water.fvec.Frame;
import water.fvec.NFSFileVec;
import water.fvec.ParseDataset2;
import water.fvec.Vec;
public class FramDemo extends AbstractCookbook{
@Test
public void Frame_1(){
String fileName = "./cookbookData/cars_nice_header.csv";
File file = new File(fileName);
Key fkey = NFSFileVec.make(file);
Key okey = Key.make("cars.hex");
Frame fr;
fr = ParseDataset2.parse(okey, new Key[]{fkey});
// ACCESSING A VEC FROM A FRAME
Vec vv = fr.vec(0); // by index
System.out.println(vv); // prints summary of the vec
Vec vvc = fr.vec("name"); // by column name
System.out.println(vvc);
Vec allVec[] = fr.vecs(); // all vectors
System.out.println("Number of vectors: "+allVec.length);
//PRINTING ALL COLUMN (AKA VEC) NAMES IN A FRAME
String colNames[] = fr.names();
for(int i=0; i<colNames.length;i++)
System.out.println("Name of vector "+i + ": "+colNames[i]);
//ADDING AN EXISTING VEC TO A FRAME
System.out.println("Number of vectors in original frame: "+fr.numCols()); //checking number of columns in the frame
fr.add("Added_vector", vv); //added an existing vector
System.out.println("Added a vector: "+fr);
//CREATING A NEW FRAME WITH A SUBSET OF VECS FROM AN EXISTING FRAME
String[] colTosubset = {"name","economy"};
Frame Sfr = fr.subframe(colTosubset); //by specifying column names
System.out.println("Subframe made by specifying colnames:"+Sfr);
//here, the sub frame is not added to the kv store
Frame Sfr2 = fr.subframe(0, 3); // by specifying start and end indices(excludes end index)
System.out.println("Subframe made by specifying indices:"+Sfr2);
String colTosubsetOn[] = {"name","economy","newvec1","newvec2"};
Frame Sfr3[] = fr.subframe(colTosubsetOn, 0);// creates two frames- First frame contains all columns from existing frame and the new vectors filled with specified double value
// Second frame contains columns missing in the original frame and are filled with the specified constant value
System.out.println("Subframe from original frame with new constant vecs: "+Sfr3[0]);
System.out.println("Newframe with constant vecs: "+Sfr3[1]);
// REMOVING A VEC FROM A FRAME
int colToRemove = 8;
String name = fr.names()[colToRemove];
fr.remove(colToRemove); // by specifying index
/*Waring: this command only removes the vector reference leaving behind the data in the KV store.
*Useful when a vector is owned by many frames and want to delete it from only one frame.
*Works here because vector 8 is a copy of the 1st vector in the original frame
*/
System.out.println("Frame after column "+ name +" removed : "+ fr);
/* fr.remove("weight"); // by specifying name
* System.out.println("Frame after column weight is removed: "+ fr);
*
* int idxsToremove[] ={6,7};
* fr.remove(idxsToremove); //removes multiple columns by specifying indices
* System.out.println("Frame after "+idxsToremove.length +" columns are removed: "+ fr);
*
* fr.remove(0, 2); // by specifying start and end indices(excludes end index)
* System.out.println("Frame after specified range of columns are removed: "+ fr);
*/
//REMOVING ALL FRAME REFERENCES TO A VEC AND RECLAIMING ITS MEMORY
UKV.remove(fr.remove("cylinders")._key);
System.out.println("Frame after column 'cylinders' is removed: "+ fr);
//CREATING A NEW DOUBLE VEC FROM NOTHING AND ADDING IT TO A FRAME
/*This is efficient only when a small/few vectors needs to be generated.
* Otherwise use mapreduce
*/
Vec dv = fr.anyVec().makeZero();
Vec.Writer vw = dv.open();
for (long i = 0; i < dv.length(); ++i)
vw.set(i, (double)i+0.1);
vw.close();
fr.add("New_Double_Vec", dv);
//CREATING A NEW LONG VEC FROM NOTHING AND ADDING IT TO A FRAME
Vec lv = fr.anyVec().makeZero();
Vec.Writer lvw = lv.open();
for (long i = 0; i < lv.length(); ++i)
lvw.set(i, i);
lvw.close();
fr.add("New_Long_Vec", lv);
//CREATING A NEW ENUM VEC FROM NOTHING AND ADDING IT TO A FRAME
final String [] Domain = {"a", "b", "c","d"};
Vec ev = fr.anyVec().makeCon(lv.length(), Domain);
Vec.Writer evw = ev.open();
for (long i = 0; i < ev.length(); ++i)
evw.set(i, i % 4);
evw.close();
fr.add("NewEnumvec", ev);
//logThisH2OInstanceWebBrowserAddress();
//sleepForever();
//CLEANING THE KV STORE OF ALL DATA
Frame.delete(okey);
Sfr3[1].delete();
Sfr3[0].delete();
Sfr2.delete();
Sfr.delete();
//DKV.remove(okey);
}
}