├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── banpei ├── __init__.py ├── base │ ├── __init__.py │ └── model.py ├── hotelling.py ├── sst.py └── utils.py ├── demo ├── data │ └── abnormal_frequency.csv └── sst_detect.py ├── docs └── images │ └── sst_example.png ├── poetry.lock ├── pyproject.toml └── tests ├── __init__.py ├── test_data ├── davis.csv └── periodic_wave.csv ├── test_hotelling.py ├── test_sst.py └── test_utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | .venv 2 | dist/ 3 | .ipynb_checkpoints/ 4 | __pycache__/ 5 | *egg-info/* 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - "3.8" 4 | before_install: 5 | - pip install poetry 6 | install: 7 | - poetry install 8 | script: 9 | - poetry run python -m unittest -v 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Hirofumi Tsuruta 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Banpei 2 | [![Build Status](https://travis-ci.org/tsurubee/banpei.svg?branch=master)](https://travis-ci.org/tsurubee/banpei) 3 | 4 | Banpei is a Python package of the anomaly detection. 5 | Anomaly detection is a technique used to identify unusual patterns that do not conform to expected behavior. 6 | 7 | ## System 8 | Python ^3.6 (2.x is not supported) 9 | 10 | ## Installation 11 | ```bash 12 | $ pip install banpei 13 | ``` 14 | After installation, you can import banpei in Python. 15 | ``` 16 | $ python 17 | >>> import banpei 18 | ``` 19 | 20 | ## Usage 21 | #### Example 22 | *Singular spectrum transformation(sst)* 23 | ```python 24 | import banpei 25 | model = banpei.SST(w=50) 26 | results = model.detect(data) 27 | ``` 28 | The input 'data' must be one-dimensional array-like object containing a sequence of values. 29 | The output 'results' is Numpy array with the same size as input data. 30 | The graph below shows the change-point scoring calculated by sst for the periodic data. 31 | 32 | sst_example 33 | 34 | The data used is placed as '/tests/test_data/periodic_wave.csv'. You can read a CSV file using the following code. 35 | ```python 36 | import pandas as pd 37 | raw_data = pd.read_csv('./tests/test_data/periodic_wave.csv') 38 | data = raw_data['y'] 39 | ``` 40 | 41 | SST processing can be accelerated using the Lanczos method which is one of Krylov subspace methods by specifying `True` for the `is_lanczos` argument like below. 42 | ```python 43 | results = model.detect(data, is_lanczos=True) 44 | ``` 45 | 46 | ## Real-time monitoring with Bokeh 47 | Banpei is developed with the goal of constructing the environment of real-time abnormality monitoring. In order to achieve the goal, Banpei has the function corresponded to the streaming data. With the help of Bokeh, which is great visualization library, we can construct the simple monitoring tool. 48 | Here's a simple demonstration movie of change-point detection of the data trends. 49 | 50 | [![sst detection](https://img.youtube.com/vi/7_woubLAhXk/0.jpg)](https://www.youtube.com/watch?v=7_woubLAhXk) 51 | https://youtu.be/7_woubLAhXk 52 | The sample code how to construct real-time monitoring environment is placed in '/demo' folder. 53 | 54 | ## The implemented algorithm 55 | #### Outlier detection 56 | * Hotelling's theory 57 | #### Change point detection 58 | * Singular spectrum transformation(sst) 59 | 60 | ## License 61 | This project is licensed under the terms of the MIT license, see LICENSE. -------------------------------------------------------------------------------- /banpei/__init__.py: -------------------------------------------------------------------------------- 1 | from . import base 2 | from .base import model 3 | from . import hotelling 4 | from .hotelling import Hotelling 5 | from . import sst 6 | from .sst import SST 7 | -------------------------------------------------------------------------------- /banpei/base/__init__.py: -------------------------------------------------------------------------------- 1 | from banpei.base import model 2 | -------------------------------------------------------------------------------- /banpei/base/model.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | class BaseModel(object): 5 | def __init__(self): 6 | pass 7 | 8 | def convert_to_nparray(self, data): 9 | if not isinstance(data, np.ndarray): 10 | return np.array(data) 11 | else: 12 | return data 13 | 14 | def detect(self, *args): 15 | """ 16 | This is a placeholder intended to be overwritten by individual models. 17 | """ 18 | raise NotImplementedError 19 | -------------------------------------------------------------------------------- /banpei/hotelling.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from scipy import stats 3 | from banpei.base.model import BaseModel 4 | 5 | 6 | class Hotelling(BaseModel): 7 | def __init__(self): 8 | pass 9 | 10 | def detect(self, data, threshold): 11 | """ 12 | Parameters 13 | ---------- 14 | data : array_like 15 | Input array or object that can be converted to an array. 16 | threshold : float 17 | 18 | Returns 19 | ------- 20 | List of tuples where each tuple contains index number and anomalous value. 21 | """ 22 | data = self.convert_to_nparray(data) 23 | 24 | # Set the threshold of abnormality 25 | abn_th = stats.chi2.interval(1-threshold, 1)[1] 26 | 27 | # Covert raw data into the degree of abnormality 28 | avg = np.average(data) 29 | var = np.var(data) 30 | data_abn = [(x - avg)**2 / var for x in data] 31 | 32 | # Abnormality determination 33 | result = [] 34 | for (index, x) in enumerate(data_abn): 35 | if x > abn_th: 36 | result.append((index, data[index])) 37 | return result 38 | -------------------------------------------------------------------------------- /banpei/sst.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from banpei.base.model import BaseModel 3 | from .utils import * 4 | 5 | class SST(BaseModel): 6 | def __init__(self, w, m=2, k=None, L=None): 7 | """ 8 | Parameters 9 | ---------- 10 | w : int 11 | Window size 12 | m : int 13 | Number of basis vectors 14 | k : int 15 | Number of columns for the trajectory and test matrices 16 | L : int 17 | Lag time 18 | """ 19 | self.w = w 20 | self.m = m 21 | if k is None: 22 | self.k = self.w // 2 23 | else: 24 | self.k = k 25 | if L is None: 26 | self.L = self.k // 2 27 | else: 28 | self.L = L 29 | 30 | def detect(self, data, is_lanczos=False): 31 | """ 32 | Batch mode detection 33 | 34 | Parameters 35 | ---------- 36 | data : array_like 37 | Input array or object that can be converted to an array. 38 | is_lanczos : boolean 39 | If true, the change score is calculated based on the lanczos method 40 | 41 | Returns 42 | ------- 43 | Numpy array contains the degree of change. 44 | The size of Numpy array is the same as input array. 45 | """ 46 | # Set variables 47 | data = self.convert_to_nparray(data) 48 | T = len(data) 49 | 50 | # Check the size of input data 51 | if not len(data) > self.L + self.w + self.k - 2: 52 | raise ValueError("Input data is too small.") 53 | 54 | # Calculation range 55 | start_cal = self.k + self.w 56 | end_cal = T - self.L + 1 57 | 58 | # Calculate the degree of change 59 | change_scores = np.zeros(len(data)) 60 | for t in range(start_cal, end_cal + 1): 61 | # Trajectory matrix 62 | start_tra = t - self.w - self.k + 1 63 | end_tra = t - self.w 64 | tra_matrix = self._extract_matrix(data, start_tra, end_tra, self.w) 65 | 66 | # Test matrix 67 | start_test = start_tra + self.L 68 | end_test = end_tra + self.L 69 | test_matrix = self._extract_matrix(data, start_test, end_test, self.w) 70 | 71 | # Calculate the score by singular value decomposition(SVD) 72 | if is_lanczos: 73 | change_scores[t] = self._calculate_score_by_lanczos(tra_matrix, test_matrix) 74 | else: 75 | change_scores[t] = self._calculate_score_by_svd(tra_matrix, test_matrix) 76 | 77 | return change_scores 78 | 79 | def stream_detect(self, data, is_lanczos=False): 80 | """ 81 | Stream mode detection for live monitoring. 82 | 83 | Parameters 84 | ---------- 85 | data : array_like 86 | Input array or object that can be converted to an array. 87 | is_lanczos : boolean 88 | If true, the change score is calculated based on the lanczos method 89 | 90 | Returns 91 | ------- 92 | tuple: (score, delay) 93 | score means the degree of change in the latest we can calculate. 94 | delay means the time lag between the latest data point and calculation point. 95 | """ 96 | # Set variables 97 | data = self.convert_to_nparray(data) 98 | T = len(data) 99 | 100 | # Check the size of input data 101 | if not len(data) > self.L + self.w + self.k - 2: 102 | return 0 103 | 104 | # Calculation range 105 | t = T - self.L + 1 106 | 107 | # Trajectory matrix 108 | start_tra = t - self.w - self.k + 1 109 | end_tra = t - self.w 110 | tra_matrix = self._extract_matrix(data, start_tra, end_tra, self.w) 111 | 112 | # Test matrix 113 | start_test = start_tra + self.L 114 | end_test = end_tra + self.L 115 | test_matrix = self._extract_matrix(data, start_test, end_test, self.w) 116 | 117 | # Calculate the change score 118 | if is_lanczos: 119 | return self._calculate_score_by_lanczos(tra_matrix, test_matrix) 120 | else: 121 | return self._calculate_score_by_svd(tra_matrix, test_matrix) 122 | 123 | def _calculate_score_by_svd(self, tra_matrix, test_matrix): 124 | U_tra, _, _ = np.linalg.svd(tra_matrix, full_matrices=False) 125 | U_test, _, _ = np.linalg.svd(test_matrix, full_matrices=False) 126 | U_tra_m = U_tra[:, :self.m] 127 | U_test_m = U_test[:, :self.m] 128 | s = np.linalg.svd(np.dot(U_tra_m.T, U_test_m), full_matrices=False, compute_uv=False) 129 | return 1 - s[0] 130 | 131 | def _calculate_score_by_lanczos(self, tra_matrix, test_matrix): 132 | m, _, _ = power_method(test_matrix) 133 | k = 2 * self.m if self.m % 2 == 0 else 2 * self.m - 1 134 | P = np.dot(tra_matrix, tra_matrix.T) 135 | T = tridiagonalize_by_lanczos(P, m, k) 136 | eigenvalue, eigenvectors = tridiag_eigen(T) 137 | return 1 - np.sum(eigenvectors[0, np.argsort(eigenvalue)[::-1][:self.m]] ** 2) 138 | 139 | def _extract_matrix(self, data, start, end, w): 140 | row = w 141 | column = end - start + 1 142 | matrix = np.empty((row, column)) 143 | i = 0 144 | for t in range(start, end+1): 145 | matrix[:, i] = data[t-1:t-1+row] 146 | i += 1 147 | 148 | return matrix 149 | -------------------------------------------------------------------------------- /banpei/utils.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def power_method(A, iter_num=1): 5 | """ 6 | Calculate the first singular vector/value of a target matrix based on the power method. 7 | Parameters 8 | ---------- 9 | A : numpy array 10 | Target matrix 11 | iter_num : int 12 | Number of iterations 13 | 14 | Returns 15 | ------- 16 | u : numpy array 17 | first left singular vector of A 18 | s : float 19 | first singular value of A 20 | v : numpy array 21 | first right singular vector of A 22 | """ 23 | # set initial vector q 24 | q = np.random.normal(size=A.shape[1]) 25 | q = q / np.linalg.norm(q) 26 | 27 | for i in range(iter_num): 28 | q = np.dot(np.dot(A.T, A), q) 29 | 30 | v = q / np.linalg.norm(q) 31 | Av = np.dot(A, v) 32 | s = np.linalg.norm(Av) 33 | u = Av / s 34 | 35 | return u, s, v 36 | 37 | def tridiagonalize_by_lanczos(P, m, k): 38 | """ 39 | Tridiagonalize matrix by lanczos method 40 | Parameters 41 | ---------- 42 | P : numpy array 43 | Target matrix 44 | q : numpy array 45 | Initial vector 46 | k : int 47 | Size of the tridiagonal matrix 48 | 49 | Returns 50 | ------- 51 | T : numpy array 52 | tridiagonal matrix 53 | """ 54 | # Initialize variables 55 | T = np.zeros((k, k)) 56 | r0 = m 57 | beta0 = 1 58 | q0 = np.zeros(m.shape) 59 | 60 | for i in range(k): 61 | q1 = r0 / beta0 62 | C = np.dot(P, q1) 63 | alpha1 = np.dot(q1, C) 64 | r1 = C - alpha1 * q1 - beta0 * q0 65 | beta1 = np.linalg.norm(r1) 66 | 67 | T[i, i] = alpha1 68 | if i + 1 < k: 69 | T[i, i + 1] = beta1 70 | T[i + 1, i] = beta1 71 | 72 | q0 = q1 73 | beta0 = beta1 74 | r0 = r1 75 | 76 | return T 77 | 78 | def tridiag_eigen(T, iter_num=1, tol=1e-3): 79 | """ 80 | Calculate eigenvalues and eigenvectors of tridiagonal matrix 81 | Parameters 82 | ---------- 83 | P : numpy array 84 | Target matrix (tridiagonal) 85 | iter_num : int 86 | Number of iterations 87 | tol : float 88 | Stop iteration if the target matrix converges to a diagonal matrix with acceptable tolerance `tol` 89 | 90 | Returns 91 | ------- 92 | eigenvalue : numpy array 93 | Calculated eigenvalues 94 | eigenvectors : numpy array 95 | Calculated eigenvectors 96 | """ 97 | eigenvectors = np.identity(T.shape[0]) 98 | 99 | for i in range(iter_num): 100 | Q, R = tridiag_qr_decomposition(T) 101 | T = np.dot(R, Q) 102 | eigenvectors = np.dot(eigenvectors, Q) 103 | eigenvalue = np.diag(T) 104 | if np.all((T - np.diag(eigenvalue) < tol)): 105 | break 106 | 107 | return eigenvalue, eigenvectors 108 | 109 | def tridiag_qr_decomposition(T): 110 | """ 111 | QR decomposition for a tridiagonal matrix 112 | Ref. http://www.ericmart.in/blog/optimizing_julia_tridiag_qr 113 | Parameters 114 | ---------- 115 | T : numpy array 116 | Target matrix (tridiagonal) 117 | 118 | Returns 119 | ------- 120 | Qt.T : numpy array 121 | R : numpy array 122 | """ 123 | R = T.copy() 124 | Qt = np.eye(T.shape[0]) 125 | 126 | for i in range(T.shape[0] - 1): 127 | u = householder(R[i:i + 2, i]) 128 | M = np.outer(u, u) 129 | R[i:i + 2, :(i + 3)] -= 2 * np.dot(M, R[i:i + 2, :(i + 3)]) 130 | Qt[i:i + 2, :(i + 3)] -= 2 * np.dot(M, Qt[i:i + 2, :(i + 3)]) 131 | 132 | return Qt.T, R 133 | 134 | def householder(x): 135 | """ 136 | Householder projection for vector. 137 | Parameters 138 | ---------- 139 | x : numpy array 140 | Target vector 141 | 142 | Returns 143 | ------- 144 | x : numpy array 145 | """ 146 | x[0] = x[0] + np.sign(x[0]) * np.linalg.norm(x) 147 | x = x / np.linalg.norm(x) 148 | return x 149 | -------------------------------------------------------------------------------- /demo/data/abnormal_frequency.csv: -------------------------------------------------------------------------------- 1 | data 2 | -0.001309202 3 | 0.004999935 4 | 0.009931528 5 | 0.015606947 6 | 0.012165483 7 | 0.021053507 8 | 0.023163775 9 | 0.025547385 10 | 0.028555434 11 | 0.030887427 12 | 0.032064662 13 | 0.033960539 14 | 0.0326049 15 | 0.031226098 16 | 0.034767635 17 | 0.03303784 18 | 0.03234975 19 | 0.027418702 20 | 0.023798397 21 | 0.020915627 22 | 0.019327269 23 | 0.01454095 24 | 0.010557806 25 | 0.007512618 26 | 0.006836284 27 | -0.002651396 28 | -0.003046795 29 | -0.010335278 30 | -0.0146095 31 | -0.017036011 32 | -0.019010741 33 | -0.024092515 34 | -0.027755231 35 | -0.03110136 36 | -0.032917381 37 | -0.033296106 38 | -0.032929639 39 | -0.033075737 40 | -0.030500874 41 | -0.034934815 42 | -0.028259315 43 | -0.028238817 44 | -0.027178242 45 | -0.024271168 46 | -0.019204542 47 | -0.017044947 48 | -0.013517739 49 | -0.011475614 50 | -0.00348009 51 | -0.001660824 52 | -0.000921096 53 | 0.005556799 54 | 0.009794498 55 | 0.012295517 56 | 0.01942764 57 | 0.022312101 58 | 0.022835518 59 | 0.025761897 60 | 0.028085268 61 | 0.033081434 62 | 0.03113548 63 | 0.031536889 64 | 0.03057832 65 | 0.032093899 66 | 0.031921851 67 | 0.031325857 68 | 0.027817311 69 | 0.028331133 70 | 0.026584308 71 | 0.023274172 72 | 0.01818309 73 | 0.01516139 74 | 0.011563823 75 | 0.007731249 76 | 0.00327767 77 | -0.000746272 78 | -0.00669743 79 | -0.009837405 80 | -0.010247843 81 | -0.017803313 82 | -0.01886644 83 | -0.020821345 84 | -0.026799818 85 | -0.030547137 86 | -0.031516376 87 | -0.033459392 88 | -0.033763293 89 | -0.03389861 90 | -0.035717321 91 | -0.032535404 92 | -0.029922304 93 | -0.028164797 94 | -0.028975866 95 | -0.022134656 96 | -0.021243628 97 | -0.018295366 98 | -0.014864763 99 | -0.014050062 100 | -0.008011062 101 | -0.000618961 102 | 0.003234213 103 | 0.005161978 104 | 0.008938239 105 | 0.015331692 106 | 0.015932804 107 | 0.022870991 108 | 0.023878567 109 | 0.0251499 110 | 0.029679182 111 | 0.030490088 112 | 0.03122618 113 | 0.034707709 114 | 0.03441347 115 | 0.036531618 116 | 0.031726109 117 | 0.033933381 118 | 0.03115202 119 | 0.025105061 120 | 0.023435103 121 | 0.020750652 122 | 0.021009958 123 | 0.010743649 124 | 0.01101995 125 | 0.007161684 126 | 0.005493388 127 | 0.000245278 128 | -0.00690161 129 | -0.011979052 130 | -0.012423812 131 | -0.017526446 132 | -0.021742785 133 | -0.027585554 134 | -0.028822655 135 | -0.028996518 136 | -0.032731958 137 | -0.033525345 138 | -0.033554684 139 | -0.029818587 140 | -0.035188085 141 | -0.03220005 142 | -0.031241327 143 | -0.027282746 144 | -0.027700642 145 | -0.026120087 146 | -0.02338027 147 | -0.018610725 148 | -0.015007348 149 | -0.011066312 150 | -0.005323548 151 | -0.001018248 152 | 0.000815861 153 | 0.009971936 154 | 0.016915742 155 | 0.027132757 156 | 0.033037507 157 | 0.03495552 158 | 0.033280928 159 | 0.025572179 160 | 0.019097057 161 | 0.00557636 162 | -0.006944917 163 | -0.018406279 164 | -0.025949341 165 | -0.030357156 166 | -0.035645733 167 | -0.032162279 168 | -0.027722067 169 | -0.019245603 170 | -0.014092031 171 | 0.000165405 172 | 0.007904563 173 | 0.017105049 174 | 0.024191588 175 | 0.03161611 176 | 0.030284469 177 | 0.03132785 178 | 0.024902248 179 | 0.017648845 180 | 0.010967636 181 | -0.002313734 182 | -0.015563618 183 | -0.020554285 184 | -0.029492202 185 | -0.034362231 186 | -0.032133823 187 | -0.02729204 188 | -0.023402121 189 | -0.014989887 190 | -0.00319565 191 | 0.004577492 192 | 0.014273079 193 | 0.026820204 194 | 0.030785014 195 | 0.033032699 196 | 0.031919472 197 | 0.028040579 198 | 0.020086733 199 | 0.009936895 200 | -0.000468274 201 | -0.010490489 202 | -0.01966071 203 | -0.027137653 204 | -0.033728572 205 | -0.031967484 206 | -0.027973383 207 | -0.025460551 208 | -0.016841856 209 | -0.00600687 210 | 0.004727111 211 | 0.011614699 212 | 0.02325396 213 | 0.028660073 214 | 0.034046468 215 | 0.032366019 216 | 0.026800272 217 | 0.025799719 218 | 0.01402146 219 | 0.002776668 220 | -0.005233022 221 | -0.01744586 222 | -0.028436903 223 | -0.030697602 224 | -0.034226356 225 | -0.029832296 226 | -0.024653787 227 | -0.019559267 228 | -0.011627817 229 | 0.00571453 230 | 0.012937604 231 | 0.021123473 232 | 0.028670438 233 | 0.032495741 234 | 0.032809093 235 | 0.031832047 236 | 0.022837358 237 | 0.014569978 238 | 0.005113493 239 | -0.00512057 240 | -0.01573498 241 | -0.026941822 242 | -0.029367939 243 | -0.032892299 244 | -0.032713542 245 | -0.027385145 246 | -0.021486041 247 | -0.011572241 248 | 0.000810993 249 | 0.009920948 250 | 0.019176113 251 | 0.025395947 252 | 0.032131557 253 | 0.035184248 254 | 0.029322679 255 | 0.025088374 256 | 0.017566699 257 | 0.00757426 258 | -0.005247358 259 | -0.014859109 260 | -0.020581393 261 | -0.028782736 262 | -0.036025423 263 | -0.031734893 264 | -0.029564198 265 | -0.02122464 266 | -0.014868997 267 | -0.00313511 268 | 0.008848771 269 | 0.023682031 270 | 0.028009777 271 | 0.029988373 272 | 0.033359733 273 | 0.033396978 274 | 0.024822692 275 | 0.017442673 276 | 0.009026616 277 | -0.000556455 278 | -0.011666516 279 | -0.024435957 280 | -0.030930465 281 | -0.030157085 282 | -0.032096886 283 | -0.027132105 284 | -0.023046312 285 | -0.01207401 286 | -0.008876288 287 | 0.007609894 288 | 0.015716849 289 | 0.022885392 290 | 0.032509465 291 | 0.029956278 292 | 0.031702854 293 | 0.029541072 294 | 0.023269554 295 | 0.008308717 296 | -0.000780114 297 | -0.010847312 298 | -0.023392368 299 | -0.026147531 300 | -0.031293947 301 | -0.030225321 302 | -0.031711398 303 | -0.025621903 304 | -0.016112873 305 | -0.004876942 306 | 0.003194975 307 | 0.007023617 308 | 0.014297662 309 | 0.01782146 310 | 0.01824104 311 | 0.023769918 312 | 0.024952002 313 | 0.027908315 314 | 0.02916859 315 | 0.02969798 316 | 0.033774011 317 | 0.033888174 318 | 0.032686712 319 | 0.032395649 320 | 0.029164143 321 | 0.026622892 322 | 0.02571759 323 | 0.026374091 324 | 0.024639358 325 | 0.020968047 326 | 0.015651779 327 | 0.01299768 328 | 0.010455538 329 | 0.004150836 330 | 0.002017203 331 | -0.003373118 332 | -0.00830858 333 | -0.013879879 334 | -0.01626172 335 | -0.0191663 336 | -0.026644611 337 | -0.02619696 338 | -0.028012667 339 | -0.029349761 340 | -0.031642912 341 | -0.033019798 342 | -0.036472679 343 | -0.030583277 344 | -0.031628916 345 | -0.034960442 346 | -0.031956864 347 | -0.026226709 348 | -0.024567322 349 | -0.023630251 350 | -0.018165939 351 | -0.015149466 352 | -0.009219464 353 | -0.011826904 354 | -0.00553611 355 | 0.000846461 356 | 0.006643734 357 | 0.008835485 358 | 0.012682351 359 | 0.018391614 360 | 0.020097336 361 | 0.02239033 362 | 0.028646451 363 | 0.027961901 364 | 0.02781911 365 | 0.032641716 366 | 0.032878544 367 | 0.033571817 368 | 0.033854459 369 | 0.034425261 370 | 0.029458533 371 | 0.030455456 372 | 0.029076147 373 | 0.023994735 374 | 0.022070733 375 | 0.019932375 376 | 0.015336068 377 | 0.011533157 378 | 0.005865576 379 | 0.005212443 380 | -0.000838297 381 | -0.001908787 382 | -0.00988935 383 | -0.010232056 384 | -0.017846334 385 | -0.022694682 386 | -0.021678567 387 | -0.025655153 388 | -0.02940441 389 | -0.030918829 390 | -0.029392027 391 | -0.029871806 392 | -0.03459049 393 | -0.034947947 394 | -0.031234722 395 | -0.032857719 396 | -0.030765812 397 | -0.025558653 398 | -0.026776176 399 | -0.021444727 400 | -0.019183456 401 | -0.014684199 402 | -0.010704051 403 | -0.006589907 404 | -0.001471441 405 | 8.35E-05 406 | 0.00658451 407 | 0.010589742 408 | 0.014013793 409 | 0.017610124 410 | 0.019146803 411 | 0.0230202 412 | 0.024872202 413 | 0.028543934 414 | 0.03142622 415 | 0.033504603 416 | 0.03674957 417 | 0.034590395 418 | 0.033519462 419 | 0.034641539 420 | 0.033881604 421 | 0.027026226 422 | 0.026952252 423 | 0.029590241 424 | 0.02260994 425 | 0.016866897 426 | 0.016277046 427 | 0.011172444 428 | 0.007459427 429 | 0.001945843 430 | 0.002433779 431 | -0.004236306 432 | -0.010235966 433 | -0.014661092 434 | -0.01960837 435 | -0.019077008 436 | -0.022480159 437 | -0.027807129 438 | -0.029119235 439 | -0.030206457 440 | -0.0301771 441 | -0.032000016 442 | -0.035345333 443 | -0.034455011 444 | -0.032069774 445 | -0.032540444 446 | -0.029234023 447 | -0.02933999 448 | -0.025291196 449 | -0.02296904 450 | -0.020102425 451 | -0.018052509 452 | -0.010013498 453 | -0.006312489 454 | -0.002440277 455 | 0.001201838 -------------------------------------------------------------------------------- /demo/sst_detect.py: -------------------------------------------------------------------------------- 1 | import banpei 2 | import numpy as np 3 | import pandas as pd 4 | from bokeh.io import curdoc 5 | from bokeh.models import ColumnDataSource, DatetimeTickFormatter 6 | from bokeh.plotting import figure 7 | from datetime import datetime 8 | from math import radians 9 | from pytz import timezone 10 | 11 | raw_data = pd.read_csv('./data/abnormal_frequency.csv') 12 | raw_data = np.array(raw_data['data']) 13 | data = [] 14 | results = [] 15 | 16 | 17 | def get_new_data(): 18 | global data 19 | global raw_data 20 | data.append(raw_data[0]) 21 | raw_data = np.delete(raw_data, 0) 22 | 23 | 24 | def update_data(): 25 | global results 26 | get_new_data() 27 | ret = model.stream_detect(data) 28 | results.append(ret) 29 | now = datetime.now(tz=timezone("Asia/Tokyo")) 30 | new_data = dict(x=[now], y=[data[-1]], ret=[results[-1]]) 31 | source.stream(new_data, rollover=500) 32 | 33 | # Create Data Source 34 | source = ColumnDataSource(dict(x=[], y=[], ret=[])) 35 | 36 | 37 | # Create Banpei instance 38 | model = banpei.SST(w=30) 39 | 40 | # Draw a graph 41 | fig = figure(x_axis_type="datetime", 42 | x_axis_label="Datetime", 43 | plot_width=950, 44 | plot_height=650) 45 | fig.title.text = "Realtime monitoring with Banpei" 46 | fig.line(source=source, x='x', y='y', line_width=2, alpha=.85, color='blue', legend='observed data') 47 | fig.line(source=source, x='x', y='ret', line_width=2, alpha=.85, color='red', legend='change-point score') 48 | fig.circle(source=source, x='x', y='y', line_width=2, line_color='blue', color='blue') 49 | fig.legend.location = "top_left" 50 | 51 | # Configuration of the axis 52 | format = "%Y-%m-%d-%H-%M-%S" 53 | fig.xaxis.formatter = DatetimeTickFormatter( 54 | seconds=[format], 55 | minsec =[format], 56 | minutes=[format], 57 | hourmin=[format], 58 | hours =[format], 59 | days =[format], 60 | months =[format], 61 | years =[format] 62 | ) 63 | fig.xaxis.major_label_orientation=radians(90) 64 | 65 | # Configuration of the callback 66 | curdoc().add_root(fig) 67 | curdoc().add_periodic_callback(update_data, 1000) #ms 68 | -------------------------------------------------------------------------------- /docs/images/sst_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsurubee/banpei/d962460284481f098874f73aae226a3dd9af1dc9/docs/images/sst_example.png -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | category = "main" 3 | description = "NumPy is the fundamental package for array computing with Python." 4 | name = "numpy" 5 | optional = false 6 | python-versions = ">=3.6" 7 | version = "1.19.2" 8 | 9 | [[package]] 10 | category = "main" 11 | description = "Powerful data structures for data analysis, time series, and statistics" 12 | name = "pandas" 13 | optional = false 14 | python-versions = ">=3.6.1" 15 | version = "1.1.2" 16 | 17 | [package.dependencies] 18 | numpy = ">=1.15.4" 19 | python-dateutil = ">=2.7.3" 20 | pytz = ">=2017.2" 21 | 22 | [package.extras] 23 | test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"] 24 | 25 | [[package]] 26 | category = "main" 27 | description = "Extensions to the standard Python datetime module" 28 | name = "python-dateutil" 29 | optional = false 30 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 31 | version = "2.8.1" 32 | 33 | [package.dependencies] 34 | six = ">=1.5" 35 | 36 | [[package]] 37 | category = "main" 38 | description = "World timezone definitions, modern and historical" 39 | name = "pytz" 40 | optional = false 41 | python-versions = "*" 42 | version = "2020.1" 43 | 44 | [[package]] 45 | category = "main" 46 | description = "SciPy: Scientific Library for Python" 47 | name = "scipy" 48 | optional = false 49 | python-versions = ">=3.6" 50 | version = "1.5.2" 51 | 52 | [package.dependencies] 53 | numpy = ">=1.14.5" 54 | 55 | [[package]] 56 | category = "main" 57 | description = "Python 2 and 3 compatibility utilities" 58 | name = "six" 59 | optional = false 60 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 61 | version = "1.15.0" 62 | 63 | [metadata] 64 | content-hash = "c5e845a685da64b7df92315e5cb73d00549fafa9e3f768ea0b071dbac0f89db6" 65 | python-versions = "^3.8" 66 | 67 | [metadata.files] 68 | numpy = [ 69 | {file = "numpy-1.19.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b594f76771bc7fc8a044c5ba303427ee67c17a09b36e1fa32bde82f5c419d17a"}, 70 | {file = "numpy-1.19.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:e6ddbdc5113628f15de7e4911c02aed74a4ccff531842c583e5032f6e5a179bd"}, 71 | {file = "numpy-1.19.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3733640466733441295b0d6d3dcbf8e1ffa7e897d4d82903169529fd3386919a"}, 72 | {file = "numpy-1.19.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:4339741994c775396e1a274dba3609c69ab0f16056c1077f18979bec2a2c2e6e"}, 73 | {file = "numpy-1.19.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c6646314291d8f5ea900a7ea9c4261f834b5b62159ba2abe3836f4fa6705526"}, 74 | {file = "numpy-1.19.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:7118f0a9f2f617f921ec7d278d981244ba83c85eea197be7c5a4f84af80a9c3c"}, 75 | {file = "numpy-1.19.2-cp36-cp36m-win32.whl", hash = "sha256:9a3001248b9231ed73894c773142658bab914645261275f675d86c290c37f66d"}, 76 | {file = "numpy-1.19.2-cp36-cp36m-win_amd64.whl", hash = "sha256:967c92435f0b3ba37a4257c48b8715b76741410467e2bdb1097e8391fccfae15"}, 77 | {file = "numpy-1.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d526fa58ae4aead839161535d59ea9565863bb0b0bdb3cc63214613fb16aced4"}, 78 | {file = "numpy-1.19.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:eb25c381d168daf351147713f49c626030dcff7a393d5caa62515d415a6071d8"}, 79 | {file = "numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:62139af94728d22350a571b7c82795b9d59be77fc162414ada6c8b6a10ef5d02"}, 80 | {file = "numpy-1.19.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:0c66da1d202c52051625e55a249da35b31f65a81cb56e4c69af0dfb8fb0125bf"}, 81 | {file = "numpy-1.19.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:2117536e968abb7357d34d754e3733b0d7113d4c9f1d921f21a3d96dec5ff716"}, 82 | {file = "numpy-1.19.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:54045b198aebf41bf6bf4088012777c1d11703bf74461d70cd350c0af2182e45"}, 83 | {file = "numpy-1.19.2-cp37-cp37m-win32.whl", hash = "sha256:aba1d5daf1144b956bc87ffb87966791f5e9f3e1f6fab3d7f581db1f5b598f7a"}, 84 | {file = "numpy-1.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:addaa551b298052c16885fc70408d3848d4e2e7352de4e7a1e13e691abc734c1"}, 85 | {file = "numpy-1.19.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:58d66a6b3b55178a1f8a5fe98df26ace76260a70de694d99577ddeab7eaa9a9d"}, 86 | {file = "numpy-1.19.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:59f3d687faea7a4f7f93bd9665e5b102f32f3fa28514f15b126f099b7997203d"}, 87 | {file = "numpy-1.19.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cebd4f4e64cfe87f2039e4725781f6326a61f095bc77b3716502bed812b385a9"}, 88 | {file = "numpy-1.19.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c35a01777f81e7333bcf276b605f39c872e28295441c265cd0c860f4b40148c1"}, 89 | {file = "numpy-1.19.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d7ac33585e1f09e7345aa902c281bd777fdb792432d27fca857f39b70e5dd31c"}, 90 | {file = "numpy-1.19.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:04c7d4ebc5ff93d9822075ddb1751ff392a4375e5885299445fcebf877f179d5"}, 91 | {file = "numpy-1.19.2-cp38-cp38-win32.whl", hash = "sha256:51ee93e1fac3fe08ef54ff1c7f329db64d8a9c5557e6c8e908be9497ac76374b"}, 92 | {file = "numpy-1.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:1669ec8e42f169ff715a904c9b2105b6640f3f2a4c4c2cb4920ae8b2785dac65"}, 93 | {file = "numpy-1.19.2-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:0bfd85053d1e9f60234f28f63d4a5147ada7f432943c113a11afcf3e65d9d4c8"}, 94 | {file = "numpy-1.19.2.zip", hash = "sha256:0d310730e1e793527065ad7dde736197b705d0e4c9999775f212b03c44a8484c"}, 95 | ] 96 | pandas = [ 97 | {file = "pandas-1.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:eb0ac2fd04428f18b547716f70c699a7cc9c65a6947ed8c7e688d96eb91e3db8"}, 98 | {file = "pandas-1.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:02ec9f5f0b7df7227931a884569ef0b6d32d76789c84bcac1a719dafd1f912e8"}, 99 | {file = "pandas-1.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1edf6c254d2d138188e9987159978ee70e23362fe9197f3f100844a197f7e1e4"}, 100 | {file = "pandas-1.1.2-cp36-cp36m-win32.whl", hash = "sha256:b821f239514a9ce46dd1cd6c9298a03ed58d0235d414ea264aacc1b14916bbe4"}, 101 | {file = "pandas-1.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ab6ea0f3116f408a8a59cd50158bfd19d2a024f4e221f14ab1bcd2da4f0c6fdf"}, 102 | {file = "pandas-1.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:474fa53e3b2f3a543cbca81f7457bd1f44e7eb1be7171067636307e21b624e9c"}, 103 | {file = "pandas-1.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9e135ce9929cd0f0ba24f0545936af17ba935f844d4c3a2b979354a73c9440e0"}, 104 | {file = "pandas-1.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:188cdfbf8399bc144fa95040536b5ce3429d2eda6c9c8b238c987af7df9f128c"}, 105 | {file = "pandas-1.1.2-cp37-cp37m-win32.whl", hash = "sha256:08783a33989a6747317766b75be30a594a9764b9f145bb4bcc06e337930d9807"}, 106 | {file = "pandas-1.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:f7008ec22b92d771b145150978d930a28fab8da3a10131b01bbf39574acdad0b"}, 107 | {file = "pandas-1.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:59df9f0276aa4854d8bff28c5e5aeb74d9c6bb4d9f55d272b7124a7df40e47d0"}, 108 | {file = "pandas-1.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:eeb64c5b3d4f2ea072ca8afdeb2b946cd681a863382ca79734f1b520b8d2fa26"}, 109 | {file = "pandas-1.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c9235b37489168ed6b173551c816b50aa89f03c24a8549a8b4d47d8dc79bfb1e"}, 110 | {file = "pandas-1.1.2-cp38-cp38-win32.whl", hash = "sha256:0936991228241db937e87f82ec552a33888dd04a2e0d5a2fa3c689f92fab09e0"}, 111 | {file = "pandas-1.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:026d764d0b86ee53183aa4c0b90774b6146123eeada4e24946d7d24290777be1"}, 112 | {file = "pandas-1.1.2.tar.gz", hash = "sha256:b64ffd87a2cfd31b40acd4b92cb72ea9a52a48165aec4c140e78fd69c45d1444"}, 113 | ] 114 | python-dateutil = [ 115 | {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, 116 | {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, 117 | ] 118 | pytz = [ 119 | {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, 120 | {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, 121 | ] 122 | scipy = [ 123 | {file = "scipy-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cca9fce15109a36a0a9f9cfc64f870f1c140cb235ddf27fe0328e6afb44dfed0"}, 124 | {file = "scipy-1.5.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1c7564a4810c1cd77fcdee7fa726d7d39d4e2695ad252d7c86c3ea9d85b7fb8f"}, 125 | {file = "scipy-1.5.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:07e52b316b40a4f001667d1ad4eb5f2318738de34597bd91537851365b6c61f1"}, 126 | {file = "scipy-1.5.2-cp36-cp36m-win32.whl", hash = "sha256:d56b10d8ed72ec1be76bf10508446df60954f08a41c2d40778bc29a3a9ad9bce"}, 127 | {file = "scipy-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:8e28e74b97fc8d6aa0454989db3b5d36fc27e69cef39a7ee5eaf8174ca1123cb"}, 128 | {file = "scipy-1.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6e86c873fe1335d88b7a4bfa09d021f27a9e753758fd75f3f92d714aa4093768"}, 129 | {file = "scipy-1.5.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a0afbb967fd2c98efad5f4c24439a640d39463282040a88e8e928db647d8ac3d"}, 130 | {file = "scipy-1.5.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:eecf40fa87eeda53e8e11d265ff2254729d04000cd40bae648e76ff268885d66"}, 131 | {file = "scipy-1.5.2-cp37-cp37m-win32.whl", hash = "sha256:315aa2165aca31375f4e26c230188db192ed901761390be908c9b21d8b07df62"}, 132 | {file = "scipy-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ec5fe57e46828d034775b00cd625c4a7b5c7d2e354c3b258d820c6c72212a6ec"}, 133 | {file = "scipy-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fc98f3eac993b9bfdd392e675dfe19850cc8c7246a8fd2b42443e506344be7d9"}, 134 | {file = "scipy-1.5.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a785409c0fa51764766840185a34f96a0a93527a0ff0230484d33a8ed085c8f8"}, 135 | {file = "scipy-1.5.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0a0e9a4e58a4734c2eba917f834b25b7e3b6dc333901ce7784fd31aefbd37b2f"}, 136 | {file = "scipy-1.5.2-cp38-cp38-win32.whl", hash = "sha256:dac09281a0eacd59974e24525a3bc90fa39b4e95177e638a31b14db60d3fa806"}, 137 | {file = "scipy-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:92eb04041d371fea828858e4fff182453c25ae3eaa8782d9b6c32b25857d23bc"}, 138 | {file = "scipy-1.5.2.tar.gz", hash = "sha256:066c513d90eb3fd7567a9e150828d39111ebd88d3e924cdfc9f8ce19ab6f90c9"}, 139 | ] 140 | six = [ 141 | {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, 142 | {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, 143 | ] 144 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "banpei" 3 | version = "0.1.2" 4 | description = "Anomaly detection library with Python" 5 | authors = ["Hirofumi Tsuruta"] 6 | license = "MIT" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.6" 10 | numpy = "^1.19.2" 11 | pandas = "^1.1.2" 12 | scipy = "^1.5.2" 13 | 14 | [tool.poetry.dev-dependencies] 15 | 16 | [build-system] 17 | requires = ["poetry>=0.12"] 18 | build-backend = "poetry.masonry.api" 19 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsurubee/banpei/d962460284481f098874f73aae226a3dd9af1dc9/tests/__init__.py -------------------------------------------------------------------------------- /tests/test_data/davis.csv: -------------------------------------------------------------------------------- 1 | "x","sex","weight","height","repwt","repht" 2 | "1","M",77,182,77,180 3 | "2","F",58,161,51,159 4 | "3","F",53,161,54,158 5 | "4","M",68,177,70,175 6 | "5","F",59,157,59,155 7 | "6","M",76,170,76,165 8 | "7","M",76,167,77,165 9 | "8","M",69,186,73,180 10 | "9","M",71,178,71,175 11 | "10","M",65,171,64,170 12 | "11","M",70,175,75,174 13 | "12","F",166,57,56,163 14 | "13","F",51,161,52,158 15 | "14","F",64,168,64,165 16 | "15","F",52,163,57,160 17 | "16","F",65,166,66,165 18 | "17","M",92,187,101,185 19 | "18","F",62,168,62,165 20 | "19","M",76,197,75,200 21 | "20","F",61,175,61,171 22 | "21","M",119,180,124,178 23 | "22","F",61,170,61,170 24 | "23","M",65,175,66,173 25 | "24","M",66,173,70,170 26 | "25","F",54,171,59,168 27 | "26","F",50,166,50,165 28 | "27","F",63,169,61,168 29 | "28","F",58,166,60,160 30 | "29","F",39,157,41,153 31 | "30","M",101,183,100,180 32 | "31","F",71,166,71,165 33 | "32","M",75,178,73,175 34 | "33","M",79,173,76,173 35 | "34","F",52,164,52,161 36 | "35","F",68,169,63,170 37 | "36","M",64,176,65,175 38 | "37","F",56,166,54,165 39 | "38","M",69,174,69,171 40 | "39","M",88,178,86,175 41 | "40","M",65,187,67,188 42 | "41","F",54,164,53,160 43 | "42","M",80,178,80,178 44 | "43","F",63,163,59,159 45 | "44","M",78,183,80,180 46 | "45","M",85,179,82,175 47 | "46","F",54,160,55,158 48 | "47","M",73,180,NA,NA 49 | "48","F",49,161,NA,NA 50 | "49","F",54,174,56,173 51 | "50","F",75,162,75,158 52 | "51","M",82,182,85,183 53 | "52","F",56,165,57,163 54 | "53","M",74,169,73,170 55 | "54","M",102,185,107,185 56 | "55","M",64,177,NA,NA 57 | "56","M",65,176,64,172 58 | "57","F",66,170,65,NA 59 | "58","M",73,183,74,180 60 | "59","M",75,172,70,169 61 | "60","M",57,173,58,170 62 | "61","M",68,165,69,165 63 | "62","M",71,177,71,170 64 | "63","M",71,180,76,175 65 | "64","F",78,173,75,169 66 | "65","M",97,189,98,185 67 | "66","F",60,162,59,160 68 | "67","F",64,165,63,163 69 | "68","F",64,164,62,161 70 | "69","F",52,158,51,155 71 | "70","M",80,178,76,175 72 | "71","F",62,175,61,171 73 | "72","M",66,173,66,175 74 | "73","F",55,165,54,163 75 | "74","F",56,163,57,159 76 | "75","F",50,166,50,161 77 | "76","F",50,171,NA,NA 78 | "77","F",50,160,55,150 79 | "78","F",63,160,64,158 80 | "79","M",69,182,70,180 81 | "80","M",69,183,70,183 82 | "81","F",61,165,60,163 83 | "82","M",55,168,56,170 84 | "83","F",53,169,52,175 85 | "84","F",60,167,55,163 86 | "85","F",56,170,56,170 87 | "86","M",59,182,61,183 88 | "87","M",62,178,66,175 89 | "88","F",53,165,53,165 90 | "89","F",57,163,59,160 91 | "90","F",57,162,56,160 92 | "91","M",70,173,68,170 93 | "92","F",56,161,56,161 94 | "93","M",84,184,86,183 95 | "94","M",69,180,71,180 96 | "95","M",88,189,87,185 97 | "96","F",56,165,57,160 98 | "97","M",103,185,101,182 99 | "98","F",50,169,50,165 100 | "99","F",52,159,52,153 101 | "100","F",55,155,NA,154 102 | "101","F",55,164,55,163 103 | "102","M",63,178,63,175 104 | "103","F",47,163,47,160 105 | "104","F",45,163,45,160 106 | "105","F",62,175,63,173 107 | "106","F",53,164,51,160 108 | "107","F",52,152,51,150 109 | "108","F",57,167,55,164 110 | "109","F",64,166,64,165 111 | "110","F",59,166,55,163 112 | "111","M",84,183,90,183 113 | "112","M",79,179,79,171 114 | "113","F",55,174,57,171 115 | "114","M",67,179,67,179 116 | "115","F",76,167,77,165 117 | "116","F",62,168,62,163 118 | "117","M",83,184,83,181 119 | "118","M",96,184,94,183 120 | "119","M",75,169,76,165 121 | "120","M",65,178,66,178 122 | "121","M",78,178,77,175 123 | "122","M",69,167,73,165 124 | "123","F",68,178,68,175 125 | "124","F",55,165,55,163 126 | "125","M",67,179,NA,NA 127 | "126","F",52,169,56,NA 128 | "127","F",47,153,NA,154 129 | "128","F",45,157,45,153 130 | "129","F",68,171,68,169 131 | "130","F",44,157,44,155 132 | "131","F",62,166,61,163 133 | "132","M",87,185,89,185 134 | "133","F",56,160,53,158 135 | "134","F",50,148,47,148 136 | "135","M",83,177,84,175 137 | "136","F",53,162,53,160 138 | "137","F",64,172,62,168 139 | "138","F",62,167,NA,NA 140 | "139","M",90,188,91,185 141 | "140","M",85,191,83,188 142 | "141","M",66,175,68,175 143 | "142","F",52,163,53,160 144 | "143","F",53,165,55,163 145 | "144","F",54,176,55,176 146 | "145","F",64,171,66,171 147 | "146","F",55,160,55,155 148 | "147","F",55,165,55,165 149 | "148","F",59,157,55,158 150 | "149","F",70,173,67,170 151 | "150","M",88,184,86,183 152 | "151","F",57,168,58,165 153 | "152","F",47,162,47,160 154 | "153","F",47,150,45,152 155 | "154","F",55,162,NA,NA 156 | "155","F",48,163,44,160 157 | "156","M",54,169,58,165 158 | "157","M",69,172,68,174 159 | "158","F",59,170,NA,NA 160 | "159","F",58,169,NA,NA 161 | "160","F",57,167,56,165 162 | "161","F",51,163,50,160 163 | "162","F",54,161,54,160 164 | "163","F",53,162,52,158 165 | "164","F",59,172,58,171 166 | "165","M",56,163,58,161 167 | "166","F",59,159,59,155 168 | "167","F",63,170,62,168 169 | "168","F",66,166,66,165 170 | "169","M",96,191,95,188 171 | "170","F",53,158,50,155 172 | "171","M",76,169,75,165 173 | "172","F",54,163,NA,NA 174 | "173","M",61,170,61,170 175 | "174","M",82,176,NA,NA 176 | "175","M",62,168,64,168 177 | "176","M",71,178,68,178 178 | "177","F",60,174,NA,NA 179 | "178","M",66,170,67,165 180 | "179","M",81,178,82,175 181 | "180","M",68,174,68,173 182 | "181","M",80,176,78,175 183 | "182","F",43,154,NA,NA 184 | "183","M",82,181,NA,NA 185 | "184","F",63,165,59,160 186 | "185","M",70,173,70,173 187 | "186","F",56,162,56,160 188 | "187","F",60,172,55,168 189 | "188","F",58,169,54,166 190 | "189","M",76,183,75,180 191 | "190","F",50,158,49,155 192 | "191","M",88,185,93,188 193 | "192","M",89,173,86,173 194 | "193","F",59,164,59,165 195 | "194","F",51,156,51,158 196 | "195","F",62,164,61,161 197 | "196","M",74,175,71,175 198 | "197","M",83,180,80,180 199 | "198","M",81,175,NA,NA 200 | "199","M",90,181,91,178 201 | "200","M",79,177,81,178 202 | -------------------------------------------------------------------------------- /tests/test_data/periodic_wave.csv: -------------------------------------------------------------------------------- 1 | x,y 2 | 0.0,0.06506124188645807 3 | 0.06295776860901389,0.04729658034331435 4 | 0.12591553721802778,0.11202163914259894 5 | 0.18887330582704168,0.2808980113772533 6 | 0.25183107443605557,0.21703401453127058 7 | 0.3147888430450695,0.3513686153220881 8 | 0.37774661165408335,0.3506742148551789 9 | 0.4407043802630972,0.35497329725517246 10 | 0.5036621488721111,0.4743351610605363 11 | 0.5666199174811251,0.5952295954664806 12 | 0.629577686090139,0.5795088552782903 13 | 0.6925354546991528,0.6659616848105241 14 | 0.7554932233081667,0.6950754515518492 15 | 0.8184509919171806,0.7324297547200177 16 | 0.8814087605261944,0.7507608160400726 17 | 0.9443665291352084,0.8167148351701229 18 | 1.0073242977442223,0.7437610413894092 19 | 1.0702820663532362,0.8549198134863585 20 | 1.1332398349622501,0.8155925664665619 21 | 1.196197603571264,0.9441394659920148 22 | 1.259155372180278,0.9695647248636922 23 | 1.3221131407892917,0.9294341040910314 24 | 1.3850709093983056,1.022867934423886 25 | 1.4480286780073195,1.0122650400933064 26 | 1.5109864466163334,1.0128905266035009 27 | 1.5739442152253473,0.9819248523765491 28 | 1.6369019838343613,1.0214554668108649 29 | 1.6998597524433752,1.0443932226069927 30 | 1.7628175210523889,0.9485983494711171 31 | 1.8257752896614028,0.9268263807017753 32 | 1.8887330582704167,1.0093329702748166 33 | 1.9516908268794306,0.8124110518187613 34 | 2.0146485954884445,0.7722396160549472 35 | 2.0776063640974582,0.7835609773735198 36 | 2.1405641327064724,0.8511133033290953 37 | 2.203521901315486,0.8140374614071098 38 | 2.2664796699245002,0.7924411714292987 39 | 2.329437438533514,0.729570373005938 40 | 2.392395207142528,0.7579203114526158 41 | 2.4553529757515418,0.7124217275475572 42 | 2.518310744360556,0.6416536337626744 43 | 2.5812685129695696,0.4736707862337616 44 | 2.6442262815785833,0.4952915469320916 45 | 2.7071840501875974,0.37756387381106926 46 | 2.770141818796611,0.33793218557638843 47 | 2.8330995874056253,0.2524550768807747 48 | 2.896057356014639,0.24361122350131462 49 | 2.959015124623653,0.2087710657085111 50 | 3.021972893232667,0.12326929593478533 51 | 3.0849306618416805,-0.0030367575584913445 52 | 3.1478884304506947,-0.08259749466936603 53 | 3.2108461990597084,-0.10730244171993054 54 | 3.2738039676687225,-0.17070839652770003 55 | 3.336761736277736,-0.15471875201345356 56 | 3.3997195048867503,-0.27123395274661755 57 | 3.462677273495764,-0.3250292519613297 58 | 3.5256350421047777,-0.38251820521130386 59 | 3.588592810713792,-0.3774199738061773 60 | 3.6515505793228056,-0.4063347702573976 61 | 3.7145083479318197,-0.5207315505288479 62 | 3.7774661165408334,-0.6062957799468649 63 | 3.8404238851498476,-0.5731982477099264 64 | 3.9033816537588613,-0.6683050040600433 65 | 3.9663394223678754,-0.7554307711403355 66 | 4.029297190976889,-0.725096224203279 67 | 4.092254959585903,-0.8034390812565841 68 | 4.1552127281949165,-0.920453203516951 69 | 4.218170496803931,-0.8489943708067134 70 | 4.281128265412945,-0.8934482121074309 71 | 4.3440860340219585,-1.0257717546598983 72 | 4.407043802630972,-1.061295398981982 73 | 4.470001571239987,-0.9639526635214527 74 | 4.5329593398490005,-0.9497778312381652 75 | 4.595917108458014,-0.9627958133909896 76 | 4.658874877067028,-1.0666174507488742 77 | 4.7218326456760416,-1.0173059063799097 78 | 4.784790414285056,-0.964050664959146 79 | 4.84774818289407,-1.0676405325414937 80 | 4.9107059515030835,-0.9761354067348362 81 | 4.973663720112097,-0.9553950187876562 82 | 5.036621488721112,-0.9017077156650961 83 | 5.0995792573301255,-1.0486682282583353 84 | 5.162537025939139,-0.8931333314214245 85 | 5.225494794548153,-0.7703180203796351 86 | 5.288452563157167,-0.8696737815042043 87 | 5.351410331766181,-0.8184917845614543 88 | 5.414368100375195,-0.7158660945920687 89 | 5.477325868984209,-0.7595831930339249 90 | 5.540283637593222,-0.6185801175042738 91 | 5.603241406202236,-0.6017227438972625 92 | 5.666199174811251,-0.6572832746859844 93 | 5.729156943420264,-0.5210875866430151 94 | 5.792114712029278,-0.5445193375098958 95 | 5.855072480638292,-0.3675272941616243 96 | 5.918030249247306,-0.44112785712273733 97 | 5.98098801785632,-0.3882063279784675 98 | 6.043945786465334,-0.29382909591757844 99 | 6.106903555074347,-0.2155238028498885 100 | 6.169861323683361,-0.04733454258048603 101 | 6.232819092292376,-0.051257799883730824 102 | 6.295776860901389,0.02714144811697626 103 | 6.358734629510403,0.12922246145307048 104 | 6.421692398119417,0.10317416224951799 105 | 6.484650166728431,0.17118849116205567 106 | 6.547607935337445,0.21897938039812126 107 | 6.610565703946459,0.3608088961738647 108 | 6.673523472555472,0.46216497607766 109 | 6.736481241164486,0.4508681051072901 110 | 6.799439009773501,0.46246155023237234 111 | 6.862396778382514,0.5213461402417442 112 | 6.925354546991528,0.5433182584571982 113 | 6.988312315600542,0.684687823867084 114 | 7.0512700842095555,0.6416125656053029 115 | 7.11422785281857,0.7259029054604581 116 | 7.177185621427584,0.7211353019268203 117 | 7.2401433900365975,0.7224700256396598 118 | 7.303101158645611,0.7250662082897227 119 | 7.366058927254626,0.8388105066884541 120 | 7.429016695863639,0.9219571140288991 121 | 7.491974464472653,0.919297086502758 122 | 7.554932233081667,0.9444382343156823 123 | 7.6178900016906805,0.9186905889900785 124 | 7.680847770299695,0.9384656554911998 125 | 7.743805538908709,0.9405516339839456 126 | 7.8067633075177225,1.0094471049902523 127 | 7.869721076126736,1.1022588793946153 128 | 7.932678844735751,0.9900863468730502 129 | 7.9956366133447645,0.9215196790023258 130 | 8.058594381953778,1.0427709094642694 131 | 8.121552150562792,0.9144877503154833 132 | 8.184509919171806,0.9737476564567903 133 | 8.24746768778082,0.9014453147806722 134 | 8.310425456389833,0.9016797468818217 135 | 8.373383224998848,1.039749533403869 136 | 8.436340993607862,0.7977910240150363 137 | 8.499298762216876,0.7695750477742788 138 | 8.56225653082589,0.7782470000437081 139 | 8.625214299434903,0.7159546843525625 140 | 8.688172068043917,0.6514740459909498 141 | 8.75112983665293,0.5894209499701796 142 | 8.814087605261944,0.6029578653771741 143 | 8.877045373870958,0.5746216900882468 144 | 8.940003142479974,0.41840493142958796 145 | 9.002960911088987,0.3525972519029192 146 | 9.065918679698001,0.4427017209903954 147 | 9.128876448307015,0.22034449230328168 148 | 9.191834216916028,0.26660942853285696 149 | 9.254791985525042,0.1911248951257576 150 | 9.317749754134056,0.051675510845851466 151 | 9.38070752274307,0.08203085343478406 152 | 9.443665291352083,-0.07404702496619185 153 | 9.506623059961099,-0.13623130984097473 154 | 9.569580828570112,-0.21377487535233522 155 | 9.632538597179126,-0.16455505190660946 156 | 9.69549636578814,-0.2898910380249642 157 | 9.758454134397153,-0.27325608085987146 158 | 9.821411903006167,-0.4268227990662643 159 | 9.88436967161518,-0.41284909215000226 160 | 9.947327440224194,-0.42872047806193436 161 | 10.010285208833208,-0.5569228857674915 162 | 10.073242977442224,-0.6602363552085809 163 | 10.136200746051237,-0.6700406441293089 164 | 10.199158514660251,-0.6364365222557714 165 | 10.262116283269265,-0.7059092217500865 166 | 10.325074051878278,-0.8028103331489258 167 | 10.388031820487292,-0.908272000682025 168 | 10.450989589096306,-0.8195656776045306 169 | 10.51394735770532,-0.8046971541842495 170 | 10.576905126314333,-0.8312010911109383 171 | 10.639862894923347,-0.9157594683687741 172 | 10.702820663532362,-0.9670042972451312 173 | 10.765778432141376,-1.0130189786034127 174 | 10.82873620075039,-1.0147448700002628 175 | 10.891693969359403,-1.0770968052123535 176 | 10.954651737968417,-0.8924352113680307 177 | 11.01760950657743,-1.0011054538488326 178 | 11.080567275186445,-0.8771700128890275 179 | 11.143525043795458,-0.9928001075302453 180 | 11.206482812404472,-1.0587570166916742 181 | 11.269440581013487,-0.8696541784917539 182 | 11.332398349622501,-0.9868003946682034 183 | 11.395356118231515,-0.943041341772627 184 | 11.458313886840529,-0.8124053420186199 185 | 11.521271655449542,-0.7920355408468089 186 | 11.584229424058556,-0.9329984778584512 187 | 11.64718719266757,-0.7950539167419293 188 | 11.710144961276583,-0.8098513956598445 189 | 11.773102729885597,-0.6856926494467005 190 | 11.836060498494613,-0.5764918387572316 191 | 11.899018267103626,-0.6447830164246641 192 | 11.96197603571264,-0.4936028716878344 193 | 12.024933804321654,-0.5618000387436981 194 | 12.087891572930667,-0.35181603361964076 195 | 12.150849341539681,-0.4449495953966356 196 | 12.213807110148695,-0.3684716624292996 197 | 12.276764878757708,-0.2707265330566906 198 | 12.339722647366722,-0.2947422092954155 199 | 12.402680415975738,-0.08547973544889191 200 | 12.465638184584751,-0.1540630056864629 201 | 12.528595953193765,-0.0070681000007794745 202 | 12.591553721802779,-0.03927605625360736 203 | 12.654511490411792,0.09351594266840267 204 | 12.717469259020806,0.14999804136296233 205 | 12.78042702762982,0.19301342615008912 206 | 12.843384796238833,0.2979458439037164 207 | 12.906342564847847,0.2776190353401475 208 | 12.969300333456863,0.46820840552897225 209 | 13.032258102065876,0.459338248242056 210 | 13.09521587067489,0.3649644814673685 211 | 13.158173639283904,0.6581364033143523 212 | 13.221131407892917,0.6316052048226249 213 | 13.284089176501931,0.7353460204515003 214 | 13.347046945110945,0.6949132431419092 215 | 13.410004713719959,0.6339330574176386 216 | 13.472962482328972,0.7664215385142404 217 | 13.535920250937988,0.7633275413995897 218 | 13.598878019547001,0.8566630292118264 219 | 13.661835788156015,0.8650048807488042 220 | 13.724793556765029,0.9266228015036786 221 | 13.787751325374042,0.8513525324719826 222 | 13.850709093983056,0.9619398686358731 223 | 13.91366686259207,0.9521485607720677 224 | 13.976624631201084,1.0188161818978423 225 | 14.039582399810097,0.9106272784465195 226 | 14.102540168419111,0.978147004416187 227 | 14.165497937028126,1.0825186711693837 228 | 14.22845570563714,0.9367829287794217 229 | 14.291413474246154,1.0250302548740793 230 | 14.354371242855168,1.0430290447115176 231 | 14.417329011464181,0.9605061482255584 232 | 14.480286780073195,0.9911351852200321 233 | 14.543244548682209,0.9707492477361488 234 | 14.606202317291222,0.9704925137394653 235 | 14.669160085900236,0.8434061461862449 236 | 14.732117854509251,0.8225610571666502 237 | 14.795075623118265,0.8314788678855423 238 | 14.858033391727279,0.7139519202978546 239 | 14.920991160336293,0.7106213868303763 240 | 14.983948928945306,0.6274688208671356 241 | 15.04690669755432,0.49749913587687816 242 | 15.109864466163334,0.5798180844661187 243 | 15.172822234772347,0.5950838631207627 244 | 15.235780003381361,0.43622849986192797 245 | 15.298737771990377,0.40211376426302453 246 | 15.36169554059939,0.3167341846851979 247 | 15.424653309208404,0.24248701562255087 248 | 15.487611077817418,0.22537853418472462 249 | 15.550568846426431,0.21039192545425772 250 | 15.613526615035445,0.205088513510634 251 | 15.676484383644459,0.07279751357200856 252 | 15.739442152253472,-0.07954187584665831 253 | 15.802399920862486,-0.1656471281538182 254 | 15.865357689471502,-0.09140384126604618 255 | 15.928315458080515,-0.20273756141351776 256 | 15.991273226689529,-0.31005834492499024 257 | 16.054230995298543,-0.39219803907438555 258 | 16.117188763907556,-0.4382850130522637 259 | 16.18014653251657,-0.3931604884474617 260 | 16.243104301125584,-0.5110803293765069 261 | 16.306062069734597,-0.6330958261339847 262 | 16.36901983834361,-0.5703222425116412 263 | 16.431977606952625,-0.6468922241630423 264 | 16.49493537556164,-0.7227754600367692 265 | 16.557893144170652,-0.720848360357751 266 | 16.620850912779666,-0.8326569231981681 267 | 16.68380868138868,-0.7799807814639186 268 | 16.746766449997697,-0.9330408013372579 269 | 16.80972421860671,-0.9371768745618306 270 | 16.872681987215724,-0.9875214180675853 271 | 16.935639755824738,-0.9625376061027703 272 | 16.99859752443375,-0.9988831883135427 273 | 17.061555293042765,-0.9946360348901461 274 | 17.12451306165178,-0.9878891790172987 275 | 17.187470830260793,-0.9681234466708736 276 | 17.250428598869807,-0.9922721005407337 277 | 17.31338636747882,-0.9868075680412912 278 | 17.376344136087834,-0.9150262087332218 279 | 17.439301904696848,-1.0004652664042175 280 | 17.50225967330586,-1.0480444493988847 281 | 17.565217441914875,-0.9116816577905221 282 | 17.62817521052389,-0.8477794592265224 283 | 17.691132979132902,-0.9068077527931945 284 | 17.754090747741916,-0.8471645127277715 285 | 17.81704851635093,-0.8913679866833831 286 | 17.880006284959947,-0.81534727177363 287 | 17.94296405356896,-0.7555561660701391 288 | 18.005921822177974,-0.7281350448951269 289 | 18.068879590786988,-0.7307449536438366 290 | 18.131837359396002,-0.5761362697664427 291 | 18.194795128005016,-0.6003287195056234 292 | 18.25775289661403,-0.5113484142429334 293 | 18.320710665223043,-0.4842477340320322 294 | 18.383668433832057,-0.40553216926300634 295 | 18.44662620244107,-0.345452452366297 296 | 18.509583971050084,-0.3442684056719377 297 | 18.572541739659098,-0.2318009435727667 298 | 18.63549950826811,-0.10440268515658681 299 | 18.698457276877125,-0.05057474943915885 300 | 18.76141504548614,-0.049824724360380795 301 | 18.824372814095153,0.05918231543762021 302 | 18.887330582704166,-0.027632888978415003 303 | 18.95028835131318,0.17418197581643458 304 | 19.013246119922197,0.1667039830038907 305 | 19.07620388853121,0.1353657167729944 306 | 19.139161657140225,0.29383493077101935 307 | 19.20211942574924,0.3941195789415469 308 | 19.265077194358252,0.3688655172853017 309 | 19.328034962967266,0.5572861384419296 310 | 19.39099273157628,0.5828292088878664 311 | 19.453950500185293,0.5045083184870294 312 | 19.516908268794307,0.6693630384351733 313 | 19.57986603740332,0.6726993277118093 314 | 19.642823806012334,0.685065548359677 315 | 19.705781574621348,0.7395430632754968 316 | 19.76873934323036,0.772856905103224 317 | 19.831697111839375,0.7708746059376507 318 | 19.89465488044839,0.8425580460489928 319 | 19.957612649057403,0.9294673421001254 320 | 20.020570417666416,0.9924430325967297 321 | 20.08352818627543,1.0167259603124523 322 | 20.146485954884447,0.9340643971427726 323 | 20.20944372349346,0.9719787362546976 324 | 20.272401492102475,0.9461066709156922 325 | 20.33535926071149,1.047890394240757 326 | 20.398317029320502,0.9173495884543009 327 | 20.461274797929516,0.9309989614614071 328 | 20.52423256653853,0.9628169550824344 329 | 20.587190335147543,0.9986884513582911 330 | 20.650148103756557,0.9576555160887397 331 | 20.71310587236557,0.9591060339616235 332 | 20.776063640974584,0.9397757094587564 333 | 20.839021409583598,0.9252947813162951 334 | 20.90197917819261,0.8345193178282714 335 | 20.964936946801625,0.8383745283283035 336 | 21.02789471541064,0.8499339987429166 337 | 21.090852484019653,0.7975223862582728 338 | 21.153810252628666,0.7975292452130851 339 | 21.21676802123768,0.6619621820291745 340 | 21.279725789846694,0.698225167684621 341 | 21.34268355845571,0.6772949549097048 342 | 21.405641327064725,0.5454926955213519 343 | 21.46859909567374,0.5123875150132409 344 | 21.531556864282752,0.4548416931712521 345 | 21.594514632891766,0.4130993270025693 346 | 21.65747240150078,0.34691470262338403 347 | 21.720430170109793,0.3408981310376638 348 | 21.783387938718807,0.23193745894985585 349 | 21.84634570732782,0.18752244860493694 350 | 21.909303475936834,0.09833009144285748 351 | 21.972261244545848,-0.033202306448525655 352 | 22.03521901315486,-0.022388156179803664 353 | 22.098176781763875,-0.11832178942436322 354 | 22.16113455037289,-0.20092289742217614 355 | 22.224092318981903,-0.27556128826806175 356 | 22.287050087590917,-0.2951221549451334 357 | 22.35000785619993,-0.38157961418467456 358 | 22.412965624808944,-0.3074352936834716 359 | 22.47592339341796,-0.3861705401109484 360 | 22.538881162026975,-0.5340993764894153 361 | 22.60183893063599,-0.5379753134735067 362 | 22.664796699245002,-0.565993202275698 363 | 22.727754467854016,-0.6804195596454983 364 | 22.79071223646303,-0.6246403541457315 365 | 22.853670005072043,-0.7133797090815516 366 | 22.916627773681057,-0.8039945254472093 367 | 22.97958554229007,-0.925132293921586 368 | 23.042543310899084,-0.916414122225716 369 | 23.105501079508098,-0.8816909594529017 370 | 23.168458848117112,-0.9454912827152211 371 | 23.231416616726126,-0.946908687467845 372 | 23.29437438533514,-1.0037817481533589 373 | 23.357332153944153,-0.9667936063426067 374 | 23.420289922553167,-1.0128988011632296 375 | 23.48324769116218,-1.0745402660994625 376 | 23.546205459771194,-1.0169583001023728 377 | 23.60916322838021,-1.0274867162929051 378 | 23.672120996989225,-1.071519633088254 379 | 23.73507876559824,-0.913890874282893 380 | 23.798036534207252,-0.9760621313171649 381 | 23.860994302816266,-0.9719602826242205 382 | 23.92395207142528,-0.897669124243872 383 | 23.986909840034293,-0.9151829510876742 384 | 24.049867608643307,-0.8449439008801348 385 | 24.11282537725232,-0.9260967094190198 386 | 24.175783145861335,-0.8692759739988225 387 | 24.23874091447035,-0.7523219896175399 388 | 24.301698683079362,-0.6640396906889755 389 | 24.364656451688376,-0.6932584274153375 390 | 24.42761422029739,-0.6373088421716936 391 | 24.490571988906403,-0.6401061681771876 392 | 24.553529757515417,-0.5488609854403425 393 | 24.61648752612443,-0.529072385599978 394 | 24.679445294733444,-0.44594288618116323 395 | 24.742403063342458,-0.34438715941697423 396 | 24.805360831951475,-0.42150186101316145 397 | 24.86831860056049,-0.25070072097086266 398 | 24.931276369169503,-0.24033185628071563 399 | 24.994234137778516,-0.17039376802492323 400 | 25.05719190638753,-0.018568835561760894 401 | 25.120149674996544,0.0021807622344758165 402 | 25.183107443605557,0.09702640453547332 403 | 25.24606521221457,0.024892846168822466 404 | 25.309022980823585,0.15485932857863102 405 | 25.3719807494326,0.21428051911772253 406 | 25.434938518041612,0.26814715867995487 407 | 25.497896286650626,0.37910585870318264 408 | 25.56085405525964,0.4599507591417456 409 | 25.623811823868653,0.4162312960664731 410 | 25.686769592477667,0.4779841293080006 411 | 25.74972736108668,0.5159817318089304 412 | 25.812685129695694,0.68612973568983 413 | 25.875642898304708,0.6506911156307574 414 | 25.938600666913725,0.7163570239197564 415 | 26.00155843552274,0.7469551721324662 416 | 26.064516204131753,0.7544969889347922 417 | 26.127473972740766,0.8572764632471731 418 | 26.19043174134978,0.890375456484514 419 | 26.253389509958794,0.947448976998957 420 | 26.316347278567807,0.9147026276238682 421 | 26.37930504717682,0.9330411430571002 422 | 26.442262815785835,0.9367853949186533 423 | 26.50522058439485,1.0548066341824474 424 | 26.568178353003862,1.0412312713718055 425 | 26.631136121612876,0.9953609005163947 426 | 26.69409389022189,1.032404089225333 427 | 26.757051658830903,0.9692762746849658 428 | 26.820009427439917,1.09594855399664 429 | 26.88296719604893,0.9543673314537925 430 | 26.945924964657944,0.9517832660174543 431 | 27.008882733266958,0.9351916653270443 432 | 27.071840501875975,1.0180014318158481 433 | 27.13479827048499,0.9158195939955351 434 | 27.197756039094003,0.9345606142768715 435 | 27.260713807703016,0.8432468191534134 436 | 27.32367157631203,0.7531518299983271 437 | 27.386629344921044,0.8143989184617566 438 | 27.449587113530058,0.703053099570542 439 | 27.51254488213907,0.6242909481406925 440 | 27.575502650748085,0.6225195468161991 441 | 27.6384604193571,0.6254633433370628 442 | 27.701418187966112,0.630298730328185 443 | 27.764375956575126,0.41876662964064915 444 | 27.82733372518414,0.3223094816505451 445 | 27.890291493793153,0.4211793017317488 446 | 27.953249262402167,0.3305984979635418 447 | 28.01620703101118,0.22709626428052848 448 | 28.079164799620195,0.21485050620048932 449 | 28.142122568229208,0.16829863234795367 450 | 28.205080336838222,0.16480163878453086 451 | 28.26803810544724,-0.00022136134386586872 452 | 28.330995874056253,0.007358331621876095 453 | 28.393953642665267,-0.14192249052250644 454 | 28.45691141127428,-0.2070482985598218 455 | 28.519869179883294,-0.22188693066020335 456 | 28.582826948492308,-0.35937156216489263 457 | 28.64578471710132,-0.428065655156863 458 | 28.708742485710335,-0.37271435298909533 459 | 28.77170025431935,-0.5752664060299991 460 | 28.834658022928362,-0.5257933870494734 461 | 28.897615791537376,-0.5999402150215747 462 | 28.96057356014639,-0.6522835648702011 463 | 29.023531328755404,-0.7476665857418869 464 | 29.086489097364417,-0.8275666302351506 465 | 29.14944686597343,-0.8006613433143877 466 | 29.212404634582445,-0.8646796511426654 467 | 29.27536240319146,-0.863297203077866 468 | 29.338320171800472,-0.869895526945638 469 | 29.40127794040949,-0.9401921323494714 470 | 29.464235709018503,-0.98195874080268 471 | 29.527193477627517,-0.9353803642041222 472 | 29.59015124623653,-1.0057603365237073 473 | 29.653109014845544,-1.0295971001538717 474 | 29.716066783454558,-1.0066405343682467 475 | 29.77902455206357,-0.9835412448185367 476 | 29.841982320672585,-0.8945576239033748 477 | 29.9049400892816,-0.9175338446864737 478 | 29.967897857890613,-1.0556425595898213 479 | 30.030855626499626,-1.0490150148600303 480 | 30.09381339510864,-0.9660014979564204 481 | 30.156771163717654,-0.9239817535352715 482 | 30.219728932326667,-0.9372398017802411 483 | 30.28268670093568,-0.7971731079195863 484 | 30.345644469544695,-0.8184823852565947 485 | 30.40860223815371,-0.7634028456069464 486 | 30.471560006762722,-0.8310192510333431 487 | 30.53451777537174,-0.8164796864975858 488 | 30.597475543980753,-0.7836026013999488 489 | 30.660433312589767,-0.6913368640035278 490 | 30.72339108119878,-0.7014080893256637 491 | 30.786348849807794,-0.6204930668442362 492 | 30.849306618416808,-0.5583217637197 493 | 30.91226438702582,-0.43542191808530484 494 | 30.975222155634835,-0.4502204265140954 495 | 31.03817992424385,-0.43918009291978966 496 | 31.101137692852863,-0.3319893606905127 497 | 31.164095461461876,-0.23974854865836726 498 | 31.22705323007089,-0.15970645396791303 499 | 31.290010998679904,-0.17166602762430253 500 | 31.352968767288917,-0.03054743031031689 501 | 31.41592653589793,0.06934127969705098 502 | 31.41592653589793,0.024475830907089356 503 | 31.478884304506945,0.17489997098560325 504 | 31.54184207311596,0.29915807349982027 505 | 31.604799841724972,0.4410304894181261 506 | 31.667757610333986,0.5074722702515424 507 | 31.730715378943,0.7604855161246024 508 | 31.793673147552013,0.8139827128887736 509 | 31.856630916161027,0.9186822636456653 510 | 31.91958868477004,0.991125224709581 511 | 31.982546453379058,0.9559222673542707 512 | 32.04550422198807,1.0486656009102562 513 | 32.108461990597085,0.9793684441851058 514 | 32.171419759206096,0.9984278476472433 515 | 32.23437752781511,0.8571985504621605 516 | 32.29733529642412,0.7671653575473667 517 | 32.36029306503314,0.619963698334668 518 | 32.42325083364215,0.572911707437064 519 | 32.48620860225117,0.2460317699979464 520 | 32.54916637086018,0.16729081231277992 521 | 32.612124139469195,0.016220986021183638 522 | 32.67508190807821,-0.2083475154141673 523 | 32.73803967668722,-0.33133743350434597 524 | 32.80099744529624,-0.552188356979521 525 | 32.86395521390525,-0.574183739955795 526 | 32.92691298251427,-0.7784802287008665 527 | 32.98987075112328,-0.7953075548711411 528 | 33.052828519732294,-0.910714671389991 529 | 33.115786288341305,-0.9990885143143898 530 | 33.17874405695032,-1.0693720013250618 531 | 33.24170182555933,-1.0335429454265534 532 | 33.30465959416835,-0.9648683648330201 533 | 33.36761736277736,-0.9414602245118255 534 | 33.43057513138638,-0.8316620114208175 535 | 33.49353289999539,-0.8110522206029055 536 | 33.556490668604404,-0.5773680832951208 537 | 33.619448437213414,-0.5380149283452279 538 | 33.68240620582243,-0.4227609370519198 539 | 33.74536397443144,-0.1592045253924088 540 | 33.80832174304046,0.004962137795262889 541 | 33.871279511649476,0.09605369462553678 542 | 33.934237280258486,0.237136901457282 543 | 33.9971950488675,0.4606584170299804 544 | 34.060152817476514,0.513151476111783 545 | 34.12311058608553,0.7324073628774813 546 | 34.18606835469454,0.7257476292409806 547 | 34.24902612330356,0.8791389185593372 548 | 34.31198389191257,0.9484832894779553 549 | 34.374941660521586,1.0475457114159403 550 | 34.437899429130596,0.9085340637158112 551 | 34.50085719773961,0.9978366152331251 552 | 34.56381496634862,0.9398355010491236 553 | 34.62677273495764,0.8804851004631324 554 | 34.68973050356665,0.7470674480444288 555 | 34.75268827217567,0.6159565795415362 556 | 34.815646040784685,0.5294653570253016 557 | 34.878603809393695,0.39733571773529086 558 | 34.941561578002705,0.32902908372464335 559 | 35.00451934661172,0.09986542889481036 560 | 35.06747711522074,-0.06941201419121282 561 | 35.13043488382975,-0.19592544144689972 562 | 35.19339265243877,-0.4669085295794684 563 | 35.25635042104778,-0.4953324774505873 564 | 35.319308189656795,-0.6166285469042551 565 | 35.382265958265805,-0.730267716390426 566 | 35.44522372687482,-0.8847660649280906 567 | 35.50818149548383,-0.9991614781470186 568 | 35.57113926409285,-1.0308669342888548 569 | 35.63409703270186,-0.9872260107316514 570 | 35.69705480131088,-0.9640146798400342 571 | 35.76001256991989,-0.8917894899127387 572 | 35.822970338528904,-0.8187611942676754 573 | 35.885928107137914,-0.7665633060997823 574 | 35.94888587574693,-0.702063631083607 575 | 36.01184364435595,-0.5653336055937879 576 | 36.07480141296496,-0.4496965988794158 577 | 36.13775918157397,-0.23283097883598164 578 | 36.200716950182986,-0.09586949743180342 579 | 36.263674718792004,0.04855866182280168 580 | 36.326632487401014,0.13732475011105216 581 | 36.38959025601003,0.4094272027320619 582 | 36.45254802461904,0.42819236508227604 583 | 36.51550579322806,0.700079702830543 584 | 36.57846356183707,0.8046061206036068 585 | 36.641421330446086,0.7727105374506955 586 | 36.704379099055096,0.9235504149396282 587 | 36.76733686766411,0.9130579394342513 588 | 36.83029463627312,0.9909809562474495 589 | 36.89325240488214,1.0223677886875746 590 | 36.95621017349115,0.9575841660696048 591 | 37.01916794210017,0.8402460709651736 592 | 37.08212571070918,0.8412173751954807 593 | 37.145083479318195,0.7387458938131221 594 | 37.20804124792721,0.6026019773680455 595 | 37.27099901653622,0.4137521862723902 596 | 37.33395678514524,0.298106851914508 597 | 37.39691455375425,0.170171728975335 598 | 37.45987232236327,-0.014048226335319453 599 | 37.52283009097228,-0.06353742049949974 600 | 37.585787859581295,-0.3147146750057685 601 | 37.648745628190305,-0.48745071933548806 602 | 37.71170339679932,-0.5898212944220196 603 | 37.77466116540833,-0.7896475445484321 604 | 37.83761893401735,-0.814129577451363 605 | 37.90057670262636,-0.8327910835873222 606 | 37.96353447123538,-1.0118571679234523 607 | 38.02649223984439,-0.9808943227128899 608 | 38.089450008453404,-0.9590245060883344 609 | 38.152407777062415,-1.0569270184130186 610 | 38.21536554567143,-0.8392014846859095 611 | 38.27832331428044,-0.8976556234428085 612 | 38.34128108288946,-0.7638165266167467 613 | 38.40423885149848,-0.609715793077587 614 | 38.46719662010749,-0.5052556941219989 615 | 38.530154388716504,-0.3051579306816585 616 | 38.593112157325514,-0.18020608603981197 617 | 38.65606992593453,0.003307118830093568 618 | 38.71902769454354,0.14181332844102412 619 | 38.78198546315256,0.3712187229709036 620 | 38.84494323176157,0.3484409799466988 621 | 38.907901000370586,0.60700817649009 622 | 38.970858768979596,0.6976188041601905 623 | 39.03381653758861,0.7694915497716958 624 | 39.096774306197624,0.8598021972428381 625 | 39.15973207480664,0.9306517495055463 626 | 39.22268984341565,1.0213940393731393 627 | 39.28564761202467,0.9543562675013397 628 | 39.348605380633686,0.9709805640814733 629 | 39.411563149242696,0.9467021270544839 630 | 39.474520917851706,0.804008173699574 631 | 39.53747868646072,0.8232333521407172 632 | 39.60043645506974,0.7739915622105723 633 | 39.66339422367875,0.48705199634660257 634 | 39.72635199228776,0.4206438110830743 635 | 39.78930976089678,0.20308933696946366 636 | 39.852267529505795,0.08330004978099875 637 | 39.915225298114805,-0.11590924806638644 638 | 39.97818306672382,-0.15699066414829033 639 | 40.04114083533283,-0.43709059862695837 640 | 40.10409860394185,-0.5233758068206238 641 | 40.16705637255086,-0.6598487660800364 642 | 40.23001414115988,-0.8531070766033843 643 | 40.29297190976889,-0.994255937540733 644 | 40.355929678377905,-0.9209280716343957 645 | 40.418887446986915,-0.9459016486272707 646 | 40.48184521559593,-1.026790679834694 647 | 40.54480298420495,-1.016718466976064 648 | 40.60776075281396,-0.8949688806967214 649 | 40.67071852142297,-0.8346942250219668 650 | 40.73367629003199,-0.7396135996416582 651 | 40.796634058641004,-0.6633577599571641 652 | 40.859591827250014,-0.5867780146546946 653 | 40.92254959585903,-0.4645655698348345 654 | 40.98550736446804,-0.3488345215638627 655 | 41.04846513307706,-0.09091088325799992 656 | 41.11142290168607,0.17143591196549296 657 | 41.174380670295086,0.26085860315578924 658 | 41.2373384389041,0.388128105018609 659 | 41.300296207513114,0.46074596591844247 660 | 41.363253976122124,0.6337041900084374 661 | 41.42621174473114,0.7798303079479583 662 | 41.48916951334016,0.8601131392127551 663 | 41.55212728194917,0.9849899210119819 664 | 41.61508505055818,0.9748722155063323 665 | 41.678042819167196,1.0345225341466489 666 | 41.74100058777621,0.9842727862564232 667 | 41.80395835638522,0.9442548828995977 668 | 41.86691612499423,0.954961414723843 669 | 41.92987389360325,0.7688198793306178 670 | 41.99283166221227,0.6851207524037664 671 | 42.05578943082128,0.5087963019359356 672 | 42.118747199430295,0.4370993489288187 673 | 42.181704968039305,0.3330102328045571 674 | 42.24466273664832,0.15340478894943096 675 | 42.30762050525733,-0.0073555832890860665 676 | 42.37057827386635,-0.15361709336806464 677 | 42.43353604247536,-0.3317067945076994 678 | 42.49649381108438,-0.4720493891679042 679 | 42.55945157969339,-0.6231371201703259 680 | 42.622409348302405,-0.8082546547571366 681 | 42.68536711691142,-0.8290377618740066 682 | 42.74832488552043,-0.8810381569619269 683 | 42.81128265412944,-1.0210992217127102 684 | 42.87424042273846,-0.9867689630020368 685 | 42.93719819134748,-0.9397960975501075 686 | 43.00015595995649,-0.9814062563750575 687 | 43.0631137285655,-0.9718450764151509 688 | 43.126071497174514,-0.8215543408684286 689 | 43.18902926578353,-0.6417417850037067 690 | 43.25198703439254,-0.644581243931375 691 | 43.31494480300156,-0.46569906293099184 692 | 43.37790257161057,-0.34716724441294483 693 | 43.44086034021959,-0.16847271483686363 694 | 43.5038181088286,0.024329785051002868 695 | 43.566775877437614,0.24921084997352327 696 | 43.629733646046624,0.2976284469035414 697 | 43.69269141465564,0.4472034048338538 698 | 43.75564918326465,0.5752834032821579 699 | 43.81860695187367,0.6839450364593482 700 | 43.881564720482686,0.7618784115540447 701 | 43.944522489091696,0.8736090775496501 702 | 44.007480257700706,0.9639467030919668 703 | 44.07043802630972,0.9984335391388419 704 | 44.13339579491874,1.055527431736912 705 | 44.19635356352775,0.9296876895613261 706 | 44.25931133213676,0.879680359817679 707 | 44.32226910074578,0.8041843898114764 708 | 44.385226869354796,0.7526512095149543 709 | 44.448184637963806,0.6159177062956053 710 | 44.51114240657282,0.527000966120954 711 | 44.57410017518183,0.2999323919132902 712 | 44.63705794379085,0.22722780415883476 713 | 44.70001571239986,0.06601186480323622 714 | 44.76297348100888,-0.15742074853222043 715 | 44.82593124961789,-0.3347500596355652 716 | 44.888889018226905,-0.44577327943848644 717 | 44.951846786835915,-0.6334571765614991 718 | 45.01480455544493,-0.6174417857602532 719 | 45.07776232405395,-0.8140090167987711 720 | 45.14072009266296,-0.8634820823461601 721 | 45.20367786127197,-1.0243660016684957 722 | 45.26663562988099,-1.0807626951368827 723 | 45.329593398490005,-0.9645221116730677 724 | 45.392551167099015,-0.9520467841633794 725 | 45.455508935708025,-0.9686847614971879 726 | 45.51846670431704,-0.8869259348161989 727 | 45.58142447292606,-0.7975628961418068 728 | 45.64438224153507,-0.6367392096461237 729 | 45.70734001014409,-0.4691752185744549 730 | 45.7702977787531,-0.4460698978919526 731 | 45.833255547362114,-0.18848821494120407 732 | 45.896213315971124,-0.09405330916860355 733 | 45.95917108458014,0.08653498374127938 734 | 46.02212885318915,0.2654631238120929 735 | 46.08508662179817,0.3585039465552008 736 | 46.14804439040718,0.710460940207502 737 | 46.211002159016196,0.8160078774505967 738 | 46.273959927625214,0.84029331113105 739 | 46.336917696234224,0.9219419829380094 740 | 46.399875464843234,0.8996511909145986 741 | 46.46283323345225,1.1079426805557702 742 | 46.52579100206127,1.0007920007810076 743 | 46.58874877067028,0.9777758684671806 744 | 46.65170653927929,1.001909332063224 745 | 46.714664307888306,0.8873373350311722 746 | 46.77762207649732,0.7446807479120614 747 | 46.84057984510633,0.6608315195258483 748 | 46.90353761371535,0.523280188424913 749 | 46.96649538232436,0.40113167938599614 750 | 47.02945315093338,0.2707984791136465 751 | 47.09241091954239,0.10839170010996102 752 | 47.155368688151405,-0.01669366032851076 753 | 47.218326456760416,-0.2432807553806915 754 | 47.28128422536943,-0.34999546880421306 755 | 47.34424199397844,-0.4567513853134537 756 | 47.40719976258746,-0.7330787214406156 757 | 47.47015753119648,-0.7478824002979645 758 | 47.53311529980549,-0.9279139372615085 759 | 47.5960730684145,-1.0170634326444823 760 | 47.659030837023515,-0.9047125419877566 761 | 47.72198860563253,-0.9431019390976362 762 | 47.78494637424154,-0.9629065895659463 763 | 47.84790414285055,-0.9756782704261132 764 | 47.91086191145957,-0.8139631626615661 765 | 47.97381968006859,-0.8710382044317855 766 | 48.0367774486776,-0.691389357732977 767 | 48.09973521728661,-0.5440051340374122 768 | 48.16269298589563,-0.3622203019024592 769 | 48.22565075450464,-0.3498062691845686 770 | 48.28860852311365,-0.26628864976163413 771 | 48.35156629172267,0.056113438789348685 772 | 48.414524060331686,0.22829682926677353 773 | 48.4774818289407,0.37751090102877155 774 | 48.54043959754971,0.4715054819091526 775 | 48.603397366158724,0.6459225153971488 776 | 48.66635513476774,0.6865617525359127 777 | 48.72931290337675,0.8796168219103203 778 | 48.79227067198576,0.975283943443048 779 | 48.85522844059478,0.9412395258809152 780 | 48.918186209203796,0.8986883335409958 781 | 48.981143977812806,0.9867357303846175 782 | 49.044101746421816,0.9510856206733495 783 | 49.10705951503083,0.8990737710580321 784 | 49.17001728363985,0.8862321545272116 785 | 49.23297505224886,0.723981796500055 786 | 49.29593282085788,0.6980866306720619 787 | 49.358890589466895,0.47386890657791203 788 | 49.421848358075906,0.2492615034217472 789 | 49.484806126684916,0.2009780363427257 790 | 49.54776389529393,-0.023403426033110127 791 | 49.61072166390295,-0.20600340439572248 792 | 49.67367943251196,-0.32541936469301397 793 | 49.73663720112097,-0.48240133579536476 794 | 49.79959496972999,-0.7017710367694641 795 | 49.862552738339005,-0.7853398523829573 796 | 49.925510506948015,-0.7844259233368849 797 | 49.988468275557025,-0.9098808713943005 798 | 50.05142604416604,-0.9388184161053063 799 | 50.11438381277506,-0.9458973401351076 800 | 50.17734158138407,-0.9067596162307959 801 | 50.24029934999308,-1.0011921915756379 802 | 50.3032571186021,-0.9513419404264771 803 | 50.366214887211115,-0.884838894292069 804 | 50.429172655820125,-0.7686570858115223 805 | 50.49213042442914,-0.6645378636580369 806 | 50.55508819303816,-0.48338619117015447 807 | 50.61804596164717,-0.3388722866480088 808 | 50.68100373025618,-0.14630825595616476 809 | 50.7439614988652,-0.07212378267649741 810 | 50.806919267474214,0.11783312396835194 811 | 50.869877036083224,0.3275887503365956 812 | 50.932834804692234,0.49536195828993357 813 | 50.99579257330125,0.48310310744660606 814 | 51.05875034191027,0.691322531862031 815 | 51.12170811051928,0.8119500199818779 816 | 51.18466587912829,0.8037320387654975 817 | 51.247623647737306,0.9851674514442867 818 | 51.310581416346324,1.0541431274416038 819 | 51.373539184955334,0.9014134914385005 820 | 51.436496953564344,0.8982573005531442 821 | 51.49945472217336,0.9759415820401539 822 | 51.56241249078238,0.9121094782633139 823 | 51.62537025939139,0.6958464456153168 824 | 51.688328028000406,0.5939422883890005 825 | 51.75128579660942,0.5429333011121449 826 | 51.81424356521843,0.3508165172713836 827 | 51.87720133382744,0.18020339063049334 828 | 51.94015910243646,0.12376304276669961 829 | 52.00311687104548,-0.10444474151970255 830 | 52.06607463965449,-0.37050762486309136 831 | 52.1290324082635,-0.41959668591284893 832 | 52.191990176872515,-0.6436960550676613 833 | 52.25494794548153,-0.6621705668140381 834 | 52.31790571409054,-0.7573190681552071 835 | 52.38086348269955,-0.8700766383394032 836 | 52.44382125130857,-0.9073522485748046 837 | 52.50677901991759,-0.8917697264002061 838 | 52.5697367885266,-0.963423236082907 839 | 52.63269455713561,-1.001400551042953 840 | 52.695652325744625,-0.9942381319419706 841 | 52.75861009435364,-0.8600015762619614 842 | 52.82156786296265,-0.8313352776803161 843 | 52.88452563157167,-0.7390379569915037 844 | 52.94748340018069,-0.5598757519971367 845 | 53.0104411687897,-0.4810310234521785 846 | 53.07339893739871,-0.3019875645001711 847 | 53.136356706007724,-0.05041965447593587 848 | 53.19931447461674,0.06426403169455935 849 | 53.26227224322575,0.23384597524212597 850 | 53.32523001183476,0.4023710959172034 851 | 53.38818778044378,0.4496546008123078 852 | 53.4511455490528,0.685739049010086 853 | 53.51410331766181,0.7872159348565586 854 | 53.57706108627082,0.8750755727820894 855 | 53.640018854879834,0.9609513590045913 856 | 53.70297662348885,0.8768033551288706 857 | 53.76593439209786,1.0955468845263912 858 | 53.82889216070687,0.9729600148672608 859 | 53.891849929315896,0.8781717465724398 860 | 53.954807697924906,0.8918189608152568 861 | 54.017765466533916,0.7353506836046794 862 | 54.08072323514293,0.6935367087032027 863 | 54.14368100375195,0.5901024388823162 864 | 54.20663877236096,0.3549291664744553 865 | 54.26959654096997,0.30969506710353256 866 | 54.33255430957899,0.11337859827581352 867 | 54.395512078188005,-0.039177492748925645 868 | 54.458469846797016,-0.19836990573306731 869 | 54.521427615406026,-0.3490497445218799 870 | 54.58438538401504,-0.46473477172817024 871 | 54.64734315262406,-0.6098893746247587 872 | 54.71030092123307,-0.7432704018376939 873 | 54.77325868984208,-0.9000147375680166 874 | 54.8362164584511,-0.9186231284252329 875 | 54.899174227060115,-1.0070314406198377 876 | 54.962131995669125,-1.0716004029972426 877 | 55.02508976427814,-0.9945423562970496 878 | 55.08804753288716,-1.004891253252056 879 | 55.15100530149617,-0.8436256284821515 880 | 55.21396307010518,-0.8193286403307526 881 | 55.2769208387142,-0.7103864321141918 882 | 55.339878607323215,-0.550043158229744 883 | 55.402836375932225,-0.4701220764921916 884 | 55.465794144541235,-0.3104483851630282 885 | 55.52875191315025,-0.07983109914090514 886 | 55.59170968175927,-0.04400348435825566 887 | 55.65466745036828,0.1444045959669729 888 | 55.71762521897729,0.3386200704255147 889 | 55.78058298758631,0.5328650094709622 890 | 55.843540756195324,0.6412390256569352 891 | 55.906498524804334,0.6891879818486928 892 | 55.969456293413344,0.7994170154631761 893 | 56.03241406202236,1.0058689322117471 894 | 56.09537183063138,0.9880730470789315 895 | 56.15832959924039,0.9664580997898824 896 | 56.221287367849406,0.9716221976376649 897 | 56.28424513645842,1.1546810471800135 898 | 56.347202905067434,0.9806443904799576 899 | 56.410160673676444,0.7533436368967537 900 | 56.47311844228546,0.7114371781099429 901 | 56.53607621089448,0.6500923261682425 902 | 56.59903397950349,0.46333859848433606 903 | 56.6619917481125,0.3844713116533805 904 | 56.724949516721516,0.2573810054167377 905 | 56.78790728533053,0.006673755022094539 906 | 56.85086505393954,-0.1420083948113265 907 | 56.91382282254855,-0.3240290493532761 908 | 56.97678059115757,-0.42186918170670634 909 | 57.03973835976659,-0.5289674597209676 910 | 57.1026961283756,-0.67905173978571 911 | 57.16565389698461,-0.8823248916216075 912 | 57.228611665593625,-0.8707213187049894 913 | 57.29156943420264,-0.9933537677214207 914 | 57.35452720281165,-0.9071911917038851 915 | 57.41748497142067,-0.9743977314557383 916 | 57.48044274002969,-0.9222212157148642 917 | 57.5434005086387,-0.9270266010459612 918 | 57.60635827724771,-0.8536808740670075 919 | 57.669316045856725,-0.733835763766677 920 | 57.73227381446574,-0.6400306590645782 921 | 57.79523158307475,-0.42559098811638035 922 | 57.85818935168376,-0.4142039485297498 923 | 57.92114712029278,-0.16583395462876613 924 | 57.9841048889018,-0.06709866802677214 925 | 58.04706265751081,0.16863538701891256 926 | 58.11002042611982,0.19571859682684062 927 | 58.172978194728834,0.5022372928142816 928 | 58.23593596333785,0.5631111645093603 929 | 58.29889373194686,0.642076413379099 930 | 58.36185150055587,0.8459599356572285 931 | 58.42480926916489,0.8852440543488488 932 | 58.48776703777391,0.969473920267233 933 | 58.55072480638292,1.0522483570106635 934 | 58.613682574991934,0.9450391763412775 935 | 58.67664034360095,0.9448016522619257 936 | 58.73959811220996,0.9414193348699925 937 | 58.80255588081897,0.8964921317400255 938 | 58.86551364942799,0.7404441609753255 939 | 58.928471418037006,0.6227400882148894 940 | 58.991429186646016,0.5700275644204761 941 | 59.054386955255026,0.43549772964485955 942 | 59.11734472386404,0.300706419003112 943 | 59.18030249247306,0.054441435158445135 944 | 59.24326026108207,-0.2234080866008564 945 | 59.30621802969108,-0.2291003955707279 946 | 59.3691757983001,-0.3714223018423251 947 | 59.432133566909116,-0.625963367603841 948 | 59.495091335518126,-0.6765323087438108 949 | 59.558049104127136,-0.7775073113572066 950 | 59.62100687273615,-0.8633219379925579 951 | 59.68396464134517,-0.969105747829157 952 | 59.74692240995418,-0.9819431193965725 953 | 59.8098801785632,-0.9699753205975465 954 | 59.872837947172215,-1.0759494104660094 955 | 59.935795715781225,-0.9023413924015927 956 | 59.998753484390235,-0.9016004149036059 957 | 60.06171125299925,-0.7568815492791816 958 | 60.12466902160827,-0.7207787996593992 959 | 60.18762679021728,-0.6434465677729772 960 | 60.25058455882629,-0.3560977486619353 961 | 60.31354232743531,-0.17929519800523486 962 | 60.376500096044325,-0.19358869734089684 963 | 60.439457864653335,-0.0016976449655574932 964 | 60.502415633262345,0.2294211448543174 965 | 60.56537340187136,0.32803314951737716 966 | 60.62833117048038,0.564129844878175 967 | 60.69128893908939,0.6178145644260558 968 | 60.7542467076984,0.7457566808802352 969 | 60.817204476307424,0.8755459498347035 970 | 60.880162244916434,0.8262766099522207 971 | 60.943120013525444,0.964403426487395 972 | 61.00607778213446,1.1001329969039444 973 | 61.06903555074348,1.0210271080930302 974 | 61.13199331935249,0.907497363031085 975 | 61.1949510879615,0.9499263426344066 976 | 61.257908856570516,0.916959850496373 977 | 61.320866625179534,0.7719522753559185 978 | 61.383824393788544,0.5544725599554523 979 | 61.446782162397554,0.4107024144657935 980 | 61.50973993100657,0.2730784581980494 981 | 61.57269769961559,0.07937381034672115 982 | 61.6356554682246,-0.030012896155259566 983 | 61.69861323683361,-0.24421687639873454 984 | 61.761571005442626,-0.39496837844528015 985 | 61.82452877405164,-0.4830500692043646 986 | 61.88748654266065,-0.6618136581636628 987 | 61.95044431126967,-0.7614533634996529 988 | 62.01340207987869,-0.7413427548975874 989 | 62.0763598484877,-0.9051671108124975 990 | 62.13931761709671,-0.914196753419371 991 | 62.202275385705725,-0.9759199100175883 992 | 62.26523315431474,-0.9650934550108535 993 | 62.32819092292375,-1.033520242605728 994 | 62.39114869153276,-0.9384017847915371 995 | 62.45410646014178,-0.8448008507469883 996 | 62.5170642287508,-0.752419519342737 997 | 62.58002199735981,-0.6191149489399953 998 | 62.64297976596882,-0.46357515239656977 999 | 62.705937534577835,-0.3326942842768819 1000 | 62.76889530318685,-0.1284805372635579 1001 | 62.83185307179586,-0.012389875305372732 1002 | 62.83185307179586,0.05419759890998308 1003 | 62.89481084040488,0.06226141553562841 1004 | 62.95776860901389,0.09584926201263022 1005 | 63.02072637762291,0.1251828190451298 1006 | 63.08368414623192,0.210708513055791 1007 | 63.146641914840934,0.2969001612679578 1008 | 63.209599683449945,0.42892985494523955 1009 | 63.27255745205896,0.3629829696418865 1010 | 63.33551522066797,0.5346437915080116 1011 | 63.39847298927699,0.5321950670821833 1012 | 63.461430757886,0.5472312101418728 1013 | 63.52438852649502,0.5725360319610909 1014 | 63.58734629510403,0.713097542047249 1015 | 63.650304063713044,0.6347765445357905 1016 | 63.713261832322054,0.7485600586505459 1017 | 63.77621960093107,0.788107623580248 1018 | 63.83917736954008,0.8372494636787536 1019 | 63.9021351381491,0.9063951434831411 1020 | 63.96509290675811,0.875057701486509 1021 | 64.02805067536713,0.9366716450519167 1022 | 64.09100844397614,0.8909393980059355 1023 | 64.15396621258516,0.9721219711946837 1024 | 64.21692398119417,1.013220322835592 1025 | 64.27988174980318,0.9748889187303197 1026 | 64.34283951841219,1.0166452068908818 1027 | 64.40579728702122,1.0052266615703287 1028 | 64.46875505563023,0.9806013591626128 1029 | 64.53171282423924,0.9886419970984293 1030 | 64.59467059284825,0.9718694651771721 1031 | 64.65762836145727,0.8689562138628866 1032 | 64.72058613006628,0.8749242893329795 1033 | 64.78354389867529,0.9499750870720481 1034 | 64.8465016672843,0.7986867686901288 1035 | 64.90945943589333,0.9322164215018042 1036 | 64.97241720450234,0.7715276949390217 1037 | 65.03537497311135,0.807945015435724 1038 | 65.09833274172036,0.7912227153064492 1039 | 65.16129051032938,0.6939347572752699 1040 | 65.22424827893839,0.7391807484048698 1041 | 65.2872060475474,0.5650898778150347 1042 | 65.35016381615642,0.6290414206859485 1043 | 65.41312158476543,0.5388886272723344 1044 | 65.47607935337444,0.4695533615385428 1045 | 65.53903712198345,0.47145880513446753 1046 | 65.60199489059248,0.38993039499241805 1047 | 65.66495265920149,0.24339931512637272 1048 | 65.7279104278105,0.31366613248887154 1049 | 65.79086819641951,0.23176468169527525 1050 | 65.85382596502853,0.12452507749718217 1051 | 65.91678373363754,0.06411605339829206 1052 | 65.97974150224655,0.06051610062994463 1053 | 66.04269927085556,0.013710411255161911 1054 | 66.10565703946459,-0.10119355432362925 1055 | 66.1686148080736,-0.25206348208810697 1056 | 66.23157257668261,-0.24925740248389536 1057 | 66.29453034529162,-0.27459493973972654 1058 | 66.35748811390064,-0.4163963686349541 1059 | 66.42044588250965,-0.4925557267902788 1060 | 66.48340365111866,-0.48785160678012496 1061 | 66.54636141972767,-0.5364662851048104 1062 | 66.6093191883367,-0.5749889987226209 1063 | 66.67227695694571,-0.5818083567833837 1064 | 66.73523472555472,-0.799338343686373 1065 | 66.79819249416374,-0.7293828544858694 1066 | 66.86115026277275,-0.7859087959560624 1067 | 66.92410803138176,-0.8130131162744956 1068 | 66.98706579999077,-0.8403800043302798 1069 | 67.0500235685998,-0.8290522087148972 1070 | 67.11298133720881,-0.8804928354104756 1071 | 67.17593910581782,-0.9352246797097954 1072 | 67.23889687442683,-0.9492873647188022 1073 | 67.30185464303585,-0.965499844193709 1074 | 67.36481241164486,-0.9905939330601352 1075 | 67.42777018025387,-0.9271241266724407 1076 | 67.49072794886288,-1.0941803763521334 1077 | 67.55368571747191,-1.070030218329836 1078 | 67.61664348608092,-0.91749831276829 1079 | 67.67960125468993,-0.962170254889202 1080 | 67.74255902329895,-0.9488674722175181 1081 | 67.80551679190796,-0.908152139620513 1082 | 67.86847456051697,-1.0488132667030359 1083 | 67.93143232912598,-0.8540168616150783 1084 | 67.994390097735,-0.9587059052280407 1085 | 68.05734786634402,-0.920361061499261 1086 | 68.12030563495303,-0.7868012757766178 1087 | 68.18326340356204,-0.8604656158856427 1088 | 68.24622117217106,-0.737019645463656 1089 | 68.30917894078007,-0.6500595936329503 1090 | 68.37213670938908,-0.7089075391421338 1091 | 68.43509447799809,-0.6582034095236656 1092 | 68.49805224660712,-0.5449781750301983 1093 | 68.56101001521613,-0.4813011751835599 1094 | 68.62396778382514,-0.4544839784943788 1095 | 68.68692555243415,-0.4942230853427529 1096 | 68.74988332104317,-0.2765839323346686 1097 | 68.81284108965218,-0.26649389570311977 1098 | 68.87579885826119,-0.354807120742421 1099 | 68.9387566268702,-0.2203595441967684 1100 | 69.00171439547923,-0.16608329500999086 1101 | 69.06467216408824,-0.08922980405319206 1102 | 69.12762993269725,0.02539384030497495 1103 | 69.19058770130627,0.03971586698724539 1104 | 69.25354546991528,0.19931200797225146 1105 | 69.31650323852429,0.2555416732963363 1106 | 69.3794610071333,0.2650645413957678 1107 | 69.44241877574233,0.2689023151291973 1108 | 69.50537654435134,0.3804705153449585 1109 | 69.56833431296035,0.45826896667918043 1110 | 69.63129208156936,0.5517484192657898 1111 | 69.69424985017838,0.5241494864813461 1112 | 69.75720761878739,0.6029200710550304 1113 | 69.8201653873964,0.5982935668238791 1114 | 69.88312315600541,0.6717098850701481 1115 | 69.94608092461444,0.7970514670512588 1116 | 70.00903869322345,0.8593935431322306 1117 | 70.07199646183246,0.800194474600515 1118 | 70.13495423044148,0.83885703131059 1119 | 70.19791199905049,0.8452754739294442 1120 | 70.2608697676595,0.8345732901708556 1121 | 70.32382753626851,0.9538258889379087 1122 | 70.38678530487752,0.9792514945414463 1123 | 70.44974307348654,1.0024819370350513 1124 | 70.51270084209555,0.9863563325757115 1125 | 70.57565861070456,1.0203973163418694 1126 | 70.63861637931359,1.0071545169304332 1127 | 70.7015741479226,1.0620990906388839 1128 | 70.76453191653161,1.0156337779586706 1129 | 70.82748968514062,1.0625504550510203 1130 | 70.89044745374964,1.0327578364277896 1131 | 70.95340522235865,0.9823668982486564 1132 | 71.01636299096766,0.8837559988045834 1133 | 71.07932075957667,0.9494417008126802 1134 | 71.1422785281857,0.9136636856247048 1135 | 71.20523629679471,0.9640473381341487 1136 | 71.26819406540372,0.8722844161317951 1137 | 71.33115183401273,0.7423455093445948 1138 | 71.39410960262175,0.7198420407535977 1139 | 71.45706737123076,0.7652488687295751 1140 | 71.52002513983977,0.6621219779357026 1141 | 71.5829829084488,0.5636968265300406 1142 | 71.64594067705781,0.597971241142239 1143 | 71.70889844566682,0.5454353235641068 1144 | 71.77185621427583,0.4600820475065785 1145 | 71.83481398288485,0.45249871883588894 1146 | 71.89777175149386,0.3459947128174981 1147 | 71.96072952010287,0.38484306806205587 1148 | 72.02368728871188,0.17596726594529546 1149 | 72.08664505732091,0.2145646308104577 1150 | 72.14960282592992,0.15637329684375992 1151 | 72.21256059453893,0.10739950200494444 1152 | 72.27551836314794,-0.025148919597595493 1153 | 72.33847613175696,-0.1024034718224534 1154 | 72.40143390036597,-0.05726361022702932 1155 | 72.46439166897498,-0.17894075703617082 1156 | 72.52734943758401,-0.2966805096357818 1157 | 72.59030720619302,-0.2859010561064865 1158 | 72.65326497480203,-0.3069616714371301 1159 | 72.71622274341104,-0.41026316864997253 1160 | 72.77918051202005,-0.5353900105624417 1161 | 72.84213828062907,-0.5036509608148367 1162 | 72.90509604923808,-0.6808404599568401 1163 | 72.96805381784709,-0.6140711327971431 1164 | 73.03101158645612,-0.6503570186696976 1165 | 73.09396935506513,-0.7539623585477464 1166 | 73.15692712367414,-0.7696546034444272 1167 | 73.21988489228315,-0.8135393666006517 1168 | 73.28284266089217,-0.8821322999580667 1169 | 73.34580042950118,-0.9291224828984124 1170 | 73.40875819811019,-0.9275648623464635 1171 | 73.4717159667192,-0.9684995860674608 1172 | 73.53467373532823,-0.8817608012486766 1173 | 73.59763150393724,-1.0414764883062853 1174 | 73.66058927254625,-0.896154188587605 1175 | 73.72354704115526,-1.0063798379134545 1176 | 73.78650480976428,-1.0377147149800747 1177 | 73.84946257837329,-1.0269695299233577 1178 | 73.9124203469823,-1.0484384121786114 1179 | 73.97537811559133,-1.0906836029485694 1180 | 74.03833588420034,-0.9370416624205672 1181 | 74.10129365280935,-0.9704147998527013 1182 | 74.16425142141836,-0.9857315580064564 1183 | 74.22720919002737,-0.9864375788934503 1184 | 74.29016695863639,-0.9229743487401806 1185 | 74.3531247272454,-0.9275491715621286 1186 | 74.41608249585441,-0.7667595759780647 1187 | 74.47904026446344,-0.8899205517602395 1188 | 74.54199803307245,-0.8032852861933863 1189 | 74.60495580168146,-0.7568006470685757 1190 | 74.66791357029047,-0.6433418236985329 1191 | 74.73087133889949,-0.6062197849260158 1192 | 74.7938291075085,-0.5755036674443704 1193 | 74.85678687611751,-0.5239790744165943 1194 | 74.91974464472653,-0.4405259700166733 1195 | 74.98270241333555,-0.4434388475872089 1196 | 75.04566018194456,-0.32112152736924027 1197 | 75.10861795055357,-0.3517125224328527 1198 | 75.17157571916258,-0.1976972111484831 1199 | 75.2345334877716,-0.18832303824384097 1200 | 75.29749125638061,-0.044143233368190336 1201 | 75.36044902498962,-0.09893320678441676 1202 | 75.42340679359864,0.0025052897744558753 1203 | 75.48636456220765,0.04698152679094355 1204 | 75.54932233081666,0.19753529538993175 1205 | 75.61228009942567,0.14186079815759556 1206 | 75.6752378680347,0.3176922739716611 1207 | 75.73819563664371,0.3566215093457873 1208 | 75.80115340525272,0.4204137774672199 1209 | 75.86411117386173,0.414807915035049 1210 | 75.92706894247075,0.5283037092275307 1211 | 75.99002671107976,0.6453944147623979 1212 | 76.05298447968877,0.5744040967916726 1213 | 76.11594224829778,0.6703272367792544 1214 | 76.17890001690681,0.6906060083563033 1215 | 76.24185778551582,0.6920465039276312 1216 | 76.30481555412483,0.7461660523120617 1217 | 76.36777332273385,0.8508735867240798 1218 | 76.43073109134286,0.8563180244912418 1219 | 76.49368885995187,0.766495230727052 1220 | 76.55664662856088,0.9427865964862489 1221 | 76.6196043971699,0.9236934701120076 1222 | 76.68256216577892,1.0051381040082186 1223 | 76.74551993438793,0.9429459440855835 1224 | 76.80847770299694,1.1024871020574698 1225 | 76.87143547160596,0.9478049432885836 1226 | 76.93439324021497,1.0377118627383373 1227 | 76.99735100882398,0.9458257133521548 1228 | 77.060308777433,1.0055838544058082 1229 | 77.12326654604202,0.9307520677224037 1230 | 77.18622431465103,1.0392461766273737 1231 | 77.24918208326004,0.9599554456735631 1232 | 77.31213985186905,1.0164481122355107 1233 | 77.37509762047807,0.9138129737522115 1234 | 77.43805538908708,0.8107867900855632 1235 | 77.5010131576961,0.8196418897499012 1236 | 77.5639709263051,0.8085675625703137 1237 | 77.62692869491413,0.86034769611376 1238 | 77.68988646352314,0.887707229553625 1239 | 77.75284423213215,0.7025109980969138 1240 | 77.81580200074117,0.6782981970171006 1241 | 77.87875976935018,0.676456803309166 1242 | 77.94171753795919,0.5060069111849377 1243 | 78.0046753065682,0.4941822003052874 1244 | 78.06763307517723,0.4883113687080102 1245 | 78.13059084378624,0.41555555744127964 1246 | 78.19354861239525,0.3351733056193025 1247 | 78.25650638100426,0.23066514725173978 1248 | 78.31946414961328,0.22378280978408252 1249 | 78.38242191822229,0.19238923552722326 1250 | 78.4453796868313,0.05837529887314073 1251 | 78.50833745544031,0.03519754046475038 1252 | 78.57129522404934,0.07301336013388958 1253 | 78.63425299265835,-0.07042951373372233 1254 | 78.69721076126736,-0.12708919223560863 1255 | 78.76016852987638,-0.2703827393100476 1256 | 78.82312629848539,-0.30707896523304656 1257 | 78.8860840670944,-0.3552627407836586 1258 | 78.94904183570341,-0.43983276510622854 1259 | 79.01199960431242,-0.5152867568444892 1260 | 79.07495737292145,-0.5882511030210545 1261 | 79.13791514153046,-0.5734663191678884 1262 | 79.20087291013947,-0.5723102548221344 1263 | 79.26383067874849,-0.631558325790596 1264 | 79.3267884473575,-0.6744047759652567 1265 | 79.38974621596651,-0.7056297798738103 1266 | 79.45270398457552,-0.8342138828716222 1267 | 79.51566175318453,-0.8623395472566958 1268 | 79.57861952179356,-0.8735770388518732 1269 | 79.64157729040257,-0.9365676201894445 1270 | 79.70453505901159,-0.9061937152736158 1271 | 79.7674928276206,-0.9748674446738665 1272 | 79.83045059622961,-0.9053129995493429 1273 | 79.89340836483862,-1.0203963160782152 1274 | 79.95636613344763,-0.960000481429867 1275 | 80.01932390205666,-0.9118980536916098 1276 | 80.08228167066567,-1.0603599750855437 1277 | 80.14523943927468,-1.0269667104262008 1278 | 80.2081972078837,-1.0336503297077453 1279 | 80.27115497649271,-1.0401544293001785 1280 | 80.33411274510172,-0.9620932283851771 1281 | 80.39707051371073,-0.9342347724401887 1282 | 80.46002828231974,-0.9762133083644952 1283 | 80.52298605092876,-0.9417963187758931 1284 | 80.58594381953777,-0.8770206862457749 1285 | 80.64890158814679,-0.8428890651783022 1286 | 80.71185935675581,-0.8801996860769667 1287 | 80.77481712536482,-0.672325706870843 1288 | 80.83777489397383,-0.758735876176485 1289 | 80.90073266258284,-0.6993540857800874 1290 | 80.96369043119186,-0.6890712100063364 1291 | 81.02664819980087,-0.6219042955156955 1292 | 81.08960596840988,-0.6030727564571368 1293 | 81.15256373701891,-0.42312474796256866 1294 | 81.21552150562792,-0.5415752559404521 1295 | 81.27847927423693,-0.4013625854191632 1296 | 81.34143704284594,-0.3004049250283363 1297 | 81.40439481145495,-0.3533455964287934 1298 | 81.46735258006397,-0.18937467331239383 1299 | 81.53031034867298,-0.08469902999858277 1300 | 81.593268117282,-0.07320831177379952 1301 | 81.65622588589102,-0.02518007010907642 1302 | 81.71918365450003,0.03605513820013642 1303 | 81.78214142310904,0.08648719445246597 1304 | 81.84509919171805,0.19196906034507424 1305 | 81.90805696032706,0.1815361571360649 1306 | 81.97101472893608,0.30191505454342726 1307 | 82.0339724975451,0.3283784777803954 1308 | 82.09693026615412,0.3745857583368566 1309 | 82.15988803476313,0.40261077979600407 1310 | 82.22284580337214,0.5490942359416958 1311 | 82.28580357198115,0.5387317427821043 1312 | 82.34876134059016,0.6727845244115852 1313 | 82.41171910919918,0.665698422390865 1314 | 82.4746768778082,0.7124949486523456 1315 | 82.5376346464172,0.7004810099431976 1316 | 82.60059241502623,0.7451008692416863 1317 | 82.66355018363524,0.8590380685490292 1318 | 82.72650795224425,0.8601648167231684 1319 | 82.78946572085326,0.8977700180489494 1320 | 82.85242348946227,0.9536966565039292 1321 | 82.91538125807129,0.9699012852971933 1322 | 82.9783390266803,0.9449408184171869 1323 | 83.04129679528931,1.1225604296925182 1324 | 83.10425456389834,1.1458276037659811 1325 | 83.16721233250735,1.0184059252682822 1326 | 83.23017010111636,0.9277975164324773 1327 | 83.29312786972537,0.9544822822466946 1328 | 83.35608563833439,1.0236962544600976 1329 | 83.4190434069434,0.9572844348036881 1330 | 83.48200117555241,0.9696278016709399 1331 | 83.54495894416144,0.8576155617292479 1332 | 83.60791671277045,0.9592080541455454 1333 | 83.67087448137946,0.9740529251725718 1334 | 83.73383224998847,0.8255237987144511 1335 | 83.79679001859748,0.8381675155773568 1336 | 83.8597477872065,0.8031023515933571 1337 | 83.92270555581551,0.6592661580447448 1338 | 83.98566332442452,0.7190814096993632 1339 | 84.04862109303355,0.6708151680125611 1340 | 84.11157886164256,0.5832342486650762 1341 | 84.17453663025157,0.5602366918616021 1342 | 84.23749439886058,0.5649648736671287 1343 | 84.30045216746959,0.5161604601486114 1344 | 84.36340993607861,0.45982564906818924 1345 | 84.42636770468762,0.35751818772640864 1346 | 84.48932547329663,0.286273420903462 1347 | 84.55228324190566,0.27469314441986387 1348 | 84.61524101051467,0.18661210424121855 1349 | 84.67819877912368,0.1961182139581084 1350 | 84.74115654773269,0.13996918727401716 1351 | 84.80411431634171,-0.004744448660051349 1352 | 84.86707208495072,-0.12573052171788507 1353 | 84.93002985355973,-0.09765600013527735 1354 | 84.99298762216876,-0.20261330144610007 1355 | 85.05594539077777,-0.18972790256166988 1356 | 85.11890315938678,-0.2565973250298755 1357 | 85.18186092799579,-0.40373687704693123 1358 | 85.2448186966048,-0.35700737900071977 1359 | 85.30777646521382,-0.39639526799908514 1360 | 85.37073423382283,-0.5014416675619806 1361 | 85.43369200243184,-0.5429258702346252 1362 | 85.49664977104086,-0.6498877293879218 1363 | 85.55960753964987,-0.7147356109591224 1364 | 85.62256530825888,-0.6543076789728368 1365 | 85.6855230768679,-0.7474297716362133 1366 | 85.7484808454769,-0.8034928297408445 1367 | 85.81143861408593,-0.8386135884188525 1368 | 85.87439638269494,-0.8304782885487442 1369 | 85.93735415130396,-0.9084081499023798 1370 | 86.00031191991297,-0.9484994803184525 1371 | 86.06326968852198,-0.961108204678495 1372 | 86.126227457131,-0.9725409311061092 1373 | 86.18918522574,-1.0034633105029527 1374 | 86.25214299434903,-0.985569583729727 1375 | 86.31510076295804,-1.0214849037047022 1376 | 86.37805853156705,-1.0226225296685458 1377 | 86.44101630017607,-0.8995584620458932 1378 | 86.50397406878508,-0.9935737269293713 1379 | 86.5669318373941,-0.8996504245532428 1380 | 86.6298896060031,-1.0224978134064318 1381 | 86.69284737461211,-0.9178761419743934 1382 | 86.75580514322114,-0.9346219644622504 1383 | 86.81876291183015,-0.8265026882236812 1384 | 86.88172068043916,-0.9065678995608898 1385 | 86.94467844904818,-0.7624478289873653 1386 | 87.0076362176572,-0.8468754855456536 1387 | 87.0705939862662,-0.779201996756145 1388 | 87.13355175487521,-0.7964388553940223 1389 | 87.19650952348424,-0.6964865613049858 1390 | 87.25946729209325,-0.6584717105710733 1391 | 87.32242506070226,-0.6544032641033621 1392 | 87.38538282931128,-0.639664019205811 1393 | 87.44834059792029,-0.448805202800493 1394 | 87.5112983665293,-0.41317410148084105 1395 | 87.57425613513831,-0.41531809145548476 1396 | 87.63721390374732,-0.32690334562797974 1397 | 87.70017167235635,-0.2976121995737995 1398 | 87.76312944096536,-0.20700850983035732 1399 | 87.82608720957437,-0.12556252281843194 1400 | 87.88904497818339,-0.057821691172311486 1401 | 87.9520027467924,-0.03764006467926373 1402 | 88.01496051540141,0.03985470427566041 1403 | 88.07791828401042,0.13888742617970629 1404 | 88.14087605261943,0.1424038469923626 1405 | 88.20383382122846,0.20918601958099622 1406 | 88.26679158983747,0.30171115267236787 1407 | 88.32974935844649,0.38183224591387277 1408 | 88.3927071270555,0.3939571975211894 1409 | 88.45566489566451,0.5113967794931951 1410 | 88.51862266427352,0.522614051727189 1411 | 88.58158043288253,0.5449424769140779 1412 | 88.64453820149156,0.6334701723217998 1413 | 88.70749597010057,0.6035933470327659 1414 | 88.77045373870958,0.62963111091524 1415 | 88.8334115073186,0.7805169625835141 1416 | 88.89636927592761,0.7138636511914809 1417 | 88.95932704453662,0.7985160604045626 1418 | 89.02228481314563,0.9211576424416166 1419 | 89.08524258175464,0.9169674009845452 1420 | 89.14820035036367,0.8834752883386294 1421 | 89.21115811897268,0.947145992685195 1422 | 89.27411588758169,0.8943666958533856 1423 | 89.33707365619071,0.9234400401400117 1424 | 89.40003142479972,0.9824620172733711 1425 | 89.46298919340873,1.0267526384819043 1426 | 89.52594696201774,0.9982689328742977 1427 | 89.58890473062677,0.9943537486983655 1428 | 89.65186249923578,0.9607075993838579 1429 | 89.71482026784479,0.987671556093636 1430 | 89.77777803645381,1.010568604563658 1431 | 89.84073580506282,1.0089306423948632 1432 | 89.90369357367183,0.9500783540997402 1433 | 89.96665134228084,0.9145383816432326 1434 | 90.02960911088985,0.8980983199954224 1435 | 90.09256687949888,0.8750196774698016 1436 | 90.15552464810789,0.7897117598538782 1437 | 90.2184824167169,0.7571693139703394 1438 | 90.28144018532592,0.7012036781859126 1439 | 90.34439795393493,0.6587771023874212 1440 | 90.40735572254394,0.7374748008403587 1441 | 90.47031349115295,0.6331273744022925 1442 | 90.53327125976196,0.5078474921038905 1443 | 90.59622902837098,0.4902563653274534 1444 | 90.65918679698,0.44763684133150644 1445 | 90.722144565589,0.37017353023611277 1446 | 90.78510233419803,0.2674082153205506 1447 | 90.84806010280704,0.3275963419286358 1448 | 90.91101787141605,0.1345111801172109 1449 | 90.97397564002506,0.17524349771692715 1450 | 91.03693340863408,0.07190004927490226 1451 | 91.0998911772431,-0.034377854974566885 1452 | 91.1628489458521,-0.06470688268709136 1453 | 91.22580671446113,-0.2118596500818004 1454 | 91.28876448307014,-0.16781623305710336 1455 | 91.35172225167915,-0.2066523718414114 1456 | 91.41468002028816,-0.33012623467333857 1457 | 91.47763778889717,-0.348074807455715 1458 | 91.5405955575062,-0.5458187215816481 1459 | 91.6035533261152,-0.5036824297043719 1460 | 91.66651109472421,-0.5983308793147123 1461 | 91.72946886333324,-0.537438471644703 1462 | 91.79242663194225,-0.6239168958923931 1463 | 91.85538440055126,-0.6834131999910945 1464 | 91.91834216916027,-0.7352329433869785 1465 | 91.9812999377693,-0.7797603388056982 1466 | 92.0442577063783,-0.7671656271337213 1467 | 92.10721547498731,-0.8941138920818908 1468 | 92.17017324359634,-0.8276846753891152 1469 | 92.23313101220535,-0.8681246760303126 1470 | 92.29608878081436,-0.8767947591499962 1471 | 92.35904654942337,-0.967279265843267 1472 | 92.42200431803238,-0.9135943059692706 1473 | 92.4849620866414,-0.9315812127204006 1474 | 92.54791985525041,-0.9692029862295053 1475 | 92.61087762385942,-0.9416723293368582 1476 | 92.67383539246845,-1.0220601275874377 1477 | 92.73679316107746,-1.0018693168392718 1478 | 92.79975092968647,-0.9250935335550537 1479 | 92.86270869829548,-0.8819330349900264 1480 | 92.92566646690449,-1.0515691056447325 1481 | 92.98862423551351,-0.904979528699269 1482 | 93.05158200412252,-0.9935603196282674 1483 | 93.11453977273153,-0.8952751726598474 1484 | 93.17749754134056,-0.9067308013926779 1485 | 93.24045530994957,-0.8351212619535127 1486 | 93.30341307855858,-0.8250376526140598 1487 | 93.36637084716759,-0.7519320345897758 1488 | 93.42932861577661,-0.6976009522888763 1489 | 93.49228638438562,-0.703055576569153 1490 | 93.55524415299463,-0.6050624236609172 1491 | 93.61820192160366,-0.6031822454846197 1492 | 93.68115969021267,-0.5025423039079937 1493 | 93.74411745882168,-0.42376343485076234 1494 | 93.80707522743069,-0.4183223943736186 1495 | 93.8700329960397,-0.3571712555765947 1496 | 93.93299076464872,-0.39975179957526313 1497 | 93.99594853325773,-0.2877722181904546 1498 | 94.05890630186674,-0.21888518581137553 1499 | 94.12186407047577,-0.1331160556055342 1500 | 94.18482183908478,-0.1329173304477317 1501 | 94.24777960769379,-0.06505330393788504 1502 | -------------------------------------------------------------------------------- /tests/test_hotelling.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import pandas as pd 3 | from banpei.hotelling import Hotelling 4 | 5 | 6 | class TestHotelling(unittest.TestCase): 7 | 8 | def setUp(self): 9 | self.data = pd.read_csv('tests/test_data/davis.csv') 10 | self.data_1d = self.data['weight'] 11 | 12 | def test_hotelling(self): 13 | expected = 2 14 | model = Hotelling() 15 | results = model.detect(self.data_1d, 0.01) 16 | self.assertEqual(expected, len(results)) 17 | 18 | 19 | if __name__ == "__main__": 20 | unittest.main() 21 | -------------------------------------------------------------------------------- /tests/test_sst.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import pandas as pd 3 | from banpei.sst import SST 4 | 5 | 6 | class TestSST(unittest.TestCase): 7 | 8 | def setUp(self): 9 | self.raw_data = pd.read_csv('tests/test_data/periodic_wave.csv') 10 | self.data = self.raw_data['y'] 11 | 12 | def test_detect_by_svd(self): 13 | model = SST(w=50) 14 | results = model.detect(self.data) 15 | self.assertEqual(len(self.data), len(results)) 16 | 17 | def test_detect_by_lanczos(self): 18 | model = SST(w=50) 19 | results = model.detect(self.data, is_lanczos=True) 20 | self.assertEqual(len(self.data), len(results)) 21 | 22 | def test_stream_detect(self): 23 | model = SST(w=50) 24 | result = model.stream_detect(self.data) 25 | self.assertIsInstance(result, float) 26 | 27 | 28 | if __name__ == "__main__": 29 | unittest.main() 30 | -------------------------------------------------------------------------------- /tests/test_utils.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import numpy as np 3 | from banpei.utils import power_method 4 | 5 | 6 | class TestUtils(unittest.TestCase): 7 | 8 | def setUp(self): 9 | self.A = np.array([[1, 2, 3], 10 | [4, 5, 6], 11 | [7, 8, 9], 12 | [10, 11, 12]]) 13 | 14 | def test_power_method(self): 15 | u, s, v = power_method(self.A, iter_num=1) 16 | self.assertEqual(len(u), self.A.shape[0]) 17 | self.assertEqual(len(v), self.A.shape[1]) 18 | 19 | if __name__ == "__main__": 20 | unittest.main() 21 | --------------------------------------------------------------------------------