/* * Joinery -- Data frames for Java * Copyright (c) 2014, 2015 IBM Corp. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package joinery; import static org.junit.Assert.assertArrayEquals; import java.io.IOException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.List; import joinery.DataFrame.Function; import org.junit.Before; import org.junit.Test; public class DataFrameTimeseriesTest { private DateFormat fmt = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); private DataFrame<Object> df; @Before public void setUp() throws IOException { df = DataFrame.readCsv(ClassLoader.getSystemResourceAsStream("timeseries.csv")); } @Test public void testOutOfWindowRowsAreNull() throws ParseException { assertArrayEquals( new Object[] { fmt.parse("Thu Feb 05 00:00:00 EST 2015"), null }, df.retain("Date", "Close") .diff() .row(0) .toArray() ); assertArrayEquals( new Object[] { fmt.parse("Wed Feb 11 00:00:00 EST 2015"), null }, df.retain("Date", "Close") .diff(5) .row(4) .toArray() ); } @Test public void testDiscreteDifference() { assertArrayEquals( new double[] { Double.NaN, -1.01, 0.79, 2.30, 2.86, 1.58, 0.62, 0.75, 0.89, -0.27 }, df.retain("Close") .cast(Number.class) .diff() .fillna(Double.NaN) .toArray(double[].class), 0.0001 ); } @Test public void testDiscreteDifferencePeriod() { assertArrayEquals( new double[] { Double.NaN, Double.NaN, Double.NaN, 2.08, 5.95, 6.74, 5.06, 2.95, 2.26, 1.37 }, df.retain("Close") .cast(Number.class) .diff(3) .fillna(Double.NaN) .toArray(double[].class), 0.0001 ); } @Test public void testPercentChange() { assertArrayEquals( new double[] { Double.NaN, -0.0084, 0.0066, 0.0192, 0.0234, 0.01265, 0.0049, 0.0059, 0.0070, -0.0021 }, df.retain("Close") .cast(Number.class) .percentChange() .fillna(Double.NaN) .toArray(double[].class), 0.0001 ); } @Test public void testPercentChangePeriod() { assertArrayEquals( new double[] { Double.NaN, Double.NaN, Double.NaN, 0.0173, 0.0500, 0.0563, 0.0415, 0.0236, 0.0179, 0.0108 }, df.retain("Close") .percentChange(3) .fillna(Double.NaN) .toArray(double[].class), 0.0001 ); } @Test public void testRollApplyMultiColumn() { assertArrayEquals( new double[] { Double.NaN, 119.435, 119.325, 120.870, 123.450, 125.670, 126.770, 127.455, 128.275, 128.585, Double.NaN, 42976406.0, 41298182.0, 50449151.5, 67785151.5, 74018131.5, 64373342.5, 58712312.0, 54022071.0, 41066090.5 }, df.numeric() .retain("Close", "Volume") .rollapply(new Function<List<Number>, Number>() { @Override public Number apply(final List<Number> values) { if (values.contains(null)) return null; return (values.get(0).doubleValue() + values.get(1).doubleValue()) / 2.0; } }) .fillna(Double.NaN) .toArray(double[].class), 0.0001 ); } }