├── lttb ├── __init__.py └── lttb.py ├── sampled.png ├── source.png ├── run.sh ├── main.py ├── README.md ├── generator └── generator.py ├── .gitignore ├── LICENSE.txt ├── graphs └── graph.sh └── sampled.csv /lttb/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sampled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devoxi/lttb-py/HEAD/sampled.png -------------------------------------------------------------------------------- /source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devoxi/lttb-py/HEAD/source.png -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | python generator/generator.py 2 | python main.py 3 | ./graphs/graph.sh source.csv source.png Not downsampled 4 | ./graphs/graph.sh sampled.csv sampled.png Downsampled 5 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from lttb.lttb import largest_triangle_three_buckets 2 | import csv 3 | 4 | 5 | def main(): 6 | with open('source.csv', 'r') as f: 7 | c = 0 8 | data = [] 9 | csvf = csv.reader(f, delimiter=',') 10 | for row in csvf: 11 | if c == 0: 12 | c += 1 13 | continue 14 | data.append([int(row[0]), float(row[1])]) 15 | c += 1 16 | sampled = largest_triangle_three_buckets(data, 500) 17 | with open('sampled.csv', 'w') as f2: 18 | csvf2 = csv.writer(f2, delimiter=',') 19 | for row in sampled: 20 | csvf2.writerow(row) 21 | 22 | 23 | if __name__ == '__main__': 24 | main() 25 | exit() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Largest-Triangle-Three-Buckets (Python) 2 | This is an implementation of the Largest-Triangle-Three-Buckets (LTTB) downsampling algorithm in Python. 3 | 4 | The code has been translated from the work of Sveinn Steinarsson in his plugin for Flot charts. 5 | More information is available on [his page](https://github.com/sveinn-steinarsson/flot-downsample/), 6 | and you can find the thesis describing the algorithm [here](http://skemman.is/handle/1946/15343). 7 | 8 | ### Demo 9 | The first chart contains 7500 points, and the downsampled one 500 points : 10 | ![alt text](source.png "source") 11 | ![alt text](sampled.png "source") 12 | 13 | ### Usage 14 | * Include `lttb.py` into your project and call the function there 15 | * You can use run.sh to generate and produce the demo graph 16 | 17 | -------------------------------------------------------------------------------- /generator/generator.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import random 3 | 4 | 5 | def signal_generator(): 6 | seed = 1 7 | max_y = 250 8 | min_y = 100 9 | start_x = 0 10 | end_x = 7500 11 | 12 | random.seed(seed) 13 | prev_y = random.random()*(max_y-min_y)+min_y 14 | 15 | with open('source.csv', 'w') as f: 16 | csvf = csv.writer(f, delimiter=',') 17 | cur = start_x 18 | while cur <= end_x: 19 | if random.random() > 0.01: 20 | sign = random.choice([-1,1]) 21 | amp = random.random()*5 22 | gen = random.random()*amp*sign+prev_y 23 | else: 24 | gen = random.random()*(max_y-min_y)+min_y 25 | prev_y = gen 26 | csvf.writerow([cur, gen]) 27 | cur += 1 28 | 29 | 30 | if __name__ == '__main__': 31 | signal_generator() 32 | exit() -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | *.egg-info/ 23 | .installed.cfg 24 | *.egg 25 | 26 | # PyInstaller 27 | # Usually these files are written by a python script from a template 28 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 29 | *.manifest 30 | *.spec 31 | 32 | # Installer logs 33 | pip-log.txt 34 | pip-delete-this-directory.txt 35 | 36 | # Unit test / coverage reports 37 | htmlcov/ 38 | .tox/ 39 | .coverage 40 | .coverage.* 41 | .cache 42 | nosetests.xml 43 | coverage.xml 44 | *,cover 45 | 46 | # Translations 47 | *.mo 48 | *.pot 49 | 50 | # Django stuff: 51 | *.log 52 | 53 | # Sphinx documentation 54 | docs/_build/ 55 | 56 | # PyBuilder 57 | target/ 58 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Olivier Devoisin 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 | -------------------------------------------------------------------------------- /graphs/graph.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [ -z $1 ] || ! [ -f $1 ]; then 4 | echo "Missing or incorrect input file" 5 | exit 6 | fi 7 | 8 | if [ -z $2 ]; then 9 | echo "Missing output file" 10 | exit 11 | fi 12 | 13 | if [ -z $3 ]; then 14 | echo "Missing title" 15 | exit 16 | fi 17 | 18 | gnuplot << EOF 19 | # reset config 20 | reset 21 | 22 | # define data delimiter 23 | set datafile separator "," 24 | 25 | # define terminal 26 | set terminal pngcairo size 720,480 enhanced font 'Verdana,10' 27 | 28 | # define axis 29 | # remove border on top and right and set color to gray 30 | set style line 11 lc rgb '#808080' lt 1 31 | set border 3 back ls 11 32 | set tics nomirror 33 | 34 | # define grid 35 | set style line 12 lc rgb '#808080' lt 0 lw 1 36 | set grid back ls 12 37 | 38 | # define legend 39 | set key off 40 | 41 | # define line styles 42 | set style line 1 lt 1 lc rgb '#483D8B' lw 2 # Color: DarkSlateBlue 43 | set style line 2 lt 1 lc rgb '#3CB371' lw 2 # Color: MediumSeaGreen 44 | set style line 3 lt 1 lc rgb '#CD853F' lw 2 # Color: Peru 45 | set style line 4 lt 1 lc rgb '#663399' lw 2 # Color: RebeccaPurple 46 | set style line 5 lt 1 lc rgb '#6B8E23' lw 2 # Color: OliveDrab 47 | set style line 6 lt 1 lc rgb '#DC143C' lw 2 # Color: Crimson 48 | set style line 7 lt 1 lc rgb '#FF4500' lw 2 # Color: OrangeRed 49 | 50 | # define ranges 51 | set yrange [0:500] 52 | 53 | # define output 54 | set output "$2" 55 | # define labels 56 | set title "${@:3}" 57 | set xlabel "Time (s)" 58 | set ylabel "Y axis" 59 | # plotting 60 | plot "$1" using 1:2 ls 6 with lines 61 | EOF -------------------------------------------------------------------------------- /lttb/lttb.py: -------------------------------------------------------------------------------- 1 | """ 2 | The MIT License (MIT) 3 | Copyright (c) 2015 Olivier Devoisin 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 17 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 18 | SOFTWARE. 19 | """ 20 | 21 | import math 22 | 23 | class LttbException(Exception): 24 | pass 25 | 26 | 27 | def largest_triangle_three_buckets(data, threshold): 28 | """ 29 | Return a downsampled version of data. 30 | Parameters 31 | ---------- 32 | data: list of lists/tuples 33 | data must be formated this way: [[x,y], [x,y], [x,y], ...] 34 | or: [(x,y), (x,y), (x,y), ...] 35 | threshold: int 36 | threshold must be >= 2 and <= to the len of data 37 | Returns 38 | ------- 39 | data, but downsampled using threshold 40 | """ 41 | 42 | # Check if data and threshold are valid 43 | if not isinstance(data, list): 44 | raise LttbException("data is not a list") 45 | if not isinstance(threshold, int) or threshold <= 2 or threshold >= len(data): 46 | raise LttbException("threshold not well defined") 47 | for i in data: 48 | if not isinstance(i, (list, tuple)) or len(i) != 2: 49 | raise LttbException("datapoints are not lists or tuples") 50 | 51 | # Bucket size. Leave room for start and end data points 52 | every = (len(data) - 2) / (threshold - 2) 53 | 54 | a = 0 # Initially a is the first point in the triangle 55 | next_a = 0 56 | max_area_point = (0, 0) 57 | 58 | sampled = [data[0]] # Always add the first point 59 | 60 | for i in range(0, threshold - 2): 61 | # Calculate point average for next bucket (containing c) 62 | avg_x = 0 63 | avg_y = 0 64 | avg_range_start = int(math.floor((i + 1) * every) + 1) 65 | avg_range_end = int(math.floor((i + 2) * every) + 1) 66 | avg_rang_end = avg_range_end if avg_range_end < len(data) else len(data) 67 | 68 | avg_range_length = avg_rang_end - avg_range_start 69 | 70 | while avg_range_start < avg_rang_end: 71 | avg_x += data[avg_range_start][0] 72 | avg_y += data[avg_range_start][1] 73 | avg_range_start += 1 74 | 75 | avg_x /= avg_range_length 76 | avg_y /= avg_range_length 77 | 78 | # Get the range for this bucket 79 | range_offs = int(math.floor((i + 0) * every) + 1) 80 | range_to = int(math.floor((i + 1) * every) + 1) 81 | 82 | # Point a 83 | point_ax = data[a][0] 84 | point_ay = data[a][1] 85 | 86 | max_area = -1 87 | 88 | while range_offs < range_to: 89 | # Calculate triangle area over three buckets 90 | area = math.fabs( 91 | (point_ax - avg_x) 92 | * (data[range_offs][1] - point_ay) 93 | - (point_ax - data[range_offs][0]) 94 | * (avg_y - point_ay) 95 | ) * 0.5 96 | 97 | if area > max_area: 98 | max_area = area 99 | max_area_point = data[range_offs] 100 | next_a = range_offs # Next a is this b 101 | range_offs += 1 102 | 103 | sampled.append(max_area_point) # Pick this point from the bucket 104 | a = next_a # This a is the next a (chosen b) 105 | 106 | sampled.append(data[len(data) - 1]) # Always add last 107 | 108 | return sampled 109 | -------------------------------------------------------------------------------- /sampled.csv: -------------------------------------------------------------------------------- 1 | 1,119.8929321310357 2 | 3,166.80807910822023 3 | 19,168.55466469356844 4 | 43,153.5941187833451 5 | 53,162.5188892011817 6 | 64,157.24428050203178 7 | 83,164.09149209347754 8 | 102,159.66957307755612 9 | 111,145.39664895782428 10 | 130,135.62105213902245 11 | 144,139.72955919572834 12 | 166,161.2210313433627 13 | 181,150.4544078816742 14 | 195,153.10235751934934 15 | 202,169.94039901778294 16 | 217,158.84211011398364 17 | 234,165.44795194012568 18 | 255,152.236265239847 19 | 268,233.2288157066267 20 | 279,223.12275585696378 21 | 290,227.18288163404154 22 | 316,214.51121923816993 23 | 323,219.34125641029328 24 | 344,221.59941989189008 25 | 355,209.9626794058881 26 | 368,213.58189481818437 27 | 388,223.6673415531111 28 | 395,234.34098730616506 29 | 422,246.22023579183698 30 | 433,236.49691305335858 31 | 445,242.1816930240501 32 | 465,233.74338423959955 33 | 478,238.8480830604563 34 | 486,251.1990264878459 35 | 503,243.767273902222 36 | 520,252.98414571176633 37 | 535,245.39565611203258 38 | 555,244.85341987783204 39 | 568,254.33172381308603 40 | 586,244.16478058053326 41 | 599,253.42909949573675 42 | 614,240.41322200861407 43 | 619,247.01301666141714 44 | 641,242.83284869636736 45 | 649,250.01546033408005 46 | 674,241.93669571974684 47 | 688,242.8083078185445 48 | 708,258.01364171304243 49 | 718,274.23132530553755 50 | 738,268.84230657264277 51 | 747,173.82644612965044 52 | 757,167.42839158159833 53 | 774,185.40220995747038 54 | 796,156.65225728998016 55 | 804,169.16730301140504 56 | 825,180.3647406586019 57 | 834,169.171356149513 58 | 859,169.58884403270136 59 | 863,160.76916999271268 60 | 879,151.16579034066152 61 | 900,153.66810747164854 62 | 919,143.0703162553321 63 | 929,155.4497275657778 64 | 946,163.31328882946113 65 | 951,157.51313763962423 66 | 975,159.6050797090294 67 | 989,145.18891115774363 68 | 1003,151.444384107504 69 | 1020,144.25756238228328 70 | 1027,153.1357759294696 71 | 1043,150.35600244892098 72 | 1066,154.8416748426307 73 | 1074,168.1177427279974 74 | 1098,162.84366683735755 75 | 1115,175.0162007283155 76 | 1123,172.00280393995826 77 | 1143,179.66337895745147 78 | 1155,179.34642245690972 79 | 1163,218.39348767584485 80 | 1187,215.34785999061128 81 | 1201,205.93294661519653 82 | 1215,218.41218291110803 83 | 1222,187.3119186412647 84 | 1240,204.58446600157254 85 | 1256,196.41462234709104 86 | 1267,202.90723911173606 87 | 1292,213.09027044199587 88 | 1302,163.88347524960204 89 | 1319,160.93304500813466 90 | 1331,170.6781510291655 91 | 1351,175.14172426210965 92 | 1362,157.22965831014068 93 | 1380,164.69372875233753 94 | 1401,163.53003822725103 95 | 1416,98.59126023671793 96 | 1417,204.33272184647018 97 | 1439,193.70739865763585 98 | 1451,208.6580485756617 99 | 1472,211.2143062845114 100 | 1486,200.60122051149156 101 | 1497,207.80637270784138 102 | 1517,203.23732735223282 103 | 1526,213.39267147744937 104 | 1540,199.98896423765126 105 | 1564,197.84740520973207 106 | 1575,209.40054908082118 107 | 1583,214.98066283801387 108 | 1605,216.30526648696016 109 | 1627,209.77344176642532 110 | 1635,104.70514280000907 111 | 1644,95.49626341235894 112 | 1658,109.03099045355354 113 | 1682,106.94214583280227 114 | 1689,189.39204113010277 115 | 1703,111.80254874384858 116 | 1730,96.48208595697844 117 | 1747,98.05393976579319 118 | 1752,191.83076791137557 119 | 1774,195.74076198807802 120 | 1786,180.0938773041315 121 | 1798,184.9554152149081 122 | 1812,168.1235161077915 123 | 1825,174.6565953117783 124 | 1850,164.28929628170562 125 | 1864,167.12382539881565 126 | 1883,182.26779389940987 127 | 1884,107.2489395362824 128 | 1906,114.48314158068929 129 | 1917,101.93021443434792 130 | 1930,111.88547591646305 131 | 1957,90.98751603189979 132 | 1973,106.18905288019552 133 | 1980,102.00206189355393 134 | 1990,111.19210863236299 135 | 2005,119.83862314948664 136 | 2022,108.2227552161888 137 | 2041,114.32270963017135 138 | 2055,112.52856066193908 139 | 2073,93.42841853809507 140 | 2083,108.07851245598876 141 | 2097,99.85816366916762 142 | 2122,104.82983192891763 143 | 2133,119.68733200171415 144 | 2142,130.2451582658354 145 | 2155,134.1974071883135 146 | 2184,121.65971976304354 147 | 2192,196.2848679836825 148 | 2207,202.66442332677335 149 | 2215,192.39770620399344 150 | 2238,222.63175214856778 151 | 2247,217.70214698537222 152 | 2263,223.52662980507628 153 | 2289,217.2451531097911 154 | 2293,161.61809322066728 155 | 2310,160.56672447845364 156 | 2333,136.54239704455108 157 | 2341,131.95388687176808 158 | 2360,131.62366230352958 159 | 2379,143.4489594042214 160 | 2389,108.52390438571781 161 | 2401,92.5809026375795 162 | 2421,80.41105752642868 163 | 2436,86.39016772337988 164 | 2448,90.76106942152579 165 | 2466,78.70705223983954 166 | 2476,89.02430165024388 167 | 2492,71.50233049820795 168 | 2510,71.7126148678414 169 | 2519,84.6227736729583 170 | 2531,76.21928839318576 171 | 2550,75.95115134254725 172 | 2564,83.23238805597622 173 | 2590,84.19106867241462 174 | 2597,192.7707267016782 175 | 2613,189.1869418780615 176 | 2629,200.13602704503498 177 | 2650,182.5044186060775 178 | 2660,188.4799684741187 179 | 2681,181.4994588756037 180 | 2685,249.25769515807846 181 | 2711,245.7547464320232 182 | 2724,261.6595651508473 183 | 2741,270.66836544265465 184 | 2755,262.588445450348 185 | 2764,260.64105530536995 186 | 2773,269.20250444801746 187 | 2793,268.08072166882664 188 | 2810,272.86095182570944 189 | 2831,293.56660936394474 190 | 2846,291.60340348027324 191 | 2859,292.07581673411386 192 | 2862,121.25378082597616 193 | 2891,111.38384136007647 194 | 2897,203.75597596493284 195 | 2907,197.86723657083698 196 | 2922,222.69663952788122 197 | 2943,223.52636834493447 198 | 2965,213.00288293445624 199 | 2972,182.44293715475044 200 | 2994,187.31445925075795 201 | 3012,179.96763212568356 202 | 3016,236.16136531785384 203 | 3036,229.13067099785076 204 | 3046,232.69615626255722 205 | 3072,228.96513546517514 206 | 3080,159.2101821134512 207 | 3088,166.79834470647026 208 | 3111,164.54370977173954 209 | 3118,173.5931452318613 210 | 3138,180.7615694841776 211 | 3156,167.90093224200447 212 | 3165,187.09924040998814 213 | 3189,189.69990164637179 214 | 3204,173.05589882951088 215 | 3217,186.29011844737758 216 | 3235,173.6160901624764 217 | 3241,178.05619043228623 218 | 3265,165.3994972988827 219 | 3270,170.98254965013595 220 | 3292,151.9340315015186 221 | 3304,205.08811743240366 222 | 3317,193.36382879221415 223 | 3340,202.2378173869941 224 | 3348,195.9363395137476 225 | 3365,204.1255856351381 226 | 3382,196.04307228404804 227 | 3394,192.84832416895878 228 | 3415,193.1770982444767 229 | 3421,205.64024887718227 230 | 3448,195.3229851977395 231 | 3457,194.37258604467496 232 | 3465,206.181102149389 233 | 3491,204.98855248850984 234 | 3505,219.48651377169676 235 | 3524,224.51242596208976 236 | 3536,235.92376222308204 237 | 3540,164.88370667977145 238 | 3568,170.63182614164455 239 | 3578,181.64309926888316 240 | 3592,176.05881499633023 241 | 3614,179.02068434716415 242 | 3615,103.71512777470673 243 | 3630,117.35162194465087 244 | 3653,98.02727592647516 245 | 3665,103.9714125476967 246 | 3678,86.3163518414846 247 | 3704,95.78783262107869 248 | 3712,139.58949154856708 249 | 3734,131.21746101024303 250 | 3742,141.6571874813563 251 | 3757,128.49900885498406 252 | 3769,129.78214049201108 253 | 3795,123.83736967301829 254 | 3797,241.62697850629604 255 | 3812,251.1483772610438 256 | 3834,233.5959151445975 257 | 3841,242.21182118213324 258 | 3868,243.14191089717636 259 | 3878,193.80698856566573 260 | 3893,176.63622917478244 261 | 3909,186.9226277092717 262 | 3921,183.42905040912672 263 | 3935,192.55939134721 264 | 3952,180.55783284449237 265 | 3974,202.78874875077634 266 | 3990,208.46956072414955 267 | 3999,200.34530707292052 268 | 4019,197.18098621983643 269 | 4026,198.3527910206668 270 | 4047,218.77916234965357 271 | 4059,218.65293855670407 272 | 4071,231.25661136851096 273 | 4095,237.4713163489062 274 | 4105,237.42332128206414 275 | 4122,213.41448248340348 276 | 4127,219.18603866684714 277 | 4155,216.3452064513692 278 | 4166,116.39408532123944 279 | 4180,129.47539701063926 280 | 4200,124.98697056557836 281 | 4209,139.41705214281873 282 | 4230,142.74837656935807 283 | 4238,135.84606109879212 284 | 4260,142.9843148137707 285 | 4275,157.82638677052023 286 | 4285,152.48827690781823 287 | 4303,166.55763371470556 288 | 4314,171.05914761437668 289 | 4323,164.2268688746845 290 | 4349,169.8211232918215 291 | 4360,214.07671580987 292 | 4373,208.8469211981337 293 | 4392,208.07826692368545 294 | 4406,222.54043299769745 295 | 4425,218.451435335106 296 | 4431,229.1612800468736 297 | 4450,228.87864247803176 298 | 4460,218.30563592729706 299 | 4486,211.79941315437665 300 | 4489,177.81098496205016 301 | 4504,192.5538711465312 302 | 4531,183.44084001107012 303 | 4538,190.08868184982626 304 | 4550,180.8837350356037 305 | 4566,185.32324951109157 306 | 4591,174.60119030781297 307 | 4594,179.46882186521898 308 | 4623,174.3118581475946 309 | 4628,179.3672904112067 310 | 4652,185.6207585546961 311 | 4660,176.76185445299612 312 | 4676,187.6211785801289 313 | 4693,173.77215917471707 314 | 4710,161.94971760276587 315 | 4721,165.8469926105727 316 | 4737,159.2912527913824 317 | 4750,143.11041913138996 318 | 4765,156.06209298411702 319 | 4788,155.2645355699259 320 | 4796,249.4635228162611 321 | 4804,212.28180035796632 322 | 4833,208.21564800659587 323 | 4835,245.4750339742967 324 | 4852,246.42439287954244 325 | 4879,266.20209650337466 326 | 4884,111.93558434550854 327 | 4899,111.59931544590444 328 | 4924,96.47141770205164 329 | 4935,218.2731333638137 330 | 4942,218.67701879510523 331 | 4960,202.4304818525876 332 | 4977,207.6766814543896 333 | 4985,198.96293740747004 334 | 5010,195.864754359323 335 | 5028,205.25443692160775 336 | 5042,199.0793154294347 337 | 5050,205.68038437946242 338 | 5074,199.3298707029883 339 | 5080,132.0153472125695 340 | 5103,138.0843146006269 341 | 5113,155.41259725243654 342 | 5135,150.3208457917707 343 | 5147,146.66007034510795 344 | 5151,220.02495487412304 345 | 5169,207.8879588486596 346 | 5187,218.304736409183 347 | 5206,216.12763569598636 348 | 5223,218.80534202356858 349 | 5226,148.8917118747271 350 | 5253,164.57192538056364 351 | 5267,168.09808516657182 352 | 5283,157.26500511694317 353 | 5291,169.19366043362663 354 | 5307,175.41295787452106 355 | 5328,163.35341346989648 356 | 5343,146.95461513840382 357 | 5354,166.42186826875547 358 | 5369,170.45146961188752 359 | 5377,162.65418754405084 360 | 5405,167.35615676707096 361 | 5421,165.04509017791128 362 | 5424,148.44133082959922 363 | 5448,155.8935693003665 364 | 5461,168.31035391408912 365 | 5481,176.54841692137293 366 | 5484,120.64510266718585 367 | 5502,119.3155361226588 368 | 5521,132.60867605752122 369 | 5527,126.35033853580133 370 | 5548,139.0540461481896 371 | 5571,127.62670873749276 372 | 5575,125.30477613715009 373 | 5592,140.55343451218695 374 | 5603,128.90791567577395 375 | 5630,128.09072586069792 376 | 5640,142.60704213650567 377 | 5662,152.6387950250201 378 | 5666,234.15035805181893 379 | 5689,222.82049277503768 380 | 5705,219.96240337229557 381 | 5709,225.83833450412175 382 | 5729,223.9830120138207 383 | 5742,236.62679857913776 384 | 5754,229.97501426856996 385 | 5770,226.20374841096958 386 | 5783,235.82334654396345 387 | 5805,244.1587796813238 388 | 5813,237.45284960014678 389 | 5828,230.40188840691923 390 | 5844,240.24694565793263 391 | 5862,233.72512475012093 392 | 5877,247.3603036287917 393 | 5891,215.17728305874314 394 | 5909,228.83368528898504 395 | 5921,230.50566680566882 396 | 5937,225.62640961471396 397 | 5950,211.92714248035242 398 | 5972,196.61703536904434 399 | 5993,198.55496702247413 400 | 5999,135.65221281560895 401 | 6022,136.6022548064375 402 | 6028,129.52862461529162 403 | 6040,132.49879961873785 404 | 6068,118.30363301371924 405 | 6069,138.88216083602947 406 | 6084,133.56008772817998 407 | 6113,149.4001242204887 408 | 6117,144.92938712548164 409 | 6143,135.16914260110732 410 | 6149,169.33594824533955 411 | 6161,169.08623530131754 412 | 6183,183.60258267571962 413 | 6203,188.0811435130506 414 | 6213,167.00040114621635 415 | 6229,144.95737837013309 416 | 6235,218.62860025115535 417 | 6258,214.58888271997353 418 | 6265,153.62977710536114 419 | 6294,155.23117510231896 420 | 6304,142.42242998004625 421 | 6311,135.12345880326203 422 | 6333,140.00946895296698 423 | 6349,153.17710055432647 424 | 6362,143.80957074293744 425 | 6380,149.56740129323296 426 | 6389,148.08003962461672 427 | 6402,132.52906104542808 428 | 6422,125.75140069550963 429 | 6445,128.23433579522046 430 | 6454,189.46046543552208 431 | 6467,190.69972719165744 432 | 6484,175.7457335100305 433 | 6491,196.50425527948897 434 | 6520,190.17862602886655 435 | 6529,138.51242495794975 436 | 6541,151.7014757934495 437 | 6559,157.3118345614523 438 | 6569,148.05685789245328 439 | 6594,161.06997262688645 440 | 6600,205.07037809886026 441 | 6619,191.3096538576127 442 | 6637,202.78360917306685 443 | 6654,198.89528759888424 444 | 6663,207.4225127452852 445 | 6671,132.01459154542135 446 | 6687,123.43204916511101 447 | 6707,129.33324044907297 448 | 6730,122.73470627767084 449 | 6732,127.30010557164368 450 | 6748,121.85266548869025 451 | 6776,136.3797574001025 452 | 6787,140.42842901555318 453 | 6792,132.16325745921884 454 | 6821,134.96546680412163 455 | 6833,120.92136695370802 456 | 6849,121.36356019464847 457 | 6854,129.74322653774158 458 | 6871,126.58012179129139 459 | 6885,128.40774409267343 460 | 6906,147.03482186976896 461 | 6926,127.09466739965299 462 | 6935,128.73713707829882 463 | 6953,116.73880536328875 464 | 6972,127.78088265477345 465 | 6984,134.51162559758373 466 | 6988,187.76309545922913 467 | 7011,201.73119505313272 468 | 7020,206.68452546634103 469 | 7038,197.28945659164134 470 | 7049,197.5155905524573 471 | 7070,208.04201636805152 472 | 7085,200.93247792173042 473 | 7093,206.32267799477705 474 | 7111,195.26688783425817 475 | 7124,211.0862314084728 476 | 7138,204.7524336807614 477 | 7160,202.4105195691033 478 | 7168,209.88987203777154 479 | 7189,210.57589546854945 480 | 7202,194.0216608194589 481 | 7227,208.26105599555638 482 | 7238,199.3071884448608 483 | 7246,204.05774756052372 484 | 7265,202.0711821637799 485 | 7288,190.8386858984851 486 | 7294,221.3522140079858 487 | 7313,230.77473988740834 488 | 7333,224.52483843376046 489 | 7348,197.03387001321528 490 | 7350,102.35608763196322 491 | 7364,97.76391832952622 492 | 7392,106.85340918451419 493 | 7405,94.91866689327986 494 | 7418,98.46090113044583 495 | 7427,88.65136387994998 496 | 7446,90.45595977756633 497 | 7467,75.68439894197 498 | 7476,84.5338709396341 499 | 7495,73.5460929563748 500 | 7500,83.71755755731016 501 | --------------------------------------------------------------------------------