From d43de5dec25ee7dd9df1574e34459a5936507bac Mon Sep 17 00:00:00 2001 From: Eduardo Alonso Date: Wed, 17 Mar 2021 21:02:27 +0100 Subject: [PATCH 1/2] Add rolling window result centering Pandas-like center parameter; allows centering the result values instead of having a bunch of NaNs at the beginning of the column. --- .../java/tech/tablesaw/columns/Column.java | 4 ++++ .../tech/tablesaw/table/RollingColumn.java | 17 ++++++++++++++-- .../tablesaw/table/RollingColumnTest.java | 20 +++++++++++++++---- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/tech/tablesaw/columns/Column.java b/core/src/main/java/tech/tablesaw/columns/Column.java index 689a3d17c..9004962c3 100644 --- a/core/src/main/java/tech/tablesaw/columns/Column.java +++ b/core/src/main/java/tech/tablesaw/columns/Column.java @@ -164,6 +164,10 @@ default RollingColumn rolling(final int windowSize) { return new RollingColumn(this, windowSize); } + default RollingColumn rolling(final int windowSize, final boolean center) { + return new RollingColumn(this, windowSize, center); + } + String getUnformattedString(int r); boolean isMissing(int rowNumber); diff --git a/core/src/main/java/tech/tablesaw/table/RollingColumn.java b/core/src/main/java/tech/tablesaw/table/RollingColumn.java index c59bcde41..0dfb16bde 100644 --- a/core/src/main/java/tech/tablesaw/table/RollingColumn.java +++ b/core/src/main/java/tech/tablesaw/table/RollingColumn.java @@ -11,10 +11,16 @@ public class RollingColumn { protected final Column column; protected final int window; + protected final boolean center; - public RollingColumn(Column column, int window) { + public RollingColumn(Column column, int window, boolean center) { this.column = column; this.window = window; + this.center = center; + } + + public RollingColumn(Column column, int window) { + this(column, window, false); } protected String generateNewColumnName(AggregateFunction function) { @@ -31,7 +37,9 @@ protected String generateNewColumnName(AggregateFunction function) { public , OUT> Column calc(AggregateFunction function) { // TODO: the subset operation copies the array. creating a view would likely be more efficient Column result = function.returnType().create(generateNewColumnName(function)); - for (int i = 0; i < window - 1; i++) { + int bound = center ? (window - 1) / 2 : window - 1; + + for (int i = 0; i < bound; i++) { result.appendMissing(); } for (int origColIndex = 0; origColIndex < column.size() - window + 1; origColIndex++) { @@ -46,6 +54,11 @@ public , OUT> Column calc(AggregateFunction Date: Thu, 18 Mar 2021 01:56:07 +0100 Subject: [PATCH 2/2] Add javadoc --- core/src/main/java/tech/tablesaw/columns/Column.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/java/tech/tablesaw/columns/Column.java b/core/src/main/java/tech/tablesaw/columns/Column.java index 9004962c3..136543626 100644 --- a/core/src/main/java/tech/tablesaw/columns/Column.java +++ b/core/src/main/java/tech/tablesaw/columns/Column.java @@ -164,6 +164,10 @@ default RollingColumn rolling(final int windowSize) { return new RollingColumn(this, windowSize); } + /** + * @param windowSize size of the rolling window to use + * @param center set the operation result at the center of the window or at the end of it + */ default RollingColumn rolling(final int windowSize, final boolean center) { return new RollingColumn(this, windowSize, center); }