├── .gitignore ├── License ├── ReadMe.md ├── pom.xml └── src ├── main └── java │ └── com │ └── github │ └── ruananswer │ ├── anomaly │ └── DetectAnoms.java │ ├── statistics │ ├── OnlineNormalStatistics.java │ └── QuickMedians.java │ └── stl │ ├── STLDecomposition.java │ ├── STLResult.java │ └── STLUtility.java └── test ├── java └── com │ └── github │ └── ruananswer │ ├── anomaly │ └── AnomalyDetectionTest.java │ ├── statistics │ └── QuickMedianTest.java │ ├── stl │ ├── PlotTest.java │ ├── STLTest.java │ ├── STLUtilityTest.java │ └── StlPlotter.java │ └── testUtility │ ├── StlFilenameFilter.java │ └── TestCommon.java └── resources ├── bumpInDoublePick anoms.csv ├── bumpInDoublePick stl.csv ├── bumpToEarly anoms.csv ├── bumpToEarly stl.csv ├── exponentialGrow anoms.csv ├── exponentialGrow stl.csv ├── flat anoms.csv ├── flat stl.csv ├── floor anoms.csv ├── floor stl.csv ├── gc anoms.csv ├── gc stl.csv ├── growSuddenly anoms.csv ├── growSuddenly stl.csv ├── justGrow anoms.csv ├── justGrow stl.csv ├── justGrowWithError anoms.csv ├── justGrowWithError stl.csv ├── linearGrow anoms.csv ├── linearGrow stl.csv ├── linearGrowWithError anoms.csv ├── linearGrowWithError stl.csv ├── moreNoise anoms.csv ├── moreNoise stl.csv ├── plateau anoms.csv ├── plateau stl.csv ├── removeNoise anoms.csv ├── removeNoise stl.csv ├── sample-timeseries.json ├── smallChange anoms.csv ├── smallChange stl.csv ├── smallChangeOnStrictModel anoms.csv ├── smallChangeOnStrictModel stl.csv ├── speark anoms.csv ├── speark stl.csv ├── stopSuddenly anoms.csv ├── stopSuddenly stl.csv ├── testLoess.csv ├── thoughput anoms.csv ├── thoughput stl.csv ├── timeSeries anoms.csv ├── timeSeries stl.csv ├── tmp anoms.csv ├── tmp stl.csv ├── twitter anoms.csv └── twitter stl.csv /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | target/ 3 | *.iml 4 | .idea/ 5 | -------------------------------------------------------------------------------- /License: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | Twitter-anomalyDetection-java 2 | ============================= 3 | 4 | A Java implementation of [twitter anomaly detection](https://github.com/twitter/AnomalyDetection). 5 | But optimized the time complexity from o(n^2) to o(nlogn). 6 | 7 | References 8 | ============================= 9 | [1. Vallis, O., Hochenbaum, J. and Kejariwal, A., (2014) “A Novel Technique for Long-Term Anomaly Detection in the Cloud”, 10 | 6th USENIX Workshop on Hot Topics in Cloud Computing, Philadelphia, PA.] 11 | (https://www.usenix.org/system/files/conference/hotcloud14/hotcloud14-vallis.pdf) 12 | [2. Rosner, B., (May 1983), “Percentage Points for a Generalized ESD Many-Outlier Procedure”, Technometrics, 25(2), pp. 165-172.] 13 | [3. STL: A Seasonal-Trend Decomposition Procedure Based on Loess](http://www.wessa.net/download/stl.pdf) 14 | 15 | More 16 | ============================ 17 | - STL-java reference (https://github.com/brandtg/stl-java), but we implements the stl in java as [stlplus](https://github.com/hafen/stlplus) described, faster and can handle NA values (some data used stl-java will throw some exception). 18 | - Twitter-anomalyDetection (https://github.com/twitter/AnomalyDetection), we optimize the algorithm from o(n^2) to o(nlogn) 19 | - STL Test and Anomaly Detection Test is from (https://anomaly.io/anomaly-detection-twitter-r/): 20 | - use R stl decompose as stl test benchmark. 21 | - use R twitter anomaly detection as anomaly detection test benchmark 22 | - this lib performs as well as twitter. And it can even find the anomalies those could not be detected by Twitter-anomalyDetection! 23 | 24 | For more information please read code, the ReadMe will update later! 25 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.github.ruananswer.stl 8 | stl-java 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 13 | 14 | 15 | org.apache.maven.plugins 16 | maven-compiler-plugin 17 | 18 | 1.8 19 | 1.8 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | org.apache.commons 31 | commons-math3 32 | 3.6 33 | 34 | 35 | com.fasterxml.jackson.core 36 | jackson-core 37 | 2.5.1 38 | test 39 | 40 | 41 | com.fasterxml.jackson.core 42 | jackson-databind 43 | 2.5.1 44 | test 45 | 46 | 47 | org.testng 48 | testng 49 | 6.8.7 50 | test 51 | 52 | 53 | org.jfree 54 | jfreechart 55 | 1.0.19 56 | test 57 | 58 | 59 | org.apache.commons 60 | commons-io 61 | 1.3.2 62 | test 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /src/main/java/com/github/ruananswer/anomaly/DetectAnoms.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.anomaly; 2 | 3 | 4 | import com.github.ruananswer.statistics.OnlineNormalStatistics; 5 | import com.github.ruananswer.statistics.QuickMedians; 6 | import com.github.ruananswer.stl.STLDecomposition; 7 | import com.github.ruananswer.stl.STLResult; 8 | import org.apache.commons.math3.distribution.TDistribution; 9 | 10 | import java.util.ArrayList; 11 | import java.util.Comparator; 12 | 13 | /** 14 | * Implementation of the underlying algorithm – referred to as Seasonal Hybrid ESD (S-H-ESD) builds upon the Generalized ESD test for detecting anomalies. 15 | * Created by on 16-4-6. 16 | */ 17 | public class DetectAnoms { 18 | private final Config config; 19 | 20 | public DetectAnoms(Config config) { 21 | this.config = config; 22 | } 23 | 24 | /** 25 | * The main parameter of function anomalyDetection 26 | */ 27 | public static class Config { 28 | /** Maximum number of anomalies that S-H-ESD will detect as a percentage of the data. */ 29 | private double maxAnoms = 0.49; 30 | /** Defines the number of observations in a single period, and used during seasonal decomposition. */ 31 | private int numObsPerPeriod = 1440; 32 | /** noms_threshold use the threshold to filter the anoms. such as if anoms_threshold = 1.05, 33 | #' then we will filter the anoms that exceed the exceptional critical value 100%-105% */ 34 | private double anomsThreshold = 1.05; 35 | /** The level of statistical significance with which to accept or reject anomalies. */ 36 | private double alpha = 0.05; 37 | 38 | public Config() {} 39 | 40 | public double getMaxAnoms() { 41 | return maxAnoms; 42 | } 43 | 44 | public int getNumObsPerPeriod() { 45 | return numObsPerPeriod; 46 | } 47 | 48 | public double getAnomsThreshold() { 49 | return anomsThreshold; 50 | } 51 | 52 | public double getAlpha() { 53 | return alpha; 54 | } 55 | 56 | public void setMaxAnoms(double maxAnoms) { 57 | this.maxAnoms = maxAnoms; 58 | } 59 | 60 | public void setNumObsPerPeriod(int numObsPerPeriod) { 61 | this.numObsPerPeriod = numObsPerPeriod; 62 | } 63 | 64 | public void setAnomsThreshold(double anomsThreshold) { 65 | this.anomsThreshold = anomsThreshold; 66 | } 67 | 68 | public void setAlpha(double alpha) { 69 | this.alpha = alpha; 70 | } 71 | } 72 | 73 | /** 74 | * The detected anomalies in a time series using S-H-ESD 75 | * A list containing the anomalies (anoms) and decomposition components (stl). 76 | */ 77 | public class ANOMSResult { 78 | private final long[] anomsIndex; 79 | private final double[] anomsScore; 80 | private final double[] dataDecomp; 81 | 82 | private ANOMSResult(long[] anomsIdx, double[] anomsSc, double[] dataDe) { 83 | this.anomsIndex = anomsIdx; 84 | this.anomsScore = anomsSc; 85 | this.dataDecomp = dataDe; 86 | } 87 | 88 | public long[] getAnomsIndex() { 89 | return anomsIndex; 90 | } 91 | 92 | public double[] getAnomsScore() { 93 | return anomsScore; 94 | } 95 | 96 | public double[] getDataDecomp() { 97 | return dataDecomp; 98 | } 99 | } 100 | 101 | /** Args: 102 | #' series: Time series to perform anomaly detection on. 103 | #' max_Anoms: Maximum number of anomalies that S-H-ESD will detect as a percentage of the data. 104 | #' alpha: The level of statistical significance with which to accept or reject anomalies. 105 | #' num_obs_per_period: Defines the number of observations in a single period, and used during seasonal decomposition. 106 | #' Returns: 107 | #' A list containing the anomalies (anoms) and decomposition components (stl). 108 | */ 109 | private ANOMSResult detectAnoms(long[] timestamps, double[] series) { 110 | if (series == null || series.length < 1) { 111 | throw new IllegalArgumentException("must supply period length for time series decomposition"); 112 | } 113 | int numberOfObservations = series.length; 114 | /** 115 | * use StlDec function 116 | * first interpolation to solve problem data to much 117 | */ 118 | // -- Step 1: Decompose data. This returns a univarite remainder which will be used for anomaly detection. Optionally, we might NOT decompose. 119 | STLResult data = removeSeasonality(timestamps, series, config.getNumObsPerPeriod()); 120 | double[] data_trend = data.getTrend(); 121 | double[] data_seasonal = data.getSeasonal(); 122 | 123 | // Mean mean = new Mean(); 124 | // Variance variance = new Variance(); 125 | // Median median = new Median(); 126 | 127 | // Remove the seasonal component, and the median of the data to create the univariate remainder 128 | double[] dataForSHESD = new double[numberOfObservations]; 129 | double[] dataDecomp = new double[numberOfObservations]; 130 | 131 | QuickMedians quickMedian = new QuickMedians(series); 132 | double medianOfSeries = quickMedian.getMedian();//median.evaluate(series); 133 | 134 | // if the data of has no seasonality, directed use the raw_data into function S-H-ESD !!! 135 | for (int i = 0; i < numberOfObservations; ++i) { 136 | dataForSHESD[i] = series[i] - data_seasonal[i] - medianOfSeries; 137 | dataDecomp[i] = data_trend[i] + data_seasonal[i]; 138 | } 139 | // Maximum number of outliers that S-H-ESD can detect (e.g. 49% of data) 140 | int maxOutliers = (int)Math.round(numberOfObservations * config.getMaxAnoms()); 141 | if (maxOutliers == 0) 142 | throw new IllegalArgumentException("You have " + numberOfObservations + " observations in a period, which is too few. Set a higher value"); 143 | 144 | long[] anomsIdx = new long[maxOutliers]; 145 | double[] anomsSc = new double[maxOutliers]; 146 | int numAnoms = 0; 147 | 148 | OnlineNormalStatistics stat = new OnlineNormalStatistics(dataForSHESD); 149 | QuickMedians quickMedian1 = new QuickMedians(dataForSHESD); 150 | double dataMean = stat.getMean();//mean.evaluate(dataForSHESD); 151 | double dataMedian = quickMedian1.getMedian();//median.evaluate(dataForSHESD); 152 | // use mad replace the variance 153 | // double dataStd = Math.sqrt(stat.getPopulationVariance());//Math.sqrt(variance.evaluate(dataForSHESD)); 154 | double[] tempDataForMad = new double[numberOfObservations]; 155 | for (int i = 0; i < numberOfObservations; ++i) { 156 | tempDataForMad[i] = Math.abs(dataForSHESD[i] - dataMedian); 157 | } 158 | QuickMedians quickMedian2 = new QuickMedians(tempDataForMad); 159 | double dataStd = quickMedian2.getMedian(); 160 | 161 | if (Math.abs(dataStd) <= 1e-10) { 162 | //return null; 163 | throw new IllegalArgumentException("The variance of the series data is zero"); 164 | } 165 | 166 | double[] ares = new double[numberOfObservations]; 167 | for (int i = 0; i < numberOfObservations; ++i) { 168 | ares[i] = Math.abs(dataForSHESD[i] - dataMedian); 169 | ares[i] /= dataStd; 170 | } 171 | 172 | // here use std for the following iterative calculate datastd 173 | dataStd = Math.sqrt(stat.getPopulationVariance()); 174 | 175 | int[] aresOrder = getOrder(ares); 176 | int medianIndex = numberOfObservations / 2; 177 | int left = 0, right = numberOfObservations - 1; 178 | int currentLen = numberOfObservations, tempMaxIdx = 0; 179 | double R = 0.0, p = 0.0; 180 | for (int outlierIdx = 1; outlierIdx <= maxOutliers; ++outlierIdx) { 181 | p = 1.0 - config.getAlpha() / (2 * (numberOfObservations - outlierIdx + 1)); 182 | TDistribution tDistribution = new TDistribution(numberOfObservations - outlierIdx - 1); 183 | double t = tDistribution.inverseCumulativeProbability(p); 184 | double lambdaCritical = t * (numberOfObservations - outlierIdx) / Math.sqrt((numberOfObservations 185 | - outlierIdx - 1 + t * t) * (numberOfObservations - outlierIdx + 1)); 186 | if (left >= right) break; 187 | if (currentLen < 1) break; 188 | 189 | // remove the largest 190 | if (Math.abs(dataForSHESD[aresOrder[left]] - dataMedian) > Math.abs(dataForSHESD[aresOrder[right]] - dataMedian)) { 191 | tempMaxIdx = aresOrder[left]; 192 | ++left; 193 | ++medianIndex; 194 | } else { 195 | tempMaxIdx = aresOrder[right]; 196 | --right; 197 | --medianIndex; 198 | } 199 | // get the R 200 | R = Math.abs((dataForSHESD[tempMaxIdx] - dataMedian) / dataStd); 201 | // recalculate the dataMean and dataStd 202 | dataStd = Math.sqrt(((currentLen - 1) * (dataStd * dataStd + dataMean * dataMean) - dataForSHESD[tempMaxIdx] * dataForSHESD[tempMaxIdx] - 203 | ((currentLen - 1) * dataMean - dataForSHESD[tempMaxIdx]) * ((currentLen - 1) * dataMean - dataForSHESD[tempMaxIdx]) / 204 | (currentLen - 2)) / (currentLen - 2)); 205 | dataMean = (dataMean * currentLen - dataForSHESD[tempMaxIdx]) / (currentLen - 1); 206 | dataMedian = dataForSHESD[aresOrder[medianIndex]]; 207 | --currentLen; 208 | 209 | // record the index 210 | anomsIdx[outlierIdx - 1] = tempMaxIdx; 211 | anomsSc[outlierIdx - 1] = R; 212 | if (R < lambdaCritical * config.getAnomsThreshold() || Double.isNaN(dataStd) || Math.abs(dataStd) <= 1e-10) { 213 | break; 214 | } 215 | numAnoms = outlierIdx; 216 | } 217 | if (numAnoms > 0) { 218 | ArrayList map = new ArrayList(); 219 | for (int i = 0; i < numAnoms; ++i) { 220 | map.add(new Pair((int)anomsIdx[i], anomsSc[i])); 221 | } 222 | map.sort(new PairKeyComparator()); 223 | long[] idx = new long[numAnoms]; 224 | double[] anoms = new double[numAnoms]; 225 | for (int i = 0; i < numAnoms; ++i) { 226 | idx[i] = map.get(i).key; 227 | anoms[i] = map.get(i).value; 228 | } 229 | return new ANOMSResult(idx, anoms, dataDecomp); 230 | } 231 | else 232 | return null; 233 | } 234 | 235 | /** 236 | #' @name AnomalyDetectionTs 237 | #' @param timestamps & series Time series as a two column data frame where the first column consists of the 238 | #' timestamps and the second column consists of the observations. 239 | #' @param max_anoms Maximum number of anomalies that S-H-ESD will detect as a percentage of the 240 | #' data. 241 | #' @param numObsPerPeriod the numbers point in one period 242 | #' @param anoms_threshold use the threshold to filter the anoms. such as if anoms_threshold = 1.05, 243 | #' then we will filter the anoms that exceed the exceptional critical value 100%-105% 244 | #' @param alpha The level of statistical significance with which to accept or reject anomalies. 245 | */ 246 | public ANOMSResult anomalyDetection(long[] timestamps, double[] series) { 247 | // Sanity check all input parameters 248 | if (timestamps == null || timestamps.length < 1 || series == null || series.length < 1 || timestamps.length != series.length) 249 | throw new IllegalArgumentException("The data is empty or has no equal length."); 250 | if (config.getMaxAnoms() > 0.49) { 251 | throw new IllegalArgumentException("max_anoms must be less than 50% of the data points."); 252 | } else if (config.getMaxAnoms() <= 0) { 253 | throw new IllegalArgumentException("max_anoms must be positive."); 254 | } 255 | /** 256 | * Main analysis: perform S-H-ESD 257 | */ 258 | int numberOfObservations = series.length; 259 | if (config.getMaxAnoms() < 1.0 / numberOfObservations) 260 | config.setMaxAnoms(1.0 / numberOfObservations); 261 | removeMissingValuesByAveragingNeighbors(series); 262 | 263 | return detectAnoms(timestamps, series); 264 | } 265 | 266 | private STLResult removeSeasonality(long[] timestamps, double[] series, int seasonality) { 267 | STLDecomposition.Config config = new STLDecomposition.Config(); 268 | config.setNumObsPerPeriod(seasonality); 269 | config.setNumberOfDataPoints(timestamps.length); 270 | // if robust 271 | config.setNumberOfInnerLoopPasses(1); 272 | config.setNumberOfRobustnessIterations(15); 273 | 274 | STLDecomposition stl = new STLDecomposition(config); 275 | STLResult res = stl.decompose(timestamps, series); 276 | 277 | return res; 278 | } 279 | 280 | public static void removeMissingValuesByAveragingNeighbors(double[] arr) { 281 | for (int i = 0; i < arr.length; i++) { 282 | if (Double.isNaN(arr[i])) { 283 | double sum = 0.0; 284 | int count = 0; 285 | if (i - 1 >= 0 && !Double.isNaN(arr[i - 1])) { 286 | sum += arr[i - 1]; 287 | count++; 288 | } 289 | if (i + 1 < arr.length && !Double.isNaN(arr[i + 1])) { 290 | sum += arr[i + 1]; 291 | count++; 292 | } 293 | if (count != 0) 294 | arr[i] = sum / count; 295 | else 296 | arr[i] = 0.0; 297 | } 298 | } 299 | } 300 | 301 | class Pair { 302 | int key; 303 | double value; 304 | public Pair(int k, double v) { 305 | key = k; 306 | value = v; 307 | } 308 | } 309 | 310 | class PairKeyComparator implements Comparator { 311 | public int compare(Pair a, Pair b) { 312 | if (a.key != b.key) 313 | return a.key - b.key; 314 | return (a.value - b.value) > 0.0 ? 1 : -1; 315 | } 316 | } 317 | 318 | class PairValueComparator implements Comparator { 319 | public int compare(Pair a, Pair b) { 320 | if (a.value != b.value) { 321 | return (a.value - b.value) > 0 ? -1 : 1; 322 | } 323 | return b.key - a.key; 324 | } 325 | } 326 | 327 | private int[] getOrder(double[] data) { 328 | if (data == null || data.length < 1) 329 | return null; 330 | int len = data.length; 331 | ArrayList map = new ArrayList(); 332 | for (int i = 0; i < len; ++i) { 333 | map.add(new Pair(i, data[i])); 334 | } 335 | map.sort(new PairValueComparator()); 336 | int[] returnOrder = new int[len]; 337 | for (int i = 0; i < len; ++i) { 338 | returnOrder[i] = map.get(i).key; 339 | } 340 | return returnOrder; 341 | } 342 | } 343 | -------------------------------------------------------------------------------- /src/main/java/com/github/ruananswer/statistics/OnlineNormalStatistics.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.statistics; 2 | 3 | /** 4 | * Simple, fast, online normal statistics object using Welford's algorithm. 5 | */ 6 | public class OnlineNormalStatistics { 7 | 8 | private int _n = 0; 9 | private double _mean = 0; 10 | private double _sumSqDiff = 0; 11 | 12 | public OnlineNormalStatistics() { 13 | // do nothing 14 | } 15 | 16 | public OnlineNormalStatistics(double[] initialValues) { 17 | for (double d : initialValues) { 18 | addValue(d); 19 | } 20 | } 21 | 22 | public void addValue(double value) { 23 | if (Double.isNaN(value)) 24 | return; 25 | double old_mean = _mean; 26 | _n++; 27 | _mean += (value - old_mean) / _n; 28 | _sumSqDiff += (value - _mean) * (value - old_mean); 29 | } 30 | 31 | public int getN() { 32 | return _n; 33 | } 34 | 35 | public double getMean() { 36 | return (_n > 0) ? _mean : Double.NaN; 37 | } 38 | 39 | public double getSumSqDev() { 40 | return (_n > 0) ? _sumSqDiff : Double.NaN; 41 | } 42 | 43 | public double getVariance() { 44 | return (_n > 1) ? _sumSqDiff / (_n - 1) : Double.NaN; 45 | } 46 | 47 | public double getPopulationVariance() { 48 | return (_n > 0) ? _sumSqDiff / _n : Double.NaN; 49 | } 50 | 51 | public double getStandardScore(double value) { 52 | return (value - _mean) / Math.sqrt(getVariance()); 53 | } 54 | 55 | public void set_n(int _n) { 56 | this._n = _n; 57 | } 58 | 59 | public void set_mean(double _mean) { 60 | this._mean = _mean; 61 | } 62 | 63 | public void set_sumSqDiff(double _sumSqDiff) { 64 | this._sumSqDiff = _sumSqDiff; 65 | } 66 | 67 | public double getSumOfSq() { 68 | return _sumSqDiff + _n * _mean * _mean; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/com/github/ruananswer/statistics/QuickMedians.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.statistics; 2 | 3 | import java.util.Arrays; 4 | 5 | /** 6 | * Created by on 17-2-28. 7 | */ 8 | public class QuickMedians { 9 | private double[] values; 10 | private double _median = 0; 11 | private int _n = 0; 12 | 13 | public QuickMedians(double[] initialValues) { 14 | _n = initialValues.length; 15 | values = Arrays.copyOf(initialValues, _n); 16 | if (_n > 0) { 17 | if (_n % 2 == 0) 18 | _median = (quickSelectK(_n / 2 - 1) + quickSelectK(_n / 2)) / 2.0; 19 | else 20 | _median = quickSelectK(_n / 2); 21 | } 22 | else 23 | _median = Double.NaN; 24 | } 25 | 26 | public int partition(int low, int high) { 27 | int l = low, r = high, i = low - 1; 28 | double x = values[high]; 29 | for (int j = l; j < r; ++j) { 30 | if (values[j] <= x) { 31 | ++i; 32 | swap(i, j); 33 | } 34 | } 35 | swap(i + 1, r); 36 | return i + 1; 37 | } 38 | 39 | private void swap(int i, int j) { 40 | double tmp = values[i]; 41 | values[i] = values[j]; 42 | values[j] = tmp; 43 | } 44 | 45 | public double quickSelectK(int k) { 46 | int l = 0, r = _n - 1, idx = 0, len = 0; 47 | while (l < r) { 48 | idx = partition(l, r); 49 | len = idx - l + 1; 50 | if (len == k + 1) 51 | return values[idx]; 52 | else if (len < k + 1) { 53 | k = k - len; 54 | l = idx + 1; 55 | } 56 | else 57 | r = idx - 1; 58 | } 59 | return values[l]; 60 | } 61 | 62 | public double getMedian() { return +_median; } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/github/ruananswer/stl/STLDecomposition.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.stl; 2 | 3 | import java.util.ArrayList; 4 | 5 | /** 6 | * Implementation of STL: A Seasonal-Trend Decomposition Procedure based on Loess. 7 | *

8 | * Robert B. Cleveland et al., "STL: A Seasonal-Trend Decomposition Procedure based on Loess," 9 | * in Journal of Official Statistics Vol. 6 No. 1, 1990, pp. 3-73 10 | *

11 | *

12 | * Hafen, R. P. "Local regression models: Advancements, applications, and new methods." (2010). 13 | *

14 | * Created by on 16-4-14. 15 | */ 16 | public class STLDecomposition { 17 | private final Config config; 18 | 19 | public STLDecomposition(Config config) { 20 | config.check(); 21 | this.config = config; 22 | } 23 | 24 | public static class Config { 25 | /** The number of observations in each cycle of the seasonal component, n_p */ 26 | private int numObsPerPeriod = -1; 27 | /** s.window either the character string \code{"periodic"} or the span (in lags) of the loess window for seasonal extraction, 28 | * which should be odd. This has no default. */ 29 | private int sWindow = -1; 30 | /** s.degree degree of locally-fitted polynomial in seasonal extraction. Should be 0, 1, or 2. */ 31 | private int sDegree = 1; 32 | /** t.window the span (in lags) of the loess window for trend extraction, which should be odd. 33 | * If \code{NULL}, the default, \code{nextodd(ceiling((1.5*period) / (1-(1.5/s.window))))}, is taken.*/ 34 | private int tWindow = -1; 35 | /** t.degree degree of locally-fitted polynomial in trend extraction. Should be 0, 1, or 2. */ 36 | private int tDegree = 1; 37 | /** l.window the span (in lags) of the loess window of the low-pass filter used for each subseries. 38 | * Defaults to the smallest odd integer greater than or equal to \code{n.p} 39 | * which is recommended since it prevents competition between the trend and seasonal components. 40 | * If not an odd integer its given value is increased to the next odd one.*/ 41 | private int lWindow = -1; 42 | /** l.degree degree of locally-fitted polynomial for the subseries low-pass filter. Should be 0, 1, or 2. */ 43 | private int lDegree = 1; 44 | /** s.jump s.jump,t.jump,l.jump,fc.jump integers at least one to increase speed of the respective smoother. 45 | * Linear interpolation happens between every \code{*.jump}th value. */ 46 | private int sJump = -1; 47 | /** t.jump */ 48 | private int tJump = -1; 49 | /** l.jump */ 50 | private int lJump = -1; 51 | /** critfreq the critical frequency to use for automatic calculation of smoothing windows for the trend and high-pass filter. */ 52 | private double critFreq = 0.05; 53 | /** The number of passes through the inner loop, n_i */ 54 | private int numberOfInnerLoopPasses = 2; 55 | /** The number of robustness iterations of the outer loop, n_o */ 56 | private int numberOfRobustnessIterations = 1; 57 | /** sub.labels optional vector of length n.p that contains the labels of the subseries in their natural order (such as month name, day of week, etc.), 58 | * used for strip labels when plotting. All entries must be unique. */ 59 | private int[] subLabels = null; 60 | /** the number of series to decompose */ 61 | private int numberOfDataPoints = -1; 62 | 63 | public int getNumObsPerPeriod() { 64 | return numObsPerPeriod; 65 | } 66 | 67 | public void setNumObsPerPeriod(int numObsPerPeriod) { 68 | this.numObsPerPeriod = numObsPerPeriod; 69 | } 70 | 71 | public int getsWindow() { 72 | return sWindow; 73 | } 74 | 75 | public void setsWindow(int sWindow) { 76 | this.sWindow = sWindow; 77 | } 78 | 79 | public int getsDegree() { 80 | return sDegree; 81 | } 82 | 83 | public void setsDegree(int sDegree) { 84 | this.sDegree = sDegree; 85 | } 86 | 87 | public int gettWindow() { 88 | return tWindow; 89 | } 90 | 91 | public void settWindow(int tWindow) { 92 | this.tWindow = tWindow; 93 | } 94 | 95 | public int gettDegree() { 96 | return tDegree; 97 | } 98 | 99 | public void settDegree(int tDegree) { 100 | this.tDegree = tDegree; 101 | } 102 | 103 | public int getlWindow() { 104 | return lWindow; 105 | } 106 | 107 | public void setlWindow(int lWindow) { 108 | this.lWindow = lWindow; 109 | } 110 | 111 | public int getlDegree() { 112 | return lDegree; 113 | } 114 | 115 | public void setlDegree(int lDegree) { 116 | this.lDegree = lDegree; 117 | } 118 | 119 | public int getsJump() { 120 | return sJump; 121 | } 122 | 123 | public void setsJump(int sJump) { 124 | this.sJump = sJump; 125 | } 126 | 127 | public int gettJump() { 128 | return tJump; 129 | } 130 | 131 | public void settJump(int tJump) { 132 | this.tJump = tJump; 133 | } 134 | 135 | public int getlJump() { 136 | return lJump; 137 | } 138 | 139 | public void setlJump(int lJump) { 140 | this.lJump = lJump; 141 | } 142 | 143 | public double getCritFreq() { 144 | return critFreq; 145 | } 146 | 147 | public void setCritFreq(double critFreq) { 148 | this.critFreq = critFreq; 149 | } 150 | 151 | public int getNumberOfInnerLoopPasses() { 152 | return numberOfInnerLoopPasses; 153 | } 154 | 155 | public void setNumberOfInnerLoopPasses(int numberOfInnerLoopPasses) { 156 | this.numberOfInnerLoopPasses = numberOfInnerLoopPasses; 157 | } 158 | 159 | public int getNumberOfRobustnessIterations() { 160 | return numberOfRobustnessIterations; 161 | } 162 | 163 | public void setNumberOfRobustnessIterations(int numberOfRobustnessIterations) { 164 | this.numberOfRobustnessIterations = numberOfRobustnessIterations; 165 | } 166 | 167 | public int[] getSubLabels() { 168 | return subLabels; 169 | } 170 | 171 | public void setSubLabels(int[] subLabels) { 172 | this.subLabels = subLabels; 173 | } 174 | 175 | public int getNumberOfDataPoints() { 176 | return numberOfDataPoints; 177 | } 178 | 179 | public void setNumberOfDataPoints(int numberOfDataPoints) { 180 | this.numberOfDataPoints = numberOfDataPoints; 181 | } 182 | 183 | public Config() { 184 | } 185 | 186 | public void check() { 187 | checkPeriodicity(numObsPerPeriod, numberOfDataPoints); 188 | } 189 | 190 | private boolean checkPeriodicity(int numObsPerPeriod, int numberOfDataPoints) { 191 | if (numObsPerPeriod == -1) 192 | throw new IllegalArgumentException("Must specify periodicity of seasonal"); 193 | if (numObsPerPeriod < 4) { 194 | throw new IllegalArgumentException("Periodicity (numObsPerPeriod) must be >= 4"); 195 | } 196 | if (numberOfDataPoints <= 2 * numObsPerPeriod) { 197 | throw new IllegalArgumentException( 198 | "numberOfDataPoints(total length) must contain at least 2 * Periodicity (numObsPerPeriod) points"); 199 | } 200 | return true; 201 | } 202 | } 203 | 204 | /** 205 | * Decompose a time series into seasonal, trend and irregular components using \code{loess}, acronym STL. 206 | * A new implementation of STL. Allows for NA values, local quadratic smoothing, post-trend smoothing, and endpoint blending. 207 | * The usage is very similar to that of R's built-in \code{stl()}. 208 | * */ 209 | public STLResult decompose(long[] times, double[] series) { 210 | if (times == null || series == null || times.length != series.length) 211 | throw new IllegalArgumentException("times must be same length as time series"); 212 | int n = series.length; 213 | int numObsPerPeriod = config.getNumObsPerPeriod(); 214 | double[] trend = new double[n]; 215 | double[] seasonal = new double[n]; 216 | double[] remainder = new double[n]; 217 | 218 | for (int i = 0; i < n; i++) { 219 | trend[i] = 0.0; 220 | seasonal[i] = 0.0; 221 | remainder[i] = 0.0; 222 | } 223 | 224 | if (config.getlWindow() == -1) 225 | config.setlWindow(STLUtility.nextOdd(config.getNumObsPerPeriod())); 226 | else 227 | config.setlWindow(STLUtility.nextOdd(config.getlWindow())); 228 | 229 | 230 | if (config.getSubLabels() == null) { 231 | int[] idx = new int[n]; 232 | for (int i = 0; i < n; ++i) 233 | idx[i] = i % numObsPerPeriod + 1 ; 234 | config.setSubLabels(idx); 235 | } 236 | 237 | config.setsWindow(10 * n + 1); 238 | config.setsDegree(0); 239 | config.setsJump((int)Math.ceil(config.getsWindow() / 10.0)); 240 | 241 | if (config.gettWindow() == -1) { 242 | /** Or use t.window <- nextodd(ceiling(1.5 * n.p/(1 - 1.5 / s.window))) */ 243 | config.settWindow(STLUtility.getTWindow(config.gettDegree(), config.getsDegree(), config.getsWindow(), numObsPerPeriod, config.getCritFreq())); 244 | } 245 | 246 | if (config.getsJump() == -1) config.setsJump((int)Math.ceil((double)config.getsWindow() / 10.0)); 247 | if (config.gettJump() == -1) config.settJump((int)Math.ceil((double)config.gettWindow() / 10.0)); 248 | if (config.getlJump() == -1) config.setlJump((int)Math.ceil((double)config.getlWindow() / 10.0)); 249 | 250 | /** start and end indices for after adding in extra n.p before and after */ 251 | int startIdx = numObsPerPeriod, endIdx = n - 1 + numObsPerPeriod; 252 | 253 | /** cycleSubIndices will keep track of what part of the 254 | # seasonal each observation belongs to */ 255 | int[] cycleSubIndices = new int[n]; 256 | double[] weight = new double[n]; 257 | for (int i = 0; i < n; ++i) { 258 | cycleSubIndices[i] = i % numObsPerPeriod + 1; 259 | weight[i] = 1.0; 260 | } 261 | // subLabels !! 262 | int lenC = n + 2 * numObsPerPeriod; 263 | double[] C = new double[lenC]; 264 | double[] D = new double[n]; 265 | double[] detrend = new double[n]; 266 | int tempSize = (int)Math.ceil((double)n / (double)numObsPerPeriod) / 2; 267 | ArrayList cycleSub = new ArrayList(tempSize), subWeights = new ArrayList(tempSize); 268 | int[] cs1 = new int[numObsPerPeriod], cs2 = new int[numObsPerPeriod]; 269 | for (int i = 0; i < numObsPerPeriod; ++i) { 270 | cs1[i] = cycleSubIndices[i]; 271 | cs2[i] = cycleSubIndices[n - numObsPerPeriod + i]; 272 | } 273 | 274 | double[] ma3, L = new double[n]; 275 | int ljump = config.getlJump(), tjump = config.gettJump(); 276 | int lenLev = (int)Math.ceil((double)n / (double)ljump), lenTev = (int)Math.ceil((double)n / (double)tjump); 277 | int[] lEv = new int[lenLev], tEv = new int[lenTev]; 278 | double weightMeanAns = 0.0; 279 | 280 | for (int oIter = 1; oIter <= config.getNumberOfRobustnessIterations(); ++oIter) { 281 | for (int iIter = 1; iIter <= config.getNumberOfInnerLoopPasses(); ++iIter) { 282 | /** Step 1: detrending */ 283 | for (int i = 0; i < n; ++i) 284 | detrend[i] = series[i] - trend[i]; 285 | 286 | /** Step 2: smoothing of cycle-subseries */ 287 | for (int i = 0; i < numObsPerPeriod; ++i) { 288 | cycleSub.clear(); subWeights.clear(); 289 | for (int j = i; j < n; j += numObsPerPeriod) { 290 | if (cycleSubIndices[j] == i + 1) { 291 | cycleSub.add(detrend[j]); 292 | subWeights.add(weight[j]); 293 | } 294 | } 295 | /** 296 | C[c(cs1, cycleSubIndices, cs2) == i] <- rep(weighted.mean(cycleSub, 297 | w = w[cycleSubIndices == i], na.rm = TRUE), cycleSub.length + 2) 298 | */ 299 | weightMeanAns = weightMean(cycleSub, subWeights); 300 | for (int j = i; j < numObsPerPeriod; j += numObsPerPeriod) 301 | if (cs1[j] == i + 1) 302 | C[j] = weightMeanAns; 303 | for (int j = i; j < n; j += numObsPerPeriod) 304 | if (cycleSubIndices[j] == i + 1) 305 | C[j + numObsPerPeriod] = weightMeanAns; 306 | for (int j = 0; j < numObsPerPeriod; ++j) 307 | if (cs2[j] == i + 1) 308 | C[j + numObsPerPeriod + n] = weightMeanAns; 309 | } 310 | 311 | /** Step 3: Low-pass filtering of collection of all the cycle-subseries 312 | # moving averages*/ 313 | ma3 = STLUtility.cMa(C, numObsPerPeriod); 314 | 315 | for (int i = 0, j = 0; i < lenLev; ++i, j += ljump) 316 | lEv[i] = j + 1; 317 | if (lEv[lenLev - 1] != n) { 318 | int[] tempLev = new int[lenLev + 1]; 319 | System.arraycopy(lEv, 0, tempLev, 0, lenLev); 320 | tempLev[lenLev] = n; 321 | L = STLUtility.loessSTL(null, ma3, config.getlWindow(), config.getlDegree(), tempLev, weight, config.getlJump()); 322 | } else { 323 | L = STLUtility.loessSTL(null, ma3, config.getlWindow(), config.getlDegree(), lEv, weight, config.getlJump()); 324 | } 325 | 326 | /** Step 4: Detrend smoothed cycle-subseries */ 327 | /** Step 5: Deseasonalize */ 328 | for (int i = 0; i < n; ++i) { 329 | seasonal[i] = C[startIdx + i] - L[i]; 330 | D[i] = series[i] - seasonal[i]; 331 | } 332 | 333 | /** Step 6: Trend Smoothing */ 334 | for (int i = 0, j = 0; i < lenTev; ++i, j += tjump) 335 | tEv[i] = j + 1; 336 | if (tEv[lenTev - 1] != n) { 337 | int[] tempTev = new int[lenTev + 1]; 338 | System.arraycopy(tEv, 0, tempTev, 0, lenTev); 339 | tempTev[lenTev] = n; 340 | trend = STLUtility.loessSTL(null, D, config.gettWindow(), config.gettDegree(), tempTev, weight, config.gettJump()); 341 | } else { 342 | trend = STLUtility.loessSTL(null, D, config.gettWindow(), config.gettDegree(), tEv, weight, config.gettJump()); 343 | } 344 | } 345 | 346 | } 347 | // Calculate remainder 348 | for (int i = 0; i < n; i++) { 349 | remainder[i] = series[i] - trend[i] - seasonal[i]; 350 | } 351 | return new STLResult(trend, seasonal, remainder); 352 | } 353 | 354 | private double weightMean(ArrayList x, ArrayList w) { 355 | double sum = 0.0, sumW = 0.0; 356 | int len = x.size(); 357 | for (int i = 0; i < len; ++i) { 358 | if (!Double.isNaN(x.get(i))) { 359 | sum += (x.get(i) * w.get(i)); 360 | sumW += w.get(i); 361 | } 362 | } 363 | return sum / sumW; 364 | } 365 | } 366 | -------------------------------------------------------------------------------- /src/main/java/com/github/ruananswer/stl/STLResult.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.stl; 2 | 3 | /** 4 | * The STL decomposition of a time series. 5 | *

6 | * getData() == getTrend() + getSeasonal() + getRemainder() 7 | *

8 | */ 9 | public class STLResult { 10 | private final double[] trend; 11 | private final double[] seasonal; 12 | private final double[] remainder; 13 | 14 | public STLResult(double[] trend, double[] seasonal, 15 | double[] remainder) { 16 | this.trend = trend; 17 | this.seasonal = seasonal; 18 | this.remainder = remainder; 19 | } 20 | 21 | public double[] getTrend() { 22 | return trend; 23 | } 24 | 25 | public double[] getSeasonal() { 26 | return seasonal; 27 | } 28 | 29 | public double[] getRemainder() { 30 | return remainder; 31 | } 32 | } -------------------------------------------------------------------------------- /src/main/java/com/github/ruananswer/stl/STLUtility.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.stl; 2 | 3 | /** 4 | * Created by on 16-4-14. 5 | */ 6 | public class STLUtility { 7 | private STLUtility() {} 8 | 9 | public static int nextOdd(double x) { 10 | int xx = (int) Math.round(x); 11 | return (xx%2 == 0) ? (xx + 1) : xx; 12 | } 13 | 14 | public static boolean degreeCheck(int x) { 15 | return (x == 0 || x == 1 || x == 2); 16 | } 17 | 18 | public static int getTWindow(int tDg, int sDg, int nS, int nP, double omega) { 19 | if (tDg == 0) tDg = 1; 20 | if (sDg == 0) sDg = 1; 21 | 22 | double[][] coefsA = {{0.000103350651767650, 3.81086166990428e-6}, {-0.000216653946625270, 0.000708495976681902}}; 23 | double[][] coefsB = {{1.42686036792937, 2.24089552678906}, {-3.1503819836694, -3.30435316073732}, {5.07481807116087, 5.08099438760489}}; 24 | double[][] coefsC = {{1.66534145060448, 2.33114333880815}, {-3.87719398039131, -1.8314816166323}, {6.46952900183769, 1.85431548427732}}; 25 | // estimate critical frequency for seasonal 26 | double betac0 = coefsA[0][0] + coefsA[1][0] * omega; 27 | double betac1 = coefsB[0][0] + coefsB[1][0] * omega + coefsB[2][0] * omega * omega; 28 | double betac2 = coefsC[0][0] + coefsC[1][0] * omega + coefsC[2][0] * omega * omega; 29 | 30 | double fC = (1.0 - (betac0 + betac1 / nS + betac2 / (nS * nS))) / nP; 31 | 32 | double betat0 = coefsA[0][0] + coefsA[1][0] * omega; 33 | double betat1 = coefsB[0][0] + coefsB[1][0] * omega + coefsB[2][0] * omega * omega; 34 | double betat2 = coefsC[0][0] + coefsC[1][0] * omega + coefsC[2][0] * omega * omega; 35 | 36 | double betat00 = betat0 - fC; 37 | 38 | return nextOdd((-betat1 - Math.sqrt(betat1 * betat1 - 4.0 * betat00 * betat2)) / (2.0 * betat00)); 39 | } 40 | 41 | public static double[] cMa(double[] x, int nP) { 42 | int i, n = x.length; 43 | int nn = n - nP * 2; 44 | int nn_p = nP; 45 | double ma_tmp = 0.0; 46 | 47 | double[] ans = new double[n - 2 * nn_p]; 48 | double[] ma = new double[nn + nn_p + 1]; 49 | double[] ma2 = new double[nn + 2]; 50 | double[] ma3 = new double[nn]; 51 | 52 | ma_tmp = 0; 53 | for(i = 0; i < nn_p; ++i) { 54 | ma_tmp = ma_tmp + x[i]; 55 | } 56 | ma[0] = ma_tmp / nn_p; 57 | for(i = nn_p; i < nn + 2 * nn_p; ++i) { 58 | ma_tmp = ma_tmp - x[i - nn_p] + x[i]; 59 | ma[i - nn_p + 1] = ma_tmp / nn_p; 60 | } 61 | 62 | ma_tmp = 0; 63 | for(i = 0; i < nn_p; ++i) { 64 | ma_tmp = ma_tmp + ma[i]; 65 | } 66 | ma2[0] = ma_tmp / nn_p; 67 | 68 | for(i = nn_p; i < nn + nn_p + 1; ++i) { 69 | ma_tmp = ma_tmp - ma[i - nn_p] + ma[i]; 70 | ma2[i - nn_p + 1] = ma_tmp / nn_p; 71 | } 72 | 73 | ma_tmp = 0; 74 | 75 | for(i = 0; i < 3; ++i) { 76 | ma_tmp = ma_tmp + ma2[i]; 77 | } 78 | ans[0] = ma_tmp / 3; 79 | 80 | for(i = 3; i < nn + 2; ++i) { 81 | ma_tmp = ma_tmp - ma2[i - 3] + ma2[i]; 82 | ans[i - 2] = ma_tmp / 3; 83 | } 84 | return ans; 85 | } 86 | 87 | public static double[] loessSTL(int[] x, double[] y, int span, int degree, int[] m, double[] weights, int jump) { 88 | int n = y.length; 89 | if (x == null) { 90 | x = new int[n]; 91 | for (int i = 0; i < n; ++i) 92 | x[i] = i + 1; 93 | } 94 | if (weights == null) { 95 | weights = new double[n]; 96 | for (int i = 0; i < n; ++i) 97 | weights[i] = 1.0; 98 | } 99 | int lenM = m.length; 100 | 101 | if (span % 2 == 0) 102 | span += 1; 103 | int s2 = (span + 1) / 2; 104 | int[] lIdx = new int[lenM]; 105 | int[] rIdx = new int[lenM]; 106 | if (n < span) { 107 | for (int i = 0; i < lenM; ++i) { 108 | lIdx[i] = 1; 109 | rIdx[i] = n; 110 | } 111 | } else { 112 | int countSmallThanS2 = 0, countLargeThanS2 = 0, countLargeThanNMinusS2 = 0; 113 | for (int i = 0; i < lenM; ++i) { 114 | if (m[i] < s2) 115 | ++countSmallThanS2; 116 | else if (m[i] >= s2 && m[i] <= n - s2) 117 | ++countLargeThanS2; 118 | else 119 | ++countLargeThanNMinusS2; 120 | } 121 | int i = 0; 122 | for (; i < countSmallThanS2; ++i) 123 | lIdx[i] = 0; 124 | for (; i < countSmallThanS2 + countLargeThanS2; ++i) 125 | lIdx[i] = m[i] - s2; 126 | for (; i < countSmallThanS2 + countLargeThanS2 + countLargeThanNMinusS2; ++i) 127 | lIdx[i] = n - span; 128 | for (i = 0; i < lenM; ++i) 129 | rIdx[i] = lIdx[i] + span - 1; 130 | } 131 | /** 132 | * aa <- abs(m - x[l_idx]) 133 | bb <- abs(x[r_idx] - m) 134 | max_dist <- ifelse(aa > bb, aa, bb) 135 | */ 136 | int[] maxDist = new int[lenM]; 137 | int aa = 0, bb = 0; 138 | for (int i = 0; i < lenM; ++i) { 139 | aa = Math.abs(m[i] - x[lIdx[i]]); 140 | bb = Math.abs(x[rIdx[i]] - m[i]); 141 | maxDist[i] = (aa > bb) ? aa : bb; 142 | } 143 | 144 | if (span > n) { 145 | for (int i = 0; i < maxDist.length; ++i) { 146 | maxDist[i] = maxDist[i] + (span - n) / 2; 147 | } 148 | } 149 | twoArray out = cLoess(x, y, degree, span, weights, m, lIdx, maxDist); 150 | 151 | // do interpolation 152 | double[] res = new double[out.result.length]; 153 | System.arraycopy(out.result, 0, res, 0, out.result.length); 154 | double[] at = new double[n]; 155 | for (int i = 0; i < n; ++i) 156 | at[i] = i + 1; 157 | if (jump > 1) { 158 | res = cInterp(m, out.result, out.slopes, at); 159 | } 160 | return res; 161 | } 162 | 163 | public static class twoArray { 164 | public double[] result, slopes; 165 | public twoArray(double[] re, double[] sl) { 166 | result = re; 167 | slopes = sl; 168 | } 169 | } 170 | 171 | private static twoArray cLoess(int[] xx, double[] yy, int degree, int span, double[] ww, int[] m, int[] l_idx, int[] max_dist) { 172 | int span2, span3, offset; 173 | int i, j; 174 | double r, tmp1, tmp2; 175 | 176 | int n = xx.length; 177 | int n_m = m.length; 178 | 179 | double[] x = new double[span]; 180 | double[] w = new double[span]; 181 | double[] xw = new double[span]; 182 | double[] x2w = new double[span]; 183 | double[] x3w = new double[span]; 184 | 185 | double[] result = new double[n_m]; 186 | double[] slopes = new double[n_m]; 187 | 188 | // variables for storing determinant intermediate values 189 | double a, b, c, d, e, a1, b1, c1, a2, b2, c2, det; 190 | 191 | span3 = span; 192 | if(span > n) { 193 | span = n; 194 | } 195 | 196 | span2 = (span - 1) / 2; 197 | 198 | // want to start storing results at index 0, corresponding to the lowest m 199 | offset = m[0]; 200 | 201 | // loop through all values of m 202 | for(i = 0; i < n_m; i++) { 203 | a = 0.0; 204 | 205 | // get weights, x, and a 206 | for(j = 0; j < span; j++) { 207 | w[j] = 0.0; 208 | x[j] = xx[l_idx[i] + j] - (double)m[i]; 209 | 210 | // r = std::fabs(x[j]); 211 | r = (x[j] > 0) ? x[j] : -x[j]; 212 | // tricube 213 | tmp1 = r / max_dist[i]; 214 | // manual multiplication is much faster than pow() 215 | tmp2 = 1.0 - tmp1 * tmp1 * tmp1; 216 | w[j] = tmp2 * tmp2 * tmp2; 217 | 218 | // scale by user-defined weights 219 | w[j] = w[j] * ww[l_idx[i] + j]; 220 | 221 | a = a + w[j]; 222 | } 223 | 224 | if(degree == 0) { 225 | // TODO: make sure denominator is not 0 226 | a1 = 1 / a; 227 | for(j = 0; j < span; j++) { 228 | // l_i[j] = w[j] * a1; 229 | result[i] = result[i] + w[j] * a1 * yy[l_idx[i] + j]; 230 | } 231 | } else { 232 | // get xw, x2w, b, c for degree 1 or 2 233 | b = 0.0; 234 | c = 0.0; 235 | for(j = 0; j < span; j++) { 236 | xw[j] = x[j] * w[j]; 237 | x2w[j] = x[j] * xw[j]; 238 | b = b + xw[j]; 239 | c = c + x2w[j]; 240 | } 241 | if(degree == 1) { 242 | // TODO: make sure denominator is not 0 243 | det = 1 / (a * c - b * b); 244 | a1 = c * det; 245 | b1 = -b * det; 246 | c1 = a * det; 247 | for(j=0; j < span; j++) { 248 | result[i] = result[i] + (w[j] * a1 + xw[j] * b1) * yy[l_idx[i] + j]; 249 | slopes[i] = slopes[i] + (w[j] * b1 + xw[j] * c1) * yy[l_idx[i] + j]; 250 | } 251 | } else { 252 | // TODO: make sure degree > 2 cannot be specified (and < 0 for that matter) 253 | // get x3w, d, and e for degree 2 254 | d = 0.0; 255 | e = 0.0; 256 | for(j = 0; j < span; j++) { 257 | x3w[j] = x[j] * x2w[j]; 258 | d = d + x3w[j]; 259 | e = e + x3w[j] * x[j]; 260 | } 261 | a1 = e * c - d * d; 262 | b1 = c * d - e * b; 263 | c1 = b * d - c * c; 264 | a2 = c * d - e * b; 265 | b2 = e * a - c * c; 266 | c2 = b * c - d * a; 267 | // TODO: make sure denominator is not 0 268 | det = 1 / (a * a1 + b * b1 + c * c1); 269 | a1 = a1 * det; 270 | b1 = b1 * det; 271 | c1 = c1 * det; 272 | a2 = a2 * det; 273 | b2 = b2 * det; 274 | c2 = c2 * det; 275 | for(j=0; j < span; j++) { 276 | result[i] = result[i] + (w[j] * a1 + xw[j] * b1 + x2w[j] * c1) * yy[l_idx[i] + j]; 277 | slopes[i] = slopes[i] + (w[j] * a2 + xw[j] * b2 + x2w[j] * c2) * yy[l_idx[i] + j]; 278 | } 279 | } 280 | } 281 | } 282 | return new twoArray(result, slopes); 283 | } 284 | 285 | private static double[] cInterp(int[] m, double[] fits, double[] slopes, double[] at) { 286 | int i, j; 287 | double u, h, u2, u3; 288 | 289 | int n_at = at.length; 290 | double[] ans = new double[n_at]; 291 | 292 | j = 0; // index of leftmost vertex 293 | for(i = 0; i < n_at; ++i) { 294 | if(at[i] > m[j + 1]) j++; 295 | h = (m[j + 1] - m[j]); 296 | u = (at[i] - m[j]) / h; 297 | u2 = u * u; 298 | u3 = u2 * u; 299 | ans[i] = (2 * u3 - 3 * u2 + 1) * fits[j] + 300 | (3 * u2 - 2 * u3) * fits[j + 1] + 301 | (u3 - 2 * u2 + u) * slopes[j] * h + 302 | (u3 - u2) * slopes[j + 1] * h; 303 | } 304 | return ans; 305 | } 306 | 307 | } 308 | -------------------------------------------------------------------------------- /src/test/java/com/github/ruananswer/anomaly/AnomalyDetectionTest.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.anomaly; 2 | 3 | import com.github.ruananswer.testUtility.TestCommon; 4 | import org.testng.Assert; 5 | import org.testng.annotations.BeforeClass; 6 | import org.testng.annotations.DataProvider; 7 | import org.testng.annotations.Test; 8 | 9 | import java.io.IOException; 10 | import java.text.ParseException; 11 | import java.util.ArrayList; 12 | import java.util.Collections; 13 | import java.util.List; 14 | 15 | /** 16 | * Created by ruan on 16-4-7. 17 | */ 18 | public class AnomalyDetectionTest { 19 | private ArrayList fileStlNames = new ArrayList(); 20 | private ArrayList fileAnomsNames = new ArrayList(); 21 | private static final double EqualPercent = 0.95; 22 | 23 | @BeforeClass 24 | public void readTestSets() { 25 | String[] files = TestCommon.readTestSets(" anoms.csv"); 26 | for (String a : files) 27 | fileAnomsNames.add(a); 28 | files = TestCommon.readTestSets(" stl.csv"); 29 | for (String a : files) 30 | fileStlNames.add(a); 31 | } 32 | 33 | @DataProvider 34 | public Object[][] DateProviderFromFile() throws IOException, ParseException { 35 | List data = new ArrayList(); 36 | Collections.sort(fileAnomsNames); 37 | Collections.sort(fileStlNames); 38 | if (fileAnomsNames == null || fileStlNames == null) return null; 39 | Assert.assertEquals(fileAnomsNames.size(), fileStlNames.size()); 40 | String fileStl = "", fileAnoms = ""; 41 | for (int fileIndex = 0; fileIndex < fileAnomsNames.size(); ++fileIndex) { 42 | fileStl = fileStlNames.get(fileIndex); 43 | fileAnoms = fileAnomsNames.get(fileIndex); 44 | String[] lines = TestCommon.getResourceAsString(fileAnoms).split("\n"); 45 | int numAnoms = lines.length; 46 | int[] anomsIndex = new int[numAnoms - 1]; 47 | double[] anomsScore = new double[numAnoms - 1]; 48 | double maxAnoms = 0.015, alpha = 0.05; 49 | String[] values = lines[0].split(","); 50 | if (values.length > 3) { 51 | maxAnoms = Double.parseDouble(values[3]); 52 | alpha = Double.parseDouble(values[4]); 53 | } 54 | for (int i = 1; i < numAnoms; ++i) { 55 | values = lines[i].split(","); 56 | anomsIndex[i - 1] = Integer.parseInt(values[1]); 57 | anomsScore[i - 1] = Double.parseDouble(values[2]); 58 | } 59 | 60 | lines = TestCommon.getResourceAsString(fileStl).split("\n"); 61 | int numData = lines.length; 62 | int seasonality = Integer.parseInt(lines[0].split(",")[0]); 63 | long[] timestamps = new long[numData - 1]; 64 | double[] series = new double[numData - 1]; 65 | for (int i = 1; i < numData; ++i) { 66 | values = lines[i].split(","); 67 | if (values[0].contains("-")) 68 | timestamps[i - 1] = (int) new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(values[0]).getTime(); 69 | else 70 | timestamps[i - 1] = Integer.parseInt(values[0]); 71 | String value = values[1]; 72 | if (value.equals("NaN")) { 73 | series[i - 1] = Double.NaN; 74 | } else { 75 | series[i - 1] = Double.valueOf(value); 76 | } 77 | } 78 | data.add(new Object[]{fileAnoms, seasonality, maxAnoms, alpha, timestamps, series, anomsIndex, anomsScore}); 79 | } 80 | return data.toArray(new Object[][]{}); 81 | } 82 | 83 | @Test(dataProvider = "DateProviderFromFile") 84 | public void testFunctionAnomalyDetection(String filename, int seasonality, double maxAnoms, double alpha, long[] timestamps, 85 | double[] series, int[] anomsIndex, double[] anomsScore) throws IOException { 86 | System.out.print(filename); 87 | 88 | DetectAnoms.Config config = new DetectAnoms.Config(); 89 | config.setMaxAnoms(maxAnoms); 90 | config.setNumObsPerPeriod(seasonality); 91 | config.setAnomsThreshold(1.0); 92 | config.setAlpha(alpha); 93 | DetectAnoms detectAnoms = new DetectAnoms(config); 94 | 95 | long lStartTime = System.nanoTime(); 96 | DetectAnoms.ANOMSResult result = detectAnoms.anomalyDetection(timestamps, series); 97 | long lEndTime = System.nanoTime(); 98 | long difference = lEndTime - lStartTime; // check different 99 | System.out.println(" time: " + difference); 100 | 101 | testAnomsSimularity(result, anomsIndex, anomsScore); 102 | } 103 | 104 | private void testAnomsSimularity(DetectAnoms.ANOMSResult res, int[] anomsIndex_r, double[] score_r) { 105 | boolean res_test = (res == null && anomsIndex_r.length != 0); 106 | Assert.assertEquals(res_test, false); 107 | if (res == null && anomsIndex_r.length == 0) 108 | return; 109 | long[] resIndex = res.getAnomsIndex(); 110 | int equalCount = 0; 111 | for (int i = 0, j = 0; i < resIndex.length && j < anomsIndex_r.length;) { 112 | if (resIndex[i] + 1 == anomsIndex_r[j]) { 113 | ++equalCount; 114 | ++i; 115 | ++j; 116 | } 117 | else if (resIndex[i] + 1 > anomsIndex_r[j]) 118 | ++j; 119 | else 120 | ++i; 121 | } 122 | if (resIndex.length > 0) { 123 | boolean equal_test = (double) equalCount / (double) Math.min(anomsIndex_r.length, resIndex.length) > this.EqualPercent; 124 | Assert.assertEquals(equal_test, true); 125 | } 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /src/test/java/com/github/ruananswer/statistics/QuickMedianTest.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.statistics; 2 | 3 | import org.testng.Assert; 4 | import org.testng.annotations.Test; 5 | 6 | import java.util.Arrays; 7 | 8 | /** 9 | * Created by ruan on 16-4-22. 10 | */ 11 | public class QuickMedianTest { 12 | @Test 13 | public void simpleArray() { 14 | double[] testArray = { 15 | 2, 1, 6, 5, 4, 3 16 | }; 17 | testCorrectness(testArray); 18 | } 19 | 20 | @Test 21 | public void bigArray() { 22 | double[] testArray = new double[1000]; 23 | for (int i = 0; i < testArray.length; i++) { 24 | testArray[i] = Math.random(); 25 | } 26 | testCorrectness(testArray); 27 | } 28 | 29 | private void testCorrectness(double[] arr) { 30 | QuickMedians stat = new QuickMedians(arr); 31 | 32 | Arrays.sort(arr); 33 | double median = 0; 34 | if (arr.length % 2 == 0) 35 | median = (arr[arr.length / 2 - 1] + arr[arr.length / 2]) / 2.0; 36 | else 37 | median = arr[arr.length / 2]; 38 | Assert.assertEquals(stat.getMedian(), median, 0.001); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/test/java/com/github/ruananswer/stl/PlotTest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package com.github.ruananswer.stl; 15 | 16 | import com.fasterxml.jackson.databind.JsonNode; 17 | import com.fasterxml.jackson.databind.ObjectMapper; 18 | import org.jfree.data.time.Hour; 19 | import org.testng.Assert; 20 | import org.testng.annotations.Test; 21 | 22 | import java.io.File; 23 | 24 | public class PlotTest { 25 | 26 | @Test 27 | public void testPlot() throws Exception { 28 | final ObjectMapper objectMapper = new ObjectMapper(); 29 | final JsonNode tree = objectMapper.readTree(new File(this.getClass().getResource("/sample-timeseries.json").getFile())); 30 | final int n = tree.get("times").size(); 31 | final long[] ts = new long[n]; 32 | final double[] dts = new double[n]; 33 | final double[] ys = new double[n]; 34 | 35 | for (int i = 0; i < n; i++) { 36 | ts[i] = tree.get("times").get(i).asLong(); 37 | dts[i] = ts[i]; 38 | ys[i] = tree.get("series").get(i).asDouble(); 39 | } 40 | 41 | final STLDecomposition.Config config = new STLDecomposition.Config(); 42 | config.setNumberOfDataPoints(n); 43 | config.setNumObsPerPeriod(12); 44 | 45 | final STLDecomposition stl = new STLDecomposition(config); 46 | final STLResult res = stl.decompose(ts, ys); 47 | 48 | final File output = new File("seasonal.png"); 49 | final File hourly = new File("stl-hourly.png"); 50 | 51 | output.deleteOnExit(); 52 | hourly.deleteOnExit(); 53 | 54 | StlPlotter.plot(res, ys, dts, "New Title", Hour.class, hourly); 55 | StlPlotter.plot(res, ys, dts, output); 56 | StlPlotter.plot(res, ys, dts); 57 | 58 | Assert.assertTrue(output.exists()); 59 | Assert.assertTrue(hourly.exists()); 60 | 61 | final File exists = new File("stl-decomposition.png"); 62 | exists.deleteOnExit(); 63 | 64 | StlPlotter.plot(res, ys, dts, "Test Title"); 65 | 66 | Assert.assertTrue(exists.exists()); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/test/java/com/github/ruananswer/stl/STLTest.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.stl; 2 | 3 | import com.github.ruananswer.testUtility.TestCommon; 4 | import org.apache.commons.math3.stat.correlation.PearsonsCorrelation; 5 | import org.apache.commons.math3.stat.inference.TTest; 6 | import org.testng.Assert; 7 | import org.testng.annotations.BeforeClass; 8 | import org.testng.annotations.DataProvider; 9 | import org.testng.annotations.Test; 10 | 11 | import java.io.IOException; 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | /** 16 | * Created by ruan on 16-4-6. 17 | */ 18 | 19 | public class STLTest { 20 | private ArrayList filenames = new ArrayList(); 21 | private static final double SimularityPearsonThreshold = 0.8; 22 | 23 | @BeforeClass 24 | public void readTestSets() { 25 | String[] files = TestCommon.readTestSets(" stl.csv"); 26 | for (String a : files) 27 | filenames.add(a); 28 | } 29 | 30 | @DataProvider 31 | public Object[][] DateProviderFromFile() throws IOException { 32 | List data = new ArrayList(); 33 | for (String filename : filenames) { 34 | String[] lines = TestCommon.getResourceAsString(filename).split("\n"); 35 | int numData = lines.length; 36 | int seasonality = Integer.parseInt(lines[0].split(",")[0]); 37 | long[] timestamps = new long[numData - 1]; 38 | double[] series = new double[numData - 1]; 39 | double[] trend_r = new double[numData - 1]; 40 | double[] residual_r = new double[numData - 1]; 41 | double[] seasonal_r = new double[numData - 1]; 42 | for (int i = 1; i < numData; ++i) { 43 | String[] values = lines[i].split(","); 44 | timestamps[i - 1] = Integer.parseInt(values[0]); 45 | String value = values[1]; 46 | if (value.equals("NA")) { 47 | series[i - 1] = Double.NaN; 48 | } else { 49 | series[i - 1] = Double.valueOf(value); 50 | } 51 | trend_r[i - 1] = Double.valueOf(values[2]); 52 | seasonal_r[i - 1] = Double.valueOf(values[3]); 53 | residual_r[i - 1] = Double.valueOf(values[4]); 54 | } 55 | TestCommon.removeMissingValuesByAveragingNeighbors(series); 56 | numData -= 1; 57 | data.add(new Object[] {filename, numData, seasonality, timestamps, series, trend_r, residual_r, seasonal_r}); 58 | } 59 | return data.toArray(new Object[][]{}); 60 | } 61 | 62 | @Test 63 | public void stlTestNumber() { 64 | Assert.assertEquals(filenames.size(), 22); 65 | } 66 | 67 | @Test(dataProvider = "DateProviderFromFile") 68 | public void testFunctionSTL(String filename, int numData, int seasonality, long[] timestamps, double[] series, double[] trend_r, double[] residual_r, double[] seasonal_r) 69 | throws IOException { 70 | System.out.print(filename); 71 | 72 | STLDecomposition.Config config = new STLDecomposition.Config(); 73 | config.setNumberOfDataPoints(numData); 74 | config.setNumObsPerPeriod(seasonality); 75 | // if robust 76 | config.setNumberOfInnerLoopPasses(1); 77 | config.setNumberOfRobustnessIterations(15); 78 | 79 | STLDecomposition stl = new STLDecomposition(config); 80 | 81 | long lStartTime = System.nanoTime(); 82 | STLResult res = stl.decompose(timestamps, series); 83 | long lEndTime = System.nanoTime(); 84 | long difference = lEndTime - lStartTime; // check different 85 | System.out.println(" time: " + difference); 86 | 87 | calSimularity(res, seasonality, trend_r, residual_r, seasonal_r); 88 | } 89 | 90 | private void calSimularity(STLResult res, int seasonality, double[] trend_r, double[] residual_r, double[] seasonal_r) throws IOException { 91 | double[] data_trend = res.getTrend(); 92 | double[] data_remainder = res.getRemainder(); 93 | double[] data_seasonal = res.getSeasonal(); 94 | double[] data_seasonal_check = new double[seasonality]; 95 | double[] seasonal_r_check = new double[seasonality]; 96 | 97 | double trend_pearson = CheckTimeSeriesSimularityPearson(trend_r, data_trend); 98 | double remainder_pearson = CheckTimeSeriesSimularityPearson(residual_r, data_remainder); 99 | double seasonal_pearson = CheckTimeSeriesSimularityPearson(seasonal_r, data_seasonal); 100 | boolean trend_pearson_test = trend_pearson > SimularityPearsonThreshold; 101 | boolean remainder_pearson_test = remainder_pearson > SimularityPearsonThreshold; 102 | boolean seasonal_pearson_test = seasonal_pearson > SimularityPearsonThreshold; 103 | System.out.println(trend_pearson + "," + remainder_pearson + "," + seasonal_pearson); 104 | Assert.assertEquals(trend_pearson_test, true); 105 | Assert.assertEquals(remainder_pearson_test, true); 106 | Assert.assertEquals(seasonal_pearson_test, true); 107 | boolean reject_null = checkTimeSeriesSimularityTtest(seasonal_r_check, data_seasonal_check); 108 | Assert.assertEquals(reject_null, false); 109 | } 110 | 111 | private boolean checkTimeSeriesSimularityTtest(double[] r_generated, double[] java_generated) { 112 | TTest t_test_obj = new TTest(); 113 | // Performs a paired t-test evaluating the null hypothesis that the mean of the paired 114 | // differences between sample1 115 | // and sample2 is 0 in favor of the two-sided alternative that the mean paired difference is not 116 | // equal to 0, 117 | // with significance level 0.05. 118 | double p_value = t_test_obj.tTest(r_generated, java_generated); 119 | boolean reject_null_hyphothesis = (p_value < 0.05); 120 | return reject_null_hyphothesis; 121 | } 122 | 123 | private double CheckTimeSeriesSimularityPearson(double[] r_generated, double[] java_generated) { 124 | PearsonsCorrelation pearson = new PearsonsCorrelation(); 125 | double pearson_correlation = pearson.correlation(r_generated, java_generated); 126 | return pearson_correlation; 127 | 128 | } 129 | 130 | } -------------------------------------------------------------------------------- /src/test/java/com/github/ruananswer/stl/STLUtilityTest.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.stl; 2 | 3 | import com.github.ruananswer.testUtility.TestCommon; 4 | import org.junit.Test; 5 | import org.testng.Assert; 6 | 7 | import java.io.IOException; 8 | 9 | /** 10 | * Created by ruan on 16-4-14. 11 | */ 12 | public class STLUtilityTest { 13 | @Test 14 | public void TestLoess() throws IOException{ 15 | // test loessSTL 16 | int n = 100; 17 | int[] x = new int[n]; 18 | double[] y = new double[n]; 19 | int[] m = new int[n]; 20 | for (int i = 0; i < n; ++i) { 21 | x[i] = i + 1; 22 | m[i] = i + 1; 23 | } 24 | String[] lines = TestCommon.getResourceAsString("testLoess.csv").split("\n"); 25 | int numData = lines.length; 26 | for (int i = 1; i < numData; i++) { 27 | String[] values = lines[i].split(","); 28 | String value = values[1]; 29 | if (value.equals("NA")) { 30 | y[i - 1] = Double.NaN; 31 | } else { 32 | y[i - 1] = Double.valueOf(value); 33 | } 34 | } 35 | double[] res = STLUtility.loessSTL(x, y, 31, 0, m, null, (int)Math.ceil(31 / 10)); 36 | Assert.assertEquals(res.length, y.length); 37 | return; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/test/java/com/github/ruananswer/stl/StlPlotter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | package com.github.ruananswer.stl; 15 | 16 | import org.jfree.chart.ChartPanel; 17 | import org.jfree.chart.ChartUtilities; 18 | import org.jfree.chart.JFreeChart; 19 | import org.jfree.chart.axis.DateAxis; 20 | import org.jfree.chart.axis.NumberAxis; 21 | import org.jfree.chart.plot.CombinedDomainXYPlot; 22 | import org.jfree.chart.plot.PlotOrientation; 23 | import org.jfree.chart.plot.XYPlot; 24 | import org.jfree.chart.renderer.xy.ClusteredXYBarRenderer; 25 | import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; 26 | import org.jfree.data.time.Minute; 27 | import org.jfree.data.time.RegularTimePeriod; 28 | import org.jfree.data.time.TimeSeries; 29 | import org.jfree.data.time.TimeSeriesCollection; 30 | import org.jfree.data.xy.XYDataset; 31 | import org.jfree.ui.ApplicationFrame; 32 | import org.jfree.ui.RefineryUtilities; 33 | 34 | import java.awt.*; 35 | import java.io.BufferedReader; 36 | import java.io.File; 37 | import java.io.IOException; 38 | import java.io.InputStreamReader; 39 | import java.util.ArrayList; 40 | import java.util.Date; 41 | import java.util.List; 42 | import java.util.TimeZone; 43 | 44 | public class StlPlotter { 45 | 46 | 47 | static void plot(final STLResult stlResult, double[] series, double[] times) throws IOException { 48 | StlPlotter.plot(stlResult, series, times, "Seasonal Decomposition"); 49 | } 50 | 51 | static void plot(final STLResult stlResult, double[] series, double[] times, final File save) throws IOException { 52 | StlPlotter.plot(stlResult, series, times, "Seasonal Decomposition", Minute.class, save); 53 | } 54 | 55 | static void plot(final STLResult stlResult, double[] series, double[] times, final String title) throws IOException { 56 | StlPlotter.plot(stlResult, series, times, title, Minute.class, new File("stl-decomposition.png")); 57 | } 58 | 59 | static void plot(final STLResult stlResult, double[] series, double[] times, final String title, final Class timePeriod, final File save) throws IOException { 60 | final ResultsPlot plot = new ResultsPlot(stlResult, series, times, title, timePeriod); 61 | ChartUtilities.saveChartAsPNG(save, plot.chart, 800, 600); 62 | } 63 | 64 | static void plotOnScreen(final STLResult stlResult, double[] series, double[] times, final String title) { 65 | final ResultsPlot plot = new ResultsPlot(stlResult, series, times, title, Minute.class); 66 | plot.pack(); 67 | RefineryUtilities.centerFrameOnScreen(plot); 68 | plot.setVisible(true); 69 | } 70 | 71 | private static class ResultsPlot extends ApplicationFrame { 72 | 73 | private static final long serialVersionUID = 1L; 74 | private final JFreeChart chart; 75 | private final ChartPanel chartPanel; 76 | private final String title; 77 | 78 | private final Class timePeriod; 79 | private final double[] series; 80 | private final double[] seasonal; 81 | private final double[] trend; 82 | private final double[] times; 83 | private final double[] remainder; 84 | 85 | ResultsPlot(final STLResult stlResults, double[] series, double[] times, final String title, final Class timePeriod) { 86 | super(title); 87 | 88 | this.series = series; 89 | this.seasonal = stlResults.getSeasonal(); 90 | this.trend = stlResults.getTrend(); 91 | this.times = times; 92 | this.remainder = stlResults.getRemainder(); 93 | 94 | this.timePeriod = timePeriod; 95 | this.title = title; 96 | 97 | this.chart = createChart(); 98 | this.chart.removeLegend(); 99 | 100 | this.chartPanel = new ChartPanel(chart, true, true, true, true, true); 101 | this.chartPanel.setPreferredSize(new Dimension(1000, 500)); 102 | 103 | setContentPane(this.chartPanel); 104 | } 105 | 106 | private JFreeChart createChart() { 107 | 108 | final CombinedDomainXYPlot plot = new CombinedDomainXYPlot(new DateAxis("Time")); 109 | final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, false); 110 | final ClusteredXYBarRenderer barRenderer = new ClusteredXYBarRenderer(); 111 | final GradientPaint black = new GradientPaint(0.0f, 0.0f, Color.black, 0.0f, 0.0f, Color.black); 112 | 113 | final TimeSeries seriests = new TimeSeries("Series"); 114 | final TimeSeries seasonalts = new TimeSeries("Seasonal"); 115 | final TimeSeries trendts = new TimeSeries("Trend"); 116 | final TimeSeries remainderts = new TimeSeries("Remainder"); 117 | 118 | final TimeSeries[] tsArray = new TimeSeries[]{seriests, seasonalts, trendts}; 119 | final String[] labels = new String[]{"Series", "Seasonal", "Trend"}; 120 | 121 | for (int i = 0; i < series.length; i++) { 122 | final Date d = new Date((long) times[i]); 123 | RegularTimePeriod rtp = RegularTimePeriod.createInstance(this.timePeriod, d, TimeZone.getDefault()); 124 | seriests.addOrUpdate(rtp, series[i]); 125 | seasonalts.addOrUpdate(rtp, seasonal[i]); 126 | trendts.addOrUpdate(rtp, trend[i]); 127 | remainderts.addOrUpdate(rtp, remainder[i]); 128 | } 129 | 130 | plot.setGap(10.0); 131 | renderer.setSeriesPaint(0, black); 132 | barRenderer.setSeriesPaint(0, black); 133 | plot.setOrientation(PlotOrientation.VERTICAL); 134 | 135 | for (int i = 0; i < tsArray.length; i++) { 136 | final XYDataset ts = new TimeSeriesCollection(tsArray[i]); 137 | final XYPlot p = new XYPlot(ts, new DateAxis(labels[i]), new NumberAxis(labels[i]), renderer); 138 | plot.add(p); 139 | } 140 | 141 | final XYDataset rts = new TimeSeriesCollection(remainderts); 142 | final XYDataset sts = new TimeSeriesCollection(seriests); 143 | final XYDataset tts = new TimeSeriesCollection(trendts); 144 | final XYPlot rplot = new XYPlot(rts, new DateAxis(), new NumberAxis("Remainder"), barRenderer); 145 | final XYPlot seriesAndTrend = new XYPlot(sts, new DateAxis(), new NumberAxis("S & T"), renderer); 146 | 147 | seriesAndTrend.setDataset(1, tts); 148 | seriesAndTrend.setRenderer(1, renderer); 149 | 150 | plot.add(rplot); 151 | plot.add(seriesAndTrend); 152 | 153 | return new JFreeChart(this.title, JFreeChart.DEFAULT_TITLE_FONT, plot, true); 154 | } 155 | } 156 | 157 | public static void main(String[] args) throws Exception { 158 | List times = new ArrayList(); 159 | List series = new ArrayList(); 160 | List trend = new ArrayList(); 161 | List seasonal = new ArrayList(); 162 | List remainder = new ArrayList(); 163 | 164 | // Read from STDIN 165 | String line; 166 | BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 167 | while ((line = reader.readLine()) != null) { 168 | String[] tokens = line.split(","); 169 | times.add(Double.valueOf(tokens[0])); 170 | series.add(Double.valueOf(tokens[1])); 171 | trend.add(Double.valueOf(tokens[2])); 172 | seasonal.add(Double.valueOf(tokens[3])); 173 | remainder.add(Double.valueOf(tokens[4])); 174 | } 175 | 176 | 177 | STLResult res = new STLResult( 178 | convert(trend), 179 | convert(seasonal), 180 | convert(remainder)); 181 | 182 | double[] tmpSeries = convert(series); 183 | double[] tmpTimes = convert(times); 184 | 185 | if (args.length == 1) { 186 | plot(res, tmpSeries, tmpTimes, new File(args[0])); 187 | } else { 188 | plotOnScreen(res, tmpSeries, tmpTimes, "Seasonal Decomposition"); 189 | } 190 | } 191 | 192 | private static double[] convert(List list) { 193 | double[] array = new double[list.size()]; 194 | for (int i = 0; i < list.size(); i++) { 195 | array[i] = list.get(i); 196 | } 197 | return array; 198 | } 199 | } 200 | -------------------------------------------------------------------------------- /src/test/java/com/github/ruananswer/testUtility/StlFilenameFilter.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.testUtility; 2 | 3 | import java.io.File; 4 | import java.io.FilenameFilter; 5 | 6 | /** 7 | * Created by ruan on 16-4-18. 8 | */ 9 | public class StlFilenameFilter implements FilenameFilter { 10 | private String type; 11 | 12 | public StlFilenameFilter(String regex) { 13 | this.type = regex; 14 | } 15 | @Override 16 | public boolean accept(File dir, String name) { 17 | return name.endsWith(type); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/test/java/com/github/ruananswer/testUtility/TestCommon.java: -------------------------------------------------------------------------------- 1 | package com.github.ruananswer.testUtility; 2 | 3 | import org.apache.commons.io.IOUtils; 4 | 5 | import java.io.File; 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | import java.io.StringWriter; 9 | 10 | /** 11 | * Created by ruan on 16-4-18. 12 | */ 13 | public class TestCommon { 14 | public static String getResourceAsString(String resource) throws IOException { 15 | InputStream is = ClassLoader.getSystemResourceAsStream(resource); 16 | StringWriter writer = new StringWriter(); 17 | IOUtils.copy(is, writer); 18 | return writer.toString(); 19 | } 20 | 21 | public static String[] readTestSets(String regex) { 22 | File f = new File("./src/test/resources/"); 23 | StlFilenameFilter filter = (new StlFilenameFilter(regex)); 24 | String[] files = f.list(filter); 25 | return files; 26 | } 27 | 28 | public static void removeMissingValuesByAveragingNeighbors(double[] arr) { 29 | for (int i = 0; i < arr.length; i++) { 30 | if (Double.isNaN(arr[i])) { 31 | double sum = 0.0; 32 | int count = 0; 33 | if (i - 1 >= 0 && !Double.isNaN(arr[i - 1])) { 34 | sum += arr[i - 1]; 35 | count++; 36 | } 37 | if (i + 1 < arr.length && !Double.isNaN(arr[i + 1])) { 38 | sum += arr[i + 1]; 39 | count++; 40 | } 41 | arr[i] = sum / count; 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/test/resources/bumpInDoublePick anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.49,0.05 2 | 1,2370,0.5,, 3 | 2,2371,0.5,, 4 | 3,2372,0.5,, 5 | 4,2373,0.5,, 6 | 5,2374,0.5,, 7 | 6,2375,0.5,, 8 | -------------------------------------------------------------------------------- /src/test/resources/bumpToEarly anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.015,0.05 2 | 1,1606,0.8502410142,, 3 | 2,1607,0.8329186071,, 4 | 3,1608,0.8443452923,, 5 | 4,1609,0.8597705242,, 6 | 5,1610,0.8395361853,, 7 | 6,1611,0.8898678571,, 8 | 7,1612,0.8719036736,, 9 | 8,1613,0.8242203038,, 10 | 9,1614,0.8503055231,, 11 | 10,1615,0.8519712322,, 12 | -------------------------------------------------------------------------------- /src/test/resources/exponentialGrow anoms.csv: -------------------------------------------------------------------------------- 1 | ,,,0.49,0.05 2 | -------------------------------------------------------------------------------- /src/test/resources/flat anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.015,0.05 2 | 1,535,201.8938007813,, 3 | -------------------------------------------------------------------------------- /src/test/resources/floor anoms.csv: -------------------------------------------------------------------------------- 1 | ,,,0.015,0.05 2 | -------------------------------------------------------------------------------- /src/test/resources/gc anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.49,0.05 2 | 1,744,4.5418456866,, 3 | 2,1307,4.5462604406,, 4 | 3,1352,6.4224320144,, 5 | 4,1837,4.7041536052,, 6 | 5,2280,5.4202340241,, 7 | 6,2327,6.5665861158,, 8 | 7,2773,5.0101269728,, 9 | 8,3737,4.7128195562,, 10 | 9,3748,4.8509093238,, 11 | 10,3768,6.8015624596,, 12 | 11,4193,4.7763715336,, 13 | 12,5288,5.0075100129,, 14 | 13,5294,6.019687543,, 15 | 14,5311,4.7815913945,, 16 | 15,5332,5.4960473018,, 17 | 16,5370,5.7774941482,, 18 | 17,5512,11.519791187,, 19 | 18,5513,9.4360954577,, 20 | 19,5631,6.5767649163,, 21 | 20,6448,4.8566719258,, 22 | 21,6492,4.5466641899,, 23 | 22,6588,5.619809918,, 24 | 23,6594,4.7063194164,, 25 | 24,6614,5.4295103948,, 26 | 25,7014,4.619387647,, 27 | 26,7047,5.5676983623,, 28 | 27,7082,5.6331372895,, 29 | 28,7135,5.6413841554,, 30 | 29,8115,4.7759863222,, 31 | 30,8202,5.6284495871,, 32 | 31,8524,4.8570711273,, 33 | -------------------------------------------------------------------------------- /src/test/resources/growSuddenly anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.015,0.05 2 | 1,1618,1.3500737468,, 3 | 2,1627,1.5938015391,, 4 | 3,1632,1.4764668942,, 5 | 4,1634,1.6775015031,, 6 | 5,1636,1.5417662384,, 7 | 6,1640,1.6811372793,, 8 | 7,1641,1.6702894686,, 9 | 8,1643,1.7885492883,, 10 | 9,1646,1.6076222241,, 11 | 10,1648,1.5839282596,, 12 | 11,1650,1.8204621908,, 13 | 12,1651,1.6043029952,, 14 | 13,1653,1.7144508741,, 15 | 14,1655,2.0968582358,, 16 | 15,1658,1.789847141,, 17 | 16,1659,1.6213897192,, 18 | 17,1660,1.7644703724,, 19 | 18,1664,1.6437483517,, 20 | 19,1666,1.7081919169,, 21 | 20,1671,1.7182059554,, 22 | 21,1676,1.8126922324,, 23 | 22,1682,1.5328886635,, 24 | 23,1695,1.5117800161,, 25 | 24,1696,1.4524502916,, 26 | 25,1698,1.4895907281,, 27 | 26,1711,1.1660509048,, 28 | -------------------------------------------------------------------------------- /src/test/resources/justGrow anoms.csv: -------------------------------------------------------------------------------- 1 | ,,,0.49,0.05 2 | -------------------------------------------------------------------------------- /src/test/resources/justGrowWithError anoms.csv: -------------------------------------------------------------------------------- 1 | ,,,0.49,0.05 2 | -------------------------------------------------------------------------------- /src/test/resources/linearGrow anoms.csv: -------------------------------------------------------------------------------- 1 | ,,,0.49,0.05 2 | -------------------------------------------------------------------------------- /src/test/resources/linearGrowWithError anoms.csv: -------------------------------------------------------------------------------- 1 | ,,,0.49,0.05 2 | -------------------------------------------------------------------------------- /src/test/resources/moreNoise anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.015,0.05 2 | 1,1655,1.6251919502,, 3 | 2,1715,-0.1083311403,, 4 | 3,1736,0.5404697481,, 5 | -------------------------------------------------------------------------------- /src/test/resources/plateau anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.015,0.05 2 | 1,1654,0.3875278833,, 3 | 2,1657,0.4442118062,, 4 | 3,1663,0.4184568984,, 5 | 4,1669,0.4506329114,, 6 | -------------------------------------------------------------------------------- /src/test/resources/removeNoise anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.015,0.05 2 | 1,535,1.3339626094,, 3 | -------------------------------------------------------------------------------- /src/test/resources/sample-timeseries.json: -------------------------------------------------------------------------------- 1 | {"series": [40.6, 40.8, 44.4, 46.7, 54.1, 58.5, 57.7, 56.4, 54.3, 50.5, 42.9, 39.8, 44.2, 39.8, 45.1, 47.0, 54.1, 58.7, 66.3, 59.9, 57.0, 54.2, 39.7, 42.8, 37.5, 38.7, 39.5, 42.1, 55.7, 57.8, 56.8, 54.3, 54.3, 47.1, 41.8, 41.7, 41.8, 40.1, 42.9, 45.8, 49.2, 52.7, 64.2, 59.6, 54.4, 49.2, 36.3, 37.6, 39.3, 37.5, 38.3, 45.5, 53.2, 57.7, 60.8, 58.2, 56.4, 49.8, 44.4, 43.6, 40.0, 40.5, 40.8, 45.1, 53.8, 59.4, 63.5, 61.0, 53.0, 50.0, 38.1, 36.3, 39.2, 43.4, 43.4, 48.9, 50.6, 56.8, 62.5, 62.0, 57.5, 46.7, 41.6, 39.8, 39.4, 38.5, 45.3, 47.1, 51.7, 55.0, 60.4, 60.5, 54.7, 50.3, 42.3, 35.2, 40.8, 41.1, 42.8, 47.3, 50.9, 56.4, 62.2, 60.5, 55.4, 50.2, 43.0, 37.3, 34.8, 31.3, 41.0, 43.9, 53.1, 56.9, 62.5, 60.3, 59.8, 49.2, 42.9, 41.9, 41.6, 37.1, 41.2, 46.9, 51.2, 60.4, 60.1, 61.6, 57.0, 50.9, 43.0, 38.8, 37.1, 38.4, 38.4, 46.5, 53.5, 58.4, 60.6, 58.2, 53.8, 46.6, 45.5, 40.6, 42.4, 38.4, 40.3, 44.6, 50.9, 57.0, 62.1, 63.5, 56.3, 47.3, 43.6, 41.8, 36.2, 39.3, 44.5, 48.7, 54.2, 60.8, 65.5, 64.9, 60.1, 50.2, 42.1, 35.8, 39.4, 38.2, 40.4, 46.9, 53.4, 59.6, 66.5, 60.4, 59.2, 51.2, 42.8, 45.8, 40.0, 42.6, 43.5, 47.1, 50.0, 60.5, 64.6, 64.0, 56.8, 48.6, 44.2, 36.4, 37.3, 35.0, 44.0, 43.9, 52.7, 58.6, 60.0, 61.1, 58.1, 49.6, 41.6, 41.3, 40.8, 41.0, 38.4, 47.4, 54.1, 58.6, 61.4, 61.8, 56.3, 50.9, 41.4, 37.1, 42.1, 41.2, 47.3, 46.6, 52.4, 59.0, 59.6, 60.4, 57.0, 50.7, 47.8, 39.2, 39.4, 40.9, 42.4, 47.8, 52.4, 58.0, 60.7, 61.8, 58.2, 46.7, 46.6, 37.8], "times": [-1577894400, -1575216000, -1572710400, -1570032000, -1567440000, -1564761600, -1562169600, -1559491200, -1556812800, -1554220800, -1551542400, -1548950400, -1546272000, -1543593600, -1541174400, -1538496000, -1535904000, -1533225600, -1530633600, -1527955200, -1525276800, -1522684800, -1520006400, -1517414400, -1514736000, -1512057600, -1509638400, -1506960000, -1504368000, -1501689600, -1499097600, -1496419200, -1493740800, -1491148800, -1488470400, -1485878400, -1483200000, -1480521600, -1478102400, -1475424000, -1472832000, -1470153600, -1467561600, -1464883200, -1462204800, -1459612800, -1456934400, -1454342400, -1451664000, -1448985600, -1446480000, -1443801600, -1441209600, -1438531200, -1435939200, -1433260800, -1430582400, -1427990400, -1425312000, -1422720000, -1420041600, -1417363200, -1414944000, -1412265600, -1409673600, -1406995200, -1404403200, -1401724800, -1399046400, -1396454400, -1393776000, -1391184000, -1388505600, -1385827200, -1383408000, -1380729600, -1378137600, -1375459200, -1372867200, -1370188800, -1367510400, -1364918400, -1362240000, -1359648000, -1356969600, -1354291200, -1351872000, -1349193600, -1346601600, -1343923200, -1341331200, -1338652800, -1335974400, -1333382400, -1330704000, -1328112000, -1325433600, -1322755200, -1320249600, -1317571200, -1314979200, -1312300800, -1309708800, -1307030400, -1304352000, -1301760000, -1299081600, -1296489600, -1293811200, -1291132800, -1288713600, -1286035200, -1283443200, -1280764800, -1278172800, -1275494400, -1272816000, -1270224000, -1267545600, -1264953600, -1262275200, -1259596800, -1257177600, -1254499200, -1251907200, -1249228800, -1246636800, -1243958400, -1241280000, -1238688000, -1236009600, -1233417600, -1230739200, -1228060800, -1225641600, -1222963200, -1220371200, -1217692800, -1215100800, -1212422400, -1209744000, -1207152000, -1204473600, -1201881600, -1199203200, -1196524800, -1194019200, -1191340800, -1188748800, -1186070400, -1183478400, -1180800000, -1178121600, -1175529600, -1172851200, -1170259200, -1167580800, -1164902400, -1162483200, -1159804800, -1157212800, -1154534400, -1151942400, -1149264000, -1146585600, -1143993600, -1141315200, -1138723200, -1136044800, -1133366400, -1130947200, -1128268800, -1125676800, -1122998400, -1120406400, -1117728000, -1115049600, -1112457600, -1109779200, -1107187200, -1104508800, -1101830400, -1099411200, -1096732800, -1094140800, -1091462400, -1088870400, -1086192000, -1083513600, -1080921600, -1078243200, -1075651200, -1072972800, -1070294400, -1067788800, -1065110400, -1062518400, -1059840000, -1057248000, -1054569600, -1051891200, -1049299200, -1046620800, -1044028800, -1041350400, -1038672000, -1036252800, -1033574400, -1030982400, -1028304000, -1025712000, -1023033600, -1020355200, -1017763200, -1015084800, -1012492800, -1009814400, -1007136000, -1004716800, -1002038400, -999446400, -996768000, -994176000, -991497600, -988819200, -986227200, -983548800, -980956800, -978278400, -975600000, -973180800, -970502400, -967910400, -965232000, -962640000, -959961600, -957283200, -954691200, -952012800, -949420800]} 2 | -------------------------------------------------------------------------------- /src/test/resources/smallChange anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.015,0.05 2 | 1,45,0.7707388789,, 3 | 2,203,0.7707388789,, 4 | 3,361,0.7707388789,, 5 | 4,519,0.7707388789,, 6 | 5,677,0.7707388789,, 7 | 6,680,0.8075581004,, 8 | 7,835,0.7707388789,, 9 | 8,838,0.8075581004,, 10 | 9,993,0.7707388789,, 11 | 10,996,0.8075581004,, 12 | 11,1151,0.7707388789,, 13 | 12,1154,0.8075581004,, 14 | 13,1309,0.7707388789,, 15 | 14,1312,0.8075581004,, 16 | 15,1467,0.7707388789,, 17 | 16,1470,0.8075581004,, 18 | 17,1620,0.6776739762,, 19 | 18,1621,0.7039393817,, 20 | 19,1622,0.7742022371,, 21 | 20,1623,0.79512986,, 22 | 21,1624,0.7501411264,, 23 | 22,1625,0.8672997114,, 24 | 23,1626,0.7654968626,, 25 | 24,1627,0.8073618989,, 26 | 25,1628,0.8820028725,, 27 | 26,1629,0.7760696791,, 28 | -------------------------------------------------------------------------------- /src/test/resources/smallChangeOnStrictModel anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.015,0.05 2 | 1,40,0.7032794192,, 3 | 2,198,0.7032794192,, 4 | 3,356,0.7032794192,, 5 | 4,514,0.7032794192,, 6 | 5,672,0.7032794192,, 7 | 6,830,0.7032794192,, 8 | 7,988,0.7032794192,, 9 | 8,1146,0.7032794192,, 10 | 9,1304,0.7032794192,, 11 | 10,1462,0.7032794192,, 12 | 11,1620,0.7022794192,, 13 | -------------------------------------------------------------------------------- /src/test/resources/speark anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.015,0.05 2 | 1,535,1.2009617617,, 3 | 2,1186,1.5,, 4 | -------------------------------------------------------------------------------- /src/test/resources/speark stl.csv: -------------------------------------------------------------------------------- 1 | 158,all,,, 2 | 1,0.9786621309,1.0095868936,0.0076647966,-0.0385895594 3 | 2,0.988819409,1.0095215079,-0.0043293601,-0.0163727388 4 | 3,1.0358803395,1.0094572237,-0.0197656477,0.0461887634 5 | 4,1.0420722834,1.0093939135,0.0224734244,0.0102049454 6 | 5,0.9935821363,1.0093314499,0.0080391185,-0.0237884321 7 | 6,1.0804673604,1.0092697053,-0.0189556197,0.0901532748 8 | 7,0.9851416275,1.0092085524,0.0040757806,-0.0281427056 9 | 8,1.0098002324,1.0091478637,-0.0426337231,0.0432860918 10 | 9,1.0620373101,1.0090875118,0.0176110006,0.0353387977 11 | 10,0.9640650923,1.0090273691,-0.0066196142,-0.0383426626 12 | 11,0.996638184,1.0089673083,0.0193776243,-0.0317067485 13 | 12,1.0172183548,1.0089072018,-0.0023767933,0.0106879463 14 | 13,0.9369507382,1.0088469223,0.006502641,-0.0783988251 15 | 14,1.0569732042,1.0087863422,0.0036564335,0.0445304285 16 | 15,0.9389109039,1.0087253342,0.0001347916,-0.0699492219 17 | 16,1.0786657944,1.0086637707,-0.0045107118,0.0745127355 18 | 17,1.0036738937,1.0086015244,0.0005397945,-0.0054674251 19 | 18,0.9412442457,1.0085384677,-0.0160543975,-0.0512398246 20 | 19,0.9205869051,1.0084744732,-0.0022162598,-0.0856713084 21 | 20,0.9626309636,1.0084094135,-0.0156520863,-0.0301263636 22 | 21,1.0241760932,1.0083431611,-0.0118076973,0.0276406294 23 | 22,0.999848723,1.0082755885,-0.0026811069,-0.0057457585 24 | 23,0.9995534799,1.0082073627,-0.02641932,0.0177654371 25 | 24,1.029667881,1.0081392242,0.0382263195,-0.0166976628 26 | 25,0.9950398959,1.0080711553,-0.0022538447,-0.0107774146 27 | 26,0.9880982876,1.0080031386,-0.0015838074,-0.0183210437 28 | 27,1.0023891329,1.0079351567,0.0151624536,-0.0207084773 29 | 28,1.0148256369,1.0078671919,0.0043056421,0.0026528029 30 | 29,0.9583095041,1.0077992269,-0.0214236102,-0.0280661126 31 | 30,0.9313015002,1.0077312441,-0.0328671377,-0.0435626062 32 | 31,1.0070139477,1.0076632261,0.0158419647,-0.0164912431 33 | 32,1.0331062981,1.0075951553,0.0043220563,0.0211890866 34 | 33,1.0565519833,1.0075270143,-0.0010555261,0.050080495 35 | 34,0.9762443989,1.0074587855,0.0070563415,-0.0382707281 36 | 35,1.0426207056,1.0073904516,0.0154937906,0.0197364634 37 | 36,0.9624240577,1.0073219949,-0.0086035089,-0.0362944284 38 | 37,0.9912166902,1.0072533981,0.0015752665,-0.0176119743 39 | 38,1.0375982214,1.0071846436,-0.0075328996,0.0379464774 40 | 39,1.0118605452,1.0071157139,0.0085371416,-0.0037923103 41 | 40,1.0633748172,1.0070465915,0.0147545323,0.0415736934 42 | 41,0.9926602158,1.006977259,-0.0092161932,-0.0051008499 43 | 42,1.0591645022,1.0069076988,0.0244922553,0.0277645481 44 | 43,1.0209578034,1.0068378935,0.008721065,0.0053988449 45 | 44,0.9614480823,1.0067685505,-0.0158233398,-0.0294971283 46 | 45,1.0357263848,1.0067003015,-0.0077028034,0.0367288867 47 | 46,1.0050052608,1.0066330157,0.0026406323,-0.0042683872 48 | 47,1.0518704585,1.0065665623,-0.0246971525,0.0700010488 49 | 48,1.0421199127,1.0065008105,0.0005377801,0.035081322 50 | 49,1.0045180225,1.0064356295,0.0014728048,-0.0033904118 51 | 50,1.0009862856,1.0063708885,-0.0075284439,0.002143841 52 | 51,1.0115496361,1.0063064565,0.0024930575,0.0027501221 53 | 52,1.0104860085,1.0062422029,-0.0033137196,0.0075575252 54 | 53,1.0737416496,1.0061779968,0.0204661666,0.0470974862 55 | 54,1.1040124081,1.0061137073,0.009164179,0.0887345218 56 | 55,1.0074207083,1.0060492037,0.001386416,-1.49114267327111E-005 57 | 56,1.0859263788,1.0059843551,-0.0007036853,0.080645709 58 | 57,1.0519606082,1.0059190307,0.0135591548,0.0324824227 59 | 58,0.9409198067,1.0058530997,0.0074569303,-0.0723902233 60 | 59,1.0514215596,1.0057864312,-0.0135936511,0.0592287795 61 | 60,1.0023238583,1.0057188945,0.0249317525,-0.0283267887 62 | 61,0.9937888189,1.0056503588,0.0018502108,-0.0137117506 63 | 62,0.9990447009,1.0055806931,-0.0190907967,0.0125548045 64 | 63,0.9735315206,1.0055097667,-0.0167235619,-0.0152546842 65 | 64,1.0411744102,1.0054374488,-0.0017173385,0.0374543 66 | 65,0.9952546702,1.0053665764,-0.0087142018,-0.0013977045 67 | 66,0.9790172861,1.0052997515,-0.0069707665,-0.0193116988 68 | 67,0.9610418418,1.0052364901,-0.004114355,-0.0400802933 69 | 68,1.0024078514,1.0051763086,-0.0049816256,0.0022131684 70 | 69,1.0107273577,1.0051187231,-0.013520456,0.0191290906 71 | 70,1.0091372537,1.0050632499,-0.0057691031,0.0098431068 72 | 71,1.0364532457,1.0050094053,-0.0232690029,0.0547128433 73 | 72,0.9345681963,1.0049567053,-0.0212036147,-0.0491848943 74 | 73,0.9714425362,1.0049046663,0.006711992,-0.0401741221 75 | 74,1.0382050249,1.0048528045,-0.0108807738,0.0442329942 76 | 75,1.0463463497,1.004800636,0.0048387305,0.0367069831 77 | 76,0.9724046047,1.0047476772,-0.022203864,-0.0101392084 78 | 77,1.0101309426,1.0046934442,0.0311016526,-0.0256641543 79 | 78,1.0216202116,1.0046374533,0.015657704,0.0013250542 80 | 79,1.0093458297,1.0045792207,0.0043402687,0.0004263403 81 | 80,0.9536315907,1.0045182626,0.0592379112,-0.1101245831 82 | 81,0.8774991872,1.0044540952,-0.026523284,-0.1004316241 83 | 82,1.028223526,1.0043862348,0.0149120043,0.0089252868 84 | 83,1.0015762973,1.0043141976,0.0046947455,-0.0074326458 85 | 84,1.0933757611,1.0042374998,-0.0036551089,0.0927933703 86 | 85,0.8780339773,1.0041556576,-0.0244029324,-0.1017187478 87 | 86,1.0292640134,1.0040740097,-0.0094192814,0.0346092851 88 | 87,1.0622976637,1.0039977372,0.0093403147,0.0489596119 89 | 88,0.9464155396,1.0039261198,-0.0103307577,-0.0471798225 90 | 89,0.9828603556,1.0038584373,0.0050585605,-0.0260566421 91 | 90,1.0021421672,1.0037939695,0.0377966767,-0.039448479 92 | 91,0.9706108195,1.0037319961,-0.0094821177,-0.0236390589 93 | 92,0.9480291846,1.003671797,0.0026570641,-0.0582996765 94 | 93,1.0077756447,1.0036126518,-0.0217006935,0.0258636864 95 | 94,0.9920152607,1.0035538404,-0.0081797411,-0.0033588386 96 | 95,1.0928246338,1.0034946425,-0.0055785236,0.0949085149 97 | 96,1.0654351781,1.0034343379,0.0126625513,0.049338289 98 | 97,0.9189901815,1.0033722063,-0.0059258503,-0.0784561746 99 | 98,1.0844704397,1.0033075276,0.0225569843,0.0586059278 100 | 99,0.997927312,1.0032395815,-0.0047232735,-0.0005889961 101 | 100,1.0528328238,1.0031676478,0.0283868511,0.021278325 102 | 101,1.0402326223,1.0030910062,-0.0063654535,0.0435070697 103 | 102,1.0271502388,1.0030089365,-0.0077047346,0.031846037 104 | 103,0.9581823343,1.0029207185,-0.0053753803,-0.0393630039 105 | 104,0.9873560761,1.0028256319,-0.0122947478,-0.003174808 106 | 105,1.0701640669,1.0027229566,0.0210261672,0.0464149431 107 | 106,1.0121712998,1.0026119722,-0.0180337605,0.027593088 108 | 107,0.9456910712,1.0024954872,-0.0064619564,-0.0503424596 109 | 108,1.0706948099,1.0023770466,0.0115868483,0.0567309149 110 | 109,1.0775167158,1.0022570353,0.037821602,0.0374380785 111 | 110,0.9635523932,1.002135838,-0.0102684381,-0.0283150067 112 | 111,1.0357918905,1.0020138396,0.0252004326,0.0085776183 113 | 112,0.9517051317,1.0018914249,0.0010731428,-0.051259436 114 | 113,0.9680613437,1.0017689788,0.0017973523,-0.0355049874 115 | 114,0.93879474,1.0016468862,-0.031610808,-0.0312413382 116 | 115,0.9745020216,1.0015255317,0.0051714989,-0.0321950089 117 | 116,1.057327576,1.0014053003,0.0166142647,0.039308011 118 | 117,0.9332279838,1.0012865768,-0.000595781,-0.067462812 119 | 118,0.9523631634,1.001169746,-0.0012233382,-0.0475832444 120 | 119,1.0087515897,1.0010551928,0.0080929,-0.0003965031 121 | 120,1.0008178028,1.0009433019,-0.024380246,0.0242547469 122 | 121,0.918938695,1.0008344583,-0.0204766138,-0.0614191495 123 | 122,0.9530577563,1.0007290467,0.0049337998,-0.0526050902 124 | 123,1.0570836615,1.000627452,0.0311999487,0.0252562607 125 | 124,1.0289008045,1.0005300591,0.0040338285,0.0243369169 126 | 125,1.0307899894,1.0004372526,-0.0036887114,0.0340414481 127 | 126,1.0476504419,1.0003494176,-0.0238815954,0.0711826197 128 | 127,0.9564089657,1.0002669388,-0.0091209647,-0.0347370083 129 | 128,0.9723652588,1.0001892196,-0.0127638531,-0.0150601077 130 | 129,0.9843528661,1.0001153381,-0.0179477442,0.0021852722 131 | 130,0.9840728965,1.000045191,-0.0296667639,0.0136944695 132 | 131,1.0054688426,0.999978675,0.003538472,0.0019516957 133 | 132,1.0368104836,0.9999156868,-0.0023950796,0.0392898764 134 | 133,1.1075639419,0.9998561232,0.030106469,0.0776013497 135 | 134,0.8918935209,0.9997998809,-0.0241312407,-0.0837751194 136 | 135,1.0018612692,0.9997468566,0.0057858396,-0.003671427 137 | 136,0.9991256153,0.9996969469,0.0036642786,-0.0042356103 138 | 137,0.9421231747,0.9996500488,-0.0232337065,-0.0342931675 139 | 138,1.0304850124,0.9996060587,0.0196971409,0.0111818129 140 | 139,1.058152965,0.9995648735,0.011344156,0.0472439355 141 | 140,0.9889686346,0.99952639,0.0116078529,-0.0221656083 142 | 141,1.046209016,0.9994905047,0.0144689447,0.0322495666 143 | 142,1.0066899856,0.9994571144,-0.0016111534,0.0088440245 144 | 143,0.9617016602,0.9994261159,-0.0388284674,0.0011040117 145 | 144,1.0786430392,0.9993974059,0.022225182,0.0570204513 146 | 145,0.9848021017,0.999370881,0.0136665505,-0.0282353298 147 | 146,1.0356677977,0.9993464381,0.0124475645,0.0238737952 148 | 147,0.9426082286,0.9993239737,-0.0066364067,-0.0500793384 149 | 148,1.0232107368,0.9993033847,-0.0065149125,0.0304222645 150 | 149,1.0850895857,0.9992889791,0.0194935787,0.0663070279 151 | 150,1.0071631631,0.9992846073,0.01253952,-0.0046609642 152 | 151,0.9056647425,0.9992894799,-0.0125407748,-0.0810839626 153 | 152,1.0238766988,0.9993028072,0.0132588349,0.0113150568 154 | 153,1.0194974052,0.9993237997,-0.001361852,0.0215354575 155 | 154,0.9932932765,0.9993516679,-0.0030814993,-0.0029768921 156 | 155,0.976344391,0.9993856223,0.0206402901,-0.0436815214 157 | 156,0.9810401988,0.9994248732,0.0147839197,-0.0331685941 158 | 157,0.9418961748,0.9994686312,-0.0290318571,-0.0285405993 159 | 158,1.0611955794,0.9995161067,0.0199328156,0.041746657 160 | 159,1.0006025354,0.9995665101,0.0076647966,-0.0066287713 161 | 160,0.9572965178,0.999619052,-0.0043293601,-0.0379931741 162 | 161,0.9858632307,0.9996729427,-0.0197656477,0.0059559356 163 | 162,1.0244263105,0.9997273928,0.0224734244,0.0022254933 164 | 163,0.9738404631,0.9997816126,0.0080391185,-0.0339802679 165 | 164,1.0996696427,0.9998348126,-0.0189556197,0.1187904498 166 | 165,1.054759184,0.9998862033,0.0040757806,0.0507972001 167 | 166,0.9355507595,0.9999349952,-0.0426337231,-0.0217505126 168 | 167,1.0007638077,0.9999803986,0.0176110006,-0.0168275915 169 | 168,1.0049280804,1.0000216241,-0.0066196142,0.0115260705 170 | 169,1.0626283144,1.0000578821,0.0193776243,0.043192808 171 | 170,0.9492166226,1.0000929005,-0.0023767933,-0.0484994846 172 | 171,0.9699370768,1.0001309457,0.006502641,-0.0366965099 173 | 172,0.9700051078,1.0001720359,0.0036564335,-0.0338233616 174 | 173,0.9766191983,1.0002161894,0.0001347916,-0.0237317827 175 | 174,1.0082659349,1.0002634245,-0.0045107118,0.0125132222 176 | 175,0.8871254416,1.0003137593,0.0005397945,-0.1137281122 177 | 176,1.0008339551,1.0003672121,-0.0160543975,0.0165211405 178 | 177,1.0231344154,1.0004238011,-0.0022162598,0.0249268742 179 | 178,0.92335701,1.0004835446,-0.0156520863,-0.0614744482 180 | 179,1.0055744091,1.0005464608,-0.0118076973,0.0168356456 181 | 180,0.9613945219,1.0006125679,-0.0026811069,-0.0365369391 182 | 181,0.947372326,1.0006818843,-0.02641932,-0.0268902383 183 | 182,0.9800779396,1.0007544281,0.0382263195,-0.058902808 184 | 183,1.0111546818,1.0008302175,-0.0022538447,0.012578309 185 | 184,1.0608634532,1.0009092708,-0.0015838074,0.0615379897 186 | 185,1.0536077859,1.0009916063,0.0151624536,0.037453726 187 | 186,1.0346283894,1.0010772422,0.0043056421,0.0292455052 188 | 187,0.9804363456,1.0011661967,-0.0214236102,0.0006937591 189 | 188,0.9567504785,1.001258488,-0.0328671377,-0.0116408718 190 | 189,1.0397156146,1.0013541344,0.0158419647,0.0225195155 191 | 190,0.9906251631,1.0014531542,0.0043220563,-0.0151500473 192 | 191,0.9537926279,1.0015509101,-0.0010555261,-0.0467027561 193 | 192,0.9757268912,1.0016432576,0.0070563415,-0.0329727079 194 | 193,0.9856885783,1.001730954,0.0154937906,-0.0315361664 195 | 194,1.0389834545,1.0018147562,-0.0086035089,0.0457722072 196 | 195,0.9582967261,1.0018954216,0.0015752665,-0.045173962 197 | 196,0.9577350218,1.0019737072,-0.0075328996,-0.0367057858 198 | 197,1.0126681185,1.0020503702,0.0085371416,0.0020806067 199 | 198,1.0424973476,1.0021261678,0.0147545323,0.0256166475 200 | 199,1.0135603188,1.0022018572,-0.0092161932,0.0205746549 201 | 200,1.0898908445,1.0022781954,0.0244922553,0.0631203938 202 | 201,0.9856519322,1.0023559396,0.008721065,-0.0254250724 203 | 202,0.9677399064,1.0024358471,-0.0158233398,-0.0188726009 204 | 203,0.9931333118,1.0025186749,-0.0077028034,-0.0016825598 205 | 204,0.927485258,1.0026051803,0.0026406323,-0.0777605545 206 | 205,0.8911317628,1.0026961203,-0.0246971525,-0.086867205 207 | 206,1.0935997623,1.0027922522,0.0005377801,0.09026973 208 | 207,1.0484248641,1.0028943331,0.0014728048,0.0440577262 209 | 208,1.0276795812,1.0030031201,-0.0075284439,0.032204905 210 | 209,1.0096181017,1.0031193704,0.0024930575,0.0040056738 211 | 210,1.0911978667,1.0032438412,-0.0033137196,0.091267745 212 | 211,0.9826287211,1.0033772897,0.0204661666,-0.0412147351 213 | 212,1.0180391512,1.0035092909,0.009164179,0.0053656814 214 | 213,1.0047449299,1.0036296842,0.001386416,-0.0002711703 215 | 214,0.9099996818,1.003739623,-0.0007036853,-0.0930362559 216 | 215,1.0017356779,1.003840261,0.0135591548,-0.0156637379 217 | 216,1.0371439327,1.0039327515,0.0074569303,0.0257542509 218 | 217,1.0168204459,1.004018248,-0.0135936511,0.0263958489 219 | 218,1.0507532506,1.0040979041,0.0249317525,0.021723594 220 | 219,1.0581723234,1.0041728733,0.0018502108,0.0521492393 221 | 220,0.9318053515,1.004244309,-0.0190907967,-0.0533481608 222 | 221,0.9761306056,1.0043133648,-0.0167235619,-0.0114591973 223 | 222,0.996132887,1.004381194,-0.0017173385,-0.0065309685 224 | 223,0.9925388398,1.0044489503,-0.0087142018,-0.0031959087 225 | 224,0.9664310235,1.0045177871,-0.0069707665,-0.0311159971 226 | 225,0.9504563174,1.004588858,-0.004114355,-0.0500181856 227 | 226,1.0386117348,1.0046633163,-0.0049816256,0.0389300442 228 | 227,1.0085177676,1.0047423156,-0.013520456,0.017295908 229 | 228,1.033101048,1.0048270094,-0.0057691031,0.0340431416 230 | 229,0.9629395218,1.0049185512,-0.0232690029,-0.0187100266 231 | 230,0.9833587222,1.0050180945,-0.0212036147,-0.0004557575 232 | 231,1.0430031389,1.0051267927,0.006711992,0.0311643542 233 | 232,0.9515294598,1.0052457994,-0.0108807738,-0.0428355658 234 | 233,1.043001841,1.0053671634,0.0048387305,0.032795947 235 | 234,0.9863818998,1.0054823581,-0.022203864,0.0031034058 236 | 235,1.1269628436,1.0055916737,0.0311016526,0.0902695173 237 | 236,0.9819868858,1.0056954006,0.015657704,-0.0393662189 238 | 237,1.0203348303,1.0057938291,0.0043402687,0.0102007325 239 | 238,0.9778281874,1.0058872496,0.0592379112,-0.0872969734 240 | 239,0.9073819649,1.0059759523,-0.026523284,-0.0720707035 241 | 240,0.9855194516,1.0060602276,0.0149120043,-0.0354527803 242 | 241,1.041124696,1.0061403658,0.0046947455,0.0302895847 243 | 242,1.122896126,1.0062166573,-0.0036551089,0.1203345776 244 | 243,1.0221649269,1.0062893922,-0.0244029324,0.0402784671 245 | 244,1.0365921795,1.0063588611,-0.0094192814,0.0396525998 246 | 245,1.0484197094,1.0064253541,0.0093403147,0.0326540406 247 | 246,0.9497451418,1.0064891617,-0.0103307577,-0.0464132622 248 | 247,0.9971123388,1.0065505741,0.0050585605,-0.0144967958 249 | 248,1.0782852892,1.0066098817,0.0377966767,0.0338787308 250 | 249,1.0196440878,1.0066673747,-0.0094821177,0.0224588308 251 | 250,1.0649983086,1.0067233436,0.0026570641,0.0556179009 252 | 251,0.913532647,1.0067780786,-0.0217006935,-0.0715447381 253 | 252,1.0064647005,1.00683187,-0.0081797411,0.0078125717 254 | 253,0.9942311223,1.0068850082,-0.0055785236,-0.0070753623 255 | 254,1.0955315443,1.006938805,0.0126625513,0.075930188 256 | 255,1.0823078157,1.0069940359,-0.0059258503,0.0812396301 257 | 256,0.9595293716,1.0070501867,0.0225569843,-0.0700777995 258 | 257,1.0068731995,1.0071067434,-0.0047232735,0.0044897295 259 | 258,0.9673901474,1.0071631919,0.0283868511,-0.0681598956 260 | 259,0.9684651836,1.0072190179,-0.0063654535,-0.0323883808 261 | 260,1.0623892011,1.0072737075,-0.0077047346,0.0628202283 262 | 261,0.9724779937,1.0073267464,-0.0053753803,-0.0294733724 263 | 262,0.9247824036,1.0073776205,-0.0122947478,-0.0703004692 264 | 263,1.0592596361,1.0074258158,0.0210261672,0.0308076531 265 | 264,1.0051233907,1.0074708181,-0.0180337605,0.015686333 266 | 265,1.0115372365,1.0075121133,-0.0064619564,0.0104870796 267 | 266,0.9912170032,1.0075491872,0.0115868483,-0.0279190323 268 | 267,1.0659366311,1.0075815258,0.037821602,0.0205335033 269 | 268,0.997454246,1.0076086149,-0.0102684381,0.0001140692 270 | 269,1.0977513566,1.0076299404,0.0252004326,0.0649209836 271 | 270,1.0435027317,1.0076449882,0.0010731428,0.0347846008 272 | 271,1.0250585214,1.0076532441,0.0017973523,0.015607925 273 | 272,0.9521395991,1.0076541941,-0.031610808,-0.0239037869 274 | 273,0.9494429581,1.007647324,0.0051714989,-0.0633758647 275 | 274,1.0398299699,1.0076321196,0.0166142647,0.0155835856 276 | 275,1.0358753314,1.0076124977,-0.000595781,0.0288586147 277 | 276,0.9988121359,1.0075925219,-0.0012233382,-0.0075570478 278 | 277,1.0623722003,1.007571899,0.0080929,0.0467074012 279 | 278,0.907990268,1.0075503358,-0.024380246,-0.0751798218 280 | 279,0.9859698497,1.007527539,-0.0204766138,-0.0010810756 281 | 280,0.9913334808,1.0075032154,0.0049337998,-0.0211035344 282 | 281,1.1212342293,1.0074770716,0.0311999487,0.082557209 283 | 282,0.9837383485,1.0074488145,0.0040338285,-0.0277442946 284 | 283,1.0351070534,1.0074181508,-0.0036887114,0.031377614 285 | 284,1.050589874,1.0073847872,-0.0238815954,0.0670866823 286 | 285,1.0684572322,1.0073484305,-0.0091209647,0.0702297665 287 | 286,1.0445027459,1.0073087874,-0.0127638531,0.0499578116 288 | 287,0.9398172058,1.0072655647,-0.0179477442,-0.0495006147 289 | 288,0.9493878353,1.0072184691,-0.0296667639,-0.0281638699 290 | 289,0.9774184246,1.0071672074,0.003538472,-0.0332872548 291 | 290,0.9306616267,1.0071114863,-0.0023950796,-0.07405478 292 | 291,0.9002053646,1.0070510125,0.030106469,-0.1369521169 293 | 292,1.0517037266,1.0069854929,-0.0241312407,0.0688494744 294 | 293,1.0204359657,1.006914634,0.0057858396,0.007735492 295 | 294,1.0119646138,1.0068381428,0.0036642786,0.0014621924 296 | 295,1.008810887,1.0067557259,-0.0232337065,0.0252888676 297 | 296,1.0490487815,1.0066691113,0.0196971409,0.0226825293 298 | 297,1.0149822772,1.006580218,0.011344156,-0.0029420967 299 | 298,1.0284157813,1.006489039,0.0116078529,0.0103188895 300 | 299,1.0300662698,1.0063955674,0.0144689447,0.0092017577 301 | 300,0.9871066562,1.0062997965,-0.0016111534,-0.0175819869 302 | 301,1.0313144426,1.0062017194,-0.0388284674,0.0639411906 303 | 302,1.0142884693,1.0061013292,0.022225182,-0.0140380418 304 | 303,0.9890667482,1.005998619,0.0136665505,-0.0305984213 305 | 304,1.0472013799,1.005893582,0.0124475645,0.0288602335 306 | 305,0.9999960658,1.0057862113,-0.0066364067,0.0008462612 307 | 306,1.0111856201,1.0056765001,-0.0065149125,0.0120240325 308 | 307,0.986173873,1.0055644414,0.0194935787,-0.0388841471 309 | 308,0.9996144787,1.0054500285,0.01253952,-0.0183750698 310 | 309,0.9941379486,1.0053332545,-0.0125407748,0.0013454689 311 | 310,0.9488758797,1.0052141125,0.0132588349,-0.0695970678 312 | 311,0.943408808,1.0050925956,-0.001361852,-0.0603219356 313 | 312,1.0518797574,1.0049686971,-0.0030814993,0.0499925596 314 | 313,1.0085957707,1.0048424099,0.0206402901,-0.0168869294 315 | 314,1.0645637341,1.0047137273,0.0147839197,0.045066087 316 | 315,0.9933174183,1.0045826425,-0.0290318571,0.0177666329 317 | 316,1.035337341,1.0044491484,0.0199328156,0.0109553769 318 | 317,1.0852337274,1.0043147363,0.0076647966,0.0732541946 319 | 318,1.0223784484,1.00418084,-0.0043293601,0.0225269685 320 | 319,0.963947669,1.0040473673,-0.0197656477,-0.0203340506 321 | 320,1.0121847507,1.0039142258,0.0224734244,-0.0142028995 322 | 321,0.9899499992,1.003781323,0.0080391185,-0.0218704423 323 | 322,0.9452161046,1.0036485667,-0.0189556197,-0.0394768424 324 | 323,1.0256264071,1.0035158644,0.0040757806,0.018034762 325 | 324,0.9168880533,1.0033831238,-0.0426337231,-0.0438613474 326 | 325,1.0436626651,1.0032502525,0.0176110006,0.0228014119 327 | 326,1.0002344057,1.0031171581,-0.0066196142,0.0037368618 328 | 327,0.9624509375,1.0029837483,0.0193776243,-0.0599104351 329 | 328,1.0436627045,1.0028499307,-0.0023767933,0.0431895671 330 | 329,0.9948382003,1.0027156128,0.006502641,-0.0143800535 331 | 330,0.9577631233,1.0025807024,0.0036564335,-0.0484740126 332 | 331,1.0716729638,1.002445107,0.0001347916,0.0690930652 333 | 332,1.0276064475,1.0023087343,-0.0045107118,0.029808425 334 | 333,0.9840177039,1.002171492,0.0005397945,-0.0186935825 335 | 334,1.0194630364,1.0020332875,-0.0160543975,0.0334841463 336 | 335,1.0151337521,1.0018940287,-0.0022162598,0.0154559832 337 | 336,0.9979579296,1.001753623,-0.0156520863,0.011856393 338 | 337,1.079113854,1.0016119781,-0.0118076973,0.0893095732 339 | 338,1.0277979203,1.0014757453,-0.0026811069,0.0290032819 340 | 339,0.9908364276,1.0013509982,-0.02641932,0.0159047494 341 | 340,1.04487997,1.0012367777,0.0382263195,0.0054168727 342 | 341,0.9606428897,1.0011321249,-0.0022538447,-0.0382353905 343 | 342,0.9620338671,1.0010360809,-0.0015838074,-0.0374184064 344 | 343,1.0215309464,1.0009476866,0.0151624536,0.0054208062 345 | 344,0.9406582426,1.0008659831,0.0043056421,-0.0645133825 346 | 345,0.9695559518,1.0007900113,-0.0214236102,-0.0098104494 347 | 346,0.9932004662,1.0007188125,-0.0328671377,0.0253487914 348 | 347,0.9841530043,1.0006514274,0.0158419647,-0.0323403879 349 | 348,0.9426658951,1.0005868973,0.0043220563,-0.0622430585 350 | 349,1.0065771572,1.0005242631,-0.0010555261,0.0071084202 351 | 350,1.0094663699,1.0004625659,0.0070563415,0.0019474625 352 | 351,1.0787779747,1.0004008466,0.0154937906,0.0628833375 353 | 352,1.007548061,1.0003381463,-0.0086035089,0.0158134236 354 | 353,0.9980195886,1.0002735061,0.0015752665,-0.0038291839 355 | 354,1.033916279,1.0002059669,-0.0075328996,0.0412432117 356 | 355,1.036867461,1.0001345698,0.0085371416,0.0281957496 357 | 356,1.0358086894,1.0000583558,0.0147545323,0.0209958013 358 | 357,0.9975302848,0.999976366,-0.0092161932,0.006770112 359 | 358,1.0873617079,0.9998876414,0.0244922553,0.0629818112 360 | 359,1.0757644649,0.9997975373,0.008721065,0.0672458625 361 | 360,0.9744635013,0.9997118499,-0.0158233398,-0.0094250088 362 | 361,0.9378122442,0.9996302808,-0.0077028034,-0.0541152331 363 | 362,0.9378416776,0.9995525319,0.0026406323,-0.0643514865 364 | 363,0.9611670383,0.999478305,-0.0246971525,-0.0136141142 365 | 364,1.0529271511,0.9994073019,0.0005377801,0.0529820691 366 | 365,0.9911749771,0.9993392245,0.0014728048,-0.0096370522 367 | 366,0.950038757,0.9992737745,-0.0075284439,-0.0417065737 368 | 367,0.9376755024,0.9992106539,0.0024930575,-0.064028209 369 | 368,0.9623834747,0.9991495643,-0.0033137196,-0.03345237 370 | 369,0.9962524998,0.9990902076,0.0204661666,-0.0233038743 371 | 370,0.9651750704,0.9990322856,0.009164179,-0.0430213942 372 | 371,0.9469736097,0.9989755002,0.001386416,-0.0533883066 373 | 372,1.0189327196,0.9989195532,-0.0007036853,0.0207168518 374 | 373,1.0361800209,0.9988641463,0.0135591548,0.0237567198 375 | 374,0.8974192389,0.9988089814,0.0074569303,-0.1088466728 376 | 375,1.0330899024,0.9987537603,-0.0135936511,0.0479297931 377 | 376,1.109776512,0.9986981848,0.0249317525,0.0861465746 378 | 377,0.9805183806,0.9986419568,0.0018502108,-0.019973787 379 | 378,0.9669526366,0.998584778,-0.0190907967,-0.0125413448 380 | 379,0.8817996357,0.9985263503,-0.0167235619,-0.1000031528 381 | 380,1.0112250489,0.9984623622,-0.0017173385,0.0144800252 382 | 381,1.0077049343,0.9983893373,-0.0087142018,0.0180297987 383 | 382,0.930212895,0.9983082305,-0.0069707665,-0.061124569 384 | 383,1.0279268578,0.9982199965,-0.004114355,0.0338212163 385 | 384,0.9830877706,0.9981255901,-0.0049816256,-0.0100561939 386 | 385,0.9707569077,0.9980259659,-0.013520456,-0.0137486021 387 | 386,1.087271199,0.9979220787,-0.0057691031,0.0951182233 388 | 387,0.9815295912,0.9978148833,-0.0232690029,0.0069837108 389 | 388,0.9399467248,0.9977053344,-0.0212036147,-0.0365549949 390 | 389,1.0675904085,0.9975943868,0.006711992,0.0632840297 391 | 390,0.9642617071,0.9974829952,-0.0108807738,-0.0223405143 392 | 391,1.0130301909,0.9973721143,0.0048387305,0.010819346 393 | 392,0.9991494587,0.9972626989,-0.022203864,0.0240906239 394 | 393,1.0527225872,0.9971557038,0.0311016526,0.0244652309 395 | 394,0.977677473,0.9970520836,0.015657704,-0.0350323147 396 | 395,1.0206382141,0.9969527932,0.0043402687,0.0193451522 397 | 396,1.0342177709,0.9968587872,0.0592379112,-0.0218789275 398 | 397,0.8958929179,0.9967710204,-0.026523284,-0.0743548186 399 | 398,1.0415647466,0.9966904476,0.0149120043,0.0299622947 400 | 399,1.0111577544,0.9966180235,0.0046947455,0.0098449854 401 | 400,0.9029574174,0.9965547028,-0.0036551089,-0.0899421766 402 | 401,0.9876202186,0.9964944442,-0.0244029324,0.0155287069 403 | 402,1.0071399145,0.9964309193,-0.0094192814,0.0201282765 404 | 403,0.8926002061,0.9963646531,0.0093403147,-0.1131047617 405 | 404,1.003806736,0.9962961702,-0.0103307577,0.0178413234 406 | 405,1.0026276367,0.9962259954,0.0050585605,0.0013430809 407 | 406,1.0640378251,0.9961546534,0.0377966767,0.030086495 408 | 407,1.0202341207,0.9960826689,-0.0094821177,0.0336335695 409 | 408,1.000367361,0.9960105667,0.0026570641,0.0016997303 410 | 409,0.9475850447,0.9959388715,-0.0217006935,-0.0266531332 411 | 410,0.9255042481,0.995868108,-0.0081797411,-0.0621841188 412 | 411,0.9813830401,0.995798801,-0.0055785236,-0.0088372373 413 | 412,0.9693187435,0.9957314752,0.0126625513,-0.0390752831 414 | 413,1.0246304308,0.9956666554,-0.0059258503,0.0348896257 415 | 414,1.0164351876,0.9956048663,0.0225569843,-0.001726663 416 | 415,0.9713310197,0.9955466326,-0.0047232735,-0.0194923394 417 | 416,1.1178683556,0.995492479,0.0283868511,0.0939890256 418 | 417,1.0368586321,0.9954429303,-0.0063654535,0.0477811553 419 | 418,0.9715568169,0.9953985113,-0.0077047346,-0.0161369598 420 | 419,0.9988936139,0.9953597466,-0.0053753803,0.0089092475 421 | 420,1.0124030058,0.9953271611,-0.0122947478,0.0293705926 422 | 421,1.0472152047,0.9953012793,0.0210261672,0.0308877582 423 | 422,0.9577276103,0.9952835632,-0.0180337605,-0.0195221925 424 | 423,1.026570648,0.995274636,-0.0064619564,0.0377579683 425 | 424,1.0788696599,0.9952737646,0.0115868483,0.072009047 426 | 425,0.9841148633,0.9952802159,0.037821602,-0.0489869546 427 | 426,0.9413020697,0.9952932568,-0.0102684381,-0.043722749 428 | 427,0.9701496217,0.9953121541,0.0252004326,-0.0503629649 429 | 428,0.9601538169,0.9953361748,0.0010731428,-0.0362555006 430 | 429,1.0313334813,0.9953645858,0.0017973523,0.0341715432 431 | 430,1.0837032095,0.9953966539,-0.031610808,0.1199173636 432 | 431,1.1000406524,0.9954316461,0.0051714989,0.0994375074 433 | 432,1.0296699463,0.9954688293,0.0166142647,0.0175868523 434 | 433,1.0630639581,0.9955074704,-0.000595781,0.0681522687 435 | 434,1.0135593018,0.9955468362,-0.0012233382,0.0192358038 436 | 435,1.0532265412,0.9955861936,0.0080929,0.0495474475 437 | 436,0.9056018802,0.9956248097,-0.024380246,-0.0656426835 438 | 437,1.0012874672,0.9956619511,-0.0204766138,0.0261021299 439 | 438,1.0251756955,0.9956968849,0.0049337998,0.0245450108 440 | 439,0.9939456946,0.995728878,0.0311999487,-0.032983132 441 | 440,0.9762003507,0.9957571972,0.0040338285,-0.023590675 442 | 441,1.0345173383,0.9957811094,-0.0036887114,0.0424249402 443 | 442,0.9305444088,0.9957998816,-0.0238815954,-0.0413738774 444 | 443,0.9821559653,0.9958213423,-0.0091209647,-0.0045444123 445 | 444,0.8624277183,0.9958531682,-0.0127638531,-0.1206615968 446 | 445,0.9589705792,0.9958943983,-0.0179477442,-0.0189760749 447 | 446,0.9553036806,0.9959440715,-0.0296667639,-0.010973627 448 | 447,1.0779290932,0.9960012268,0.003538472,0.0783893944 449 | 448,0.9257918652,0.9960649031,-0.0023950796,-0.0678779583 450 | 449,1.0271106664,0.9961341394,0.030106469,0.0008700581 451 | 450,1.0264928756,0.9962079746,-0.0241312407,0.0544161416 452 | 451,0.9336180053,0.9962854477,0.0057858396,-0.068453282 453 | 452,1.0314076694,0.9963655976,0.0036642786,0.0313777931 454 | 453,0.9363615891,0.9964474633,-0.0232337065,-0.0368521678 455 | 454,1.0075009906,0.9965300838,0.0196971409,-0.008726234 456 | 455,1.039844434,0.9966124979,0.011344156,0.0318877801 457 | 456,0.9346073797,0.9966937447,0.0116078529,-0.073694218 458 | 457,0.99884521,0.9967728632,0.0144689447,-0.0123965979 459 | 458,0.9764297352,0.9968488922,-0.0016111534,-0.0188080035 460 | 459,0.9887835613,0.9969208707,-0.0388284674,0.0306911581 461 | 460,1.059131559,0.9969878376,0.022225182,0.0399185394 462 | 461,0.9652057576,0.997048832,0.0136665505,-0.0455096249 463 | 462,0.8995021538,0.9971028928,0.0124475645,-0.1100483034 464 | 463,1.0790258883,0.9971490589,-0.0066364067,0.088513236 465 | 464,0.985054076,0.9971906001,-0.0065149125,-0.0056216116 466 | 465,0.976530881,0.9972316101,0.0194935787,-0.0401943078 467 | 466,0.9858627607,0.9972723632,0.01253952,-0.0239491225 468 | 467,1.0211878997,0.9973131341,-0.0125407748,0.0364155404 469 | 468,1.0086210578,0.9973541972,0.0132588349,-0.0019919743 470 | 469,0.9881895098,0.9973958272,-0.001361852,-0.0078444654 471 | 470,0.8689612386,0.9974382985,-0.0030814993,-0.1253955607 472 | 471,0.9353914695,0.9974818857,0.0206402901,-0.0827307063 473 | 472,1.0014267369,0.9975268633,0.0147839197,-0.0108840461 474 | 473,0.9987873518,0.9975735058,-0.0290318571,0.0302457031 475 | 474,1.0164465936,0.9976220879,0.0199328156,-0.0011083099 476 | 475,1.0029669492,0.9976728839,0.0076647966,-0.0023707313 477 | 476,1.0407616592,0.9977261685,-0.0043293601,0.0473648508 478 | 477,0.93271698,0.9977822161,-0.0197656477,-0.0452995884 479 | 478,0.9937199395,0.9978413014,0.0224734244,-0.0265947863 480 | 479,1.0496181665,0.9979036988,0.0080391185,0.0436753492 481 | 480,0.9191803133,0.9979696829,-0.0189556197,-0.0598337499 482 | 481,1.0148087435,0.9980395282,0.0040757806,0.0126934347 483 | 482,0.9339817345,0.9981135093,-0.0426337231,-0.0214980517 484 | 483,1.0395009735,0.9981919006,0.0176110006,0.0236980722 485 | 484,1.0309463462,0.9982749768,-0.0066196142,0.0392909836 486 | 485,0.9674163793,0.9983544537,0.0193776243,-0.0503156987 487 | 486,0.9938363383,0.9984227705,-0.0023767933,-0.0022096389 488 | 487,1.0866628309,0.9984812861,0.006502641,0.0816789038 489 | 488,1.0283398137,0.9985313595,0.0036564335,0.0261520206 490 | 489,1.0711656836,0.9985743499,0.0001347916,0.0724565421 491 | 490,0.9276384246,0.9986116163,-0.0045107118,-0.0664624799 492 | 491,1.0155525428,0.9986445177,0.0005397945,0.0163682307 493 | 492,1.0454251578,0.9986744132,-0.0160543975,0.0628051421 494 | 493,1.0178972505,0.9987026618,-0.0022162598,0.0214108485 495 | 494,0.9202449564,0.9987306225,-0.0156520863,-0.0628335798 496 | 495,0.9965996239,0.9987596545,-0.0118076973,0.0096476667 497 | 496,0.9361280613,0.9987911167,-0.0026811069,-0.0599819485 498 | 497,0.9168959301,0.9988263682,-0.02641932,-0.0555111181 499 | 498,1.0568052041,0.9988667681,0.0382263195,0.0197121165 500 | 499,1.0825996565,0.9989136754,-0.0022538447,0.0859398259 501 | 500,0.9609577071,0.9989684491,-0.0015838074,-0.0364269346 502 | 501,1.0107318521,0.9990324483,0.0151624536,-0.0034630498 503 | 502,1.0150211848,0.999107032,0.0043056421,0.0116085108 504 | 503,1.0405025787,0.9991935593,-0.0214236102,0.0627326296 505 | 504,0.9889705297,0.9992933892,-0.0328671377,0.0225442782 506 | 505,0.9857074837,0.9994078808,0.0158419647,-0.0295423619 507 | 506,1.0482679187,0.9995278945,0.0043220563,0.0444179679 508 | 507,1.0292631482,0.9996436541,-0.0010555261,0.0306750201 509 | 508,1.0534638033,0.9997555638,0.0070563415,0.0466518981 510 | 509,0.9724533427,0.9998640277,0.0154937906,-0.0429044756 511 | 510,1.0103343645,0.99996945,-0.0086035089,0.0189684234 512 | 511,0.9775067733,1.0000722349,0.0015752665,-0.0241407281 513 | 512,0.9622477604,1.0001727866,-0.0075328996,-0.0303921266 514 | 513,1.0232664994,1.0002715091,0.0085371416,0.0144578486 515 | 514,1.0409508527,1.0003688068,0.0147545323,0.0258275136 516 | 515,0.9884097728,1.0004650837,-0.0092161932,-0.0028391176 517 | 516,0.9509034725,1.000560744,0.0244922553,-0.0741495267 518 | 517,1.0198595379,1.000656192,0.008721065,0.010482281 519 | 518,1.0070085079,1.0007518317,-0.0158233398,0.0220800161 520 | 519,0.9461700798,1.0008480673,-0.0077028034,-0.046975184 521 | 520,1.0182735407,1.000945303,0.0026406323,0.0146876054 522 | 521,1.0107013918,1.001043943,-0.0246971525,0.0343546013 523 | 522,0.9068229258,1.0011443915,0.0005377801,-0.0948592459 524 | 523,0.9639385123,1.0012470526,0.0014728048,-0.038781345 525 | 524,1.072179755,1.0013523304,-0.0075284439,0.0783558685 526 | 525,1.0185793458,1.0014606292,0.0024930575,0.0146256591 527 | 526,0.9717977232,1.0015723531,-0.0033137196,-0.0264609103 528 | 527,1.048988446,1.0016886571,0.0204661666,0.0268336224 529 | 528,0.9449337514,1.0018099286,0.009164179,-0.0660403562 530 | 529,1.0125127501,1.0019354207,0.001386416,0.0091909134 531 | 530,1.0191412157,1.0020643864,-0.0007036853,0.0177805145 532 | 531,1.0057272962,1.0021960788,0.0135591548,-0.0100279375 533 | 532,1.0296021736,1.0023297509,0.0074569303,0.0198154923 534 | 533,0.9943425467,1.0024646557,-0.0135936511,0.0054715421 535 | 534,0.9241748929,1.0026000462,0.0249317525,-0.1033569058 536 | 535,1.2009617617,1.0027351755,0.0018502108,0.1963763755 537 | 536,0.9627906786,1.0028692965,-0.0190907967,-0.0209878213 538 | 537,1.0154346233,1.0030016624,-0.0167235619,0.0291565228 539 | 538,0.9818689776,1.0031315261,-0.0017173385,-0.01954521 540 | 539,0.9397270672,1.0032581407,-0.0087142018,-0.0548168717 541 | 540,1.0132230403,1.0033807592,-0.0069707665,0.0168130477 542 | 541,1.0931991219,1.0034986346,-0.004114355,0.0938148423 543 | 542,0.9949411126,1.00361102,-0.0049816256,-0.0036882817 544 | 543,1.0541781301,1.0037171683,-0.013520456,0.0639814178 545 | 544,0.9976032421,1.0038163327,-0.0057691031,-0.0004439875 546 | 545,0.9050789087,1.0039077661,-0.0232690029,-0.0755598546 547 | 546,1.0279000811,1.0039907216,-0.0212036147,0.0451129743 548 | 547,0.9868081291,1.0040644522,0.006711992,-0.0239683151 549 | 548,0.9453752356,1.0041327043,-0.0108807738,-0.0478766949 550 | 549,1.027073822,1.004199696,0.0048387305,0.0180353954 551 | 550,1.0262019846,1.0042653877,-0.022203864,0.044140461 552 | 551,1.0337210514,1.0043297396,0.0311016526,-0.0017103408 553 | 552,1.0772465448,1.0043927122,0.015657704,0.0571961285 554 | 553,1.0078384064,1.0044542659,0.0043402687,-0.0009561281 555 | 554,1.0035936845,1.0045143609,0.0592379112,-0.0601585876 556 | 555,1.0011410081,1.0045729576,-0.026523284,0.0230913344 557 | 556,0.9748925401,1.0046300164,0.0149120043,-0.0446494807 558 | 557,0.9938967767,1.0046854977,0.0046947455,-0.0154834665 559 | 558,0.9193409204,1.0047393618,-0.0036551089,-0.0817433325 560 | 559,0.936021493,1.004791569,-0.0244029324,-0.0443671436 561 | 560,1.0642798127,1.0048420798,-0.0094192814,0.0688570143 562 | 561,1.0540436996,1.0048908545,0.0093403147,0.0398125305 563 | 562,0.9913333662,1.0049378534,-0.0103307577,-0.0032737295 564 | 563,1.0593508412,1.0049830369,0.0050585605,0.0493092438 565 | 564,1.0612177762,1.0050263653,0.0377966767,0.0183947342 566 | 565,0.9282273139,1.0050677991,-0.0094821177,-0.0673583675 567 | 566,1.0475593455,1.0051072986,0.0026570641,0.0397949829 568 | 567,0.9989150403,1.0051448241,-0.0217006935,0.0154709097 569 | 568,0.9682614355,1.005180336,-0.0081797411,-0.0287391594 570 | 569,1.0611087484,1.0052115763,-0.0055785236,0.0614756957 571 | 570,1.0321307099,1.0052366298,0.0126625513,0.0142315288 572 | 571,0.8626015549,1.0052559709,-0.0059258503,-0.1367285657 573 | 572,0.976795255,1.0052700739,0.0225569843,-0.0510318032 574 | 573,0.9908601862,1.0052794132,-0.0047232735,-0.0096959535 575 | 574,1.0350180173,1.0052844633,0.0283868511,0.0013467029 576 | 575,0.9845929187,1.0052856986,-0.0063654535,-0.0143273263 577 | 576,0.9476046369,1.0052835933,-0.0077047346,-0.0499742218 578 | 577,1.016732369,1.005278622,-0.0053753803,0.0168291273 579 | 578,1.0217961748,1.0052712589,-0.0122947478,0.0288196637 580 | 579,0.9759505202,1.0052619786,0.0210261672,-0.0503376256 581 | 580,1.0851259091,1.0052512553,-0.0180337605,0.0979084143 582 | 581,0.9814634966,1.0052395635,-0.0064619564,-0.0173141105 583 | 582,1.0526105193,1.0052273775,0.0115868483,0.0357962934 584 | 583,1.0554464565,1.0052151718,0.037821602,0.0124096827 585 | 584,1.0009026188,1.0052034208,-0.0102684381,0.0059676361 586 | 585,1.0639550335,1.0051925988,0.0252004326,0.0335620021 587 | 586,0.9247777943,1.0051831802,0.0010731428,-0.0814785287 588 | 587,1.0212017243,1.0051756394,0.0017973523,0.0142287326 589 | 588,0.9397741182,1.0051704508,-0.031610808,-0.0337855246 590 | 589,0.9989417685,1.0051680888,0.0051714989,-0.0113978192 591 | 590,1.0605926724,1.0051641064,0.0166142647,0.0388143013 592 | 591,1.0166144074,1.0051539881,-0.000595781,0.0120562002 593 | 592,1.0539213692,1.0051381056,-0.0012233382,0.0500066018 594 | 593,1.0512993668,1.0051168305,0.0080929,0.0380896363 595 | 594,1.0086229934,1.0050905345,-0.024380246,0.0279127049 596 | 595,1.0397604016,1.0050595893,-0.0204766138,0.055177426 597 | 596,1.0220054997,1.0050243667,0.0049337998,0.0120473332 598 | 597,0.9586390671,1.0049852382,0.0311999487,-0.0775461198 599 | 598,1.029838224,1.0049425757,0.0040338285,0.0208618198 600 | 599,1.0372516656,1.0048967506,-0.0036887114,0.0360436263 601 | 600,0.8487211943,1.0048481349,-0.0238815954,-0.1322453451 602 | 601,0.9118954099,1.0047971,-0.0091209647,-0.0837807254 603 | 602,1.0206957323,1.0047440178,-0.0127638531,0.0287155676 604 | 603,1.0422837422,1.0046892599,-0.0179477442,0.0555422265 605 | 604,0.9652639533,1.004633198,-0.0296667639,-0.0097024807 606 | 605,0.9845848237,1.0045762037,0.003538472,-0.023529852 607 | 606,1.0597641349,1.0045186488,-0.0023950796,0.0576405657 608 | 607,0.9544362613,1.0044609049,0.030106469,-0.0801311126 609 | 608,1.0057518426,1.0044033438,-0.0241312407,0.0254797394 610 | 609,1.0269936008,1.0043463371,0.0057858396,0.0168614241 611 | 610,1.1170900856,1.0042902565,0.0036642786,0.1091355505 612 | 611,0.990457585,1.0042357497,-0.0232337065,0.0094555417 613 | 612,1.0230520851,1.0041829897,0.0196971409,-0.0008280454 614 | 613,0.9907952742,1.0041316356,0.011344156,-0.0246805174 615 | 614,1.1104254978,1.0040813468,0.0116078529,0.0947362981 616 | 615,1.0522316913,1.0040317824,0.0144689447,0.0337309642 617 | 616,0.9606574849,1.0039826018,-0.0016111534,-0.0417139636 618 | 617,0.9972544953,1.0039334643,-0.0388284674,0.0321494984 619 | 618,1.0126155984,1.003884029,0.022225182,-0.0134936126 620 | 619,1.0659602992,1.0038339553,0.0136665505,0.0484597934 621 | 620,0.9817774976,1.0037829024,0.0124475645,-0.0344529693 622 | 621,1.0500669045,1.0037305296,-0.0066364067,0.0529727815 623 | 622,0.9229673563,1.0036764962,-0.0065149125,-0.0741942275 624 | 623,0.9665023886,1.0036204614,0.0194935787,-0.0566116514 625 | 624,1.0177618726,1.0035620844,0.01253952,0.0016602682 626 | 625,1.0122791373,1.0035010246,-0.0125407748,0.0213188875 627 | 626,1.0407680669,1.0034369412,0.0132588349,0.0240722908 628 | 627,0.926490593,1.0033694935,-0.001361852,-0.0755170485 629 | 628,1.0461204535,1.0032983407,-0.0030814993,0.0459036121 630 | 629,1.0679942617,1.0032231422,0.0206402901,0.0441308295 631 | 630,1.0023818909,1.0031435571,0.0147839197,-0.0155455859 632 | 631,0.993014231,1.0030592447,-0.0290318571,0.0189868434 633 | 632,1.0268385482,1.0029750484,0.0199328156,0.0039306842 634 | 633,1.0357043804,1.0028955844,0.0076647966,0.0251439994 635 | 634,0.8996111586,1.0028201718,-0.0043293601,-0.0988796531 636 | 635,1.0676940824,1.0027481295,-0.0197656477,0.0847116005 637 | 636,1.0694438763,1.0026787766,0.0224734244,0.0442916753 638 | 637,1.0820109098,1.0026114319,0.0080391185,0.0713603594 639 | 638,0.9518851805,1.0025454146,-0.0189556197,-0.0317046143 640 | 639,0.9175084487,1.0024800434,0.0040757806,-0.0890473753 641 | 640,0.9831704288,1.0024146374,-0.0426337231,0.0233895145 642 | 641,0.9737779914,1.0023485157,0.0176110006,-0.0461815249 643 | 642,0.9269209895,1.002280997,-0.0066196142,-0.0687403934 644 | 643,1.0893013411,1.0022114006,0.0193776243,0.0677123163 645 | 644,0.9959132402,1.0021390452,-0.0023767933,-0.0038490117 646 | 645,1.0275253288,1.0020632499,0.006502641,0.0189594379 647 | 646,0.9604933912,1.0019833336,0.0036564335,-0.0451463758 648 | 647,0.9610575818,1.0018986153,0.0001347916,-0.0409758251 649 | 648,0.9230722063,1.0018084141,-0.0045107118,-0.074225496 650 | 649,1.0243323074,1.0017120488,0.0005397945,0.0220804642 651 | 650,0.9259604018,1.0016088385,-0.0160543975,-0.0595940392 652 | 651,1.0637417198,1.001498102,-0.0022162598,0.0644598776 653 | 652,0.9809147632,1.0013791585,-0.0156520863,-0.004812309 654 | 653,0.9303685401,1.0012532947,-0.0118076973,-0.0590770573 655 | 654,1.0920198992,1.0011224573,-0.0026811069,0.0935785488 656 | 655,1.0937458784,1.0009869551,-0.02641932,0.1191782433 657 | 656,1.0222684829,1.000847097,0.0382263195,-0.0168049336 658 | 657,0.9757406548,1.0007031918,-0.0022538447,-0.0227086923 659 | 658,1.0627953675,1.0005555483,-0.0015838074,0.0638236266 660 | 659,1.054798337,1.0004044753,0.0151624536,0.0392314082 661 | 660,0.9972818961,1.0002502816,0.0043056421,-0.0072740275 662 | 661,1.0032067799,1.000093276,-0.0214236102,0.0245371141 663 | 662,0.9583616432,0.9999337674,-0.0328671377,-0.0087049866 664 | 663,1.0577083409,0.9997720646,0.0158419647,0.0420943116 665 | 664,0.9995117777,0.9996084763,0.0043220563,-0.0044187549 666 | 665,0.9289600951,0.9994433114,-0.0010555261,-0.0694276902 667 | 666,0.9666579167,0.9992768788,0.0070563415,-0.0396753035 668 | 667,0.9869905155,0.9991094871,0.0154937906,-0.0276127622 669 | 668,0.9379441505,0.9989414453,-0.0086035089,-0.052393786 670 | 669,0.9843761872,0.9987730622,0.0015752665,-0.0159721414 671 | 670,1.0292566616,0.9986046465,-0.0075328996,0.0381849146 672 | 671,1.0110058071,0.9984365071,0.0085371416,0.0040321583 673 | 672,1.0160983452,0.9982689528,0.0147545323,0.0030748601 674 | 673,0.9937198571,0.9981022925,-0.0092161932,0.0048337578 675 | 674,1.0072424341,0.9979328691,0.0244922553,-0.0151826902 676 | 675,0.9424736769,0.9977571752,0.008721065,-0.0640045633 677 | 676,1.0019386242,0.997575744,-0.0158233398,0.02018622 678 | 677,0.9651522535,0.9973891085,-0.0077028034,-0.0245340516 679 | 678,1.0275591589,0.9971978018,0.0026406323,0.0277207249 680 | 679,0.9797029294,0.997002357,-0.0246971525,0.0073977249 681 | 680,0.9838053396,0.9968033072,0.0005377801,-0.0135357478 682 | 681,0.9503321055,0.9966011855,0.0014728048,-0.0477418848 683 | 682,0.9034583785,0.996396525,-0.0075284439,-0.0854097026 684 | 683,0.9570006516,0.9961898587,0.0024930575,-0.0416822646 685 | 684,1.088964415,0.9959817198,-0.0033137196,0.0962964148 686 | 685,1.068929104,0.9957726414,0.0204661666,0.0526902961 687 | 686,1.0697725266,0.9955631564,0.009164179,0.0650451912 688 | 687,1.0030240797,0.9953537982,0.001386416,0.0062838656 689 | 688,0.896379672,0.9951450996,-0.0007036853,-0.0980617423 690 | 689,0.9662195114,0.9949375938,0.0135591548,-0.0422772372 691 | 690,1.0407864703,0.9947318139,0.0074569303,0.038597726 692 | 691,0.9795097939,0.9945282931,-0.0135936511,-0.0014248482 693 | 692,1.0801403961,0.9943275643,0.0249317525,0.0608810793 694 | 693,0.9940135709,0.9941301607,0.0018502108,-0.0019668005 695 | 694,1.06054901,0.9939366153,-0.0190907967,0.0857031914 696 | 695,0.9847762848,0.9937507293,-0.0167235619,0.0077491173 697 | 696,0.9867011186,0.9935753459,-0.0017173385,-0.0051568888 698 | 697,0.972908071,0.9934095608,-0.0087142018,-0.0117872881 699 | 698,0.9988672866,0.9932524703,-0.0069707665,0.0125855829 700 | 699,0.9501748559,0.9931031702,-0.004114355,-0.0388139592 701 | 700,1.0127437057,0.9929607564,-0.0049816256,0.0247645748 702 | 701,1.0338961934,0.9928243251,-0.013520456,0.0545923243 703 | 702,0.9661710292,0.9926929722,-0.0057691031,-0.02075284 704 | 703,1.0336412513,0.9925657937,-0.0232690029,0.0643444606 705 | 704,0.9987241756,0.9924418855,-0.0212036147,0.0274859048 706 | 705,1.0204132906,0.9923203436,0.006711992,0.021380955 707 | 706,0.9751977478,0.9922002641,-0.0108807738,-0.0061217426 708 | 707,0.9729290685,0.9920807429,0.0048387305,-0.0239904049 709 | 708,0.9612770645,0.991960876,-0.022203864,-0.0084799475 710 | 709,0.9788066033,0.9918397593,0.0311016526,-0.0441348086 711 | 710,1.0310573057,0.9917164889,0.015657704,0.0236831127 712 | 711,0.9576324799,0.9915901608,0.0043402687,-0.0382979496 713 | 712,0.975009692,0.9914598709,0.0592379112,-0.0756880901 714 | 713,1.0787150854,0.9913247153,-0.026523284,0.1139136541 715 | 714,0.9952726181,0.9911837898,0.0149120043,-0.010823176 716 | 715,1.0471365955,0.9910361905,0.0046947455,0.0514056595 717 | 716,0.9495675621,0.9908978844,-0.0036551089,-0.0376752134 718 | 717,1.039247176,0.9907841401,-0.0244029324,0.0728659684 719 | 718,0.8785210301,0.990693006,-0.0094192814,-0.1027526945 720 | 719,1.0366470018,0.9906225307,0.0093403147,0.0366841564 721 | 720,1.0169764602,0.9905707625,-0.0103307577,0.0367364554 722 | 721,0.9869431757,0.99053575,0.0050585605,-0.0086511348 723 | 722,0.978107925,0.9905155415,0.0377966767,-0.0502042932 724 | 723,0.9539871451,0.9905081855,-0.0094821177,-0.0270389227 725 | 724,0.976213168,0.9905117304,0.0026570641,-0.0169556265 726 | 725,0.9842984331,0.9905242248,-0.0217006935,0.0154749018 727 | 726,0.9900304642,0.990543717,-0.0081797411,0.0076664883 728 | 727,0.9042825211,0.9905682556,-0.0055785236,-0.0807072109 729 | 728,1.063060135,0.9905958889,0.0126625513,0.0598016949 730 | 729,1.0263261832,0.9906246654,-0.0059258503,0.0416273682 731 | 730,1.0229756911,0.9906526335,0.0225569843,0.0097660732 732 | 731,1.0574944399,0.9906778418,-0.0047232735,0.0715398716 733 | 732,0.9894399259,0.9906983386,0.0283868511,-0.0296452638 734 | 733,0.9630187044,0.9907121724,-0.0063654535,-0.0213280145 735 | 734,0.9689616967,0.9907173917,-0.0077047346,-0.0140509604 736 | 735,0.9698991919,0.9907120449,-0.0053753803,-0.0154374727 737 | 736,0.9592832923,0.9906941804,-0.0122947478,-0.0191161403 738 | 737,1.0927230526,0.9906775771,0.0210261672,0.0810193084 739 | 738,0.987028362,0.9906767488,-0.0180337605,0.0143853737 740 | 739,0.9797217299,0.9906908468,-0.0064619564,-0.0045071606 741 | 740,0.9205691189,0.9907190222,0.0115868483,-0.0817367516 742 | 741,1.0262125524,0.9907604262,0.037821602,-0.0023694758 743 | 742,1.0312674174,0.9908142099,-0.0102684381,0.0507216456 744 | 743,0.9693720352,0.9908795245,0.0252004326,-0.0467079219 745 | 744,0.9492282308,0.9909555211,0.0010731428,-0.0428004331 746 | 745,0.9294529605,0.991041351,0.0017973523,-0.0633857428 747 | 746,0.9349399302,0.9911361653,-0.031610808,-0.024585427 748 | 747,0.9639593212,0.9912391151,0.0051714989,-0.0324512927 749 | 748,0.9176429562,0.9913493516,0.0166142647,-0.0903206601 750 | 749,1.0260886417,0.9914660259,-0.000595781,0.0352183967 751 | 750,0.9927050044,0.9915882893,-0.0012233382,0.0023400532 752 | 751,0.9635044074,0.9917152929,0.0080929,-0.0363037856 753 | 752,0.9016574516,0.9918461879,-0.024380246,-0.0658084903 754 | 753,0.9644823476,0.9919801254,-0.0204766138,-0.007021164 755 | 754,1.0057743657,0.9921162565,0.0049337998,0.0087243094 756 | 755,0.9819741643,0.9922537325,0.0311999487,-0.0414795169 757 | 756,0.9839230859,0.9923917045,0.0040338285,-0.0125024471 758 | 757,0.891120372,0.9925293237,-0.0036887114,-0.0977202404 759 | 758,0.9242431174,0.9926582895,-0.0238815954,-0.0445335766 760 | 759,1.0223352307,0.9927722541,-0.0091209647,0.0386839413 761 | 760,0.951527905,0.9928732978,-0.0127638531,-0.0285815396 762 | 761,1.0394246655,0.9929635009,-0.0179477442,0.0644089088 763 | 762,0.9345659999,0.9930449437,-0.0296667639,-0.0288121799 764 | 763,0.9463201285,0.9931197065,0.003538472,-0.05033805 765 | 764,1.0120787341,0.9931898696,-0.0023950796,0.0212839441 766 | 765,1.057071669,0.9932575133,0.030106469,0.0337076867 767 | 766,0.9296886665,0.9933247179,-0.0241312407,-0.0395048107 768 | 767,0.9627666484,0.9933935637,0.0057858396,-0.0364127548 769 | 768,1.0179583695,0.993466131,0.0036642786,0.0208279599 770 | 769,1.0190735455,0.9935445,-0.0232337065,0.048762752 771 | 770,0.9794703048,0.9936307511,0.0196971409,-0.0338575871 772 | 771,1.0064062621,0.9937269646,0.011344156,0.0013351415 773 | 772,0.9689762131,0.9938352207,0.0116078529,-0.0364668605 774 | 773,1.013429528,0.9939575998,0.0144689447,0.0050029835 775 | 774,1.0292805003,0.9940961822,-0.0016111534,0.0367954715 776 | 775,0.9683875427,0.9942530481,-0.0388284674,0.012962962 777 | 776,0.9566501837,0.9944302779,0.022225182,-0.0600052761 778 | 777,1.0141706436,0.9946299518,0.0136665505,0.0058741413 779 | 778,0.9785615922,0.9948541502,0.0124475645,-0.0287401224 780 | 779,0.9371125042,0.9950745068,-0.0066364067,-0.0513255959 781 | 780,1.0241602921,0.9952633554,-0.0065149125,0.0354118492 782 | 781,1.0547327448,0.995423826,0.0194935787,0.0398153401 783 | 782,1.0401985036,0.9955590487,0.01253952,0.0320999349 784 | 783,0.9746557685,0.9956721537,-0.0125407748,-0.0084756104 785 | 784,0.936317877,0.995766271,0.0132588349,-0.0727072289 786 | 785,0.9985642604,0.9958445306,-0.001361852,0.0040815818 787 | 786,1.0506840103,0.9959100628,-0.0030814993,0.0578554468 788 | 787,1.0333042459,0.9959659976,0.0206402901,0.0166979582 789 | 788,1.0777468868,0.996015465,0.0147839197,0.0669475021 790 | 789,0.8494269474,0.9960615952,-0.0290318571,-0.1176027907 791 | 790,0.9656987605,0.9961075183,0.0199328156,-0.0503415734 792 | 791,1.0125743821,0.9961563643,0.0076647966,0.0087532213 793 | 792,1.0470970627,0.9962112633,-0.0043293601,0.0552151594 794 | 793,0.9536157504,0.9962753455,-0.0197656477,-0.0228939475 795 | 794,1.0105293309,0.996351741,0.0224734244,-0.0082958344 796 | 795,0.9949892522,0.9964435797,0.0080391185,-0.009493446 797 | 796,0.9188126863,0.9965539919,-0.0189556197,-0.0587856859 798 | 797,1.0392429855,0.9966861075,0.0040757806,0.0384810974 799 | 798,0.95691809,0.9968430568,-0.0426337231,0.0027087563 800 | 799,0.947788008,0.9970279697,0.0176110006,-0.0668509624 801 | 800,1.0689282563,0.9972203991,-0.0066196142,0.0783274713 802 | 801,1.0527014997,0.9973983536,0.0193776243,0.0359255219 803 | 802,1.1039815648,0.9975626465,-0.0023767933,0.1087957115 804 | 803,1.0579188572,0.9977140916,0.006502641,0.0537021246 805 | 804,1.0123659486,0.9978535023,0.0036564335,0.0108560127 806 | 805,0.9972597151,0.9979816923,0.0001347916,-0.0008567687 807 | 806,1.1096678744,0.9980994751,-0.0045107118,0.1160791111 808 | 807,1.0340264974,0.9982076643,0.0005397945,0.0352790386 809 | 808,0.9692157619,0.9983070735,-0.0160543975,-0.0130369142 810 | 809,0.9499074723,0.9983985162,-0.0022162598,-0.0462747842 811 | 810,1.0634369997,0.998482806,-0.0156520863,0.08060628 812 | 811,0.8754639546,0.9985607565,-0.0118076973,-0.1112891046 813 | 812,1.0059473505,0.9986331812,-0.0026811069,0.0099952761 814 | 813,0.8964786875,0.9987008938,-0.02641932,-0.0758028863 815 | 814,1.0864135176,0.9987647077,0.0382263195,0.0494224904 816 | 815,0.9825011059,0.9988254366,-0.0022538447,-0.0140704859 817 | 816,1.0380803488,0.998883894,-0.0015838074,0.0407802623 818 | 817,1.0214387486,0.9989408934,0.0151624536,0.0073354016 819 | 818,1.0300449808,0.9989972486,0.0043056421,0.0267420901 820 | 819,0.9963657099,0.999053773,-0.0214236102,0.0187355471 821 | 820,1.068924142,0.9991112802,-0.0328671377,0.1026799995 822 | 821,1.0762710411,0.9991769166,0.0158419647,0.0612521597 823 | 822,1.0461014766,0.999255895,0.0043220563,0.0425235253 824 | 823,0.9991968484,0.9993461284,-0.0010555261,0.000906246 825 | 824,1.0047752913,0.9994455299,0.0070563415,-0.0017265801 826 | 825,1.0225522446,0.9995520125,0.0154937906,0.0075064414 827 | 826,0.9516758904,0.9996634893,-0.0086035089,-0.03938409 828 | 827,1.056256687,0.9997778733,0.0015752665,0.0549035472 829 | 828,0.989506948,0.9998930776,-0.0075328996,-0.00285323 830 | 829,1.0096435818,1.0000070152,0.0085371416,0.0010994249 831 | 830,1.0434558041,1.0001175992,0.0147545323,0.0285836726 832 | 831,0.9857914569,1.0002227426,-0.0092161932,-0.0052150925 833 | 832,0.9815152764,1.0003203585,0.0244922553,-0.0432973374 834 | 833,1.0813804659,1.0004083599,0.008721065,0.0722510409 835 | 834,0.9692941415,1.0004846599,-0.0158233398,-0.0153671786 836 | 835,0.9824111314,1.0005471716,-0.0077028034,-0.0104332367 837 | 836,1.0160553628,1.0005938079,0.0026406323,0.0128209227 838 | 837,0.9507141653,1.0006224819,-0.0246971525,-0.0252111641 839 | 838,1.005346977,1.0006311067,0.0005377801,0.0041780901 840 | 839,1.0588711114,1.0006175954,0.0014728048,0.0567807113 841 | 840,1.0853792004,1.0005798609,-0.0075284439,0.0923277834 842 | 841,1.0308657028,1.0005158163,0.0024930575,0.027856829 843 | 842,0.9720696576,1.0004479759,-0.0033137196,-0.0250645987 844 | 843,0.935955231,1.0003988148,0.0204661666,-0.0849097503 845 | 844,1.0549932577,1.0003661874,0.009164179,0.0454628914 846 | 845,1.0161817934,1.0003479482,0.001386416,0.0144474292 847 | 846,0.9692384653,1.0003419518,-0.0007036853,-0.0303998012 848 | 847,1.061121459,1.0003460526,0.0135591548,0.0472162516 849 | 848,1.0302541025,1.0003581052,0.0074569303,0.022439067 850 | 849,0.9754306722,1.0003759639,-0.0135936511,-0.0113516407 851 | 850,1.0488940946,1.0003974834,0.0249317525,0.0235648587 852 | 851,0.8716670257,1.0004205181,0.0018502108,-0.1306037032 853 | 852,1.0075641952,1.0004429225,-0.0190907967,0.0262120695 854 | 853,0.9950864687,1.000462551,-0.0167235619,0.0113474795 855 | 854,0.9853953504,1.0004772582,-0.0017173385,-0.0133645694 856 | 855,0.9973088423,1.0004848986,-0.0087142018,0.0055381455 857 | 856,0.9954064323,1.0004833267,-0.0069707665,0.0018938722 858 | 857,0.9966253238,1.0004703968,-0.004114355,0.0002692819 859 | 858,1.0085418463,1.0004439637,-0.0049816256,0.0130795082 860 | 859,0.9488930251,1.0004018817,-0.013520456,-0.0379884006 861 | 860,0.9064589155,1.0003420052,-0.0057691031,-0.0881139866 862 | 861,0.9848296088,1.000262189,-0.0232690029,0.0078364227 863 | 862,0.9823966844,1.0001602873,-0.0212036147,0.0034400118 864 | 863,1.0356012735,1.0000491804,0.006711992,0.0288401011 865 | 864,0.933598258,0.999942998,-0.0108807738,-0.0554639662 866 | 865,0.8886569712,0.9998414689,0.0048387305,-0.1160232282 867 | 866,0.9248612966,0.999744322,-0.022203864,-0.0526791613 868 | 867,0.9898972862,0.999651286,0.0311016526,-0.0408556524 869 | 868,1.0327697516,0.99956209,0.015657704,0.0175499576 870 | 869,1.021138663,0.9994764625,0.0043402687,0.0173219318 871 | 870,1.00897788,0.9993941326,0.0592379112,-0.0496541639 872 | 871,1.0383755266,0.9993148291,-0.026523284,0.0655839815 873 | 872,1.054803552,0.9992382807,0.0149120043,0.040653267 874 | 873,0.9868153441,0.9991642163,0.0046947455,-0.0170436177 875 | 874,0.9872925815,0.9990923647,-0.0036551089,-0.0081446743 876 | 875,0.983652664,0.9990224548,-0.0244029324,0.0090331416 877 | 876,0.9851767356,0.9989542154,-0.0094192814,-0.0043581984 878 | 877,0.9425232768,0.9988873754,0.0093403147,-0.0657044133 879 | 878,1.0710319812,0.9988216635,-0.0103307577,0.0825410754 880 | 879,1.0149166309,0.9987568087,0.0050585605,0.0111012617 881 | 880,1.0913181633,0.9986925397,0.0377966767,0.0548289469 882 | 881,0.9568577639,0.9986285854,-0.0094821177,-0.0322887037 883 | 882,1.0562034195,0.9985646745,0.0026570641,0.0549816809 884 | 883,0.8935814113,0.9985005361,-0.0217006935,-0.0832184313 885 | 884,0.9855176709,0.9984297286,-0.0081797411,-0.0047323166 886 | 885,0.9747452069,0.9983470033,-0.0055785236,-0.0180232728 887 | 886,1.0120926518,0.9982538775,0.0126625513,0.0011762229 888 | 887,0.9929049957,0.9981518689,-0.0059258503,0.0006789771 889 | 888,1.0095553396,0.998042495,0.0225569843,-0.0110441397 890 | 889,0.996132392,0.9979272732,-0.0047232735,0.0029283923 891 | 890,1.0495265783,0.9978077211,0.0283868511,0.0233320062 892 | 891,0.9977803781,0.9976853562,-0.0063654535,0.0064604755 893 | 892,0.9457777654,0.9975616959,-0.0077047346,-0.0440791959 894 | 893,1.0347930004,0.9974382579,-0.0053753803,0.0427301227 895 | 894,0.9835884046,0.9973165597,-0.0122947478,-0.0014334072 896 | 895,0.910201994,0.9971981187,0.0210261672,-0.1080222918 897 | 896,0.9491302312,0.9970844524,-0.0180337605,-0.0299204608 898 | 897,0.9382469434,0.9969770784,-0.0064619564,-0.0522681786 899 | 898,1.0083250817,0.9968775142,0.0115868483,-0.0001392808 900 | 899,1.0893323355,0.9967872773,0.037821602,0.0547234562 901 | 900,1.0179016704,0.9967078853,-0.0102684381,0.0314622233 902 | 901,1.0005621053,0.9966408555,0.0252004326,-0.0212791828 903 | 902,1.0004744617,0.9965877056,0.0010731428,0.0028136134 904 | 903,1.0036906053,0.996549953,0.0017973523,0.0053432999 905 | 904,0.9770776649,0.9965291154,-0.031610808,0.0121593575 906 | 905,0.9924857414,0.996511278,0.0051714989,-0.0091970355 907 | 906,0.956462616,0.9964822555,0.0166142647,-0.0566339042 908 | 907,0.9437000178,0.9964431585,-0.000595781,-0.0521473597 909 | 908,0.9932692359,0.996395098,-0.0012233382,-0.0019025239 910 | 909,0.9756729172,0.9963391848,0.0080929,-0.0287591677 911 | 910,1.104220333,0.9962765297,-0.024380246,0.1323240493 912 | 911,1.0154833035,0.9962082437,-0.0204766138,0.0397516736 913 | 912,1.0087584105,0.9961354375,0.0049337998,0.0076891732 914 | 913,1.0197011752,0.9960592221,0.0311999487,-0.0075579956 915 | 914,1.0612824924,0.9959807082,0.0040338285,0.0612679556 916 | 915,0.9451636561,0.9959010068,-0.0036887114,-0.0470486393 917 | 916,1.0208263198,0.9958212286,-0.0238815954,0.0488866866 918 | 917,1.0214594551,0.9957424845,-0.0091209647,0.0348379353 919 | 918,0.992134226,0.9956658854,-0.0127638531,0.0092321937 920 | 919,0.9650909805,0.9955925422,-0.0179477442,-0.0125538175 921 | 920,1.0091918437,0.9955235656,-0.0296667639,0.0433350419 922 | 921,1.0042032334,0.9954600666,0.003538472,0.0052046948 923 | 922,1.031023285,0.995403156,-0.0023950796,0.0380152086 924 | 923,1.0933042891,0.9953539446,0.030106469,0.0678438755 925 | 924,0.9724066881,0.9953135433,-0.0241312407,0.0012243855 926 | 925,0.9708974492,0.9952830629,0.0057858396,-0.0301714534 927 | 926,0.9509567872,0.9952594697,0.0036642786,-0.0479669611 928 | 927,0.9433668525,0.9952386381,-0.0232337065,-0.0286380791 929 | 928,1.0174586942,0.995220042,0.0196971409,0.0025415114 930 | 929,0.9016535056,0.9952031548,0.011344156,-0.1048938052 931 | 930,1.02734491,0.9951874504,0.0116078529,0.0205496067 932 | 931,0.9817217388,0.9951724024,0.0144689447,-0.0279196082 933 | 932,1.0128900198,0.9951574843,-0.0016111534,0.0193436888 934 | 933,0.8987285424,0.9951421699,-0.0388284674,-0.0575851601 935 | 934,1.0103151453,0.9951259329,0.022225182,-0.0070359696 936 | 935,0.9782006871,0.9951082468,0.0136665505,-0.0305741102 937 | 936,1.1060249811,0.9950885853,0.0124475645,0.0984888312 938 | 937,0.9647408425,0.9950664222,-0.0066364067,-0.023689173 939 | 938,1.0552502432,0.995041231,-0.0065149125,0.0667239247 940 | 939,1.0898254986,0.9950124853,0.0194935787,0.0753194346 941 | 940,0.9291102675,0.994979659,0.01253952,-0.0784089115 942 | 941,0.9981342528,0.9949422255,-0.0125407748,0.015732802 943 | 942,1.0959289278,0.9948996586,0.0132588349,0.0877704343 944 | 943,1.0809881915,0.9948514319,-0.001361852,0.0874986116 945 | 944,0.8693972261,0.9947970191,-0.0030814993,-0.1223182938 946 | 945,1.1054471359,0.9947358939,0.0206402901,0.0900709519 947 | 946,0.995701719,0.9946675298,0.0147839197,-0.0137497305 948 | 947,0.9943218414,0.9946016025,-0.0290318571,0.028752096 949 | 948,0.9428537249,0.9945473333,0.0199328156,-0.0716264239 950 | 949,0.9944858593,0.9945035138,0.0076647966,-0.0076824511 951 | 950,1.0211517539,0.9944689362,-0.0043293601,0.0310121779 952 | 951,0.9745038451,0.9944423922,-0.0197656477,-0.0001728994 953 | 952,1.0801369879,0.9944226737,0.0224734244,0.0632408897 954 | 953,1.0188840433,0.9944085727,0.0080391185,0.016436352 955 | 954,0.9173158718,0.994398881,-0.0189556197,-0.0581273896 956 | 955,1.035308765,0.9943923906,0.0040757806,0.0368405938 957 | 956,0.9419861103,0.9943878933,-0.0426337231,-0.0097680599 958 | 957,0.9933530823,0.994384181,0.0176110006,-0.0186420993 959 | 958,0.9368844495,0.9943800456,-0.0066196142,-0.0508759819 960 | 959,1.0430545271,0.994374279,0.0193776243,0.0293026239 961 | 960,0.8618676009,0.9943656731,-0.0023767933,-0.1301212789 962 | 961,0.9601162028,0.9943530198,0.006502641,-0.040739458 963 | 962,1.0503739454,0.994335111,0.0036564335,0.052382401 964 | 963,1.0417766598,0.9943107386,0.0001347916,0.0473311297 965 | 964,1.0074678684,0.9942786944,-0.0045107118,0.0176998858 966 | 965,1.0165063438,0.9942377704,0.0005397945,0.0217287789 967 | 966,0.9704220483,0.9941867585,-0.0160543975,-0.0077103128 968 | 967,1.0246598813,0.9941244506,-0.0022162598,0.0327516906 969 | 968,1.0267633272,0.9940628375,-0.0156520863,0.0483525761 970 | 969,1.0349815266,0.9940140584,-0.0118076973,0.0527751654 971 | 970,0.9263261448,0.9939771275,-0.0026811069,-0.0649698758 972 | 971,0.9617791484,0.9939510589,-0.02641932,-0.0057525906 973 | 972,1.0457451156,0.9939348668,0.0382263195,0.0135839293 974 | 973,0.9534877774,0.9939275653,-0.0022538447,-0.0381859432 975 | 974,0.997611314,0.9939281685,-0.0015838074,0.0052669529 976 | 975,1.0489112957,0.9939356906,0.0151624536,0.0398131515 977 | 976,1.011490029,0.9939491459,0.0043056421,0.013235241 978 | 977,0.8941622148,0.9939675483,-0.0214236102,-0.0783817233 979 | 978,0.8918310887,0.9939899121,-0.0328671377,-0.0692916857 980 | 979,0.9687050064,0.9940152514,0.0158419647,-0.0411522098 981 | 980,0.9628479612,0.9940425804,0.0043220563,-0.0355166755 982 | 981,0.9777775649,0.9940709133,-0.0010555261,-0.0152378223 983 | 982,0.9680212322,0.9940992641,0.0070563415,-0.0331343734 984 | 983,0.9631315593,0.994126647,0.0154937906,-0.0464888784 985 | 984,1.0490393873,0.9941520763,-0.0086035089,0.0634908199 986 | 985,1.0145383765,0.9941745659,0.0015752665,0.0187885441 987 | 986,1.0192055466,0.9941931302,-0.0075328996,0.032545316 988 | 987,1.0275166515,0.9942067832,0.0085371416,0.0247727267 989 | 988,0.9660093933,0.9942145391,0.0147545323,-0.0429596781 990 | 989,0.93480328,0.9942208027,-0.0092161932,-0.0502013295 991 | 990,1.0406879814,0.9942307443,0.0244922553,0.0219649819 992 | 991,0.9602719101,0.9942445258,0.008721065,-0.0426936807 993 | 992,1.0242881781,0.9942623095,-0.0158233398,0.0458492085 994 | 993,1.0291095157,0.9942842574,-0.0077028034,0.0425280617 995 | 994,1.0166512091,0.9943105317,0.0026406323,0.0197000452 996 | 995,0.9750233774,0.9943412944,-0.0246971525,0.0053792355 997 | 996,0.936210723,0.9943767078,0.0005377801,-0.0587037649 998 | 997,0.9355770495,0.9944169339,0.0014728048,-0.0603126892 999 | 998,0.968404274,0.9944621348,-0.0075284439,-0.018529417 1000 | 999,1.0669011679,0.9945124727,0.0024930575,0.0698956376 1001 | 1000,0.8794900575,0.9945681097,-0.0033137196,-0.1117643327 1002 | 1001,1.1033570581,0.9946292079,0.0204661666,0.0882616836 1003 | 1002,0.9787459364,0.9946959294,0.009164179,-0.025114172 1004 | 1003,1.0534061063,0.9947684364,0.001386416,0.0572512539 1005 | 1004,1.0004137233,0.9948468909,-0.0007036853,0.0062705177 1006 | 1005,0.9387258382,0.9949314551,0.0135591548,-0.0697647718 1007 | 1006,1.0256889632,0.9950222911,0.0074569303,0.0232097417 1008 | 1007,0.9115383465,0.9951195611,-0.0135936511,-0.0699875635 1009 | 1008,0.9844551211,0.995223427,0.0249317525,-0.0357000585 1010 | 1009,0.9549747634,0.9953340511,0.0018502108,-0.0422094986 1011 | 1010,0.9573636562,0.9954451474,-0.0190907967,-0.0189906946 1012 | 1011,1.0441430337,0.9955509527,-0.0167235619,0.065315643 1013 | 1012,0.9800303873,0.9956524131,-0.0017173385,-0.0139046874 1014 | 1013,1.032300423,0.9957504751,-0.0087142018,0.0452641497 1015 | 1014,1.0186039406,0.9958460849,-0.0069707665,0.0297286223 1016 | 1015,0.9399569238,0.9959401886,-0.004114355,-0.0518689098 1017 | 1016,0.9992181374,0.9960337328,-0.0049816256,0.0081660303 1018 | 1017,0.9686998618,0.9961276635,-0.013520456,-0.0139073457 1019 | 1018,0.9669709322,0.9962229271,-0.0057691031,-0.0234828919 1020 | 1019,0.9733101799,0.9963204699,-0.0232690029,0.0002587129 1021 | 1020,0.9931837491,0.9964212381,-0.0212036147,0.0179661257 1022 | 1021,0.9697993721,0.9965261781,0.006711992,-0.033438798 1023 | 1022,1.0292346255,0.996636236,-0.0108807738,0.0434791633 1024 | 1023,1.029159052,0.9967523582,0.0048387305,0.0275679634 1025 | 1024,0.968036513,0.9968754909,-0.022203864,-0.0066351138 1026 | 1025,1.0381672352,0.9970065804,0.0311016526,0.0100590021 1027 | 1026,0.9672115137,0.9971465731,0.015657704,-0.0455927634 1028 | 1027,0.9792379534,0.9972964151,0.0043402687,-0.0223987303 1029 | 1028,1.024253721,0.9974570527,0.0592379112,-0.032441243 1030 | 1029,0.9523847217,0.9976294323,-0.026523284,-0.0187214266 1031 | 1030,1.0470070167,0.9978145001,0.0149120043,0.0342805123 1032 | 1031,0.9881318264,0.9979993686,0.0046947455,-0.0145622877 1033 | 1032,1.0210234839,0.9981713617,-0.0036551089,0.0265072311 1034 | 1033,0.9769910285,0.9983317426,-0.0244029324,0.0030622184 1035 | 1034,0.9668827339,0.9984817746,-0.0094192814,-0.0221797592 1036 | 1035,1.0182876417,0.9986227209,0.0093403147,0.0103246061 1037 | 1036,1.0003324508,0.9987558448,-0.0103307577,0.0119073637 1038 | 1037,0.99662302,0.9988824095,0.0050585605,-0.00731795 1039 | 1038,1.0173730549,0.9990036783,0.0377966767,-0.0194273001 1040 | 1039,1.0208033586,0.9991209145,-0.0094821177,0.0311645618 1041 | 1040,0.9632756797,0.9992353812,0.0026570641,-0.0386167655 1042 | 1041,1.0469010811,0.9993483418,-0.0217006935,0.0692534328 1043 | 1042,1.0444089389,0.9994610595,-0.0081797411,0.0531276205 1044 | 1043,0.9913318503,0.9995747975,-0.0055785236,-0.0026644236 1045 | 1044,0.8904787635,0.9996908191,0.0126625513,-0.1218746069 1046 | 1045,1.0088996025,0.9998103876,-0.0059258503,0.0150150653 1047 | 1046,1.0455174728,0.9999347661,0.0225569843,0.0230257224 1048 | 1047,0.9859659078,1.000065218,-0.0047232735,-0.0093760368 1049 | 1048,1.0041767385,1.0002030066,0.0283868511,-0.0244131192 1050 | 1049,0.9741299195,1.000349395,-0.0063654535,-0.0198540219 1051 | 1050,1.0428974893,1.0005056464,-0.0077047346,0.0500965775 1052 | 1051,0.9422852359,1.0006730243,-0.0053753803,-0.0530124081 1053 | 1052,1.018021269,1.0008403431,-0.0122947478,0.0294756738 1054 | 1053,1.0133784492,1.0009960729,0.0210261672,-0.0086437908 1055 | 1054,0.9412577827,1.0011409603,-0.0180337605,-0.0418494171 1056 | 1055,1.0669816142,1.0012757521,-0.0064619564,0.0721678184 1057 | 1056,0.9989307597,1.0014011948,0.0115868483,-0.0140572835 1058 | 1057,1.0689053736,1.001518035,0.037821602,0.0295657366 1059 | 1058,0.9909189707,1.0016270194,-0.0102684381,-0.0004396106 1060 | 1059,0.974798683,1.0017288946,0.0252004326,-0.0521306442 1061 | 1060,1.0297036972,1.0018244072,0.0010731428,0.0268061473 1062 | 1061,1.0729748913,1.0019143038,0.0017973523,0.0692632352 1063 | 1062,1.0057448674,1.0019993311,-0.031610808,0.0353563443 1064 | 1063,1.0235032369,1.0020802356,0.0051714989,0.0162515024 1065 | 1064,1.0484786904,1.0021577641,0.0166142647,0.0297066616 1066 | 1065,0.9967033436,1.0022326631,-0.000595781,-0.0049335386 1067 | 1066,1.001232001,1.0023056793,-0.0012233382,0.0001496599 1068 | 1067,0.973677514,1.0023775592,0.0080929,-0.0367929452 1069 | 1068,0.9993702048,1.0024490496,-0.024380246,0.0213014012 1070 | 1069,0.8970757246,1.0025208969,-0.0204766138,-0.0849685586 1071 | 1070,1.1015569148,1.002593848,0.0049337998,0.094029267 1072 | 1071,1.0994613818,1.0026686493,0.0311999487,0.0655927838 1073 | 1072,1.012398818,1.0027460475,0.0040338285,0.0056189419 1074 | 1073,0.9736162644,1.0028241795,-0.0036887114,-0.0255192037 1075 | 1074,0.9527285023,1.00290049,-0.0238815954,-0.0262903922 1076 | 1075,0.964279452,1.0029746872,-0.0091209647,-0.0295742705 1077 | 1076,1.0627658391,1.0030464794,-0.0127638531,0.0724832128 1078 | 1077,0.9744116702,1.0031155749,-0.0179477442,-0.0107561605 1079 | 1078,1.0217291188,1.0031816819,-0.0296667639,0.0482142008 1080 | 1079,0.9715055616,1.0032445086,0.003538472,-0.035277419 1081 | 1080,0.9729656639,1.0033037634,-0.0023950796,-0.0279430199 1082 | 1081,1.0358132931,1.0033591545,0.030106469,0.0023476696 1083 | 1082,0.9150724289,1.0034103901,-0.0241312407,-0.0642067205 1084 | 1083,1.0335249485,1.0034571785,0.0057858396,0.0242819304 1085 | 1084,0.9926724258,1.003499228,0.0036642786,-0.0144910808 1086 | 1085,0.9957086735,1.0035362467,-0.0232337065,0.0154061333 1087 | 1086,1.0387350062,1.0035679431,0.0196971409,0.0154699222 1088 | 1087,1.0794465129,1.0035940253,0.011344156,0.0645083317 1089 | 1088,1.020450996,1.0036142016,0.0116078529,0.0052289416 1090 | 1089,1.0350626662,1.0036281802,0.0144689447,0.0169655413 1091 | 1090,0.9893439923,1.0036356694,-0.0016111534,-0.0126805237 1092 | 1091,0.9288631334,1.0036363775,-0.0388284674,-0.0359447768 1093 | 1092,1.0631297413,1.0036300128,0.022225182,0.0372745466 1094 | 1093,1.0598820964,1.0036162834,0.0136665505,0.0425992626 1095 | 1094,0.9946005337,1.0036066506,0.0124475645,-0.0214536813 1096 | 1095,1.0453192216,1.0036116904,-0.0066364067,0.0483439378 1097 | 1096,0.9332279976,1.0036297831,-0.0065149125,-0.0638868731 1098 | 1097,0.9789849175,1.0036593091,0.0194935787,-0.0441679702 1099 | 1098,1.0631828935,1.0036986486,0.01253952,0.0469447249 1100 | 1099,1.0262969834,1.0037461821,-0.0125407748,0.0350915761 1101 | 1100,1.0266947387,1.0038002897,0.0132588349,0.0096356141 1102 | 1101,1.0229049893,1.0038593519,-0.001361852,0.0204074895 1103 | 1102,1.0568026339,1.0039217489,-0.0030814993,0.0559623843 1104 | 1103,1.0455778111,1.0039858611,0.0206402901,0.0209516599 1105 | 1104,1.003246591,1.0040500689,0.0147839197,-0.0155873976 1106 | 1105,1.0565739868,1.0041127524,-0.0290318571,0.0814930915 1107 | 1106,1.0926680793,1.0041722922,0.0199328156,0.0685629715 1108 | 1107,0.9593586612,1.0042270684,0.0076647966,-0.0525332038 1109 | 1108,0.9964133485,1.0042754615,-0.0043293601,-0.0035327529 1110 | 1109,0.9357300897,1.0043158516,-0.0197656477,-0.0488201143 1111 | 1110,0.9552815572,1.0043466193,0.0224734244,-0.0715384865 1112 | 1111,0.9693922353,1.0043661447,0.0080391185,-0.043013028 1113 | 1112,1.0237235012,1.0043728083,-0.0189556197,0.0383063126 1114 | 1113,0.9681004067,1.0043649903,0.0040757806,-0.0403403642 1115 | 1114,0.9885117786,1.0043410711,-0.0426337231,0.0268044306 1116 | 1115,1.0878934011,1.0043141249,0.0176110006,0.0659682756 1117 | 1116,1.0220534843,1.0042976649,-0.0066196142,0.0243754335 1118 | 1117,0.9887594663,1.00429073,0.0193776243,-0.034908888 1119 | 1118,1.0232077544,1.0042923591,-0.0023767933,0.0212921885 1120 | 1119,1.0259600362,1.004301591,0.006502641,0.0151558042 1121 | 1120,1.0007743706,1.0043174646,0.0036564335,-0.0071995275 1122 | 1121,0.9503809659,1.0043390187,0.0001347916,-0.0540928443 1123 | 1122,0.8892005386,1.0043652921,-0.0045107118,-0.1106540417 1124 | 1123,1.0466363258,1.0043953238,0.0005397945,0.0417012075 1125 | 1124,1.0064102362,1.0044281525,-0.0160543975,0.0180364811 1126 | 1125,0.9744502071,1.0044628171,-0.0022162598,-0.0277963503 1127 | 1126,1.0065373897,1.0044983566,-0.0156520863,0.0176911194 1128 | 1127,0.9661401834,1.0045338096,-0.0118076973,-0.026585929 1129 | 1128,1.0357983806,1.0045682152,-0.0026811069,0.0339112724 1130 | 1129,0.9885413782,1.004600612,-0.02641932,0.0103600862 1131 | 1130,1.0463764596,1.004630039,0.0382263195,0.003520101 1132 | 1131,1.0271105305,1.0046555351,-0.0022538447,0.0247088401 1133 | 1132,0.9230983202,1.0046761391,-0.0015838074,-0.0799940115 1134 | 1133,0.9140185658,1.0046908898,0.0151624536,-0.1058347775 1135 | 1134,0.9965559606,1.0046988261,0.0043056421,-0.0124485075 1136 | 1135,0.9920831012,1.0046989868,-0.0214236102,0.0088077246 1137 | 1136,0.9537003094,1.0046914446,-0.0328671377,-0.0181239975 1138 | 1137,1.0134291636,1.0046774449,0.0158419647,-0.007090246 1139 | 1138,1.0174281487,1.0046577857,0.0043220563,0.0084483067 1140 | 1139,1.0454271952,1.0046332653,-0.0010555261,0.0418494559 1141 | 1140,1.1080939963,1.0046046817,0.0070563415,0.0964329731 1142 | 1141,1.0777369055,1.004572833,0.0154937906,0.0576702819 1143 | 1142,0.9792186857,1.0045385173,-0.0086035089,-0.0167163227 1144 | 1143,1.0383724294,1.0045025326,0.0015752665,0.0322946303 1145 | 1144,0.9162257722,1.0044656772,-0.0075328996,-0.0807070055 1146 | 1145,0.9413851282,1.004428749,0.0085371416,-0.0715807625 1147 | 1146,0.9157043859,1.0043925462,0.0147545323,-0.1034426926 1148 | 1147,1.0255943621,1.0043578669,-0.0092161932,0.0304526884 1149 | 1148,0.9848958197,1.0043255092,0.0244922553,-0.0439219448 1150 | 1149,0.9890484551,1.0042962711,0.008721065,-0.023968881 1151 | 1150,0.9727857633,1.0042709508,-0.0158233398,-0.0156618477 1152 | 1151,1.0543288997,1.0042503464,-0.0077028034,0.0577813568 1153 | 1152,1.0776320915,1.0042352559,0.0026406323,0.0707562034 1154 | 1153,0.9874021397,1.0042264775,-0.0246971525,0.0078728148 1155 | 1154,0.988671945,1.0042248092,0.0005377801,-0.0160906444 1156 | 1155,1.0640606335,1.0042310492,0.0014728048,0.0583567795 1157 | 1156,0.9366740281,1.0042459956,-0.0075284439,-0.0600435236 1158 | 1157,0.9926855429,1.0042600441,0.0024930575,-0.0140675587 1159 | 1158,1.0019402348,1.0042637295,-0.0033137196,0.0009902249 1160 | 1159,0.9586536721,1.0042580585,0.0204661666,-0.0660705529 1161 | 1160,0.9423747365,1.0042440374,0.009164179,-0.07103348 1162 | 1161,0.9715237038,1.0042226729,0.001386416,-0.0340853851 1163 | 1162,1.0990042586,1.0041949714,-0.0007036853,0.0955129725 1164 | 1163,1.0514436746,1.0041619395,0.0135591548,0.0337225803 1165 | 1164,1.0624625668,1.0041245837,0.0074569303,0.0508810528 1166 | 1165,0.933705723,1.0040839105,-0.0135936511,-0.0567845364 1167 | 1166,1.00353561,1.0040409265,0.0249317525,-0.025437069 1168 | 1167,0.9653011126,1.0039966381,0.0018502108,-0.0405457363 1169 | 1168,0.9657935703,1.003952052,-0.0190907967,-0.0190676851 1170 | 1169,0.999887694,1.0039081746,-0.0167235619,0.0127030812 1171 | 1170,1.0082918175,1.0038660125,-0.0017173385,0.0061431435 1172 | 1171,0.9970733424,1.0038265722,-0.0087142018,0.001960972 1173 | 1172,1.0469667722,1.0037908602,-0.0069707665,0.0501466786 1174 | 1173,1.0521575736,1.003759883,-0.004114355,0.0525120455 1175 | 1174,0.9250011201,1.0037346472,-0.0049816256,-0.0737519016 1176 | 1175,0.9005197385,1.0037161593,-0.013520456,-0.0896759649 1177 | 1176,0.9914261887,1.0037054259,-0.0057691031,-0.0065101342 1178 | 1177,0.9402918997,1.0037034534,-0.0232690029,-0.0401425508 1179 | 1178,0.974438643,1.00370378,-0.0212036147,-0.0080615223 1180 | 1179,0.9630961541,1.0036995551,0.006711992,-0.047315393 1181 | 1180,1.0795347816,1.0036912021,-0.0108807738,0.0867243533 1182 | 1181,1.0224287777,1.0036791444,0.0048387305,0.0139109027 1183 | 1182,0.9879060965,1.0036638056,-0.022203864,0.006446155 1184 | 1183,1.0221895561,1.0036456089,0.0311016526,-0.0125577053 1185 | 1184,1.0394143848,1.0036249778,0.015657704,0.0201317029 1186 | 1185,1.0222193124,1.0036023358,0.0043402687,0.014276708 1187 | 1186,1.5,1.0035781062,0.0592379112,0.4371839826 1188 | 1187,1.0399838935,1.0035527125,-0.026523284,0.062954465 1189 | 1188,0.995531192,1.0035265781,0.0149120043,-0.0229073905 1190 | 1189,0.9711888856,1.0035001264,0.0046947455,-0.0370059864 1191 | 1190,0.9777242937,1.003473781,-0.0036551089,-0.0220943784 1192 | 1191,0.9844199598,1.003447965,-0.0244029324,0.0053749272 1193 | 1192,0.9601259601,1.0034231021,-0.0094192814,-0.0338778607 1194 | 1193,1.0232132792,1.0033996156,0.0093403147,0.0104733489 1195 | 1194,0.9410067666,1.003377929,-0.0103307577,-0.0520404047 1196 | 1195,1.0033243563,1.0033584656,0.0050585605,-0.0050926698 1197 | 1196,1.0131868864,1.0033416489,0.0377966767,-0.0279514392 1198 | 1197,1.0570899711,1.0033279024,-0.0094821177,0.0632441864 1199 | 1198,0.9679470733,1.0033176494,0.0026570641,-0.0380276402 1200 | 1199,1.0371742161,1.0033085549,-0.0217006935,0.0555663547 1201 | 1200,1.025757238,1.0032980807,-0.0081797411,0.0306388985 1202 | 1201,0.9588797765,1.0032863449,-0.0055785236,-0.0388280449 1203 | 1202,0.9766731011,1.003273466,0.0126625513,-0.0392629162 1204 | 1203,1.0393481423,1.0032595622,-0.0059258503,0.0420144304 1205 | 1204,1.068578864,1.0032447519,0.0225569843,0.0427771278 1206 | 1205,0.9590086666,1.0032291533,-0.0047232735,-0.0394972132 1207 | 1206,1.014191407,1.0032128849,0.0283868511,-0.0174083289 1208 | 1207,0.9873101632,1.0031960649,-0.0063654535,-0.0095204482 1209 | 1208,0.9752932658,1.0031788116,-0.0077047346,-0.0201808111 1210 | 1209,1.0669536995,1.0031612433,-0.0053753803,0.0691678364 1211 | 1210,0.9975661997,1.0031434785,-0.0122947478,0.006717469 1212 | 1211,1.0023917991,1.0031256353,0.0210261672,-0.0217600034 1213 | 1212,0.9211649139,1.0031078322,-0.0180337605,-0.0639091578 1214 | 1213,1.001024007,1.0030901873,-0.0064619564,0.0043957761 1215 | 1214,0.9743561894,1.0030728192,0.0115868483,-0.0403034781 1216 | 1215,0.9379465514,1.0030558459,0.037821602,-0.1029308965 1217 | 1216,0.9773676387,1.003039386,-0.0102684381,-0.0154033092 1218 | 1217,1.0920298962,1.0030235577,0.0252004326,0.0638059059 1219 | 1218,1.1518570432,1.0030084793,0.0010731428,0.1477754212 1220 | 1219,0.9654528406,1.0029942691,0.0017973523,-0.0393387808 1221 | 1220,0.9178358656,1.0029797527,-0.031610808,-0.0535330791 1222 | 1221,1.0414452923,1.0029637658,0.0051714989,0.0333100277 1223 | 1222,1.025895437,1.0029464422,0.0166142647,0.0063347301 1224 | 1223,0.9829669897,1.0029279155,-0.000595781,-0.0193651448 1225 | 1224,0.9873688413,1.0029083195,-0.0012233382,-0.01431614 1226 | 1225,0.9792577713,1.002887788,0.0080929,-0.0317229167 1227 | 1226,0.9796889176,1.0028664547,-0.024380246,0.001202709 1228 | 1227,1.0161860439,1.0028444533,-0.0204766138,0.0338182044 1229 | 1228,0.9347830046,1.0028219175,0.0049337998,-0.0729727127 1230 | 1229,1.0205068435,1.0027989811,0.0311999487,-0.0134920863 1231 | 1230,0.9589017925,1.0027757779,0.0040338285,-0.0479078139 1232 | 1231,1.025797059,1.0027524415,-0.0036887114,0.0267333289 1233 | 1232,1.0364597755,1.0027291057,-0.0238815954,0.0576122652 1234 | 1233,1.0027869275,1.0027059042,-0.0091209647,0.009201988 1235 | 1234,0.9941431517,1.0026829708,-0.0127638531,0.0042240341 1236 | 1235,0.9546651432,1.0026604391,-0.0179477442,-0.0300475517 1237 | 1236,0.9456750229,1.002638443,-0.0296667639,-0.0272966562 1238 | 1237,1.063329931,1.0026171161,0.003538472,0.0571743429 1239 | 1238,1.0141276715,1.0025965922,-0.0023950796,0.0139261589 1240 | 1239,1.0676681387,1.0025770051,0.030106469,0.0349846646 1241 | 1240,1.0162077934,1.0025584884,-0.0241312407,0.0377805457 1242 | 1241,1.0984097763,1.0025393088,0.0057858396,0.090084628 1243 | 1242,0.9103172502,1.0025177944,0.0036642786,-0.0958648229 1244 | 1243,0.9803660587,1.0024941712,-0.0232337065,0.001105594 1245 | 1244,1.0139282594,1.0024686653,0.0196971409,-0.0082375468 1246 | 1245,1.0015446763,1.0024415026,0.011344156,-0.0122409822 1247 | 1246,1.0157232244,1.0024129091,0.0116078529,0.0017024623 1248 | 1247,0.9602187461,1.0023831109,0.0144689447,-0.0566333095 1249 | 1248,1.0267353833,1.002352334,-0.0016111534,0.0259942027 1250 | 1249,0.9163575631,1.0023208043,-0.0388284674,-0.0471347738 1251 | 1250,0.9850479543,1.0022887478,0.022225182,-0.0394659755 1252 | 1251,1.0540715578,1.0022563907,0.0136665505,0.0381486166 1253 | 1252,1.0582970197,1.0022239588,0.0124475645,0.0436254964 1254 | 1253,0.9301152564,1.0021916783,-0.0066364067,-0.0654400152 1255 | 1254,0.9948968476,1.002159775,-0.0065149125,-0.0007480149 1256 | 1255,1.0201599276,1.002128475,0.0194935787,-0.0014621262 1257 | 1256,1.0594396639,1.0020980044,0.01253952,0.0448021395 1258 | 1257,0.9692883617,1.002068589,-0.0125407748,-0.0202394526 1259 | 1258,1.0269002217,1.002040455,0.0132588349,0.0116009317 1260 | 1259,1.0109034137,1.0020138284,-0.001361852,0.0102514374 1261 | 1260,1.0399683505,1.001988935,-0.0030814993,0.0410609148 1262 | 1261,0.994130941,1.001966001,0.0206402901,-0.0284753502 1263 | 1262,0.9937104874,1.0019357066,0.0147839197,-0.0230091389 1264 | 1263,0.9418261922,1.0018980926,-0.0290318571,-0.0310400432 1265 | 1264,1.0197337088,1.0018674255,0.0199328156,-0.0020665324 1266 | -------------------------------------------------------------------------------- /src/test/resources/stopSuddenly anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.015,0.05 2 | 1,1644,0,, 3 | 2,1645,0,, 4 | 3,1646,0,, 5 | 4,1647,0,, 6 | 5,1650,0,, 7 | 6,1651,0,, 8 | 7,1652,0,, 9 | 8,1653,0,, 10 | 9,1654,0,, 11 | 10,1655,0,, 12 | 11,1656,0,, 13 | 12,1657,0,, 14 | 13,1658,0,, 15 | 14,1659,0,, 16 | 15,1660,0,, 17 | 16,1661,0,, 18 | 17,1662,0,, 19 | 18,1663,0,, 20 | 19,1664,0,, 21 | 20,1666,0,, 22 | 21,1667,0,, 23 | 22,1669,0,, 24 | 23,1670,0,, 25 | 24,1672,0,, 26 | 25,1676,0,, 27 | 26,1678,0,, 28 | -------------------------------------------------------------------------------- /src/test/resources/testLoess.csv: -------------------------------------------------------------------------------- 1 | "","x" 2 | "1",1.14360804083816 3 | "2",0.504238354273159 4 | "3",0.688545260908805 5 | "4",-0.630520579127678 6 | "5",0.382784969026056 7 | "6",-1.69846907290217 8 | "7",-0.271249024387362 9 | "8",-1.7978536256734 10 | "9",-0.185643559093902 11 | "10",0.809857569410305 12 | "11",-0.657997979297155 13 | "12",0.462205372556922 14 | "13",-0.483518014894404 15 | "14",-0.977502851802009 16 | "15",1.32494076568232 17 | "16",0.409789610833911 18 | "17",0.0651017322005119 19 | "18",-1.8626960343045 20 | "19",-0.735345079467196 21 | "20",-0.392573130764067 22 | "21",-0.348078900179653 23 | "22",-0.3372931070312 24 | "23",-0.988647310449608 25 | "24",1.44573491585821 26 | "25",1.00858045156289 27 | "26",1.74420718029304 28 | "27",-0.504614869726231 29 | "28",-0.522589670556436 30 | "29",0.298775542754018 31 | "30",-0.877469143944834 32 | "31",0.974034105113311 33 | "32",2.32170237289339 34 | "33",-1.67780028681548 35 | "34",-1.25713202506728 36 | "35",0.610729920852634 37 | "36",0.836934548665335 38 | "37",-0.00769151871626692 39 | "38",0.282312455338754 40 | "39",0.467341467639176 41 | "40",-0.0813761201102137 42 | "41",-0.179832033617526 43 | "42",1.53507590828106 44 | "43",-1.35533005264773 45 | "44",0.0137089735424157 46 | "45",1.20939856917767 47 | "46",0.523338308873162 48 | "47",0.164441513275789 49 | "48",-0.0495376554493294 50 | "49",-0.432467024609481 51 | "50",0.763867899974555 52 | "51",0.0330349957968 53 | "52",-0.0953573280386427 54 | "53",-0.499233250988721 55 | "54",-0.864198248425925 56 | "55",-0.903471469271326 57 | "56",0.743313201623368 58 | "57",-1.16731824407368 59 | "58",-0.258537183486557 60 | "59",-1.60604811001703 61 | "60",-1.45541740108048 62 | "61",-0.36432017982007 63 | "62",0.708780307863365 64 | "63",0.905463172537706 65 | "64",-0.0941395629626993 66 | "65",1.99330262387666 67 | "66",0.839562546125609 68 | "67",0.140491525917362 69 | "68",-1.51036074342005 70 | "69",-0.332682619238384 71 | "70",0.610340238116176 72 | "71",0.977146036697597 73 | "72",-0.0684036803340995 74 | "73",-0.796681394288787 75 | "74",0.852672754489616 76 | "75",0.143598751184459 77 | "76",-0.900366733988325 78 | "77",-1.05053206081004 79 | "78",-1.05312930356661 80 | "79",-0.682421690078706 81 | "80",0.351566209387648 82 | "81",-0.15519727230134 83 | "82",-0.331242331764587 84 | "83",1.03596343615535 85 | "84",-0.094321931833021 86 | "85",-0.281847727427602 87 | "86",1.29717635441662 88 | "87",1.07120617174117 89 | "88",-1.43028343721829 90 | "89",0.969003446385405 91 | "90",-0.119073162516371 92 | "91",1.37302099615511 93 | "92",1.18887313190773 94 | "93",1.1218115719318 95 | "94",0.147816754700651 96 | "95",1.27688514789435 97 | "96",-0.554262877121424 98 | "97",-0.0211743987277917 99 | "98",-0.234083948334119 100 | "99",-0.400702698890962 101 | "100",1.53676360396317 102 | -------------------------------------------------------------------------------- /src/test/resources/thoughput anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.49,0.05 2 | 1,974,9.6990228908,, 3 | 2,7147,7.8603623729,, 4 | -------------------------------------------------------------------------------- /src/test/resources/timeSeries anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.49,0.05 2 | 1,1288,14.8105699555,, 3 | 2,1290,14.4963629666,, 4 | 3,1291,14.4740497305,, 5 | 4,1292,14.4621398657,, 6 | 5,1293,14.3943024464,, 7 | 6,1294,14.3246399439,, 8 | 7,1295,14.3418401713,, 9 | 8,1296,14.4317226971,, 10 | 9,1297,14.5031777508,, 11 | 10,1298,14.5141809574,, 12 | 11,1300,14.5554315856,, 13 | 12,1301,14.6435120058,, 14 | 13,1302,14.7373932258,, 15 | 14,1303,14.8057091563,, 16 | 15,1304,14.8314351997,, 17 | 16,1305,14.8387877629,, 18 | 17,1306,14.8129605432,, 19 | 18,1307,14.7758579831,, 20 | 19,1308,14.7613243633,, 21 | 20,1309,14.6996668655,, 22 | 21,1310,14.6448118762,, 23 | 22,1311,14.574792329,, 24 | 23,1312,14.4516253756,, 25 | 24,1313,14.3241331569,, 26 | 25,1314,14.236664615,, 27 | 26,1315,14.2301686145,, 28 | 27,1316,14.2430045715,, 29 | 28,1317,14.2224499122,, 30 | 29,1318,14.1805695573,, 31 | 30,1319,14.2104134147,, 32 | 31,1320,14.2940984865,, 33 | 32,1321,14.3856383295,, 34 | 33,1322,14.4482408451,, 35 | 34,1323,14.4700800986,, 36 | 35,1324,14.5198192168,, 37 | 36,1325,14.5951211738,, 38 | 37,1326,14.6838422202,, 39 | 38,1327,14.7760233217,, 40 | 39,1328,14.8418721743,, 41 | 40,1329,14.8637505315,, 42 | 41,1330,14.8630032214,, 43 | 42,1331,14.8550767699,, 44 | 43,1332,14.8812304408,, 45 | 44,1333,14.8529564114,, 46 | 45,1334,14.8271492871,, 47 | 46,1335,14.7514329221,, 48 | 47,1336,14.6105444274,, 49 | 48,1337,14.5408698138,, 50 | 49,1338,14.566865324,, 51 | 50,1339,14.6985418768,, 52 | 51,1340,14.7322627833,, 53 | 52,1341,14.6722869265,, 54 | 53,1342,14.7072593859,, 55 | 54,1343,14.8499934862,, 56 | 55,1344,15.0344623155,, 57 | 56,1345,15.1744589018,, 58 | 57,1346,15.2207137647,, 59 | 58,1347,15.263846184,, 60 | 59,1348,15.3428475628,, 61 | 60,1349,15.4986919333,, 62 | 61,1350,15.6676814498,, 63 | 62,1351,15.7656870219,, 64 | 63,1352,15.7836368061,, 65 | 64,1353,15.7260151184,, 66 | 65,1354,15.6721570813,, 67 | 66,1355,15.6869277377,, 68 | 67,1356,15.7387758071,, 69 | 68,1357,15.73153512,, 70 | 69,1358,15.6515900564,, 71 | 70,1359,15.4671096638,, 72 | -------------------------------------------------------------------------------- /src/test/resources/tmp anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.001,0.4 2 | 1,1000,9.9481883299,, 3 | 2,2200,12,, 4 | -------------------------------------------------------------------------------- /src/test/resources/twitter anoms.csv: -------------------------------------------------------------------------------- 1 | ,index,anoms,0.02,0.05 2 | 1,125,21.351,, 3 | 2,5320,193.1036,, 4 | 3,7431,32.5045,, 5 | 4,7432,30.0555,, 6 | 5,7433,31.2614,, 7 | 6,7435,27.386,, 8 | 7,7436,28.9807,, 9 | 8,7437,29.0844,, 10 | 9,7438,26.9185,, 11 | 10,7439,26.4621,, 12 | 11,7441,40.4268,, 13 | 12,7442,28.8811,, 14 | 13,7443,27.1294,, 15 | 14,7444,26.9913,, 16 | 15,7445,26.7741,, 17 | 16,7446,30.6972,, 18 | 17,7447,27.6085,, 19 | 18,7448,25.2841,, 20 | 19,7449,25.2264,, 21 | 20,7450,25.1927,, 22 | 21,7451,27.6501,, 23 | 22,7452,24.8858,, 24 | 23,7453,24.8099,, 25 | 24,7454,24.295,, 26 | 25,7455,24.5221,, 27 | 26,7456,26.7354,, 28 | 27,7457,24.7589,, 29 | 28,7458,25.63,, 30 | 29,7459,24.6949,, 31 | 30,7460,23.6518,, 32 | 31,7461,27.6977,, 33 | 32,7462,25.8687,, 34 | 33,7463,24.6654,, 35 | 34,7464,24.6694,, 36 | 35,7465,24.4351,, 37 | 36,7466,25.7723,, 38 | 37,7467,24.2502,, 39 | 38,7471,32.8182,, 40 | 39,7472,27.4586,, 41 | 40,7473,26.3163,, 42 | 41,7583,165.787,, 43 | 42,7584,167.585,, 44 | 43,7585,170.349,, 45 | 44,7586,180.899,, 46 | 45,7587,170.513,, 47 | 46,7588,174.678,, 48 | 47,7589,164.735,, 49 | 48,7590,178.822,, 50 | 49,7591,198.326,, 51 | 50,7592,203.901,, 52 | 51,7593,200.309,, 53 | 52,7594,178.491,, 54 | 53,7595,167.748,, 55 | 54,7596,183.018,, 56 | 55,7597,176.769,, 57 | 56,7598,186.823,, 58 | 57,7599,183.66,, 59 | 58,7600,179.276,, 60 | 59,7601,197.283,, 61 | 60,7602,191.097,, 62 | 61,7603,194.67,, 63 | 62,7604,177.325,, 64 | 63,7605,173.758,, 65 | 64,7606,200.816,, 66 | 65,7607,186.235,, 67 | 66,7608,185.421,, 68 | 67,7609,178.958,, 69 | 68,7610,171.75,, 70 | 69,7611,203.231,, 71 | 70,7612,181.354,, 72 | 71,7613,186.778,, 73 | 72,7614,175.582,, 74 | 73,7615,176.125,, 75 | 74,7616,181.514,, 76 | 75,7617,175.261,, 77 | 76,7618,164.719,, 78 | 77,7621,170.736,, 79 | 78,10640,188.2908,, 80 | 79,13636,50.5876,, 81 | 80,13640,38.8363,, 82 | 81,13641,41.0145,, 83 | 82,13642,39.5523,, 84 | 83,13643,38.9117,, 85 | 84,13644,37.3052,, 86 | 85,13645,36.1725,, 87 | 86,13646,37.515,, 88 | 87,13647,38.1387,, 89 | 88,13651,43.6522,, 90 | 89,14358,40,, 91 | 90,14368,250,, 92 | 91,14378,40,, 93 | --------------------------------------------------------------------------------