Releases: tedmiddleton/mainframe
Expression functions, renaming, refining
The big new feature here is expression functions that allow for row expressions that contain function invocations (like calling std::trunc on columns). Also, frame::new_series<> is now frame::append_column<> and frame::prepend_column<>, and in general column/series terminology has been made a bit more consistent. Also, series::minmax() and series::stddev().
innerjoin, leftjoin, and frame indexing
mainframe now supports innerjoin and leftjoin functions, much like
auto fjoined = innerjoin( f1, _2, f2, _3 );
mainframe also supports flexible index operators for both columns and rows
// selects columns 3, 4, and 5 and then all rows where column 1 > 25 and column 2 is 2002 or later
auto fnew = f1[ _3, _4, _5 ][ _1 > 25.0 && _2 > 2002y/1/1 ];
groupby and aggregate
Now supports SQL-ish GROUPBY functionality complete with SUM(), MIN(), MAX(), MEAN(), STDDEV(), and COUNT().
algorithms and iterators and rows
The original implementation of frame_iterator didn't really allow for mutation - there was no frame_iterator::value_type that standard algorithms like std::sort() could use as temp values to do their work, because the proxy object that frame_iterator used was a bunch of series iterators.
The existing proxy object has been enhanced to allow better assignment behaviour, and at the same time there's now a type for frame_iterator::value_type - frame_row. frame_row contains actual values and can be used by std::sort() as a temp variable. frame_row will continue to be enhanced and will serve as a sort of "row-builder" object type to make parsing into frame objects a bit easier.
Other than that, the iterator type, frame_iterator, has an improved implementation with fewer strange corner-cases.
Column indexers and expressions work as expected
The list of table-stakes items for a dataframe that mainframe hasn't implemented is growing shorter with every commit - but correlations are next.
Missing columns
Columns can now hold missing types and frame supports the frame::allow_missing() and frame::disallow_missing() calls, directed either at the whole frame or groups of columns.
frame::rows() and expressions
Expressions mostly... work? frame::rows() works? frame::rows() seems to mostly work now. It can't work with column names unfortunately - only indices. But there might be a way of salvaging this - although it would still mean uframe and useries would have to be used. But for now, it's possible to craft an expression that filters on columns based on arbitrary types that have standard c++ operator support.
v0.1.0
Merge branch 'main' of github.com:tedmiddleton/miniframe into main