├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ └── main.yml ├── .gitignore ├── .vscode └── settings.json ├── CONTRIBUTING.md ├── Ch01 ├── 01_01 │ └── code_cells.py ├── 01_02 │ └── extensions.py └── 01_03 │ └── markdown_cells.py ├── Ch02 ├── 02_01 │ └── np_overview.py ├── 02_02 │ └── arrays.py ├── 02_03 │ └── slicing.py ├── 02_04 │ └── boolean_indexing.py ├── 02_05 │ └── broadcasting.py ├── 02_06 │ └── operations.py ├── 02_07 │ └── ufuncs.py ├── challenge │ ├── flower.png │ └── square.py └── solution │ ├── flower.png │ └── square.py ├── Ch03 ├── 03_02 │ ├── load.py │ └── track.csv ├── 03_03 │ ├── parse_time.py │ └── track.csv ├── 03_04 │ ├── access.py │ └── track.csv ├── 03_05 │ ├── speed.py │ └── track.csv ├── 03_06 │ ├── box_plot.py │ └── track.csv ├── challenge │ ├── download_data.py │ └── mean_speed.py └── solution │ ├── download_data.py │ └── mean_speed.py ├── Ch04 ├── 04_01 │ ├── map.py │ ├── track.csv │ └── track.html ├── 04_02 │ ├── track.csv │ └── track.py ├── 04_03 │ ├── geo.py │ └── track.csv ├── challenge │ ├── height.py │ └── track.csv └── solution │ ├── height.py │ └── track.csv ├── Ch05 ├── 05_01 │ ├── download_data.py │ └── first_look.py ├── 05_02 │ ├── download_data.py │ └── load.py ├── 05_03 │ ├── categorical.py │ └── download_data.py ├── 05_04 │ ├── daily.py │ └── download_data.py ├── 05_05 │ ├── download_data.py │ └── hourly.py ├── 05_06 │ ├── download_data.py │ ├── download_weather.py │ └── weather.py ├── challenge │ ├── by_count.png │ ├── by_weekday.png │ ├── download_data.py │ └── tip.py └── solution │ ├── download_data.py │ └── tip.py ├── Ch06 ├── 06_02 │ └── regression.py ├── 06_03 │ └── split.py ├── 06_04 │ └── preprocess.py ├── 06_05 │ └── pipe.py ├── 06_06 │ └── save.py ├── challenge │ └── digits.py └── solution │ └── digits.py ├── Ch07 ├── 07_02 │ └── style.py ├── 07_03 │ └── pd_style.py ├── 07_04 │ ├── download_data.py │ └── pd_plot.py ├── 07_05 │ ├── download_data.py │ └── pd_mpl.py ├── 07_06 │ └── interactive.py ├── 07_07 │ ├── other.py │ └── track.csv ├── challenge │ ├── chart.png │ ├── download_data.py │ └── montly_close.py └── solution │ ├── download_data.py │ └── montly_close.py ├── Ch08 ├── 08_02 │ └── polysum.py ├── 08_03 │ └── digits.py ├── 08_04 │ ├── images.py │ └── sign.jpg ├── 08_05 │ └── nlp.py └── 08_06 │ ├── big.py │ └── download_data.py ├── Ch09 └── 09_05 │ ├── scale.py │ └── test_scale.py ├── LICENSE ├── NOTICE ├── README.md └── requirements.txt /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG VARIANT="3.10-bullseye" 2 | FROM mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT} 3 | 4 | ARG NODE_VERSION="none" 5 | RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi 6 | 7 | RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ 8 | && apt-get -y install --no-install-recommends graphviz libgl1 9 | 10 | RUN python -m pip install --upgrade pip 11 | COPY requirements.txt /tmp/pip-tmp/ 12 | RUN python -m pip --no-cache-dir install -r /tmp/pip-tmp/requirements.txt && rm -rf /tmp/pip-tmp 13 | RUN python -m spacy download en_core_web_sm 14 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "dockerfile": "Dockerfile", 4 | "context": "..", 5 | "args": { 6 | "VARIANT": "3.10-bullseye", 7 | "NODE_VERSION": "lts/*" 8 | } 9 | }, 10 | "extensions": [ 11 | "GitHub.github-vscode-theme", 12 | "ms-python.python" 13 | ], 14 | "onCreateCommand" : "echo PS1='\"$ \"' >> ~/.bashrc" 15 | } 16 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Codeowners for these exercise files: 2 | # * (asterisk) denotes "all files and folders" 3 | # Example: * @producer @instructor 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 7 | 8 | ## Issue Overview 9 | 10 | 11 | ## Describe your environment 12 | 13 | 14 | ## Steps to Reproduce 15 | 16 | 1. 17 | 2. 18 | 3. 19 | 4. 20 | 21 | ## Expected Behavior 22 | 23 | 24 | ## Current Behavior 25 | 26 | 27 | ## Possible Solution 28 | 29 | 30 | ## Screenshots / Video 31 | 32 | 33 | ## Related Issues 34 | 35 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Copy To Branches 2 | on: 3 | workflow_dispatch: 4 | jobs: 5 | copy-to-branches: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/checkout@v2 9 | with: 10 | fetch-depth: 0 11 | - name: Copy To Branches Action 12 | uses: planetoftheweb/copy-to-branches@v1.2 13 | env: 14 | key: main 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pkl 2 | .DS_Store 3 | .tmp 4 | node_modules 5 | npm-debug.log 6 | taxi.csv 7 | taxi.parquet 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.bracketPairColorization.enabled": true, 3 | "editor.cursorBlinking": "solid", 4 | "editor.fontFamily": "ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace", 5 | "editor.fontLigatures": false, 6 | "editor.fontSize": 22, 7 | "editor.formatOnPaste": true, 8 | "editor.formatOnSave": true, 9 | "editor.lineNumbers": "on", 10 | "editor.matchBrackets": "always", 11 | "editor.minimap.enabled": false, 12 | "editor.smoothScrolling": true, 13 | "editor.tabSize": 2, 14 | "editor.useTabStops": true, 15 | "emmet.triggerExpansionOnTab": true, 16 | "explorer.openEditors.visible": 0, 17 | "files.autoSave": "afterDelay", 18 | "screencastMode.onlyKeyboardShortcuts": true, 19 | "terminal.integrated.fontSize": 18, 20 | "workbench.activityBar.visible": true, 21 | "workbench.colorTheme": "Visual Studio Dark", 22 | "workbench.fontAliasing": "antialiased", 23 | "workbench.statusBar.visible": true 24 | } 25 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 2 | Contribution Agreement 3 | ====================== 4 | 5 | This repository does not accept pull requests (PRs). All pull requests will be closed. 6 | 7 | However, if any contributions (through pull requests, issues, feedback or otherwise) are provided, as a contributor, you represent that the code you submit is your original work or that of your employer (in which case you represent you have the right to bind your employer). By submitting code (or otherwise providing feedback), you (and, if applicable, your employer) are licensing the submitted code (and/or feedback) to LinkedIn and the open source community subject to the BSD 2-Clause license. 8 | -------------------------------------------------------------------------------- /Ch01/01_01/code_cells.py: -------------------------------------------------------------------------------- 1 | # %% 2 | 40 + 2 3 | 4 | # %% 5 | "Hi" + " there" 6 | 7 | # %% 8 | import matplotlib.pyplot as plt 9 | import numpy as np 10 | 11 | xs = np.linspace(-6, 6, 1000) 12 | ys = np.sin(xs) 13 | plt.plot(xs, ys) 14 | -------------------------------------------------------------------------------- /Ch01/01_02/extensions.py: -------------------------------------------------------------------------------- 1 | #%% 2 | %pwd 3 | # %% 4 | from time import sleep 5 | 6 | %time sleep(0.1) 7 | # %% 8 | %%time 9 | for i in range(3): 10 | sleep(0.1) 11 | # %% 12 | !ls /var/log 13 | # %% 14 | dirname = '/var/log' 15 | files = !ls $dirname 16 | print(f'{len(files)} files at {dirname}') 17 | -------------------------------------------------------------------------------- /Ch01/01_03/markdown_cells.py: -------------------------------------------------------------------------------- 1 | # %% [markdown] 2 | # # Shopping List 3 | # - Cheese 4 | # - Bread 5 | # - Lettuce 6 | 7 | # %% [markdown] 8 | # [Python](https://python.org) 9 | #  10 | 11 | # %% [markdown] 12 | # Euler's identity is $e^{i\pi} + 1 = 0$ 13 | # %% 14 | -------------------------------------------------------------------------------- /Ch02/02_01/np_overview.py: -------------------------------------------------------------------------------- 1 | # %% 2 | 2 ** 1000 3 | # %% 4 | import numpy as np 5 | 6 | np.int64(2) ** 1000 7 | # %% 8 | np.sin(27) 9 | # %% 10 | np.sin(np.array([1, 2, 3])) -------------------------------------------------------------------------------- /Ch02/02_02/arrays.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import numpy as np 3 | 4 | # %% 5 | arr = np.array([1, 2, 3]) 6 | arr 7 | # %% 8 | len(arr) 9 | 10 | # %% 11 | arr[1] 12 | 13 | # %% 14 | type(arr[1]) 15 | 16 | # %% 17 | arr.dtype 18 | 19 | # %% 20 | arr32 = np.array([1,2,3], dtype=np.int32) 21 | arr32.dtype 22 | 23 | # %% 24 | arr * arr 25 | 26 | # %% 27 | v1 = np.random.rand(1_000_000) 28 | v2 = np.random.rand(1_000_000) 29 | %time v1 * v2 30 | 31 | # %% 32 | arr @ arr 33 | # %% 34 | mat = np.array([ 35 | [1,2,3], 36 | [4,5,6], 37 | [7, 8, 9], 38 | ]) 39 | mat 40 | 41 | # %% 42 | v = np.arange(12) 43 | v 44 | 45 | # %% 46 | v.reshape((4, 3)) 47 | 48 | # %% 49 | mat = np.arange(12).reshape((4, 3)) 50 | mat 51 | 52 | # %% 53 | mat.shape 54 | 55 | # %% 56 | mat2 = mat.reshape((3, 4)) 57 | mat2[1, 1] = 1000 58 | mat 59 | 60 | # %% 61 | mat.T -------------------------------------------------------------------------------- /Ch02/02_03/slicing.py: -------------------------------------------------------------------------------- 1 | # %% 2 | nums = [1, 2, 3, 4, 5] 3 | nums[2:4] 4 | 5 | # %% 6 | import numpy as np 7 | 8 | v = np.arange(1, 6) 9 | v[2:4] 10 | 11 | # %% 12 | arr = np.arange(12).reshape(3, 4) 13 | arr 14 | 15 | # %% 16 | arr[0] 17 | 18 | # %% 19 | arr[1][1] 20 | 21 | # %% 22 | arr[1, 1] 23 | # %% 24 | arr[:, 1] 25 | 26 | # %% 27 | arr[:, 1].reshape((3, 1)) 28 | 29 | # %% 30 | arr[1:, 2:] 31 | 32 | # %% 33 | arr[1:, 2:] = 7 34 | arr 35 | 36 | # %% 37 | -------------------------------------------------------------------------------- /Ch02/02_04/boolean_indexing.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import numpy as np 3 | 4 | arr = np.arange(3) 5 | arr 6 | 7 | # %% 8 | arr[[True, False, True]] 9 | 10 | # %% 11 | arr >= 1 12 | 13 | # %% 14 | arr[arr >= 1] 15 | 16 | # %% 17 | arr = np.arange(10) 18 | 19 | arr[(arr>2) & (arr<7)] 20 | 21 | # %% 22 | arr[(arr>7) | (arr<2)] 23 | 24 | # %% 25 | arr[~(arr>7)] 26 | 27 | # %% 28 | values = np.random.normal(0, 10, 1_000) 29 | values[33] = 1038 30 | values[832] = -3423 31 | 32 | # %% 33 | mask = np.abs(values - values.mean()) > (2 * values.std()) 34 | values[mask] 35 | 36 | # %% 37 | values[mask] = values.mean() -------------------------------------------------------------------------------- /Ch02/02_05/broadcasting.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import numpy as np 3 | 4 | arr = np.arange(3) 5 | arr + 4 6 | 7 | # %% 8 | mat = np.arange(9).reshape((3,3)) 9 | vec = np.arange(3) 10 | 11 | mat + vec 12 | 13 | # %% 14 | v1 = np.arange(3) 15 | v2 = np.arange(3).reshape((3, 1)) 16 | v2 17 | 18 | # %% 19 | v1 + v2 -------------------------------------------------------------------------------- /Ch02/02_06/operations.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import numpy as np 3 | 4 | v = np.array([ 5 | [0, 1, 2], 6 | [3, 4, 5], 7 | [6, 7, 8], 8 | ]) 9 | v 10 | 11 | # %% 12 | v.T 13 | # %% 14 | v.any() 15 | 16 | # %% 17 | v.all() 18 | 19 | # %% 20 | if v: 21 | print('ok') 22 | # %% 23 | v.prod() 24 | 25 | # %% 26 | v.sum(axis=1) 27 | 28 | # %% 29 | v.sum(axis=0) 30 | 31 | # %% 32 | v1 = v.copy() 33 | v1[0,0] = -1 34 | v -------------------------------------------------------------------------------- /Ch02/02_07/ufuncs.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import numpy as np 3 | len(dir(np)) 4 | 5 | # %% 6 | np.sin(90) 7 | # %% 8 | v = np.arange(-3, 3) 9 | np.sin(v) 10 | 11 | # %% 12 | def relu(n): 13 | if n < 0: 14 | return 0.0 15 | return n 16 | 17 | relu(-2) 18 | 19 | # %% 20 | relu(v) 21 | # %% 22 | 23 | @np.vectorize 24 | def relu(n): 25 | if n < 0: 26 | return 0.0 27 | return n 28 | 29 | relu(v) 30 | # %% 31 | relu(-2) 32 | 33 | # %% 34 | relu(-2) - 7 35 | 36 | # %% 37 | nv = np.array([-1.0, np.nan, 1.0]) 38 | np.sin(nv) -------------------------------------------------------------------------------- /Ch02/challenge/flower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinkedInLearning/data-science-foundations-python-scientific-stack-3084641/cb2d7702e66ff3e80816d9f49844c80c18cfa0ba/Ch02/challenge/flower.png -------------------------------------------------------------------------------- /Ch02/challenge/square.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import matplotlib.pyplot as plt 3 | 4 | img = plt.imread('flower.png') 5 | img = img.copy() # make img writable 6 | plt.imshow(img) 7 | 8 | #%% 9 | type(img) 10 | # %% 11 | img.shape 12 | 13 | # %% 14 | # Draw a blue square around the flower 15 | # Top-left: 190x350 16 | # Bottom-right: 680x850 17 | # Line width: 5 -------------------------------------------------------------------------------- /Ch02/solution/flower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinkedInLearning/data-science-foundations-python-scientific-stack-3084641/cb2d7702e66ff3e80816d9f49844c80c18cfa0ba/Ch02/solution/flower.png -------------------------------------------------------------------------------- /Ch02/solution/square.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import matplotlib.pyplot as plt 3 | 4 | img = plt.imread('flower.png') 5 | img = img.copy() # make img writable 6 | plt.imshow(img) 7 | #%% 8 | type(img) 9 | # %% 10 | img.shape 11 | 12 | # %% 13 | # Draw a blue square around the flower 14 | # Top-left: 190x350 15 | # Bottom-right: 680x850 16 | # Line width: 5 17 | 18 | # first dimension is rows (y) 19 | tl_x, tl_y = 350, 190 20 | br_x, br_y = 850, 680 21 | width = 5 22 | 23 | color = [0, 0, 0xFF] # blue 24 | 25 | # Top line 26 | img[tl_x:tl_x+width, tl_y:br_y] = color 27 | # Bottom line 28 | img[br_x:br_x+width, tl_y:br_y] = color 29 | # Left line 30 | img[tl_x:br_x, tl_y:tl_y+width] = color 31 | # Right line 32 | img[tl_x:br_x, br_y-width:br_y] = color 33 | 34 | plt.imshow(img) -------------------------------------------------------------------------------- /Ch03/03_02/load.py: -------------------------------------------------------------------------------- 1 | # %% File size 2 | from pathlib import Path 3 | 4 | kb = 2**10 5 | 6 | csv_file = Path('track.csv') 7 | csv_file.stat().st_size / kb 8 | 9 | # %% 10 | !ls -lh $csv_file 11 | 12 | # %% First few lines & line count 13 | count = 0 14 | with csv_file.open() as fp: 15 | for lnum, line in enumerate(fp, 1): 16 | count += 1 17 | if lnum <= 5: 18 | print(line, end='') 19 | print(f'{count} lines') 20 | 21 | # %% First few lines 22 | !head -5 $csv_file 23 | 24 | # %% Line count 25 | !wc -l $csv_file 26 | 27 | # %% Load to data frame 28 | import pandas as pd 29 | 30 | df = pd.read_csv(csv_file) 31 | len(df) 32 | 33 | # %% 34 | df.columns 35 | # %% 36 | df.info() 37 | # %% 38 | df.describe() 39 | -------------------------------------------------------------------------------- /Ch03/03_02/track.csv: -------------------------------------------------------------------------------- 1 | time,lat,lng,height 2 | 2015-08-20 03:48:07.235,32.519585,35.015021,136.1999969482422 3 | 2015-08-20 03:48:24.734,32.519606,35.014954,126.5999984741211 4 | 2015-08-20 03:48:25.660,32.519612,35.014871,123.0 5 | 2015-08-20 03:48:26.819,32.519654,35.014824,120.5 6 | 2015-08-20 03:48:27.828,32.519689,35.014776,118.9000015258789 7 | 2015-08-20 03:48:29.720,32.519691,35.014704,119.9000015258789 8 | 2015-08-20 03:48:30.669,32.519734,35.014657,120.9000015258789 9 | 2015-08-20 03:48:33.793,32.519719,35.014563,121.6999969482422 10 | 2015-08-20 03:48:34.869,32.519694,35.014549,121.1999969482422 11 | 2015-08-20 03:48:37.708,32.519625,35.014515,121.6999969482422 12 | 2015-08-20 03:48:38.839,32.519599,35.014505,121.8000030517578 13 | 2015-08-20 03:48:41.980,32.519514,35.014481,122.5999984741211 14 | 2015-08-20 03:48:42.725,32.519486,35.014472,123.0 15 | 2015-08-20 03:48:45.896,32.519405,35.014439,122.6999969482422 16 | 2015-08-20 03:48:46.662,32.519379,35.014432,122.6999969482422 17 | 2015-08-20 03:48:49.829,32.519309,35.014414,122.6999969482422 18 | 2015-08-20 03:48:50.665,32.519287,35.0144,123.3000030517578 19 | 2015-08-20 03:48:53.692,32.519211,35.014372,122.3000030517578 20 | 2015-08-20 03:48:54.662,32.519187,35.014365,122.5999984741211 21 | 2015-08-20 03:48:58.869,32.519106,35.014337,122.0 22 | 2015-08-20 03:48:59.663,32.519084,35.014331,121.8000030517578 23 | 2015-08-20 03:49:03.861,32.519009,35.014303,122.9000015258789 24 | 2015-08-20 03:49:04.663,32.518989,35.014306,122.9000015258789 25 | 2015-08-20 03:49:07.742,32.518916,35.01434,123.0999984741211 26 | 2015-08-20 03:50:13.679,32.517636,35.013531,115.1999969482422 27 | 2015-08-20 03:50:16.767,32.517589,35.013606,114.3000030517578 28 | 2015-08-20 03:50:17.719,32.517574,35.01363,114.1999969482422 29 | 2015-08-20 03:50:20.748,32.517529,35.013705,113.8000030517578 30 | 2015-08-20 03:50:21.681,32.517512,35.01373,114.1999969482422 31 | 2015-08-20 03:50:24.735,32.517459,35.013809,114.0 32 | 2015-08-20 03:50:25.677,32.517442,35.013834,113.0999984741211 33 | 2015-08-20 03:50:28.738,32.517389,35.013903,112.5999984741211 34 | 2015-08-20 03:50:29.673,32.517373,35.013925,113.5 35 | 2015-08-20 03:50:32.816,32.517323,35.013991,113.5999984741211 36 | 2015-08-20 03:50:33.682,32.517306,35.014012,113.4000015258789 37 | 2015-08-20 03:50:36.749,32.517254,35.014075,114.5999984741211 38 | 2015-08-20 03:50:37.744,32.517236,35.014095,114.1999969482422 39 | 2015-08-20 03:50:40.735,32.517183,35.014148,115.5 40 | 2015-08-20 03:50:41.682,32.517164,35.014167,116.0 41 | 2015-08-20 03:50:44.757,32.517111,35.014235,116.5999984741211 42 | 2015-08-20 03:50:45.674,32.517095,35.014257,116.5999984741211 43 | 2015-08-20 03:50:48.716,32.517044,35.014332,115.3000030517578 44 | 2015-08-20 03:50:49.684,32.517026,35.014357,115.0 45 | 2015-08-20 03:50:52.757,32.516972,35.014431,114.9000015258789 46 | 2015-08-20 03:50:53.688,32.516954,35.014456,114.9000015258789 47 | 2015-08-20 03:50:56.782,32.516891,35.014519,115.6999969482422 48 | 2015-08-20 03:50:57.731,32.516868,35.014522,114.0 49 | 2015-08-20 03:51:00.870,32.516818,35.01447,113.5999984741211 50 | 2015-08-20 03:51:01.772,32.516803,35.014442,113.0 51 | 2015-08-20 03:51:04.744,32.516752,35.01436,112.0 52 | 2015-08-20 03:51:05.747,32.516734,35.014335,112.3000030517578 53 | 2015-08-20 03:51:08.831,32.516677,35.014257,110.9000015258789 54 | 2015-08-20 03:51:09.744,32.516657,35.014233,110.8000030517578 55 | 2015-08-20 03:51:12.743,32.516591,35.014176,108.6999969482422 56 | 2015-08-20 03:51:13.702,32.516568,35.014162,108.4000015258789 57 | 2015-08-20 03:51:16.777,32.516506,35.014103,109.1999969482422 58 | 2015-08-20 03:51:17.729,32.516486,35.014084,108.4000015258789 59 | 2015-08-20 03:51:20.733,32.516421,35.014026,108.5 60 | 2015-08-20 03:51:21.670,32.5164,35.014006,108.5999984741211 61 | 2015-08-20 03:51:24.691,32.516338,35.013941,107.5999984741211 62 | 2015-08-20 03:51:25.672,32.516318,35.01392,107.9000015258789 63 | 2015-08-20 03:51:28.745,32.516253,35.013869,108.0 64 | 2015-08-20 03:51:29.677,32.51623,35.013852,108.0 65 | 2015-08-20 03:51:32.707,32.516174,35.013795,105.5999984741211 66 | 2015-08-20 03:51:33.674,32.516156,35.013775,104.8000030517578 67 | 2015-08-20 03:51:36.758,32.516108,35.01371,105.3000030517578 68 | 2015-08-20 03:51:37.675,32.516089,35.01369,103.9000015258789 69 | 2015-08-20 03:51:40.733,32.516033,35.013633,103.6999969482422 70 | 2015-08-20 03:51:41.674,32.516014,35.013615,103.5 71 | 2015-08-20 03:51:44.744,32.51596,35.013559,102.8000030517578 72 | 2015-08-20 03:51:45.679,32.515943,35.01354,103.0 73 | 2015-08-20 03:51:48.760,32.515891,35.013482,102.0 74 | 2015-08-20 03:51:49.684,32.515873,35.013463,102.0 75 | 2015-08-20 03:51:52.709,32.515826,35.013403,102.0 76 | 2015-08-20 03:51:53.672,32.515812,35.013382,102.0 77 | 2015-08-20 03:51:56.894,32.515761,35.013325,101.8000030517578 78 | 2015-08-20 03:51:57.767,32.515743,35.013307,101.3000030517578 79 | 2015-08-20 03:52:00.768,32.515693,35.013246,100.5 80 | 2015-08-20 03:52:01.676,32.515675,35.013226,100.8000030517578 81 | 2015-08-20 03:52:04.866,32.515622,35.013162,101.0999984741211 82 | 2015-08-20 03:52:05.780,32.515605,35.013139,100.6999969482422 83 | 2015-08-20 03:52:08.753,32.51555,35.013074,99.1999969482422 84 | 2015-08-20 03:52:09.700,32.515531,35.013055,99.1999969482422 85 | 2015-08-20 03:52:12.855,32.515471,35.012994,99.3000030517578 86 | 2015-08-20 03:52:13.780,32.515451,35.012974,99.0 87 | 2015-08-20 03:52:16.775,32.515388,35.012912,99.6999969482422 88 | 2015-08-20 03:52:17.704,32.515368,35.012891,99.6999969482422 89 | 2015-08-20 03:52:20.907,32.515311,35.012826,99.0999984741211 90 | 2015-08-20 03:52:21.779,32.515291,35.012806,98.8000030517578 91 | 2015-08-20 03:52:24.813,32.515226,35.01276,98.5 92 | 2015-08-20 03:52:25.698,32.515203,35.012747,97.9000015258789 93 | 2015-08-20 03:52:28.748,32.515136,35.012709,97.4000015258789 94 | 2015-08-20 03:52:29.672,32.515113,35.012694,97.0 95 | 2015-08-20 03:52:32.719,32.515052,35.012636,96.3000030517578 96 | 2015-08-20 03:52:33.698,32.515034,35.012617,96.3000030517578 97 | 2015-08-20 03:52:37.790,32.514986,35.012537,96.0999984741211 98 | 2015-08-20 03:52:38.678,32.514964,35.012521,96.5999984741211 99 | 2015-08-20 03:52:41.752,32.514901,35.01246,95.1999969482422 100 | 2015-08-20 03:52:42.684,32.514882,35.012438,94.6999969482422 101 | 2015-08-20 03:52:45.758,32.514836,35.012371,94.3000030517578 102 | 2015-08-20 03:52:46.679,32.514813,35.012367,94.9000015258789 103 | 2015-08-20 03:52:49.764,32.514761,35.012418,95.0 104 | 2015-08-20 03:52:50.678,32.514746,35.012445,95.4000015258789 105 | 2015-08-20 03:52:54.323,32.514689,35.012516,96.4000015258789 106 | 2015-08-20 03:52:54.673,32.514671,35.01254,96.5 107 | 2015-08-20 03:52:57.937,32.514631,35.012615,98.0 108 | 2015-08-20 03:52:58.682,32.514619,35.012636,97.6999969482422 109 | 2015-08-20 03:53:02.766,32.514562,35.012717,99.0999984741211 110 | 2015-08-20 03:53:03.678,32.514545,35.012741,99.1999969482422 111 | 2015-08-20 03:53:05.884,32.514507,35.012782,99.4000015258789 112 | 2015-08-20 03:53:33.775,32.514134,35.013324,105.1999969482422 113 | 2015-08-20 03:53:36.808,32.514092,35.013393,105.8000030517578 114 | 2015-08-20 03:53:37.677,32.514077,35.013417,106.1999969482422 115 | 2015-08-20 03:53:40.734,32.514028,35.013493,106.3000030517578 116 | 2015-08-20 03:53:41.686,32.514011,35.013514,107.1999969482422 117 | 2015-08-20 03:53:44.713,32.513947,35.013472,106.6999969482422 118 | 2015-08-20 03:53:45.682,32.513928,35.013445,107.3000030517578 119 | 2015-08-20 03:53:49.290,32.513882,35.013363,103.9000015258789 120 | 2015-08-20 03:53:49.679,32.513869,35.013336,102.5999984741211 121 | 2015-08-20 03:53:52.831,32.513823,35.01327,105.4000015258789 122 | 2015-08-20 03:53:53.737,32.513807,35.013251,105.0999984741211 123 | 2015-08-20 03:53:56.820,32.513777,35.013178,105.1999969482422 124 | 2015-08-20 03:53:57.772,32.513769,35.013153,104.6999969482422 125 | 2015-08-20 03:54:00.947,32.513739,35.013078,104.1999969482422 126 | 2015-08-20 03:54:01.713,32.513726,35.013053,103.9000015258789 127 | 2015-08-20 03:54:04.796,32.513683,35.012981,102.8000030517578 128 | 2015-08-20 03:54:05.739,32.513666,35.012958,102.3000030517578 129 | 2015-08-20 03:54:08.837,32.513614,35.012891,100.4000015258789 130 | 2015-08-20 03:54:09.736,32.513598,35.012869,100.4000015258789 131 | 2015-08-20 03:54:12.795,32.513558,35.012791,100.5999984741211 132 | 2015-08-20 03:54:13.691,32.513546,35.012765,100.4000015258789 133 | 2015-08-20 03:54:17.425,32.513513,35.012687,99.6999969482422 134 | 2015-08-20 03:54:17.724,32.513502,35.01266,99.9000015258789 135 | 2015-08-20 03:54:20.759,32.513469,35.012578,102.0 136 | 2015-08-20 03:54:21.692,32.51346,35.01255,102.0999984741211 137 | 2015-08-20 03:54:24.813,32.513433,35.012471,101.5999984741211 138 | 2015-08-20 03:54:25.692,32.513426,35.012445,100.9000015258789 139 | 2015-08-20 03:54:28.783,32.513402,35.012367,100.0999984741211 140 | 2015-08-20 03:54:29.687,32.513394,35.012338,99.1999969482422 141 | 2015-08-20 03:54:32.827,32.513355,35.01226,99.5 142 | 2015-08-20 03:54:33.691,32.51334,35.012236,99.4000015258789 143 | 2015-08-20 03:54:36.774,32.513301,35.012159,98.3000030517578 144 | 2015-08-20 03:54:37.686,32.513288,35.012135,96.6999969482422 145 | 2015-08-20 03:54:40.787,32.513249,35.012063,95.1999969482422 146 | 2015-08-20 03:54:41.686,32.513237,35.012037,95.0 147 | 2015-08-20 03:54:44.769,32.513199,35.011961,94.6999969482422 148 | 2015-08-20 03:54:45.688,32.513184,35.011937,95.1999969482422 149 | 2015-08-20 03:54:48.745,32.51314,35.011868,93.3000030517578 150 | 2015-08-20 03:54:49.689,32.513126,35.011844,93.1999969482422 151 | 2015-08-20 03:54:52.757,32.513097,35.011766,92.5 152 | 2015-08-20 03:54:53.684,32.513088,35.011741,91.4000015258789 153 | 2015-08-20 03:54:57.781,32.513055,35.011644,91.1999969482422 154 | 2015-08-20 03:54:58.688,32.513048,35.011618,90.9000015258789 155 | 2015-08-20 03:55:01.904,32.513024,35.011538,90.6999969482422 156 | 2015-08-20 03:55:02.695,32.513016,35.01151,91.0 157 | 2015-08-20 03:55:05.766,32.512991,35.011432,90.0 158 | 2015-08-20 03:55:06.696,32.512982,35.011409,88.9000015258789 159 | 2015-08-20 03:55:10.766,32.512965,35.01131,88.0 160 | 2015-08-20 03:55:11.690,32.512962,35.011284,88.0999984741211 161 | 2015-08-20 03:55:14.787,32.512944,35.011205,87.9000015258789 162 | 2015-08-20 03:55:15.692,32.512936,35.011179,87.80000305175781 163 | 2015-08-20 03:55:18.789,32.512908,35.0111,86.80000305175781 164 | 2015-08-20 03:55:19.724,32.512897,35.011073,87.69999694824219 165 | 2015-08-20 03:55:22.747,32.512862,35.010991,88.0 166 | 2015-08-20 03:55:23.801,32.51285,35.010963,88.30000305175781 167 | 2015-08-20 03:55:26.824,32.51282,35.010873,88.0999984741211 168 | 2015-08-20 03:55:27.730,32.51281,35.010844,87.30000305175781 169 | 2015-08-20 03:55:30.791,32.512774,35.010765,87.4000015258789 170 | 2015-08-20 03:55:31.786,32.512762,35.010739,87.5999984741211 171 | 2015-08-20 03:55:34.837,32.512726,35.010661,86.80000305175781 172 | 2015-08-20 03:55:35.724,32.512714,35.010636,86.69999694824219 173 | 2015-08-20 03:55:38.786,32.512676,35.010562,87.19999694824219 174 | 2015-08-20 03:55:39.770,32.512664,35.010537,87.30000305175781 175 | 2015-08-20 03:55:42.826,32.512645,35.010455,87.0999984741211 176 | 2015-08-20 03:55:43.699,32.512642,35.010426,86.5999984741211 177 | 2015-08-20 03:55:46.771,32.512637,35.01034,85.0 178 | 2015-08-20 03:55:47.692,32.512636,35.010313,84.9000015258789 179 | 2015-08-20 03:55:51.779,32.512629,35.010212,84.9000015258789 180 | 2015-08-20 03:55:52.694,32.512625,35.010189,84.4000015258789 181 | 2015-08-20 03:55:56.849,32.512594,35.010093,82.9000015258789 182 | 2015-08-20 03:55:57.697,32.512584,35.010068,83.69999694824219 183 | 2015-08-20 03:56:00.786,32.512551,35.009988,84.0999984741211 184 | 2015-08-20 03:56:01.697,32.512539,35.009961,84.5 185 | 2015-08-20 03:56:04.757,32.512505,35.009883,84.0 186 | 2015-08-20 03:56:05.839,32.512493,35.009857,84.0 187 | 2015-08-20 03:56:08.782,32.512456,35.009785,83.0 188 | 2015-08-20 03:56:09.705,32.512445,35.009762,82.9000015258789 189 | 2015-08-20 03:56:12.777,32.512408,35.009692,82.4000015258789 190 | 2015-08-20 03:56:13.701,32.512395,35.009668,82.80000305175781 191 | 2015-08-20 03:56:16.840,32.512362,35.009595,81.5999984741211 192 | 2015-08-20 03:56:17.698,32.512347,35.009574,81.30000305175781 193 | 2015-08-20 03:56:20.757,32.512291,35.009517,81.80000305175781 194 | 2015-08-20 03:56:21.708,32.512267,35.009495,81.69999694824219 195 | 2015-08-20 03:56:24.832,32.512213,35.00943,82.30000305175781 196 | 2015-08-20 03:56:25.698,32.512199,35.00941,82.0 197 | 2015-08-20 03:56:28.974,32.512144,35.009361,80.69999694824219 198 | 2015-08-20 03:57:10.713,32.511551,35.009294,84.0 199 | 2015-08-20 03:57:14.785,32.511533,35.009386,86.9000015258789 200 | 2015-08-20 03:57:15.920,32.511524,35.009408,87.5 201 | 2015-08-20 03:57:19.818,32.511467,35.009485,87.30000305175781 202 | 2015-08-20 03:57:20.757,32.51145,35.0095,86.80000305175781 203 | 2015-08-20 03:57:24.836,32.511379,35.009559,89.5999984741211 204 | 2015-08-20 03:57:25.763,32.511362,35.009573,89.5 205 | 2015-08-20 03:57:29.824,32.511303,35.009636,89.0 206 | 2015-08-20 03:57:30.702,32.511293,35.009653,88.80000305175781 207 | 2015-08-20 03:57:35.785,32.511252,35.009745,91.1999969482422 208 | 2015-08-20 03:57:36.709,32.511245,35.009764,91.6999969482422 209 | 2015-08-20 03:57:41.812,32.511216,35.009855,91.3000030517578 210 | 2015-08-20 03:57:42.760,32.511212,35.009875,91.8000030517578 211 | 2015-08-20 03:57:47.810,32.511215,35.009977,87.69999694824219 212 | 2015-08-20 03:57:48.711,32.511218,35.009998,88.5999984741211 213 | 2015-08-20 03:57:53.815,32.511226,35.010102,86.19999694824219 214 | 2015-08-20 03:57:54.704,32.511225,35.010123,86.5999984741211 215 | 2015-08-20 03:57:59.780,32.511209,35.010227,86.9000015258789 216 | 2015-08-20 03:58:00.710,32.511202,35.010248,87.9000015258789 217 | 2015-08-20 03:58:04.797,32.511172,35.010329,88.80000305175781 218 | 2015-08-20 03:58:05.710,32.511162,35.010348,88.5 219 | 2015-08-20 03:58:09.754,32.511117,35.010419,90.3000030517578 220 | 2015-08-20 03:58:23.793,32.510997,35.010643,93.5 221 | 2015-08-20 03:58:28.757,32.510988,35.010748,93.1999969482422 222 | 2015-08-20 03:58:29.705,32.510981,35.010764,93.5999984741211 223 | 2015-08-20 03:58:34.772,32.510925,35.010825,93.3000030517578 224 | 2015-08-20 03:58:35.709,32.510912,35.010837,93.8000030517578 225 | 2015-08-20 03:58:40.773,32.510838,35.010887,95.4000015258789 226 | 2015-08-20 03:58:41.710,32.510821,35.010891,94.6999969482422 227 | 2015-08-20 03:58:46.790,32.510745,35.010903,97.6999969482422 228 | 2015-08-20 03:58:47.755,32.510729,35.01091,98.4000015258789 229 | 2015-08-20 03:58:52.795,32.510651,35.010939,100.5 230 | 2015-08-20 03:58:53.723,32.510637,35.010948,99.6999969482422 231 | 2015-08-20 03:58:58.841,32.510557,35.010988,98.8000030517578 232 | 2015-08-20 03:58:59.753,32.510539,35.010993,97.8000030517578 233 | 2015-08-20 03:59:04.834,32.510462,35.011028,98.1999969482422 234 | 2015-08-20 03:59:05.760,32.510448,35.011037,98.0999984741211 235 | 2015-08-20 03:59:10.877,32.510369,35.011071,98.0 236 | 2015-08-20 03:59:11.758,32.510353,35.011076,99.3000030517578 237 | 2015-08-20 03:59:16.821,32.510278,35.011083,100.1999969482422 238 | 2015-08-20 03:59:17.799,32.510262,35.011083,100.0 239 | 2015-08-20 03:59:22.869,32.510184,35.011083,100.5999984741211 240 | 2015-08-20 03:59:23.773,32.510168,35.011081,101.0 241 | 2015-08-20 03:59:29.840,32.510085,35.011108,103.6999969482422 242 | 2015-08-20 03:59:30.719,32.510071,35.011108,103.1999969482422 243 | 2015-08-20 03:59:35.811,32.509998,35.011101,104.0 244 | 2015-08-20 03:59:36.722,32.50998,35.011102,105.3000030517578 245 | 2015-08-20 03:59:41.823,32.509892,35.011123,109.5999984741211 246 | 2015-08-20 03:59:42.900,32.509875,35.011126,109.8000030517578 247 | 2015-08-20 03:59:47.759,32.509797,35.011142,112.3000030517578 248 | 2015-08-20 03:59:48.718,32.509782,35.011142,112.8000030517578 249 | 2015-08-20 03:59:54.855,32.509693,35.011128,110.8000030517578 250 | 2015-08-20 03:59:55.709,32.509679,35.01113,110.4000015258789 251 | 2015-08-20 04:00:02.764,32.509592,35.011152,109.1999969482422 252 | 2015-08-20 04:00:03.761,32.509576,35.011153,108.4000015258789 253 | 2015-08-20 04:00:08.786,32.509491,35.011162,109.8000030517578 254 | 2015-08-20 04:00:09.727,32.509474,35.011171,110.0999984741211 255 | 2015-08-20 04:00:13.815,32.50941,35.011228,111.5999984741211 256 | 2015-08-20 04:00:14.721,32.509395,35.011246,111.8000030517578 257 | 2015-08-20 04:00:18.879,32.509335,35.011324,111.0999984741211 258 | 2015-08-20 04:00:19.739,32.509325,35.011348,111.0 259 | 2015-08-20 04:00:22.758,32.50931,35.011425,110.3000030517578 260 | 2015-08-20 04:00:26.765,32.509363,35.011497,109.4000015258789 261 | 2015-08-20 04:00:31.754,32.509427,35.011568,109.5 262 | 2015-08-20 04:00:32.724,32.509434,35.01158,109.4000015258789 263 | 2015-08-20 04:00:38.798,32.509408,35.01168,108.3000030517578 264 | 2015-08-20 04:00:39.732,32.509398,35.011698,108.3000030517578 265 | 2015-08-20 04:00:44.912,32.509339,35.011764,106.5999984741211 266 | 2015-08-20 04:00:45.722,32.509328,35.011776,106.6999969482422 267 | 2015-08-20 04:00:50.955,32.509276,35.011845,103.0 268 | 2015-08-20 04:00:51.724,32.509261,35.011857,102.1999969482422 269 | 2015-08-20 04:00:56.837,32.509182,35.011906,100.9000015258789 270 | 2015-08-20 04:00:57.790,32.509167,35.011919,100.6999969482422 271 | 2015-08-20 04:01:02.893,32.509097,35.011982,100.5 272 | 2015-08-20 04:01:03.767,32.509082,35.011995,100.0999984741211 273 | 2015-08-20 04:01:07.773,32.509023,35.012046,98.6999969482422 274 | 2015-08-20 04:01:08.723,32.509008,35.01206,98.4000015258789 275 | 2015-08-20 04:01:12.892,32.508949,35.012118,98.1999969482422 276 | 2015-08-20 04:01:13.730,32.508936,35.012133,97.8000030517578 277 | 2015-08-20 04:01:17.889,32.508888,35.012198,96.9000015258789 278 | 2015-08-20 04:01:18.737,32.508875,35.012215,96.9000015258789 279 | 2015-08-20 04:01:22.773,32.508815,35.012275,96.0 280 | 2015-08-20 04:01:23.738,32.508801,35.012291,95.6999969482422 281 | 2015-08-20 04:01:27.842,32.508754,35.012367,95.5 282 | 2015-08-20 04:01:28.724,32.508745,35.01239,95.3000030517578 283 | 2015-08-20 04:01:32.771,32.508719,35.012489,94.9000015258789 284 | 2015-08-20 04:01:33.737,32.508714,35.012511,94.1999969482422 285 | 2015-08-20 04:01:37.826,32.508683,35.012593,93.3000030517578 286 | 2015-08-20 04:01:38.805,32.50867,35.012613,93.6999969482422 287 | 2015-08-20 04:01:42.885,32.508632,35.012693,92.0999984741211 288 | 2015-08-20 04:01:43.769,32.508626,35.012715,91.3000030517578 289 | 2015-08-20 04:01:47.862,32.508605,35.012807,90.5999984741211 290 | 2015-08-20 04:01:48.809,32.508601,35.012831,90.1999969482422 291 | 2015-08-20 04:01:52.842,32.508585,35.012924,89.5999984741211 292 | 2015-08-20 04:01:53.730,32.508577,35.012946,88.4000015258789 293 | 2015-08-20 04:01:56.975,32.508545,35.013015,88.0999984741211 294 | 2015-08-20 04:01:57.734,32.508537,35.013042,88.4000015258789 295 | 2015-08-20 04:02:01.816,32.508514,35.013143,87.30000305175781 296 | 2015-08-20 04:02:02.766,32.508506,35.013164,87.19999694824219 297 | 2015-08-20 04:02:06.811,32.508474,35.01325,87.0999984741211 298 | 2015-08-20 04:02:07.740,32.508467,35.013272,87.19999694824219 299 | 2015-08-20 04:02:11.804,32.508432,35.013361,87.4000015258789 300 | 2015-08-20 04:02:12.733,32.508421,35.013383,88.0 301 | 2015-08-20 04:02:16.800,32.508376,35.013474,88.0999984741211 302 | 2015-08-20 04:02:17.734,32.508364,35.013495,87.30000305175781 303 | 2015-08-20 04:02:22.799,32.508313,35.013573,85.19999694824219 304 | 2015-08-20 04:02:23.743,32.5083,35.013586,85.0 305 | 2015-08-20 04:02:28.794,32.508228,35.013635,80.80000305175781 306 | 2015-08-20 04:02:29.755,32.508212,35.013642,80.19999694824219 307 | 2015-08-20 04:02:33.807,32.508138,35.013675,79.9000015258789 308 | 2015-08-20 04:02:34.804,32.508119,35.013685,80.0999984741211 309 | 2015-08-20 04:02:38.812,32.508092,35.013769,80.69999694824219 310 | 2015-08-20 04:02:39.879,32.508098,35.0138,81.0 311 | 2015-08-20 04:02:42.909,32.508128,35.013877,79.69999694824219 312 | 2015-08-20 04:02:43.754,32.508136,35.013901,80.80000305175781 313 | 2015-08-20 04:02:48.018,32.508157,35.014002,80.5999984741211 314 | 2015-08-20 04:02:48.746,32.508158,35.014028,80.5999984741211 315 | 2015-08-20 04:02:56.857,32.508152,35.014134,80.69999694824219 316 | 2015-08-20 04:02:57.964,32.508154,35.014166,80.4000015258789 317 | 2015-08-20 04:03:00.838,32.508153,35.014262,80.0999984741211 318 | 2015-08-20 04:03:01.834,32.508154,35.014292,79.80000305175781 319 | 2015-08-20 04:03:04.926,32.508161,35.014381,78.80000305175781 320 | 2015-08-20 04:03:05.735,32.508159,35.014411,79.19999694824219 321 | 2015-08-20 04:03:08.875,32.508163,35.014501,79.0 322 | 2015-08-20 04:03:09.740,32.508176,35.014527,79.9000015258789 323 | 2015-08-20 04:03:12.773,32.508198,35.014609,80.4000015258789 324 | 2015-08-20 04:03:13.733,32.508205,35.014635,81.4000015258789 325 | 2015-08-20 04:03:17.917,32.508223,35.01473,81.0 326 | 2015-08-20 04:03:18.741,32.508227,35.014754,81.5 327 | 2015-08-20 04:03:22.777,32.508247,35.014854,81.5999984741211 328 | 2015-08-20 04:03:23.734,32.508254,35.01488,81.19999694824219 329 | 2015-08-20 04:03:26.806,32.508274,35.014959,81.0 330 | 2015-08-20 04:03:27.736,32.508278,35.014985,81.19999694824219 331 | 2015-08-20 04:03:31.781,32.508291,35.015084,83.30000305175781 332 | 2015-08-20 04:03:32.733,32.508294,35.015108,83.5999984741211 333 | 2015-08-20 04:03:36.817,32.508315,35.015203,84.5999984741211 334 | 2015-08-20 04:03:37.735,32.508318,35.015227,84.30000305175781 335 | 2015-08-20 04:03:41.910,32.508329,35.015329,84.80000305175781 336 | 2015-08-20 04:03:42.735,32.508329,35.015354,84.9000015258789 337 | 2015-08-20 04:03:46.780,32.508337,35.015452,85.30000305175781 338 | 2015-08-20 04:03:47.739,32.50834,35.015477,85.0 339 | 2015-08-20 04:03:51.812,32.50836,35.015572,84.5999984741211 340 | 2015-08-20 04:03:52.753,32.50837,35.015594,83.5999984741211 341 | 2015-08-20 04:03:56.823,32.508393,35.015688,84.0999984741211 342 | 2015-08-20 04:03:57.748,32.508398,35.015712,83.5 343 | 2015-08-20 04:04:01.886,32.508414,35.015804,83.19999694824219 344 | 2015-08-20 04:04:02.806,32.508417,35.015827,82.80000305175781 345 | 2015-08-20 04:04:06.819,32.508435,35.015917,81.19999694824219 346 | 2015-08-20 04:04:07.737,32.508441,35.015939,80.5999984741211 347 | 2015-08-20 04:04:11.934,32.508457,35.016031,81.0999984741211 348 | 2015-08-20 04:04:12.809,32.50846,35.016053,81.19999694824219 349 | 2015-08-20 04:04:16.845,32.508471,35.016144,79.0999984741211 350 | 2015-08-20 04:04:17.756,32.508474,35.016168,79.19999694824219 351 | 2015-08-20 04:04:21.812,32.508485,35.016264,77.9000015258789 352 | 2015-08-20 04:04:22.738,32.508485,35.016287,77.5 353 | 2015-08-20 04:04:26.828,32.508482,35.016389,78.30000305175781 354 | 2015-08-20 04:04:27.741,32.508484,35.016415,79.5 355 | 2015-08-20 04:04:30.815,32.508498,35.016495,79.19999694824219 356 | 2015-08-20 04:04:31.780,32.508502,35.016521,79.19999694824219 357 | 2015-08-20 04:04:35.782,32.508519,35.016616,80.19999694824219 358 | 2015-08-20 04:04:36.758,32.508519,35.01664,80.5999984741211 359 | 2015-08-20 04:04:40.819,32.508524,35.016736,80.9000015258789 360 | 2015-08-20 04:04:41.739,32.508526,35.01676,80.5999984741211 361 | 2015-08-20 04:04:45.822,32.50854,35.016862,82.0999984741211 362 | 2015-08-20 04:04:46.754,32.508545,35.016889,81.69999694824219 363 | 2015-08-20 04:04:49.819,32.50856,35.016969,81.69999694824219 364 | 2015-08-20 04:04:50.751,32.508565,35.016995,81.69999694824219 365 | 2015-08-20 04:04:54.827,32.508588,35.017093,81.5 366 | 2015-08-20 04:04:55.741,32.508594,35.017118,81.30000305175781 367 | 2015-08-20 04:04:59.953,32.508622,35.017211,81.69999694824219 368 | 2015-08-20 04:05:00.898,32.508629,35.017233,81.9000015258789 369 | 2015-08-20 04:05:04.825,32.50865,35.017327,83.69999694824219 370 | 2015-08-20 04:05:05.753,32.508654,35.017352,83.9000015258789 371 | 2015-08-20 04:05:09.820,32.508676,35.017453,85.80000305175781 372 | 2015-08-20 04:05:10.752,32.508681,35.017477,85.19999694824219 373 | 2015-08-20 04:05:14.782,32.508707,35.017574,85.0 374 | 2015-08-20 04:05:15.746,32.508715,35.017599,84.69999694824219 375 | 2015-08-20 04:05:18.810,32.508727,35.017679,84.30000305175781 376 | 2015-08-20 04:05:19.754,32.508727,35.017706,85.0999984741211 377 | 2015-08-20 04:05:23.821,32.508727,35.017811,85.19999694824219 378 | 2015-08-20 04:05:24.748,32.508732,35.017839,85.19999694824219 379 | 2015-08-20 04:05:27.786,32.508745,35.017921,84.4000015258789 380 | 2015-08-20 04:05:28.751,32.508745,35.01795,84.69999694824219 381 | 2015-08-20 04:05:31.779,32.508764,35.018032,84.69999694824219 382 | 2015-08-20 04:05:32.778,32.508771,35.01806,84.5 383 | 2015-08-20 04:05:35.827,32.508779,35.018146,84.69999694824219 384 | 2015-08-20 04:05:36.757,32.508782,35.018173,83.30000305175781 385 | 2015-08-20 04:05:40.868,32.508792,35.018274,83.5 386 | 2015-08-20 04:05:41.830,32.508795,35.018298,84.5 387 | 2015-08-20 04:05:45.830,32.508801,35.018397,83.69999694824219 388 | 2015-08-20 04:05:46.745,32.508802,35.018421,82.80000305175781 389 | 2015-08-20 04:05:50.865,32.508796,35.018515,80.9000015258789 390 | 2015-08-20 04:05:51.774,32.508792,35.018539,81.5 391 | 2015-08-20 04:05:55.985,32.508787,35.018637,82.5999984741211 392 | 2015-08-20 04:05:56.877,32.508784,35.01866,82.9000015258789 393 | 2015-08-20 04:06:01.100,32.508772,35.018762,84.80000305175781 394 | 2015-08-20 04:06:01.788,32.508772,35.018789,84.80000305175781 395 | 2015-08-20 04:06:04.895,32.508772,35.018874,84.69999694824219 396 | 2015-08-20 04:06:05.832,32.508774,35.018902,83.80000305175781 397 | 2015-08-20 04:06:08.882,32.50878,35.018988,82.0999984741211 398 | 2015-08-20 04:06:10.029,32.508783,35.019016,81.80000305175781 399 | 2015-08-20 04:06:12.907,32.508795,35.019104,80.5999984741211 400 | 2015-08-20 04:06:13.760,32.508798,35.019135,79.5 401 | 2015-08-20 04:06:16.824,32.508818,35.01922,80.5 402 | 2015-08-20 04:06:17.748,32.508826,35.019248,79.5 403 | 2015-08-20 04:06:20.825,32.508859,35.019327,79.4000015258789 404 | 2015-08-20 04:06:21.750,32.508868,35.019355,79.9000015258789 405 | 2015-08-20 04:06:24.830,32.508895,35.019439,80.0 406 | 2015-08-20 04:06:25.755,32.508902,35.019465,80.4000015258789 407 | 2015-08-20 04:06:28.846,32.508922,35.019544,79.0 408 | 2015-08-20 04:06:29.760,32.50893,35.019568,79.30000305175781 409 | 2015-08-20 04:06:33.815,32.50896,35.019661,79.5 410 | 2015-08-20 04:06:34.814,32.508969,35.019684,80.19999694824219 411 | 2015-08-20 04:06:38.879,32.509004,35.019779,80.4000015258789 412 | 2015-08-20 04:06:39.758,32.509014,35.019804,79.19999694824219 413 | 2015-08-20 04:06:42.786,32.509039,35.01988,79.9000015258789 414 | 2015-08-20 04:06:43.754,32.509046,35.019905,79.4000015258789 415 | 2015-08-20 04:06:47.808,32.509086,35.019981,80.0 416 | 2015-08-20 04:06:48.764,32.509093,35.019999,79.69999694824219 417 | 2015-08-20 04:06:53.841,32.509119,35.020097,80.0 418 | 2015-08-20 04:06:54.756,32.509125,35.020119,79.30000305175781 419 | 2015-08-20 04:06:58.908,32.509153,35.020204,81.5999984741211 420 | 2015-08-20 04:06:59.766,32.509157,35.020226,81.80000305175781 421 | 2015-08-20 04:07:04.844,32.509181,35.020326,83.19999694824219 422 | 2015-08-20 04:07:05.792,32.509186,35.020345,82.0999984741211 423 | 2015-08-20 04:07:09.806,32.509207,35.020426,82.5999984741211 424 | 2015-08-20 04:07:10.753,32.509211,35.020448,81.9000015258789 425 | 2015-08-20 04:07:14.850,32.509228,35.020537,82.30000305175781 426 | 2015-08-20 04:07:15.779,32.509234,35.020559,82.5 427 | 2015-08-20 04:07:19.852,32.50925,35.02065,87.4000015258789 428 | 2015-08-20 04:07:20.770,32.509254,35.020673,86.9000015258789 429 | 2015-08-20 04:07:24.887,32.509278,35.020759,88.0999984741211 430 | 2015-08-20 04:07:25.772,32.509284,35.020781,88.69999694824219 431 | 2015-08-20 04:07:29.868,32.509304,35.020867,89.5999984741211 432 | 2015-08-20 04:07:30.822,32.509309,35.020888,88.4000015258789 433 | 2015-08-20 04:07:34.900,32.509322,35.020976,89.0999984741211 434 | 2015-08-20 04:07:35.760,32.509325,35.020997,87.9000015258789 435 | 2015-08-20 04:07:41.002,32.509351,35.021097,86.4000015258789 436 | 2015-08-20 04:07:41.805,32.509356,35.021117,86.5999984741211 437 | 2015-08-20 04:07:47.040,32.509381,35.021218,87.69999694824219 438 | 2015-08-20 04:07:47.830,32.509384,35.021238,87.69999694824219 439 | 2015-08-20 04:07:51.835,32.509403,35.021322,88.19999694824219 440 | 2015-08-20 04:07:52.792,32.509405,35.021342,88.30000305175781 441 | 2015-08-20 04:07:57.866,32.509433,35.021441,88.80000305175781 442 | 2015-08-20 04:07:58.770,32.509438,35.021462,88.5 443 | 2015-08-20 04:08:02.860,32.509445,35.021548,88.0 444 | 2015-08-20 04:08:03.761,32.509445,35.021571,88.0 445 | 2015-08-20 04:08:07.842,32.509489,35.021641,88.0 446 | 2015-08-20 04:08:08.772,32.509511,35.021648,88.5999984741211 447 | 2015-08-20 04:08:12.796,32.509599,35.02164,88.5999984741211 448 | 2015-08-20 04:08:13.757,32.509619,35.021636,88.30000305175781 449 | 2015-08-20 04:08:17.819,32.509691,35.021609,88.80000305175781 450 | 2015-08-20 04:08:18.850,32.509711,35.021606,89.5999984741211 451 | 2015-08-20 04:08:22.966,32.509787,35.021593,91.0999984741211 452 | 2015-08-20 04:08:23.757,32.509805,35.021589,91.3000030517578 453 | 2015-08-20 04:08:28.794,32.509887,35.021561,91.8000030517578 454 | 2015-08-20 04:08:29.759,32.509901,35.021551,92.1999969482422 455 | 2015-08-20 04:08:35.900,32.509982,35.021518,91.0 456 | 2015-08-20 04:08:36.758,32.509996,35.021516,91.0999984741211 457 | 2015-08-20 04:08:41.814,32.510072,35.021502,91.5 458 | 2015-08-20 04:08:42.760,32.510086,35.021494,92.0 459 | 2015-08-20 04:08:47.832,32.510153,35.021456,94.5 460 | 2015-08-20 04:08:48.774,32.510169,35.021447,94.0 461 | 2015-08-20 04:08:53.897,32.51024,35.021412,95.5999984741211 462 | 2015-08-20 04:08:54.788,32.510255,35.021404,95.8000030517578 463 | 2015-08-20 04:08:59.841,32.510334,35.021376,97.9000015258789 464 | 2015-08-20 04:09:00.764,32.51035,35.021375,98.5 465 | 2015-08-20 04:09:05.833,32.510434,35.021379,100.3000030517578 466 | 2015-08-20 04:09:06.775,32.510449,35.021382,100.3000030517578 467 | 2015-08-20 04:09:11.860,32.51053,35.021413,101.0 468 | 2015-08-20 04:09:12.835,32.510546,35.021419,101.0999984741211 469 | 2015-08-20 04:09:17.860,32.510605,35.021491,99.5999984741211 470 | 2015-08-20 04:09:18.765,32.510614,35.021508,99.1999969482422 471 | 2015-08-20 04:09:23.855,32.510657,35.021598,98.9000015258789 472 | 2015-08-20 04:09:24.776,32.510665,35.021618,98.6999969482422 473 | 2015-08-20 04:09:28.839,32.510702,35.021694,99.1999969482422 474 | 2015-08-20 04:09:29.768,32.510714,35.021709,99.1999969482422 475 | 2015-08-20 04:09:34.851,32.510775,35.021785,99.4000015258789 476 | 2015-08-20 04:09:35.768,32.510788,35.021799,98.9000015258789 477 | 2015-08-20 04:09:39.837,32.510838,35.021858,99.0999984741211 478 | 2015-08-20 04:09:40.769,32.510849,35.021877,98.8000030517578 479 | 2015-08-20 04:09:44.872,32.51089,35.02196,97.4000015258789 480 | 2015-08-20 04:09:45.774,32.510899,35.02198,98.1999969482422 481 | 2015-08-20 04:09:49.854,32.510933,35.022068,98.5 482 | 2015-08-20 04:09:50.768,32.51094,35.022091,97.6999969482422 483 | 2015-08-20 04:09:54.847,32.510969,35.022182,97.6999969482422 484 | 2015-08-20 04:09:55.768,32.510979,35.022202,97.5999984741211 485 | 2015-08-20 04:09:59.850,32.511022,35.022282,97.5 486 | 2015-08-20 04:10:00.776,32.511032,35.0223,97.5999984741211 487 | 2015-08-20 04:10:05.856,32.511085,35.022376,98.9000015258789 488 | 2015-08-20 04:10:06.766,32.511094,35.022391,98.6999969482422 489 | 2015-08-20 04:10:12.468,32.511146,35.022471,99.8000030517578 490 | 2015-08-20 04:10:12.830,32.511155,35.022488,99.9000015258789 491 | 2015-08-20 04:10:17.817,32.511197,35.022577,99.6999969482422 492 | 2015-08-20 04:10:18.783,32.511205,35.022595,99.5999984741211 493 | 2015-08-20 04:10:23.827,32.511237,35.022677,100.6999969482422 494 | 2015-08-20 04:10:24.781,32.511247,35.02269,100.4000015258789 495 | 2015-08-20 04:10:29.980,32.511298,35.022761,101.8000030517578 496 | 2015-08-20 04:10:30.838,32.511309,35.022774,102.3000030517578 497 | 2015-08-20 04:10:35.889,32.51139,35.022733,103.3000030517578 498 | 2015-08-20 04:10:36.783,32.511398,35.022713,103.3000030517578 499 | 2015-08-20 04:10:40.836,32.511421,35.022627,99.9000015258789 500 | 2015-08-20 04:10:41.777,32.511418,35.0226,100.0999984741211 501 | 2015-08-20 04:10:45.853,32.511412,35.022497,99.5999984741211 502 | 2015-08-20 04:10:46.785,32.511417,35.022477,99.6999969482422 503 | 2015-08-20 04:10:51.857,32.511476,35.022398,103.5 504 | 2015-08-20 04:10:52.769,32.511487,35.022382,103.3000030517578 505 | 2015-08-20 04:10:57.843,32.511493,35.022287,100.6999969482422 506 | 2015-08-20 04:10:58.777,32.511486,35.022269,100.4000015258789 507 | 2015-08-20 04:11:02.933,32.511446,35.022192,100.6999969482422 508 | 2015-08-20 04:11:03.781,32.511434,35.022173,101.5 509 | 2015-08-20 04:11:07.870,32.511387,35.022099,103.8000030517578 510 | 2015-08-20 04:11:08.771,32.511378,35.022078,104.3000030517578 511 | 2015-08-20 04:11:12.832,32.511372,35.02199,105.5 512 | 2015-08-20 04:11:13.785,32.511375,35.021969,104.4000015258789 513 | 2015-08-20 04:11:18.859,32.511364,35.021865,104.4000015258789 514 | 2015-08-20 04:11:19.774,32.511358,35.021844,104.3000030517578 515 | 2015-08-20 04:11:23.916,32.511348,35.021755,104.3000030517578 516 | 2015-08-20 04:11:24.856,32.511341,35.021733,104.5999984741211 517 | 2015-08-20 04:11:28.859,32.511297,35.021653,103.5999984741211 518 | 2015-08-20 04:11:29.785,32.511285,35.021634,103.5999984741211 519 | 2015-08-20 04:11:33.916,32.511249,35.021544,102.6999969482422 520 | 2015-08-20 04:11:34.777,32.511242,35.021523,102.0 521 | 2015-08-20 04:11:38.845,32.511193,35.021447,101.6999969482422 522 | 2015-08-20 04:11:39.776,32.511181,35.02143,101.9000015258789 523 | 2015-08-20 04:11:43.854,32.511127,35.021367,101.4000015258789 524 | 2015-08-20 04:11:44.781,32.511111,35.021355,100.6999969482422 525 | 2015-08-20 04:11:48.862,32.511036,35.021326,99.6999969482422 526 | 2015-08-20 04:11:49.796,32.511016,35.021322,100.0999984741211 527 | 2015-08-20 04:11:53.868,32.510939,35.021304,99.4000015258789 528 | 2015-08-20 04:11:54.783,32.51092,35.021295,99.3000030517578 529 | 2015-08-20 04:11:58.880,32.510854,35.021241,99.5 530 | 2015-08-20 04:11:59.783,32.51084,35.021223,98.6999969482422 531 | 2015-08-20 04:12:03.871,32.510782,35.021152,97.3000030517578 532 | 2015-08-20 04:12:04.793,32.510766,35.021134,97.5999984741211 533 | 2015-08-20 04:12:08.851,32.510714,35.021052,96.5999984741211 534 | 2015-08-20 04:12:09.802,32.510703,35.02103,96.9000015258789 535 | 2015-08-20 04:12:13.871,32.510683,35.020927,96.0999984741211 536 | 2015-08-20 04:12:14.784,32.510684,35.020899,96.0999984741211 537 | 2015-08-20 04:12:17.844,32.510691,35.020811,96.5999984741211 538 | 2015-08-20 04:12:18.868,32.510695,35.02078,97.0 539 | 2015-08-20 04:12:21.929,32.51071,35.020689,96.6999969482422 540 | 2015-08-20 04:12:22.857,32.510717,35.02066,96.5999984741211 541 | 2015-08-20 04:12:25.926,32.51074,35.020582,96.0999984741211 542 | 2015-08-20 04:12:26.841,32.510747,35.020556,95.5999984741211 543 | 2015-08-20 04:12:30.906,32.510777,35.020461,94.3000030517578 544 | 2015-08-20 04:12:32.078,32.510786,35.020438,94.1999969482422 545 | 2015-08-20 04:12:35.899,32.510816,35.02034,92.4000015258789 546 | 2015-08-20 04:12:37.006,32.51082,35.020313,92.5999984741211 547 | 2015-08-20 04:12:39.957,32.510831,35.020222,93.9000015258789 548 | 2015-08-20 04:12:40.800,32.510836,35.020193,93.3000030517578 549 | 2015-08-20 04:12:43.876,32.510856,35.020111,93.5 550 | 2015-08-20 04:12:44.798,32.510863,35.020084,93.5 551 | 2015-08-20 04:12:47.876,32.510892,35.02001,92.9000015258789 552 | 2015-08-20 04:12:48.814,32.510902,35.019987,92.6999969482422 553 | 2015-08-20 04:12:52.978,32.510944,35.019899,92.3000030517578 554 | 2015-08-20 04:12:53.847,32.510955,35.019877,92.0 555 | 2015-08-20 04:12:57.829,32.510988,35.019784,92.1999969482422 556 | 2015-08-20 04:12:58.800,32.510993,35.019759,91.9000015258789 557 | 2015-08-20 04:13:01.913,32.511,35.019676,90.5999984741211 558 | 2015-08-20 04:13:03.025,32.511004,35.019648,90.5999984741211 559 | 2015-08-20 04:13:05.853,32.511023,35.019567,90.0 560 | 2015-08-20 04:13:06.809,32.511031,35.019541,89.5999984741211 561 | 2015-08-20 04:13:09.907,32.511058,35.01947,88.69999694824219 562 | 2015-08-20 04:13:11.796,32.511085,35.019434,88.5 563 | 2015-08-20 04:13:15.810,32.511152,35.019368,89.5999984741211 564 | 2015-08-20 04:13:16.782,32.51117,35.019353,89.0999984741211 565 | 2015-08-20 04:13:19.841,32.511213,35.019291,90.3000030517578 566 | 2015-08-20 04:13:20.799,32.511225,35.019267,91.4000015258789 567 | 2015-08-20 04:13:24.818,32.511276,35.019184,91.8000030517578 568 | 2015-08-20 04:13:25.969,32.511286,35.019163,92.0999984741211 569 | 2015-08-20 04:13:29.993,32.511319,35.01907,92.1999969482422 570 | 2015-08-20 04:13:30.782,32.51133,35.019048,92.6999969482422 571 | 2015-08-20 04:13:34.847,32.511367,35.018962,92.1999969482422 572 | 2015-08-20 04:13:35.784,32.511371,35.01894,91.9000015258789 573 | 2015-08-20 04:13:40.817,32.511413,35.01886,92.0999984741211 574 | 2015-08-20 04:13:41.783,32.511419,35.018845,92.0 575 | 2015-08-20 04:13:47.873,32.511452,35.018747,90.4000015258789 576 | 2015-08-20 04:13:48.828,32.511457,35.018728,91.0 577 | 2015-08-20 04:13:52.897,32.511486,35.018646,92.4000015258789 578 | 2015-08-20 04:13:53.799,32.511495,35.018627,91.9000015258789 579 | 2015-08-20 04:13:57.883,32.511541,35.018559,92.5 580 | 2015-08-20 04:13:58.794,32.511551,35.018542,91.8000030517578 581 | 2015-08-20 04:14:03.880,32.511598,35.01846,92.8000030517578 582 | 2015-08-20 04:14:04.928,32.511604,35.018444,92.5999984741211 583 | 2015-08-20 04:14:10.074,32.511663,35.018369,92.8000030517578 584 | 2015-08-20 04:14:10.882,32.511675,35.018355,92.4000015258789 585 | 2015-08-20 04:14:16.882,32.511724,35.018267,90.4000015258789 586 | 2015-08-20 04:14:17.787,32.511738,35.018253,90.5 587 | 2015-08-20 04:14:21.900,32.511797,35.018196,89.0999984741211 588 | 2015-08-20 04:14:22.795,32.511806,35.018176,88.80000305175781 589 | 2015-08-20 04:14:27.035,32.511863,35.018103,93.5 590 | 2015-08-20 04:14:27.814,32.511876,35.018086,93.3000030517578 591 | 2015-08-20 04:14:32.930,32.51191,35.01799,91.3000030517578 592 | 2015-08-20 04:14:33.823,32.511919,35.017974,91.0 593 | 2015-08-20 04:14:39.152,32.511969,35.0179,93.0 594 | 2015-08-20 04:14:39.822,32.511981,35.017886,92.3000030517578 595 | 2015-08-20 04:14:45.935,32.512028,35.017796,94.1999969482422 596 | 2015-08-20 04:14:46.797,32.512037,35.017785,94.1999969482422 597 | 2015-08-20 04:14:52.855,32.5121,35.017713,93.9000015258789 598 | 2015-08-20 04:14:53.800,32.512113,35.017704,94.6999969482422 599 | 2015-08-20 04:14:58.953,32.512166,35.017636,96.3000030517578 600 | 2015-08-20 04:14:59.818,32.512176,35.017623,96.0999984741211 601 | 2015-08-20 04:15:05.903,32.512235,35.017543,96.8000030517578 602 | 2015-08-20 04:15:06.857,32.512245,35.01753,97.0 603 | 2015-08-20 04:15:12.020,32.512297,35.017461,94.1999969482422 604 | 2015-08-20 04:15:12.817,32.512305,35.017448,93.6999969482422 605 | 2015-08-20 04:15:19.098,32.512358,35.017372,95.1999969482422 606 | 2015-08-20 04:15:19.947,32.512367,35.017358,94.9000015258789 607 | 2015-08-20 04:15:24.889,32.512411,35.017285,94.3000030517578 608 | 2015-08-20 04:15:25.969,32.512421,35.01727,95.0 609 | 2015-08-20 04:15:31.057,32.51248,35.017192,96.4000015258789 610 | 2015-08-20 04:15:31.836,32.512492,35.017175,96.1999969482422 611 | 2015-08-20 04:15:36.910,32.512551,35.017096,98.1999969482422 612 | 2015-08-20 04:15:37.812,32.512563,35.017081,99.0 613 | 2015-08-20 04:15:42.857,32.512622,35.017014,97.1999969482422 614 | 2015-08-20 04:15:43.904,32.512629,35.016998,96.9000015258789 615 | 2015-08-20 04:15:48.929,32.512679,35.016924,98.0 616 | 2015-08-20 04:15:49.830,32.512686,35.016908,97.8000030517578 617 | 2015-08-20 04:15:54.946,32.512727,35.016819,98.6999969482422 618 | 2015-08-20 04:15:55.863,32.512735,35.0168,97.9000015258789 619 | 2015-08-20 04:15:59.939,32.512763,35.016714,97.0 620 | 2015-08-20 04:16:00.878,32.512769,35.016691,98.0 621 | 2015-08-20 04:16:05.942,32.512842,35.016637,99.8000030517578 622 | 2015-08-20 04:16:06.875,32.512859,35.016648,100.3000030517578 623 | 2015-08-20 04:16:10.956,32.512922,35.016715,100.0 624 | 2015-08-20 04:16:11.879,32.512936,35.016735,100.5 625 | 2015-08-20 04:16:15.900,32.512992,35.016803,101.5 626 | 2015-08-20 04:16:16.890,32.513005,35.016819,100.6999969482422 627 | 2015-08-20 04:16:20.894,32.51307,35.016871,102.4000015258789 628 | 2015-08-20 04:16:21.815,32.513084,35.016884,102.5 629 | 2015-08-20 04:16:27.117,32.513151,35.016949,105.4000015258789 630 | 2015-08-20 04:16:27.981,32.513166,35.016961,105.3000030517578 631 | 2015-08-20 04:16:31.960,32.513221,35.01702,106.5999984741211 632 | 2015-08-20 04:16:32.888,32.513232,35.017037,107.3000030517578 633 | 2015-08-20 04:16:36.966,32.513276,35.017107,106.1999969482422 634 | 2015-08-20 04:16:37.866,32.513287,35.017123,107.4000015258789 635 | 2015-08-20 04:16:43.057,32.51333,35.017208,108.8000030517578 636 | 2015-08-20 04:16:43.873,32.51334,35.017226,110.3000030517578 637 | 2015-08-20 04:16:47.848,32.513398,35.017278,109.5 638 | 2015-08-20 04:16:48.815,32.513411,35.017291,109.9000015258789 639 | 2015-08-20 04:16:52.875,32.513464,35.017348,111.1999969482422 640 | 2015-08-20 04:16:53.817,32.513477,35.017364,112.5 641 | 2015-08-20 04:16:57.999,32.513534,35.017427,113.4000015258789 642 | 2015-08-20 04:16:58.839,32.513548,35.017441,113.6999969482422 643 | 2015-08-20 04:17:03.026,32.513618,35.017485,113.0 644 | 2015-08-20 04:17:03.872,32.513639,35.01749,112.8000030517578 645 | 2015-08-20 04:17:07.843,32.513718,35.017455,113.5999984741211 646 | 2015-08-20 04:17:08.815,32.513731,35.017436,113.6999969482422 647 | 2015-08-20 04:17:11.930,32.51377,35.017373,114.0999984741211 648 | 2015-08-20 04:17:12.887,32.513784,35.017349,114.0 649 | 2015-08-20 04:17:15.874,32.513828,35.017284,114.5 650 | 2015-08-20 04:17:16.827,32.513843,35.017263,114.5999984741211 651 | 2015-08-20 04:17:19.920,32.513887,35.017201,114.4000015258789 652 | 2015-08-20 04:17:20.855,32.513897,35.017175,113.9000015258789 653 | 2015-08-20 04:17:24.052,32.51393,35.017102,113.5 654 | 2015-08-20 04:17:25.054,32.513935,35.017077,113.5999984741211 655 | 2015-08-20 04:17:27.916,32.51393,35.016994,113.9000015258789 656 | 2015-08-20 04:17:28.819,32.513929,35.016965,114.9000015258789 657 | 2015-08-20 04:17:31.911,32.513936,35.016881,114.9000015258789 658 | 2015-08-20 04:17:32.827,32.513941,35.016855,114.3000030517578 659 | 2015-08-20 04:17:36.970,32.513958,35.016764,113.5999984741211 660 | 2015-08-20 04:17:37.876,32.513959,35.016742,113.5999984741211 661 | 2015-08-20 04:17:41.925,32.513989,35.01666,113.5999984741211 662 | 2015-08-20 04:17:42.821,32.513999,35.016639,113.6999969482422 663 | 2015-08-20 04:17:46.931,32.514054,35.016579,111.9000015258789 664 | 2015-08-20 04:17:47.947,32.514065,35.016562,112.8000030517578 665 | 2015-08-20 04:17:51.892,32.514112,35.016492,113.6999969482422 666 | 2015-08-20 04:17:52.841,32.514126,35.016471,113.8000030517578 667 | 2015-08-20 04:17:56.908,32.51417,35.016384,114.1999969482422 668 | 2015-08-20 04:17:57.824,32.514178,35.016362,114.3000030517578 669 | 2015-08-20 04:18:01.921,32.51421,35.016274,114.3000030517578 670 | 2015-08-20 04:18:02.823,32.514221,35.016254,114.1999969482422 671 | 2015-08-20 04:18:06.896,32.514278,35.016184,114.8000030517578 672 | 2015-08-20 04:18:07.813,32.514296,35.016171,115.5999984741211 673 | 2015-08-20 04:18:10.895,32.514355,35.016146,115.5999984741211 674 | 2015-08-20 04:18:13.814,32.514421,35.016143,116.3000030517578 675 | 2015-08-20 04:18:17.869,32.514502,35.016162,117.5999984741211 676 | 2015-08-20 04:18:18.813,32.514522,35.016165,117.5 677 | 2015-08-20 04:18:22.862,32.514598,35.016182,117.4000015258789 678 | 2015-08-20 04:18:23.814,32.514616,35.016187,117.0999984741211 679 | 2015-08-20 04:18:27.863,32.514686,35.016171,116.6999969482422 680 | 2015-08-20 04:18:28.816,32.514703,35.016158,116.5999984741211 681 | 2015-08-20 04:18:32.870,32.514754,35.016085,116.5999984741211 682 | 2015-08-20 04:18:33.815,32.514765,35.01607,115.8000030517578 683 | 2015-08-20 04:18:37.847,32.514825,35.016018,117.3000030517578 684 | 2015-08-20 04:18:38.816,32.514843,35.016007,117.6999969482422 685 | 2015-08-20 04:18:42.882,32.514921,35.015984,117.5999984741211 686 | 2015-08-20 04:18:43.815,32.514942,35.015984,118.3000030517578 687 | 2015-08-20 04:18:47.897,32.51503,35.01597,118.3000030517578 688 | 2015-08-20 04:18:48.836,32.515053,35.01597,118.0999984741211 689 | 2015-08-20 04:18:50.877,32.515114,35.015958,116.4000015258789 690 | 2015-08-20 04:18:51.819,32.515146,35.015951,117.0999984741211 691 | 2015-08-20 04:18:54.007,32.515209,35.015942,117.0999984741211 692 | 2015-08-20 04:18:54.893,32.51524,35.015937,117.5 693 | 2015-08-20 04:18:57.939,32.515328,35.015943,118.5999984741211 694 | 2015-08-20 04:18:58.845,32.515358,35.015946,118.5 695 | 2015-08-20 04:19:01.992,32.515443,35.015964,118.3000030517578 696 | 2015-08-20 04:19:02.889,32.515462,35.015973,118.3000030517578 697 | 2015-08-20 04:19:06.990,32.515544,35.01601,118.6999969482422 698 | 2015-08-20 04:19:07.888,32.51556,35.016017,118.5999984741211 699 | 2015-08-20 04:19:11.886,32.515638,35.016042,118.5999984741211 700 | 2015-08-20 04:19:12.819,32.51566,35.016051,118.0 701 | 2015-08-20 04:19:16.911,32.515738,35.016069,117.9000015258789 702 | 2015-08-20 04:19:17.842,32.515757,35.016076,117.1999969482422 703 | 2015-08-20 04:19:21.908,32.515844,35.016087,116.4000015258789 704 | 2015-08-20 04:19:22.820,32.51587,35.016071,116.1999969482422 705 | 2015-08-20 04:19:25.934,32.515933,35.016016,116.0 706 | 2015-08-20 04:19:26.831,32.515953,35.015993,116.8000030517578 707 | 2015-08-20 04:19:29.879,32.516001,35.015918,116.5 708 | 2015-08-20 04:19:30.833,32.51602,35.015894,117.0 709 | 2015-08-20 04:19:34.152,32.516074,35.015828,116.5 710 | 2015-08-20 04:19:34.904,32.516091,35.015804,116.5 711 | 2015-08-20 04:19:37.851,32.516142,35.01573,116.5999984741211 712 | 2015-08-20 04:19:38.820,32.516157,35.015705,116.5 713 | 2015-08-20 04:19:41.881,32.516211,35.01564,115.4000015258789 714 | 2015-08-20 04:19:42.825,32.516225,35.015617,114.0999984741211 715 | 2015-08-20 04:19:45.963,32.516278,35.015551,113.5 716 | 2015-08-20 04:19:46.890,32.516301,35.015533,112.5 717 | 2015-08-20 04:19:49.987,32.516361,35.015468,112.0 718 | 2015-08-20 04:19:50.878,32.51638,35.015444,112.6999969482422 719 | 2015-08-20 04:19:53.937,32.516442,35.015369,112.5 720 | 2015-08-20 04:19:54.896,32.516462,35.015343,112.5999984741211 721 | 2015-08-20 04:19:58.048,32.516517,35.015264,112.3000030517578 722 | 2015-08-20 04:19:58.898,32.516537,35.015238,112.0999984741211 723 | 2015-08-20 04:20:01.965,32.516592,35.015157,110.0999984741211 724 | 2015-08-20 04:20:02.886,32.51661,35.015129,109.8000030517578 725 | 2015-08-20 04:20:05.959,32.516665,35.015048,107.6999969482422 726 | 2015-08-20 04:20:06.823,32.516683,35.015023,107.5 727 | 2015-08-20 04:20:09.926,32.516736,35.014943,107.5999984741211 728 | 2015-08-20 04:20:10.824,32.516754,35.014916,107.0999984741211 729 | 2015-08-20 04:20:14.040,32.5168,35.014835,106.0999984741211 730 | 2015-08-20 04:20:14.888,32.516818,35.01481,105.1999969482422 731 | 2015-08-20 04:20:17.897,32.516873,35.014737,106.4000015258789 732 | 2015-08-20 04:20:18.844,32.516889,35.014709,106.4000015258789 733 | 2015-08-20 04:20:21.996,32.516933,35.014617,103.5 734 | 2015-08-20 04:20:22.897,32.516945,35.014584,103.0999984741211 735 | 2015-08-20 04:20:24.905,32.516971,35.014518,103.8000030517578 736 | 2015-08-20 04:20:25.835,32.516984,35.014484,104.1999969482422 737 | 2015-08-20 04:20:28.982,32.51702,35.014387,104.8000030517578 738 | 2015-08-20 04:20:29.923,32.517035,35.014355,105.1999969482422 739 | 2015-08-20 04:20:32.863,32.517087,35.014279,102.9000015258789 740 | 2015-08-20 04:20:33.994,32.517098,35.014264,102.4000015258789 741 | 2015-08-20 04:20:42.329,32.517142,35.014212,103.4000015258789 742 | -------------------------------------------------------------------------------- /Ch03/03_03/parse_time.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | csv_file = 'track.csv' 5 | df = pd.read_csv(csv_file) 6 | df.dtypes 7 | # %% 8 | df = pd.read_csv(csv_file, parse_dates=['time']) 9 | df.dtypes 10 | 11 | # %% 12 | -------------------------------------------------------------------------------- /Ch03/03_03/track.csv: -------------------------------------------------------------------------------- 1 | time,lat,lng,height 2 | 2015-08-20 03:48:07.235,32.519585,35.015021,136.1999969482422 3 | 2015-08-20 03:48:24.734,32.519606,35.014954,126.5999984741211 4 | 2015-08-20 03:48:25.660,32.519612,35.014871,123.0 5 | 2015-08-20 03:48:26.819,32.519654,35.014824,120.5 6 | 2015-08-20 03:48:27.828,32.519689,35.014776,118.9000015258789 7 | 2015-08-20 03:48:29.720,32.519691,35.014704,119.9000015258789 8 | 2015-08-20 03:48:30.669,32.519734,35.014657,120.9000015258789 9 | 2015-08-20 03:48:33.793,32.519719,35.014563,121.6999969482422 10 | 2015-08-20 03:48:34.869,32.519694,35.014549,121.1999969482422 11 | 2015-08-20 03:48:37.708,32.519625,35.014515,121.6999969482422 12 | 2015-08-20 03:48:38.839,32.519599,35.014505,121.8000030517578 13 | 2015-08-20 03:48:41.980,32.519514,35.014481,122.5999984741211 14 | 2015-08-20 03:48:42.725,32.519486,35.014472,123.0 15 | 2015-08-20 03:48:45.896,32.519405,35.014439,122.6999969482422 16 | 2015-08-20 03:48:46.662,32.519379,35.014432,122.6999969482422 17 | 2015-08-20 03:48:49.829,32.519309,35.014414,122.6999969482422 18 | 2015-08-20 03:48:50.665,32.519287,35.0144,123.3000030517578 19 | 2015-08-20 03:48:53.692,32.519211,35.014372,122.3000030517578 20 | 2015-08-20 03:48:54.662,32.519187,35.014365,122.5999984741211 21 | 2015-08-20 03:48:58.869,32.519106,35.014337,122.0 22 | 2015-08-20 03:48:59.663,32.519084,35.014331,121.8000030517578 23 | 2015-08-20 03:49:03.861,32.519009,35.014303,122.9000015258789 24 | 2015-08-20 03:49:04.663,32.518989,35.014306,122.9000015258789 25 | 2015-08-20 03:49:07.742,32.518916,35.01434,123.0999984741211 26 | 2015-08-20 03:50:13.679,32.517636,35.013531,115.1999969482422 27 | 2015-08-20 03:50:16.767,32.517589,35.013606,114.3000030517578 28 | 2015-08-20 03:50:17.719,32.517574,35.01363,114.1999969482422 29 | 2015-08-20 03:50:20.748,32.517529,35.013705,113.8000030517578 30 | 2015-08-20 03:50:21.681,32.517512,35.01373,114.1999969482422 31 | 2015-08-20 03:50:24.735,32.517459,35.013809,114.0 32 | 2015-08-20 03:50:25.677,32.517442,35.013834,113.0999984741211 33 | 2015-08-20 03:50:28.738,32.517389,35.013903,112.5999984741211 34 | 2015-08-20 03:50:29.673,32.517373,35.013925,113.5 35 | 2015-08-20 03:50:32.816,32.517323,35.013991,113.5999984741211 36 | 2015-08-20 03:50:33.682,32.517306,35.014012,113.4000015258789 37 | 2015-08-20 03:50:36.749,32.517254,35.014075,114.5999984741211 38 | 2015-08-20 03:50:37.744,32.517236,35.014095,114.1999969482422 39 | 2015-08-20 03:50:40.735,32.517183,35.014148,115.5 40 | 2015-08-20 03:50:41.682,32.517164,35.014167,116.0 41 | 2015-08-20 03:50:44.757,32.517111,35.014235,116.5999984741211 42 | 2015-08-20 03:50:45.674,32.517095,35.014257,116.5999984741211 43 | 2015-08-20 03:50:48.716,32.517044,35.014332,115.3000030517578 44 | 2015-08-20 03:50:49.684,32.517026,35.014357,115.0 45 | 2015-08-20 03:50:52.757,32.516972,35.014431,114.9000015258789 46 | 2015-08-20 03:50:53.688,32.516954,35.014456,114.9000015258789 47 | 2015-08-20 03:50:56.782,32.516891,35.014519,115.6999969482422 48 | 2015-08-20 03:50:57.731,32.516868,35.014522,114.0 49 | 2015-08-20 03:51:00.870,32.516818,35.01447,113.5999984741211 50 | 2015-08-20 03:51:01.772,32.516803,35.014442,113.0 51 | 2015-08-20 03:51:04.744,32.516752,35.01436,112.0 52 | 2015-08-20 03:51:05.747,32.516734,35.014335,112.3000030517578 53 | 2015-08-20 03:51:08.831,32.516677,35.014257,110.9000015258789 54 | 2015-08-20 03:51:09.744,32.516657,35.014233,110.8000030517578 55 | 2015-08-20 03:51:12.743,32.516591,35.014176,108.6999969482422 56 | 2015-08-20 03:51:13.702,32.516568,35.014162,108.4000015258789 57 | 2015-08-20 03:51:16.777,32.516506,35.014103,109.1999969482422 58 | 2015-08-20 03:51:17.729,32.516486,35.014084,108.4000015258789 59 | 2015-08-20 03:51:20.733,32.516421,35.014026,108.5 60 | 2015-08-20 03:51:21.670,32.5164,35.014006,108.5999984741211 61 | 2015-08-20 03:51:24.691,32.516338,35.013941,107.5999984741211 62 | 2015-08-20 03:51:25.672,32.516318,35.01392,107.9000015258789 63 | 2015-08-20 03:51:28.745,32.516253,35.013869,108.0 64 | 2015-08-20 03:51:29.677,32.51623,35.013852,108.0 65 | 2015-08-20 03:51:32.707,32.516174,35.013795,105.5999984741211 66 | 2015-08-20 03:51:33.674,32.516156,35.013775,104.8000030517578 67 | 2015-08-20 03:51:36.758,32.516108,35.01371,105.3000030517578 68 | 2015-08-20 03:51:37.675,32.516089,35.01369,103.9000015258789 69 | 2015-08-20 03:51:40.733,32.516033,35.013633,103.6999969482422 70 | 2015-08-20 03:51:41.674,32.516014,35.013615,103.5 71 | 2015-08-20 03:51:44.744,32.51596,35.013559,102.8000030517578 72 | 2015-08-20 03:51:45.679,32.515943,35.01354,103.0 73 | 2015-08-20 03:51:48.760,32.515891,35.013482,102.0 74 | 2015-08-20 03:51:49.684,32.515873,35.013463,102.0 75 | 2015-08-20 03:51:52.709,32.515826,35.013403,102.0 76 | 2015-08-20 03:51:53.672,32.515812,35.013382,102.0 77 | 2015-08-20 03:51:56.894,32.515761,35.013325,101.8000030517578 78 | 2015-08-20 03:51:57.767,32.515743,35.013307,101.3000030517578 79 | 2015-08-20 03:52:00.768,32.515693,35.013246,100.5 80 | 2015-08-20 03:52:01.676,32.515675,35.013226,100.8000030517578 81 | 2015-08-20 03:52:04.866,32.515622,35.013162,101.0999984741211 82 | 2015-08-20 03:52:05.780,32.515605,35.013139,100.6999969482422 83 | 2015-08-20 03:52:08.753,32.51555,35.013074,99.1999969482422 84 | 2015-08-20 03:52:09.700,32.515531,35.013055,99.1999969482422 85 | 2015-08-20 03:52:12.855,32.515471,35.012994,99.3000030517578 86 | 2015-08-20 03:52:13.780,32.515451,35.012974,99.0 87 | 2015-08-20 03:52:16.775,32.515388,35.012912,99.6999969482422 88 | 2015-08-20 03:52:17.704,32.515368,35.012891,99.6999969482422 89 | 2015-08-20 03:52:20.907,32.515311,35.012826,99.0999984741211 90 | 2015-08-20 03:52:21.779,32.515291,35.012806,98.8000030517578 91 | 2015-08-20 03:52:24.813,32.515226,35.01276,98.5 92 | 2015-08-20 03:52:25.698,32.515203,35.012747,97.9000015258789 93 | 2015-08-20 03:52:28.748,32.515136,35.012709,97.4000015258789 94 | 2015-08-20 03:52:29.672,32.515113,35.012694,97.0 95 | 2015-08-20 03:52:32.719,32.515052,35.012636,96.3000030517578 96 | 2015-08-20 03:52:33.698,32.515034,35.012617,96.3000030517578 97 | 2015-08-20 03:52:37.790,32.514986,35.012537,96.0999984741211 98 | 2015-08-20 03:52:38.678,32.514964,35.012521,96.5999984741211 99 | 2015-08-20 03:52:41.752,32.514901,35.01246,95.1999969482422 100 | 2015-08-20 03:52:42.684,32.514882,35.012438,94.6999969482422 101 | 2015-08-20 03:52:45.758,32.514836,35.012371,94.3000030517578 102 | 2015-08-20 03:52:46.679,32.514813,35.012367,94.9000015258789 103 | 2015-08-20 03:52:49.764,32.514761,35.012418,95.0 104 | 2015-08-20 03:52:50.678,32.514746,35.012445,95.4000015258789 105 | 2015-08-20 03:52:54.323,32.514689,35.012516,96.4000015258789 106 | 2015-08-20 03:52:54.673,32.514671,35.01254,96.5 107 | 2015-08-20 03:52:57.937,32.514631,35.012615,98.0 108 | 2015-08-20 03:52:58.682,32.514619,35.012636,97.6999969482422 109 | 2015-08-20 03:53:02.766,32.514562,35.012717,99.0999984741211 110 | 2015-08-20 03:53:03.678,32.514545,35.012741,99.1999969482422 111 | 2015-08-20 03:53:05.884,32.514507,35.012782,99.4000015258789 112 | 2015-08-20 03:53:33.775,32.514134,35.013324,105.1999969482422 113 | 2015-08-20 03:53:36.808,32.514092,35.013393,105.8000030517578 114 | 2015-08-20 03:53:37.677,32.514077,35.013417,106.1999969482422 115 | 2015-08-20 03:53:40.734,32.514028,35.013493,106.3000030517578 116 | 2015-08-20 03:53:41.686,32.514011,35.013514,107.1999969482422 117 | 2015-08-20 03:53:44.713,32.513947,35.013472,106.6999969482422 118 | 2015-08-20 03:53:45.682,32.513928,35.013445,107.3000030517578 119 | 2015-08-20 03:53:49.290,32.513882,35.013363,103.9000015258789 120 | 2015-08-20 03:53:49.679,32.513869,35.013336,102.5999984741211 121 | 2015-08-20 03:53:52.831,32.513823,35.01327,105.4000015258789 122 | 2015-08-20 03:53:53.737,32.513807,35.013251,105.0999984741211 123 | 2015-08-20 03:53:56.820,32.513777,35.013178,105.1999969482422 124 | 2015-08-20 03:53:57.772,32.513769,35.013153,104.6999969482422 125 | 2015-08-20 03:54:00.947,32.513739,35.013078,104.1999969482422 126 | 2015-08-20 03:54:01.713,32.513726,35.013053,103.9000015258789 127 | 2015-08-20 03:54:04.796,32.513683,35.012981,102.8000030517578 128 | 2015-08-20 03:54:05.739,32.513666,35.012958,102.3000030517578 129 | 2015-08-20 03:54:08.837,32.513614,35.012891,100.4000015258789 130 | 2015-08-20 03:54:09.736,32.513598,35.012869,100.4000015258789 131 | 2015-08-20 03:54:12.795,32.513558,35.012791,100.5999984741211 132 | 2015-08-20 03:54:13.691,32.513546,35.012765,100.4000015258789 133 | 2015-08-20 03:54:17.425,32.513513,35.012687,99.6999969482422 134 | 2015-08-20 03:54:17.724,32.513502,35.01266,99.9000015258789 135 | 2015-08-20 03:54:20.759,32.513469,35.012578,102.0 136 | 2015-08-20 03:54:21.692,32.51346,35.01255,102.0999984741211 137 | 2015-08-20 03:54:24.813,32.513433,35.012471,101.5999984741211 138 | 2015-08-20 03:54:25.692,32.513426,35.012445,100.9000015258789 139 | 2015-08-20 03:54:28.783,32.513402,35.012367,100.0999984741211 140 | 2015-08-20 03:54:29.687,32.513394,35.012338,99.1999969482422 141 | 2015-08-20 03:54:32.827,32.513355,35.01226,99.5 142 | 2015-08-20 03:54:33.691,32.51334,35.012236,99.4000015258789 143 | 2015-08-20 03:54:36.774,32.513301,35.012159,98.3000030517578 144 | 2015-08-20 03:54:37.686,32.513288,35.012135,96.6999969482422 145 | 2015-08-20 03:54:40.787,32.513249,35.012063,95.1999969482422 146 | 2015-08-20 03:54:41.686,32.513237,35.012037,95.0 147 | 2015-08-20 03:54:44.769,32.513199,35.011961,94.6999969482422 148 | 2015-08-20 03:54:45.688,32.513184,35.011937,95.1999969482422 149 | 2015-08-20 03:54:48.745,32.51314,35.011868,93.3000030517578 150 | 2015-08-20 03:54:49.689,32.513126,35.011844,93.1999969482422 151 | 2015-08-20 03:54:52.757,32.513097,35.011766,92.5 152 | 2015-08-20 03:54:53.684,32.513088,35.011741,91.4000015258789 153 | 2015-08-20 03:54:57.781,32.513055,35.011644,91.1999969482422 154 | 2015-08-20 03:54:58.688,32.513048,35.011618,90.9000015258789 155 | 2015-08-20 03:55:01.904,32.513024,35.011538,90.6999969482422 156 | 2015-08-20 03:55:02.695,32.513016,35.01151,91.0 157 | 2015-08-20 03:55:05.766,32.512991,35.011432,90.0 158 | 2015-08-20 03:55:06.696,32.512982,35.011409,88.9000015258789 159 | 2015-08-20 03:55:10.766,32.512965,35.01131,88.0 160 | 2015-08-20 03:55:11.690,32.512962,35.011284,88.0999984741211 161 | 2015-08-20 03:55:14.787,32.512944,35.011205,87.9000015258789 162 | 2015-08-20 03:55:15.692,32.512936,35.011179,87.80000305175781 163 | 2015-08-20 03:55:18.789,32.512908,35.0111,86.80000305175781 164 | 2015-08-20 03:55:19.724,32.512897,35.011073,87.69999694824219 165 | 2015-08-20 03:55:22.747,32.512862,35.010991,88.0 166 | 2015-08-20 03:55:23.801,32.51285,35.010963,88.30000305175781 167 | 2015-08-20 03:55:26.824,32.51282,35.010873,88.0999984741211 168 | 2015-08-20 03:55:27.730,32.51281,35.010844,87.30000305175781 169 | 2015-08-20 03:55:30.791,32.512774,35.010765,87.4000015258789 170 | 2015-08-20 03:55:31.786,32.512762,35.010739,87.5999984741211 171 | 2015-08-20 03:55:34.837,32.512726,35.010661,86.80000305175781 172 | 2015-08-20 03:55:35.724,32.512714,35.010636,86.69999694824219 173 | 2015-08-20 03:55:38.786,32.512676,35.010562,87.19999694824219 174 | 2015-08-20 03:55:39.770,32.512664,35.010537,87.30000305175781 175 | 2015-08-20 03:55:42.826,32.512645,35.010455,87.0999984741211 176 | 2015-08-20 03:55:43.699,32.512642,35.010426,86.5999984741211 177 | 2015-08-20 03:55:46.771,32.512637,35.01034,85.0 178 | 2015-08-20 03:55:47.692,32.512636,35.010313,84.9000015258789 179 | 2015-08-20 03:55:51.779,32.512629,35.010212,84.9000015258789 180 | 2015-08-20 03:55:52.694,32.512625,35.010189,84.4000015258789 181 | 2015-08-20 03:55:56.849,32.512594,35.010093,82.9000015258789 182 | 2015-08-20 03:55:57.697,32.512584,35.010068,83.69999694824219 183 | 2015-08-20 03:56:00.786,32.512551,35.009988,84.0999984741211 184 | 2015-08-20 03:56:01.697,32.512539,35.009961,84.5 185 | 2015-08-20 03:56:04.757,32.512505,35.009883,84.0 186 | 2015-08-20 03:56:05.839,32.512493,35.009857,84.0 187 | 2015-08-20 03:56:08.782,32.512456,35.009785,83.0 188 | 2015-08-20 03:56:09.705,32.512445,35.009762,82.9000015258789 189 | 2015-08-20 03:56:12.777,32.512408,35.009692,82.4000015258789 190 | 2015-08-20 03:56:13.701,32.512395,35.009668,82.80000305175781 191 | 2015-08-20 03:56:16.840,32.512362,35.009595,81.5999984741211 192 | 2015-08-20 03:56:17.698,32.512347,35.009574,81.30000305175781 193 | 2015-08-20 03:56:20.757,32.512291,35.009517,81.80000305175781 194 | 2015-08-20 03:56:21.708,32.512267,35.009495,81.69999694824219 195 | 2015-08-20 03:56:24.832,32.512213,35.00943,82.30000305175781 196 | 2015-08-20 03:56:25.698,32.512199,35.00941,82.0 197 | 2015-08-20 03:56:28.974,32.512144,35.009361,80.69999694824219 198 | 2015-08-20 03:57:10.713,32.511551,35.009294,84.0 199 | 2015-08-20 03:57:14.785,32.511533,35.009386,86.9000015258789 200 | 2015-08-20 03:57:15.920,32.511524,35.009408,87.5 201 | 2015-08-20 03:57:19.818,32.511467,35.009485,87.30000305175781 202 | 2015-08-20 03:57:20.757,32.51145,35.0095,86.80000305175781 203 | 2015-08-20 03:57:24.836,32.511379,35.009559,89.5999984741211 204 | 2015-08-20 03:57:25.763,32.511362,35.009573,89.5 205 | 2015-08-20 03:57:29.824,32.511303,35.009636,89.0 206 | 2015-08-20 03:57:30.702,32.511293,35.009653,88.80000305175781 207 | 2015-08-20 03:57:35.785,32.511252,35.009745,91.1999969482422 208 | 2015-08-20 03:57:36.709,32.511245,35.009764,91.6999969482422 209 | 2015-08-20 03:57:41.812,32.511216,35.009855,91.3000030517578 210 | 2015-08-20 03:57:42.760,32.511212,35.009875,91.8000030517578 211 | 2015-08-20 03:57:47.810,32.511215,35.009977,87.69999694824219 212 | 2015-08-20 03:57:48.711,32.511218,35.009998,88.5999984741211 213 | 2015-08-20 03:57:53.815,32.511226,35.010102,86.19999694824219 214 | 2015-08-20 03:57:54.704,32.511225,35.010123,86.5999984741211 215 | 2015-08-20 03:57:59.780,32.511209,35.010227,86.9000015258789 216 | 2015-08-20 03:58:00.710,32.511202,35.010248,87.9000015258789 217 | 2015-08-20 03:58:04.797,32.511172,35.010329,88.80000305175781 218 | 2015-08-20 03:58:05.710,32.511162,35.010348,88.5 219 | 2015-08-20 03:58:09.754,32.511117,35.010419,90.3000030517578 220 | 2015-08-20 03:58:23.793,32.510997,35.010643,93.5 221 | 2015-08-20 03:58:28.757,32.510988,35.010748,93.1999969482422 222 | 2015-08-20 03:58:29.705,32.510981,35.010764,93.5999984741211 223 | 2015-08-20 03:58:34.772,32.510925,35.010825,93.3000030517578 224 | 2015-08-20 03:58:35.709,32.510912,35.010837,93.8000030517578 225 | 2015-08-20 03:58:40.773,32.510838,35.010887,95.4000015258789 226 | 2015-08-20 03:58:41.710,32.510821,35.010891,94.6999969482422 227 | 2015-08-20 03:58:46.790,32.510745,35.010903,97.6999969482422 228 | 2015-08-20 03:58:47.755,32.510729,35.01091,98.4000015258789 229 | 2015-08-20 03:58:52.795,32.510651,35.010939,100.5 230 | 2015-08-20 03:58:53.723,32.510637,35.010948,99.6999969482422 231 | 2015-08-20 03:58:58.841,32.510557,35.010988,98.8000030517578 232 | 2015-08-20 03:58:59.753,32.510539,35.010993,97.8000030517578 233 | 2015-08-20 03:59:04.834,32.510462,35.011028,98.1999969482422 234 | 2015-08-20 03:59:05.760,32.510448,35.011037,98.0999984741211 235 | 2015-08-20 03:59:10.877,32.510369,35.011071,98.0 236 | 2015-08-20 03:59:11.758,32.510353,35.011076,99.3000030517578 237 | 2015-08-20 03:59:16.821,32.510278,35.011083,100.1999969482422 238 | 2015-08-20 03:59:17.799,32.510262,35.011083,100.0 239 | 2015-08-20 03:59:22.869,32.510184,35.011083,100.5999984741211 240 | 2015-08-20 03:59:23.773,32.510168,35.011081,101.0 241 | 2015-08-20 03:59:29.840,32.510085,35.011108,103.6999969482422 242 | 2015-08-20 03:59:30.719,32.510071,35.011108,103.1999969482422 243 | 2015-08-20 03:59:35.811,32.509998,35.011101,104.0 244 | 2015-08-20 03:59:36.722,32.50998,35.011102,105.3000030517578 245 | 2015-08-20 03:59:41.823,32.509892,35.011123,109.5999984741211 246 | 2015-08-20 03:59:42.900,32.509875,35.011126,109.8000030517578 247 | 2015-08-20 03:59:47.759,32.509797,35.011142,112.3000030517578 248 | 2015-08-20 03:59:48.718,32.509782,35.011142,112.8000030517578 249 | 2015-08-20 03:59:54.855,32.509693,35.011128,110.8000030517578 250 | 2015-08-20 03:59:55.709,32.509679,35.01113,110.4000015258789 251 | 2015-08-20 04:00:02.764,32.509592,35.011152,109.1999969482422 252 | 2015-08-20 04:00:03.761,32.509576,35.011153,108.4000015258789 253 | 2015-08-20 04:00:08.786,32.509491,35.011162,109.8000030517578 254 | 2015-08-20 04:00:09.727,32.509474,35.011171,110.0999984741211 255 | 2015-08-20 04:00:13.815,32.50941,35.011228,111.5999984741211 256 | 2015-08-20 04:00:14.721,32.509395,35.011246,111.8000030517578 257 | 2015-08-20 04:00:18.879,32.509335,35.011324,111.0999984741211 258 | 2015-08-20 04:00:19.739,32.509325,35.011348,111.0 259 | 2015-08-20 04:00:22.758,32.50931,35.011425,110.3000030517578 260 | 2015-08-20 04:00:26.765,32.509363,35.011497,109.4000015258789 261 | 2015-08-20 04:00:31.754,32.509427,35.011568,109.5 262 | 2015-08-20 04:00:32.724,32.509434,35.01158,109.4000015258789 263 | 2015-08-20 04:00:38.798,32.509408,35.01168,108.3000030517578 264 | 2015-08-20 04:00:39.732,32.509398,35.011698,108.3000030517578 265 | 2015-08-20 04:00:44.912,32.509339,35.011764,106.5999984741211 266 | 2015-08-20 04:00:45.722,32.509328,35.011776,106.6999969482422 267 | 2015-08-20 04:00:50.955,32.509276,35.011845,103.0 268 | 2015-08-20 04:00:51.724,32.509261,35.011857,102.1999969482422 269 | 2015-08-20 04:00:56.837,32.509182,35.011906,100.9000015258789 270 | 2015-08-20 04:00:57.790,32.509167,35.011919,100.6999969482422 271 | 2015-08-20 04:01:02.893,32.509097,35.011982,100.5 272 | 2015-08-20 04:01:03.767,32.509082,35.011995,100.0999984741211 273 | 2015-08-20 04:01:07.773,32.509023,35.012046,98.6999969482422 274 | 2015-08-20 04:01:08.723,32.509008,35.01206,98.4000015258789 275 | 2015-08-20 04:01:12.892,32.508949,35.012118,98.1999969482422 276 | 2015-08-20 04:01:13.730,32.508936,35.012133,97.8000030517578 277 | 2015-08-20 04:01:17.889,32.508888,35.012198,96.9000015258789 278 | 2015-08-20 04:01:18.737,32.508875,35.012215,96.9000015258789 279 | 2015-08-20 04:01:22.773,32.508815,35.012275,96.0 280 | 2015-08-20 04:01:23.738,32.508801,35.012291,95.6999969482422 281 | 2015-08-20 04:01:27.842,32.508754,35.012367,95.5 282 | 2015-08-20 04:01:28.724,32.508745,35.01239,95.3000030517578 283 | 2015-08-20 04:01:32.771,32.508719,35.012489,94.9000015258789 284 | 2015-08-20 04:01:33.737,32.508714,35.012511,94.1999969482422 285 | 2015-08-20 04:01:37.826,32.508683,35.012593,93.3000030517578 286 | 2015-08-20 04:01:38.805,32.50867,35.012613,93.6999969482422 287 | 2015-08-20 04:01:42.885,32.508632,35.012693,92.0999984741211 288 | 2015-08-20 04:01:43.769,32.508626,35.012715,91.3000030517578 289 | 2015-08-20 04:01:47.862,32.508605,35.012807,90.5999984741211 290 | 2015-08-20 04:01:48.809,32.508601,35.012831,90.1999969482422 291 | 2015-08-20 04:01:52.842,32.508585,35.012924,89.5999984741211 292 | 2015-08-20 04:01:53.730,32.508577,35.012946,88.4000015258789 293 | 2015-08-20 04:01:56.975,32.508545,35.013015,88.0999984741211 294 | 2015-08-20 04:01:57.734,32.508537,35.013042,88.4000015258789 295 | 2015-08-20 04:02:01.816,32.508514,35.013143,87.30000305175781 296 | 2015-08-20 04:02:02.766,32.508506,35.013164,87.19999694824219 297 | 2015-08-20 04:02:06.811,32.508474,35.01325,87.0999984741211 298 | 2015-08-20 04:02:07.740,32.508467,35.013272,87.19999694824219 299 | 2015-08-20 04:02:11.804,32.508432,35.013361,87.4000015258789 300 | 2015-08-20 04:02:12.733,32.508421,35.013383,88.0 301 | 2015-08-20 04:02:16.800,32.508376,35.013474,88.0999984741211 302 | 2015-08-20 04:02:17.734,32.508364,35.013495,87.30000305175781 303 | 2015-08-20 04:02:22.799,32.508313,35.013573,85.19999694824219 304 | 2015-08-20 04:02:23.743,32.5083,35.013586,85.0 305 | 2015-08-20 04:02:28.794,32.508228,35.013635,80.80000305175781 306 | 2015-08-20 04:02:29.755,32.508212,35.013642,80.19999694824219 307 | 2015-08-20 04:02:33.807,32.508138,35.013675,79.9000015258789 308 | 2015-08-20 04:02:34.804,32.508119,35.013685,80.0999984741211 309 | 2015-08-20 04:02:38.812,32.508092,35.013769,80.69999694824219 310 | 2015-08-20 04:02:39.879,32.508098,35.0138,81.0 311 | 2015-08-20 04:02:42.909,32.508128,35.013877,79.69999694824219 312 | 2015-08-20 04:02:43.754,32.508136,35.013901,80.80000305175781 313 | 2015-08-20 04:02:48.018,32.508157,35.014002,80.5999984741211 314 | 2015-08-20 04:02:48.746,32.508158,35.014028,80.5999984741211 315 | 2015-08-20 04:02:56.857,32.508152,35.014134,80.69999694824219 316 | 2015-08-20 04:02:57.964,32.508154,35.014166,80.4000015258789 317 | 2015-08-20 04:03:00.838,32.508153,35.014262,80.0999984741211 318 | 2015-08-20 04:03:01.834,32.508154,35.014292,79.80000305175781 319 | 2015-08-20 04:03:04.926,32.508161,35.014381,78.80000305175781 320 | 2015-08-20 04:03:05.735,32.508159,35.014411,79.19999694824219 321 | 2015-08-20 04:03:08.875,32.508163,35.014501,79.0 322 | 2015-08-20 04:03:09.740,32.508176,35.014527,79.9000015258789 323 | 2015-08-20 04:03:12.773,32.508198,35.014609,80.4000015258789 324 | 2015-08-20 04:03:13.733,32.508205,35.014635,81.4000015258789 325 | 2015-08-20 04:03:17.917,32.508223,35.01473,81.0 326 | 2015-08-20 04:03:18.741,32.508227,35.014754,81.5 327 | 2015-08-20 04:03:22.777,32.508247,35.014854,81.5999984741211 328 | 2015-08-20 04:03:23.734,32.508254,35.01488,81.19999694824219 329 | 2015-08-20 04:03:26.806,32.508274,35.014959,81.0 330 | 2015-08-20 04:03:27.736,32.508278,35.014985,81.19999694824219 331 | 2015-08-20 04:03:31.781,32.508291,35.015084,83.30000305175781 332 | 2015-08-20 04:03:32.733,32.508294,35.015108,83.5999984741211 333 | 2015-08-20 04:03:36.817,32.508315,35.015203,84.5999984741211 334 | 2015-08-20 04:03:37.735,32.508318,35.015227,84.30000305175781 335 | 2015-08-20 04:03:41.910,32.508329,35.015329,84.80000305175781 336 | 2015-08-20 04:03:42.735,32.508329,35.015354,84.9000015258789 337 | 2015-08-20 04:03:46.780,32.508337,35.015452,85.30000305175781 338 | 2015-08-20 04:03:47.739,32.50834,35.015477,85.0 339 | 2015-08-20 04:03:51.812,32.50836,35.015572,84.5999984741211 340 | 2015-08-20 04:03:52.753,32.50837,35.015594,83.5999984741211 341 | 2015-08-20 04:03:56.823,32.508393,35.015688,84.0999984741211 342 | 2015-08-20 04:03:57.748,32.508398,35.015712,83.5 343 | 2015-08-20 04:04:01.886,32.508414,35.015804,83.19999694824219 344 | 2015-08-20 04:04:02.806,32.508417,35.015827,82.80000305175781 345 | 2015-08-20 04:04:06.819,32.508435,35.015917,81.19999694824219 346 | 2015-08-20 04:04:07.737,32.508441,35.015939,80.5999984741211 347 | 2015-08-20 04:04:11.934,32.508457,35.016031,81.0999984741211 348 | 2015-08-20 04:04:12.809,32.50846,35.016053,81.19999694824219 349 | 2015-08-20 04:04:16.845,32.508471,35.016144,79.0999984741211 350 | 2015-08-20 04:04:17.756,32.508474,35.016168,79.19999694824219 351 | 2015-08-20 04:04:21.812,32.508485,35.016264,77.9000015258789 352 | 2015-08-20 04:04:22.738,32.508485,35.016287,77.5 353 | 2015-08-20 04:04:26.828,32.508482,35.016389,78.30000305175781 354 | 2015-08-20 04:04:27.741,32.508484,35.016415,79.5 355 | 2015-08-20 04:04:30.815,32.508498,35.016495,79.19999694824219 356 | 2015-08-20 04:04:31.780,32.508502,35.016521,79.19999694824219 357 | 2015-08-20 04:04:35.782,32.508519,35.016616,80.19999694824219 358 | 2015-08-20 04:04:36.758,32.508519,35.01664,80.5999984741211 359 | 2015-08-20 04:04:40.819,32.508524,35.016736,80.9000015258789 360 | 2015-08-20 04:04:41.739,32.508526,35.01676,80.5999984741211 361 | 2015-08-20 04:04:45.822,32.50854,35.016862,82.0999984741211 362 | 2015-08-20 04:04:46.754,32.508545,35.016889,81.69999694824219 363 | 2015-08-20 04:04:49.819,32.50856,35.016969,81.69999694824219 364 | 2015-08-20 04:04:50.751,32.508565,35.016995,81.69999694824219 365 | 2015-08-20 04:04:54.827,32.508588,35.017093,81.5 366 | 2015-08-20 04:04:55.741,32.508594,35.017118,81.30000305175781 367 | 2015-08-20 04:04:59.953,32.508622,35.017211,81.69999694824219 368 | 2015-08-20 04:05:00.898,32.508629,35.017233,81.9000015258789 369 | 2015-08-20 04:05:04.825,32.50865,35.017327,83.69999694824219 370 | 2015-08-20 04:05:05.753,32.508654,35.017352,83.9000015258789 371 | 2015-08-20 04:05:09.820,32.508676,35.017453,85.80000305175781 372 | 2015-08-20 04:05:10.752,32.508681,35.017477,85.19999694824219 373 | 2015-08-20 04:05:14.782,32.508707,35.017574,85.0 374 | 2015-08-20 04:05:15.746,32.508715,35.017599,84.69999694824219 375 | 2015-08-20 04:05:18.810,32.508727,35.017679,84.30000305175781 376 | 2015-08-20 04:05:19.754,32.508727,35.017706,85.0999984741211 377 | 2015-08-20 04:05:23.821,32.508727,35.017811,85.19999694824219 378 | 2015-08-20 04:05:24.748,32.508732,35.017839,85.19999694824219 379 | 2015-08-20 04:05:27.786,32.508745,35.017921,84.4000015258789 380 | 2015-08-20 04:05:28.751,32.508745,35.01795,84.69999694824219 381 | 2015-08-20 04:05:31.779,32.508764,35.018032,84.69999694824219 382 | 2015-08-20 04:05:32.778,32.508771,35.01806,84.5 383 | 2015-08-20 04:05:35.827,32.508779,35.018146,84.69999694824219 384 | 2015-08-20 04:05:36.757,32.508782,35.018173,83.30000305175781 385 | 2015-08-20 04:05:40.868,32.508792,35.018274,83.5 386 | 2015-08-20 04:05:41.830,32.508795,35.018298,84.5 387 | 2015-08-20 04:05:45.830,32.508801,35.018397,83.69999694824219 388 | 2015-08-20 04:05:46.745,32.508802,35.018421,82.80000305175781 389 | 2015-08-20 04:05:50.865,32.508796,35.018515,80.9000015258789 390 | 2015-08-20 04:05:51.774,32.508792,35.018539,81.5 391 | 2015-08-20 04:05:55.985,32.508787,35.018637,82.5999984741211 392 | 2015-08-20 04:05:56.877,32.508784,35.01866,82.9000015258789 393 | 2015-08-20 04:06:01.100,32.508772,35.018762,84.80000305175781 394 | 2015-08-20 04:06:01.788,32.508772,35.018789,84.80000305175781 395 | 2015-08-20 04:06:04.895,32.508772,35.018874,84.69999694824219 396 | 2015-08-20 04:06:05.832,32.508774,35.018902,83.80000305175781 397 | 2015-08-20 04:06:08.882,32.50878,35.018988,82.0999984741211 398 | 2015-08-20 04:06:10.029,32.508783,35.019016,81.80000305175781 399 | 2015-08-20 04:06:12.907,32.508795,35.019104,80.5999984741211 400 | 2015-08-20 04:06:13.760,32.508798,35.019135,79.5 401 | 2015-08-20 04:06:16.824,32.508818,35.01922,80.5 402 | 2015-08-20 04:06:17.748,32.508826,35.019248,79.5 403 | 2015-08-20 04:06:20.825,32.508859,35.019327,79.4000015258789 404 | 2015-08-20 04:06:21.750,32.508868,35.019355,79.9000015258789 405 | 2015-08-20 04:06:24.830,32.508895,35.019439,80.0 406 | 2015-08-20 04:06:25.755,32.508902,35.019465,80.4000015258789 407 | 2015-08-20 04:06:28.846,32.508922,35.019544,79.0 408 | 2015-08-20 04:06:29.760,32.50893,35.019568,79.30000305175781 409 | 2015-08-20 04:06:33.815,32.50896,35.019661,79.5 410 | 2015-08-20 04:06:34.814,32.508969,35.019684,80.19999694824219 411 | 2015-08-20 04:06:38.879,32.509004,35.019779,80.4000015258789 412 | 2015-08-20 04:06:39.758,32.509014,35.019804,79.19999694824219 413 | 2015-08-20 04:06:42.786,32.509039,35.01988,79.9000015258789 414 | 2015-08-20 04:06:43.754,32.509046,35.019905,79.4000015258789 415 | 2015-08-20 04:06:47.808,32.509086,35.019981,80.0 416 | 2015-08-20 04:06:48.764,32.509093,35.019999,79.69999694824219 417 | 2015-08-20 04:06:53.841,32.509119,35.020097,80.0 418 | 2015-08-20 04:06:54.756,32.509125,35.020119,79.30000305175781 419 | 2015-08-20 04:06:58.908,32.509153,35.020204,81.5999984741211 420 | 2015-08-20 04:06:59.766,32.509157,35.020226,81.80000305175781 421 | 2015-08-20 04:07:04.844,32.509181,35.020326,83.19999694824219 422 | 2015-08-20 04:07:05.792,32.509186,35.020345,82.0999984741211 423 | 2015-08-20 04:07:09.806,32.509207,35.020426,82.5999984741211 424 | 2015-08-20 04:07:10.753,32.509211,35.020448,81.9000015258789 425 | 2015-08-20 04:07:14.850,32.509228,35.020537,82.30000305175781 426 | 2015-08-20 04:07:15.779,32.509234,35.020559,82.5 427 | 2015-08-20 04:07:19.852,32.50925,35.02065,87.4000015258789 428 | 2015-08-20 04:07:20.770,32.509254,35.020673,86.9000015258789 429 | 2015-08-20 04:07:24.887,32.509278,35.020759,88.0999984741211 430 | 2015-08-20 04:07:25.772,32.509284,35.020781,88.69999694824219 431 | 2015-08-20 04:07:29.868,32.509304,35.020867,89.5999984741211 432 | 2015-08-20 04:07:30.822,32.509309,35.020888,88.4000015258789 433 | 2015-08-20 04:07:34.900,32.509322,35.020976,89.0999984741211 434 | 2015-08-20 04:07:35.760,32.509325,35.020997,87.9000015258789 435 | 2015-08-20 04:07:41.002,32.509351,35.021097,86.4000015258789 436 | 2015-08-20 04:07:41.805,32.509356,35.021117,86.5999984741211 437 | 2015-08-20 04:07:47.040,32.509381,35.021218,87.69999694824219 438 | 2015-08-20 04:07:47.830,32.509384,35.021238,87.69999694824219 439 | 2015-08-20 04:07:51.835,32.509403,35.021322,88.19999694824219 440 | 2015-08-20 04:07:52.792,32.509405,35.021342,88.30000305175781 441 | 2015-08-20 04:07:57.866,32.509433,35.021441,88.80000305175781 442 | 2015-08-20 04:07:58.770,32.509438,35.021462,88.5 443 | 2015-08-20 04:08:02.860,32.509445,35.021548,88.0 444 | 2015-08-20 04:08:03.761,32.509445,35.021571,88.0 445 | 2015-08-20 04:08:07.842,32.509489,35.021641,88.0 446 | 2015-08-20 04:08:08.772,32.509511,35.021648,88.5999984741211 447 | 2015-08-20 04:08:12.796,32.509599,35.02164,88.5999984741211 448 | 2015-08-20 04:08:13.757,32.509619,35.021636,88.30000305175781 449 | 2015-08-20 04:08:17.819,32.509691,35.021609,88.80000305175781 450 | 2015-08-20 04:08:18.850,32.509711,35.021606,89.5999984741211 451 | 2015-08-20 04:08:22.966,32.509787,35.021593,91.0999984741211 452 | 2015-08-20 04:08:23.757,32.509805,35.021589,91.3000030517578 453 | 2015-08-20 04:08:28.794,32.509887,35.021561,91.8000030517578 454 | 2015-08-20 04:08:29.759,32.509901,35.021551,92.1999969482422 455 | 2015-08-20 04:08:35.900,32.509982,35.021518,91.0 456 | 2015-08-20 04:08:36.758,32.509996,35.021516,91.0999984741211 457 | 2015-08-20 04:08:41.814,32.510072,35.021502,91.5 458 | 2015-08-20 04:08:42.760,32.510086,35.021494,92.0 459 | 2015-08-20 04:08:47.832,32.510153,35.021456,94.5 460 | 2015-08-20 04:08:48.774,32.510169,35.021447,94.0 461 | 2015-08-20 04:08:53.897,32.51024,35.021412,95.5999984741211 462 | 2015-08-20 04:08:54.788,32.510255,35.021404,95.8000030517578 463 | 2015-08-20 04:08:59.841,32.510334,35.021376,97.9000015258789 464 | 2015-08-20 04:09:00.764,32.51035,35.021375,98.5 465 | 2015-08-20 04:09:05.833,32.510434,35.021379,100.3000030517578 466 | 2015-08-20 04:09:06.775,32.510449,35.021382,100.3000030517578 467 | 2015-08-20 04:09:11.860,32.51053,35.021413,101.0 468 | 2015-08-20 04:09:12.835,32.510546,35.021419,101.0999984741211 469 | 2015-08-20 04:09:17.860,32.510605,35.021491,99.5999984741211 470 | 2015-08-20 04:09:18.765,32.510614,35.021508,99.1999969482422 471 | 2015-08-20 04:09:23.855,32.510657,35.021598,98.9000015258789 472 | 2015-08-20 04:09:24.776,32.510665,35.021618,98.6999969482422 473 | 2015-08-20 04:09:28.839,32.510702,35.021694,99.1999969482422 474 | 2015-08-20 04:09:29.768,32.510714,35.021709,99.1999969482422 475 | 2015-08-20 04:09:34.851,32.510775,35.021785,99.4000015258789 476 | 2015-08-20 04:09:35.768,32.510788,35.021799,98.9000015258789 477 | 2015-08-20 04:09:39.837,32.510838,35.021858,99.0999984741211 478 | 2015-08-20 04:09:40.769,32.510849,35.021877,98.8000030517578 479 | 2015-08-20 04:09:44.872,32.51089,35.02196,97.4000015258789 480 | 2015-08-20 04:09:45.774,32.510899,35.02198,98.1999969482422 481 | 2015-08-20 04:09:49.854,32.510933,35.022068,98.5 482 | 2015-08-20 04:09:50.768,32.51094,35.022091,97.6999969482422 483 | 2015-08-20 04:09:54.847,32.510969,35.022182,97.6999969482422 484 | 2015-08-20 04:09:55.768,32.510979,35.022202,97.5999984741211 485 | 2015-08-20 04:09:59.850,32.511022,35.022282,97.5 486 | 2015-08-20 04:10:00.776,32.511032,35.0223,97.5999984741211 487 | 2015-08-20 04:10:05.856,32.511085,35.022376,98.9000015258789 488 | 2015-08-20 04:10:06.766,32.511094,35.022391,98.6999969482422 489 | 2015-08-20 04:10:12.468,32.511146,35.022471,99.8000030517578 490 | 2015-08-20 04:10:12.830,32.511155,35.022488,99.9000015258789 491 | 2015-08-20 04:10:17.817,32.511197,35.022577,99.6999969482422 492 | 2015-08-20 04:10:18.783,32.511205,35.022595,99.5999984741211 493 | 2015-08-20 04:10:23.827,32.511237,35.022677,100.6999969482422 494 | 2015-08-20 04:10:24.781,32.511247,35.02269,100.4000015258789 495 | 2015-08-20 04:10:29.980,32.511298,35.022761,101.8000030517578 496 | 2015-08-20 04:10:30.838,32.511309,35.022774,102.3000030517578 497 | 2015-08-20 04:10:35.889,32.51139,35.022733,103.3000030517578 498 | 2015-08-20 04:10:36.783,32.511398,35.022713,103.3000030517578 499 | 2015-08-20 04:10:40.836,32.511421,35.022627,99.9000015258789 500 | 2015-08-20 04:10:41.777,32.511418,35.0226,100.0999984741211 501 | 2015-08-20 04:10:45.853,32.511412,35.022497,99.5999984741211 502 | 2015-08-20 04:10:46.785,32.511417,35.022477,99.6999969482422 503 | 2015-08-20 04:10:51.857,32.511476,35.022398,103.5 504 | 2015-08-20 04:10:52.769,32.511487,35.022382,103.3000030517578 505 | 2015-08-20 04:10:57.843,32.511493,35.022287,100.6999969482422 506 | 2015-08-20 04:10:58.777,32.511486,35.022269,100.4000015258789 507 | 2015-08-20 04:11:02.933,32.511446,35.022192,100.6999969482422 508 | 2015-08-20 04:11:03.781,32.511434,35.022173,101.5 509 | 2015-08-20 04:11:07.870,32.511387,35.022099,103.8000030517578 510 | 2015-08-20 04:11:08.771,32.511378,35.022078,104.3000030517578 511 | 2015-08-20 04:11:12.832,32.511372,35.02199,105.5 512 | 2015-08-20 04:11:13.785,32.511375,35.021969,104.4000015258789 513 | 2015-08-20 04:11:18.859,32.511364,35.021865,104.4000015258789 514 | 2015-08-20 04:11:19.774,32.511358,35.021844,104.3000030517578 515 | 2015-08-20 04:11:23.916,32.511348,35.021755,104.3000030517578 516 | 2015-08-20 04:11:24.856,32.511341,35.021733,104.5999984741211 517 | 2015-08-20 04:11:28.859,32.511297,35.021653,103.5999984741211 518 | 2015-08-20 04:11:29.785,32.511285,35.021634,103.5999984741211 519 | 2015-08-20 04:11:33.916,32.511249,35.021544,102.6999969482422 520 | 2015-08-20 04:11:34.777,32.511242,35.021523,102.0 521 | 2015-08-20 04:11:38.845,32.511193,35.021447,101.6999969482422 522 | 2015-08-20 04:11:39.776,32.511181,35.02143,101.9000015258789 523 | 2015-08-20 04:11:43.854,32.511127,35.021367,101.4000015258789 524 | 2015-08-20 04:11:44.781,32.511111,35.021355,100.6999969482422 525 | 2015-08-20 04:11:48.862,32.511036,35.021326,99.6999969482422 526 | 2015-08-20 04:11:49.796,32.511016,35.021322,100.0999984741211 527 | 2015-08-20 04:11:53.868,32.510939,35.021304,99.4000015258789 528 | 2015-08-20 04:11:54.783,32.51092,35.021295,99.3000030517578 529 | 2015-08-20 04:11:58.880,32.510854,35.021241,99.5 530 | 2015-08-20 04:11:59.783,32.51084,35.021223,98.6999969482422 531 | 2015-08-20 04:12:03.871,32.510782,35.021152,97.3000030517578 532 | 2015-08-20 04:12:04.793,32.510766,35.021134,97.5999984741211 533 | 2015-08-20 04:12:08.851,32.510714,35.021052,96.5999984741211 534 | 2015-08-20 04:12:09.802,32.510703,35.02103,96.9000015258789 535 | 2015-08-20 04:12:13.871,32.510683,35.020927,96.0999984741211 536 | 2015-08-20 04:12:14.784,32.510684,35.020899,96.0999984741211 537 | 2015-08-20 04:12:17.844,32.510691,35.020811,96.5999984741211 538 | 2015-08-20 04:12:18.868,32.510695,35.02078,97.0 539 | 2015-08-20 04:12:21.929,32.51071,35.020689,96.6999969482422 540 | 2015-08-20 04:12:22.857,32.510717,35.02066,96.5999984741211 541 | 2015-08-20 04:12:25.926,32.51074,35.020582,96.0999984741211 542 | 2015-08-20 04:12:26.841,32.510747,35.020556,95.5999984741211 543 | 2015-08-20 04:12:30.906,32.510777,35.020461,94.3000030517578 544 | 2015-08-20 04:12:32.078,32.510786,35.020438,94.1999969482422 545 | 2015-08-20 04:12:35.899,32.510816,35.02034,92.4000015258789 546 | 2015-08-20 04:12:37.006,32.51082,35.020313,92.5999984741211 547 | 2015-08-20 04:12:39.957,32.510831,35.020222,93.9000015258789 548 | 2015-08-20 04:12:40.800,32.510836,35.020193,93.3000030517578 549 | 2015-08-20 04:12:43.876,32.510856,35.020111,93.5 550 | 2015-08-20 04:12:44.798,32.510863,35.020084,93.5 551 | 2015-08-20 04:12:47.876,32.510892,35.02001,92.9000015258789 552 | 2015-08-20 04:12:48.814,32.510902,35.019987,92.6999969482422 553 | 2015-08-20 04:12:52.978,32.510944,35.019899,92.3000030517578 554 | 2015-08-20 04:12:53.847,32.510955,35.019877,92.0 555 | 2015-08-20 04:12:57.829,32.510988,35.019784,92.1999969482422 556 | 2015-08-20 04:12:58.800,32.510993,35.019759,91.9000015258789 557 | 2015-08-20 04:13:01.913,32.511,35.019676,90.5999984741211 558 | 2015-08-20 04:13:03.025,32.511004,35.019648,90.5999984741211 559 | 2015-08-20 04:13:05.853,32.511023,35.019567,90.0 560 | 2015-08-20 04:13:06.809,32.511031,35.019541,89.5999984741211 561 | 2015-08-20 04:13:09.907,32.511058,35.01947,88.69999694824219 562 | 2015-08-20 04:13:11.796,32.511085,35.019434,88.5 563 | 2015-08-20 04:13:15.810,32.511152,35.019368,89.5999984741211 564 | 2015-08-20 04:13:16.782,32.51117,35.019353,89.0999984741211 565 | 2015-08-20 04:13:19.841,32.511213,35.019291,90.3000030517578 566 | 2015-08-20 04:13:20.799,32.511225,35.019267,91.4000015258789 567 | 2015-08-20 04:13:24.818,32.511276,35.019184,91.8000030517578 568 | 2015-08-20 04:13:25.969,32.511286,35.019163,92.0999984741211 569 | 2015-08-20 04:13:29.993,32.511319,35.01907,92.1999969482422 570 | 2015-08-20 04:13:30.782,32.51133,35.019048,92.6999969482422 571 | 2015-08-20 04:13:34.847,32.511367,35.018962,92.1999969482422 572 | 2015-08-20 04:13:35.784,32.511371,35.01894,91.9000015258789 573 | 2015-08-20 04:13:40.817,32.511413,35.01886,92.0999984741211 574 | 2015-08-20 04:13:41.783,32.511419,35.018845,92.0 575 | 2015-08-20 04:13:47.873,32.511452,35.018747,90.4000015258789 576 | 2015-08-20 04:13:48.828,32.511457,35.018728,91.0 577 | 2015-08-20 04:13:52.897,32.511486,35.018646,92.4000015258789 578 | 2015-08-20 04:13:53.799,32.511495,35.018627,91.9000015258789 579 | 2015-08-20 04:13:57.883,32.511541,35.018559,92.5 580 | 2015-08-20 04:13:58.794,32.511551,35.018542,91.8000030517578 581 | 2015-08-20 04:14:03.880,32.511598,35.01846,92.8000030517578 582 | 2015-08-20 04:14:04.928,32.511604,35.018444,92.5999984741211 583 | 2015-08-20 04:14:10.074,32.511663,35.018369,92.8000030517578 584 | 2015-08-20 04:14:10.882,32.511675,35.018355,92.4000015258789 585 | 2015-08-20 04:14:16.882,32.511724,35.018267,90.4000015258789 586 | 2015-08-20 04:14:17.787,32.511738,35.018253,90.5 587 | 2015-08-20 04:14:21.900,32.511797,35.018196,89.0999984741211 588 | 2015-08-20 04:14:22.795,32.511806,35.018176,88.80000305175781 589 | 2015-08-20 04:14:27.035,32.511863,35.018103,93.5 590 | 2015-08-20 04:14:27.814,32.511876,35.018086,93.3000030517578 591 | 2015-08-20 04:14:32.930,32.51191,35.01799,91.3000030517578 592 | 2015-08-20 04:14:33.823,32.511919,35.017974,91.0 593 | 2015-08-20 04:14:39.152,32.511969,35.0179,93.0 594 | 2015-08-20 04:14:39.822,32.511981,35.017886,92.3000030517578 595 | 2015-08-20 04:14:45.935,32.512028,35.017796,94.1999969482422 596 | 2015-08-20 04:14:46.797,32.512037,35.017785,94.1999969482422 597 | 2015-08-20 04:14:52.855,32.5121,35.017713,93.9000015258789 598 | 2015-08-20 04:14:53.800,32.512113,35.017704,94.6999969482422 599 | 2015-08-20 04:14:58.953,32.512166,35.017636,96.3000030517578 600 | 2015-08-20 04:14:59.818,32.512176,35.017623,96.0999984741211 601 | 2015-08-20 04:15:05.903,32.512235,35.017543,96.8000030517578 602 | 2015-08-20 04:15:06.857,32.512245,35.01753,97.0 603 | 2015-08-20 04:15:12.020,32.512297,35.017461,94.1999969482422 604 | 2015-08-20 04:15:12.817,32.512305,35.017448,93.6999969482422 605 | 2015-08-20 04:15:19.098,32.512358,35.017372,95.1999969482422 606 | 2015-08-20 04:15:19.947,32.512367,35.017358,94.9000015258789 607 | 2015-08-20 04:15:24.889,32.512411,35.017285,94.3000030517578 608 | 2015-08-20 04:15:25.969,32.512421,35.01727,95.0 609 | 2015-08-20 04:15:31.057,32.51248,35.017192,96.4000015258789 610 | 2015-08-20 04:15:31.836,32.512492,35.017175,96.1999969482422 611 | 2015-08-20 04:15:36.910,32.512551,35.017096,98.1999969482422 612 | 2015-08-20 04:15:37.812,32.512563,35.017081,99.0 613 | 2015-08-20 04:15:42.857,32.512622,35.017014,97.1999969482422 614 | 2015-08-20 04:15:43.904,32.512629,35.016998,96.9000015258789 615 | 2015-08-20 04:15:48.929,32.512679,35.016924,98.0 616 | 2015-08-20 04:15:49.830,32.512686,35.016908,97.8000030517578 617 | 2015-08-20 04:15:54.946,32.512727,35.016819,98.6999969482422 618 | 2015-08-20 04:15:55.863,32.512735,35.0168,97.9000015258789 619 | 2015-08-20 04:15:59.939,32.512763,35.016714,97.0 620 | 2015-08-20 04:16:00.878,32.512769,35.016691,98.0 621 | 2015-08-20 04:16:05.942,32.512842,35.016637,99.8000030517578 622 | 2015-08-20 04:16:06.875,32.512859,35.016648,100.3000030517578 623 | 2015-08-20 04:16:10.956,32.512922,35.016715,100.0 624 | 2015-08-20 04:16:11.879,32.512936,35.016735,100.5 625 | 2015-08-20 04:16:15.900,32.512992,35.016803,101.5 626 | 2015-08-20 04:16:16.890,32.513005,35.016819,100.6999969482422 627 | 2015-08-20 04:16:20.894,32.51307,35.016871,102.4000015258789 628 | 2015-08-20 04:16:21.815,32.513084,35.016884,102.5 629 | 2015-08-20 04:16:27.117,32.513151,35.016949,105.4000015258789 630 | 2015-08-20 04:16:27.981,32.513166,35.016961,105.3000030517578 631 | 2015-08-20 04:16:31.960,32.513221,35.01702,106.5999984741211 632 | 2015-08-20 04:16:32.888,32.513232,35.017037,107.3000030517578 633 | 2015-08-20 04:16:36.966,32.513276,35.017107,106.1999969482422 634 | 2015-08-20 04:16:37.866,32.513287,35.017123,107.4000015258789 635 | 2015-08-20 04:16:43.057,32.51333,35.017208,108.8000030517578 636 | 2015-08-20 04:16:43.873,32.51334,35.017226,110.3000030517578 637 | 2015-08-20 04:16:47.848,32.513398,35.017278,109.5 638 | 2015-08-20 04:16:48.815,32.513411,35.017291,109.9000015258789 639 | 2015-08-20 04:16:52.875,32.513464,35.017348,111.1999969482422 640 | 2015-08-20 04:16:53.817,32.513477,35.017364,112.5 641 | 2015-08-20 04:16:57.999,32.513534,35.017427,113.4000015258789 642 | 2015-08-20 04:16:58.839,32.513548,35.017441,113.6999969482422 643 | 2015-08-20 04:17:03.026,32.513618,35.017485,113.0 644 | 2015-08-20 04:17:03.872,32.513639,35.01749,112.8000030517578 645 | 2015-08-20 04:17:07.843,32.513718,35.017455,113.5999984741211 646 | 2015-08-20 04:17:08.815,32.513731,35.017436,113.6999969482422 647 | 2015-08-20 04:17:11.930,32.51377,35.017373,114.0999984741211 648 | 2015-08-20 04:17:12.887,32.513784,35.017349,114.0 649 | 2015-08-20 04:17:15.874,32.513828,35.017284,114.5 650 | 2015-08-20 04:17:16.827,32.513843,35.017263,114.5999984741211 651 | 2015-08-20 04:17:19.920,32.513887,35.017201,114.4000015258789 652 | 2015-08-20 04:17:20.855,32.513897,35.017175,113.9000015258789 653 | 2015-08-20 04:17:24.052,32.51393,35.017102,113.5 654 | 2015-08-20 04:17:25.054,32.513935,35.017077,113.5999984741211 655 | 2015-08-20 04:17:27.916,32.51393,35.016994,113.9000015258789 656 | 2015-08-20 04:17:28.819,32.513929,35.016965,114.9000015258789 657 | 2015-08-20 04:17:31.911,32.513936,35.016881,114.9000015258789 658 | 2015-08-20 04:17:32.827,32.513941,35.016855,114.3000030517578 659 | 2015-08-20 04:17:36.970,32.513958,35.016764,113.5999984741211 660 | 2015-08-20 04:17:37.876,32.513959,35.016742,113.5999984741211 661 | 2015-08-20 04:17:41.925,32.513989,35.01666,113.5999984741211 662 | 2015-08-20 04:17:42.821,32.513999,35.016639,113.6999969482422 663 | 2015-08-20 04:17:46.931,32.514054,35.016579,111.9000015258789 664 | 2015-08-20 04:17:47.947,32.514065,35.016562,112.8000030517578 665 | 2015-08-20 04:17:51.892,32.514112,35.016492,113.6999969482422 666 | 2015-08-20 04:17:52.841,32.514126,35.016471,113.8000030517578 667 | 2015-08-20 04:17:56.908,32.51417,35.016384,114.1999969482422 668 | 2015-08-20 04:17:57.824,32.514178,35.016362,114.3000030517578 669 | 2015-08-20 04:18:01.921,32.51421,35.016274,114.3000030517578 670 | 2015-08-20 04:18:02.823,32.514221,35.016254,114.1999969482422 671 | 2015-08-20 04:18:06.896,32.514278,35.016184,114.8000030517578 672 | 2015-08-20 04:18:07.813,32.514296,35.016171,115.5999984741211 673 | 2015-08-20 04:18:10.895,32.514355,35.016146,115.5999984741211 674 | 2015-08-20 04:18:13.814,32.514421,35.016143,116.3000030517578 675 | 2015-08-20 04:18:17.869,32.514502,35.016162,117.5999984741211 676 | 2015-08-20 04:18:18.813,32.514522,35.016165,117.5 677 | 2015-08-20 04:18:22.862,32.514598,35.016182,117.4000015258789 678 | 2015-08-20 04:18:23.814,32.514616,35.016187,117.0999984741211 679 | 2015-08-20 04:18:27.863,32.514686,35.016171,116.6999969482422 680 | 2015-08-20 04:18:28.816,32.514703,35.016158,116.5999984741211 681 | 2015-08-20 04:18:32.870,32.514754,35.016085,116.5999984741211 682 | 2015-08-20 04:18:33.815,32.514765,35.01607,115.8000030517578 683 | 2015-08-20 04:18:37.847,32.514825,35.016018,117.3000030517578 684 | 2015-08-20 04:18:38.816,32.514843,35.016007,117.6999969482422 685 | 2015-08-20 04:18:42.882,32.514921,35.015984,117.5999984741211 686 | 2015-08-20 04:18:43.815,32.514942,35.015984,118.3000030517578 687 | 2015-08-20 04:18:47.897,32.51503,35.01597,118.3000030517578 688 | 2015-08-20 04:18:48.836,32.515053,35.01597,118.0999984741211 689 | 2015-08-20 04:18:50.877,32.515114,35.015958,116.4000015258789 690 | 2015-08-20 04:18:51.819,32.515146,35.015951,117.0999984741211 691 | 2015-08-20 04:18:54.007,32.515209,35.015942,117.0999984741211 692 | 2015-08-20 04:18:54.893,32.51524,35.015937,117.5 693 | 2015-08-20 04:18:57.939,32.515328,35.015943,118.5999984741211 694 | 2015-08-20 04:18:58.845,32.515358,35.015946,118.5 695 | 2015-08-20 04:19:01.992,32.515443,35.015964,118.3000030517578 696 | 2015-08-20 04:19:02.889,32.515462,35.015973,118.3000030517578 697 | 2015-08-20 04:19:06.990,32.515544,35.01601,118.6999969482422 698 | 2015-08-20 04:19:07.888,32.51556,35.016017,118.5999984741211 699 | 2015-08-20 04:19:11.886,32.515638,35.016042,118.5999984741211 700 | 2015-08-20 04:19:12.819,32.51566,35.016051,118.0 701 | 2015-08-20 04:19:16.911,32.515738,35.016069,117.9000015258789 702 | 2015-08-20 04:19:17.842,32.515757,35.016076,117.1999969482422 703 | 2015-08-20 04:19:21.908,32.515844,35.016087,116.4000015258789 704 | 2015-08-20 04:19:22.820,32.51587,35.016071,116.1999969482422 705 | 2015-08-20 04:19:25.934,32.515933,35.016016,116.0 706 | 2015-08-20 04:19:26.831,32.515953,35.015993,116.8000030517578 707 | 2015-08-20 04:19:29.879,32.516001,35.015918,116.5 708 | 2015-08-20 04:19:30.833,32.51602,35.015894,117.0 709 | 2015-08-20 04:19:34.152,32.516074,35.015828,116.5 710 | 2015-08-20 04:19:34.904,32.516091,35.015804,116.5 711 | 2015-08-20 04:19:37.851,32.516142,35.01573,116.5999984741211 712 | 2015-08-20 04:19:38.820,32.516157,35.015705,116.5 713 | 2015-08-20 04:19:41.881,32.516211,35.01564,115.4000015258789 714 | 2015-08-20 04:19:42.825,32.516225,35.015617,114.0999984741211 715 | 2015-08-20 04:19:45.963,32.516278,35.015551,113.5 716 | 2015-08-20 04:19:46.890,32.516301,35.015533,112.5 717 | 2015-08-20 04:19:49.987,32.516361,35.015468,112.0 718 | 2015-08-20 04:19:50.878,32.51638,35.015444,112.6999969482422 719 | 2015-08-20 04:19:53.937,32.516442,35.015369,112.5 720 | 2015-08-20 04:19:54.896,32.516462,35.015343,112.5999984741211 721 | 2015-08-20 04:19:58.048,32.516517,35.015264,112.3000030517578 722 | 2015-08-20 04:19:58.898,32.516537,35.015238,112.0999984741211 723 | 2015-08-20 04:20:01.965,32.516592,35.015157,110.0999984741211 724 | 2015-08-20 04:20:02.886,32.51661,35.015129,109.8000030517578 725 | 2015-08-20 04:20:05.959,32.516665,35.015048,107.6999969482422 726 | 2015-08-20 04:20:06.823,32.516683,35.015023,107.5 727 | 2015-08-20 04:20:09.926,32.516736,35.014943,107.5999984741211 728 | 2015-08-20 04:20:10.824,32.516754,35.014916,107.0999984741211 729 | 2015-08-20 04:20:14.040,32.5168,35.014835,106.0999984741211 730 | 2015-08-20 04:20:14.888,32.516818,35.01481,105.1999969482422 731 | 2015-08-20 04:20:17.897,32.516873,35.014737,106.4000015258789 732 | 2015-08-20 04:20:18.844,32.516889,35.014709,106.4000015258789 733 | 2015-08-20 04:20:21.996,32.516933,35.014617,103.5 734 | 2015-08-20 04:20:22.897,32.516945,35.014584,103.0999984741211 735 | 2015-08-20 04:20:24.905,32.516971,35.014518,103.8000030517578 736 | 2015-08-20 04:20:25.835,32.516984,35.014484,104.1999969482422 737 | 2015-08-20 04:20:28.982,32.51702,35.014387,104.8000030517578 738 | 2015-08-20 04:20:29.923,32.517035,35.014355,105.1999969482422 739 | 2015-08-20 04:20:32.863,32.517087,35.014279,102.9000015258789 740 | 2015-08-20 04:20:33.994,32.517098,35.014264,102.4000015258789 741 | 2015-08-20 04:20:42.329,32.517142,35.014212,103.4000015258789 742 | -------------------------------------------------------------------------------- /Ch03/03_04/access.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | csv_file = 'track.csv' 5 | df = pd.read_csv(csv_file, parse_dates=['time']) 6 | 7 | # %% 8 | df['lat'] 9 | 10 | # %% 11 | df.lat # Don't do this! 12 | 13 | # %% 14 | df[['lat', 'lng']] 15 | 16 | # %% 17 | df['lat'][0] 18 | 19 | # %% 20 | df.loc[0] 21 | 22 | # %% 23 | df.loc[2:7] 24 | 25 | # %% 26 | df[['lat', 'lng']][2:7] 27 | 28 | # %% 29 | 30 | df.index 31 | # %% 32 | import numpy as np 33 | 34 | df1 = pd.DataFrame( 35 | np.arange(10).reshape(5, 2), 36 | columns=['x', 'y'], 37 | index=['a', 'b', 'c', 'd', 'e'], 38 | ) 39 | df1 40 | 41 | # %% 42 | df1.loc[0] 43 | 44 | # %% 45 | df1.loc['a'] 46 | 47 | # %% 48 | df1.loc['a':'d'] 49 | 50 | # %% 51 | df1.iloc[0] 52 | 53 | # %% 54 | df.index 55 | 56 | # %% 57 | df.index = df['time'] 58 | df.index 59 | 60 | # %% 61 | df.loc[0] 62 | 63 | # %% 64 | df.loc['2015-08-20 03:48:34'] 65 | 66 | # %% 67 | 68 | df.loc['2015-08-20 03:48'] -------------------------------------------------------------------------------- /Ch03/03_04/track.csv: -------------------------------------------------------------------------------- 1 | time,lat,lng,height 2 | 2015-08-20 03:48:07.235,32.519585,35.015021,136.1999969482422 3 | 2015-08-20 03:48:24.734,32.519606,35.014954,126.5999984741211 4 | 2015-08-20 03:48:25.660,32.519612,35.014871,123.0 5 | 2015-08-20 03:48:26.819,32.519654,35.014824,120.5 6 | 2015-08-20 03:48:27.828,32.519689,35.014776,118.9000015258789 7 | 2015-08-20 03:48:29.720,32.519691,35.014704,119.9000015258789 8 | 2015-08-20 03:48:30.669,32.519734,35.014657,120.9000015258789 9 | 2015-08-20 03:48:33.793,32.519719,35.014563,121.6999969482422 10 | 2015-08-20 03:48:34.869,32.519694,35.014549,121.1999969482422 11 | 2015-08-20 03:48:37.708,32.519625,35.014515,121.6999969482422 12 | 2015-08-20 03:48:38.839,32.519599,35.014505,121.8000030517578 13 | 2015-08-20 03:48:41.980,32.519514,35.014481,122.5999984741211 14 | 2015-08-20 03:48:42.725,32.519486,35.014472,123.0 15 | 2015-08-20 03:48:45.896,32.519405,35.014439,122.6999969482422 16 | 2015-08-20 03:48:46.662,32.519379,35.014432,122.6999969482422 17 | 2015-08-20 03:48:49.829,32.519309,35.014414,122.6999969482422 18 | 2015-08-20 03:48:50.665,32.519287,35.0144,123.3000030517578 19 | 2015-08-20 03:48:53.692,32.519211,35.014372,122.3000030517578 20 | 2015-08-20 03:48:54.662,32.519187,35.014365,122.5999984741211 21 | 2015-08-20 03:48:58.869,32.519106,35.014337,122.0 22 | 2015-08-20 03:48:59.663,32.519084,35.014331,121.8000030517578 23 | 2015-08-20 03:49:03.861,32.519009,35.014303,122.9000015258789 24 | 2015-08-20 03:49:04.663,32.518989,35.014306,122.9000015258789 25 | 2015-08-20 03:49:07.742,32.518916,35.01434,123.0999984741211 26 | 2015-08-20 03:50:13.679,32.517636,35.013531,115.1999969482422 27 | 2015-08-20 03:50:16.767,32.517589,35.013606,114.3000030517578 28 | 2015-08-20 03:50:17.719,32.517574,35.01363,114.1999969482422 29 | 2015-08-20 03:50:20.748,32.517529,35.013705,113.8000030517578 30 | 2015-08-20 03:50:21.681,32.517512,35.01373,114.1999969482422 31 | 2015-08-20 03:50:24.735,32.517459,35.013809,114.0 32 | 2015-08-20 03:50:25.677,32.517442,35.013834,113.0999984741211 33 | 2015-08-20 03:50:28.738,32.517389,35.013903,112.5999984741211 34 | 2015-08-20 03:50:29.673,32.517373,35.013925,113.5 35 | 2015-08-20 03:50:32.816,32.517323,35.013991,113.5999984741211 36 | 2015-08-20 03:50:33.682,32.517306,35.014012,113.4000015258789 37 | 2015-08-20 03:50:36.749,32.517254,35.014075,114.5999984741211 38 | 2015-08-20 03:50:37.744,32.517236,35.014095,114.1999969482422 39 | 2015-08-20 03:50:40.735,32.517183,35.014148,115.5 40 | 2015-08-20 03:50:41.682,32.517164,35.014167,116.0 41 | 2015-08-20 03:50:44.757,32.517111,35.014235,116.5999984741211 42 | 2015-08-20 03:50:45.674,32.517095,35.014257,116.5999984741211 43 | 2015-08-20 03:50:48.716,32.517044,35.014332,115.3000030517578 44 | 2015-08-20 03:50:49.684,32.517026,35.014357,115.0 45 | 2015-08-20 03:50:52.757,32.516972,35.014431,114.9000015258789 46 | 2015-08-20 03:50:53.688,32.516954,35.014456,114.9000015258789 47 | 2015-08-20 03:50:56.782,32.516891,35.014519,115.6999969482422 48 | 2015-08-20 03:50:57.731,32.516868,35.014522,114.0 49 | 2015-08-20 03:51:00.870,32.516818,35.01447,113.5999984741211 50 | 2015-08-20 03:51:01.772,32.516803,35.014442,113.0 51 | 2015-08-20 03:51:04.744,32.516752,35.01436,112.0 52 | 2015-08-20 03:51:05.747,32.516734,35.014335,112.3000030517578 53 | 2015-08-20 03:51:08.831,32.516677,35.014257,110.9000015258789 54 | 2015-08-20 03:51:09.744,32.516657,35.014233,110.8000030517578 55 | 2015-08-20 03:51:12.743,32.516591,35.014176,108.6999969482422 56 | 2015-08-20 03:51:13.702,32.516568,35.014162,108.4000015258789 57 | 2015-08-20 03:51:16.777,32.516506,35.014103,109.1999969482422 58 | 2015-08-20 03:51:17.729,32.516486,35.014084,108.4000015258789 59 | 2015-08-20 03:51:20.733,32.516421,35.014026,108.5 60 | 2015-08-20 03:51:21.670,32.5164,35.014006,108.5999984741211 61 | 2015-08-20 03:51:24.691,32.516338,35.013941,107.5999984741211 62 | 2015-08-20 03:51:25.672,32.516318,35.01392,107.9000015258789 63 | 2015-08-20 03:51:28.745,32.516253,35.013869,108.0 64 | 2015-08-20 03:51:29.677,32.51623,35.013852,108.0 65 | 2015-08-20 03:51:32.707,32.516174,35.013795,105.5999984741211 66 | 2015-08-20 03:51:33.674,32.516156,35.013775,104.8000030517578 67 | 2015-08-20 03:51:36.758,32.516108,35.01371,105.3000030517578 68 | 2015-08-20 03:51:37.675,32.516089,35.01369,103.9000015258789 69 | 2015-08-20 03:51:40.733,32.516033,35.013633,103.6999969482422 70 | 2015-08-20 03:51:41.674,32.516014,35.013615,103.5 71 | 2015-08-20 03:51:44.744,32.51596,35.013559,102.8000030517578 72 | 2015-08-20 03:51:45.679,32.515943,35.01354,103.0 73 | 2015-08-20 03:51:48.760,32.515891,35.013482,102.0 74 | 2015-08-20 03:51:49.684,32.515873,35.013463,102.0 75 | 2015-08-20 03:51:52.709,32.515826,35.013403,102.0 76 | 2015-08-20 03:51:53.672,32.515812,35.013382,102.0 77 | 2015-08-20 03:51:56.894,32.515761,35.013325,101.8000030517578 78 | 2015-08-20 03:51:57.767,32.515743,35.013307,101.3000030517578 79 | 2015-08-20 03:52:00.768,32.515693,35.013246,100.5 80 | 2015-08-20 03:52:01.676,32.515675,35.013226,100.8000030517578 81 | 2015-08-20 03:52:04.866,32.515622,35.013162,101.0999984741211 82 | 2015-08-20 03:52:05.780,32.515605,35.013139,100.6999969482422 83 | 2015-08-20 03:52:08.753,32.51555,35.013074,99.1999969482422 84 | 2015-08-20 03:52:09.700,32.515531,35.013055,99.1999969482422 85 | 2015-08-20 03:52:12.855,32.515471,35.012994,99.3000030517578 86 | 2015-08-20 03:52:13.780,32.515451,35.012974,99.0 87 | 2015-08-20 03:52:16.775,32.515388,35.012912,99.6999969482422 88 | 2015-08-20 03:52:17.704,32.515368,35.012891,99.6999969482422 89 | 2015-08-20 03:52:20.907,32.515311,35.012826,99.0999984741211 90 | 2015-08-20 03:52:21.779,32.515291,35.012806,98.8000030517578 91 | 2015-08-20 03:52:24.813,32.515226,35.01276,98.5 92 | 2015-08-20 03:52:25.698,32.515203,35.012747,97.9000015258789 93 | 2015-08-20 03:52:28.748,32.515136,35.012709,97.4000015258789 94 | 2015-08-20 03:52:29.672,32.515113,35.012694,97.0 95 | 2015-08-20 03:52:32.719,32.515052,35.012636,96.3000030517578 96 | 2015-08-20 03:52:33.698,32.515034,35.012617,96.3000030517578 97 | 2015-08-20 03:52:37.790,32.514986,35.012537,96.0999984741211 98 | 2015-08-20 03:52:38.678,32.514964,35.012521,96.5999984741211 99 | 2015-08-20 03:52:41.752,32.514901,35.01246,95.1999969482422 100 | 2015-08-20 03:52:42.684,32.514882,35.012438,94.6999969482422 101 | 2015-08-20 03:52:45.758,32.514836,35.012371,94.3000030517578 102 | 2015-08-20 03:52:46.679,32.514813,35.012367,94.9000015258789 103 | 2015-08-20 03:52:49.764,32.514761,35.012418,95.0 104 | 2015-08-20 03:52:50.678,32.514746,35.012445,95.4000015258789 105 | 2015-08-20 03:52:54.323,32.514689,35.012516,96.4000015258789 106 | 2015-08-20 03:52:54.673,32.514671,35.01254,96.5 107 | 2015-08-20 03:52:57.937,32.514631,35.012615,98.0 108 | 2015-08-20 03:52:58.682,32.514619,35.012636,97.6999969482422 109 | 2015-08-20 03:53:02.766,32.514562,35.012717,99.0999984741211 110 | 2015-08-20 03:53:03.678,32.514545,35.012741,99.1999969482422 111 | 2015-08-20 03:53:05.884,32.514507,35.012782,99.4000015258789 112 | 2015-08-20 03:53:33.775,32.514134,35.013324,105.1999969482422 113 | 2015-08-20 03:53:36.808,32.514092,35.013393,105.8000030517578 114 | 2015-08-20 03:53:37.677,32.514077,35.013417,106.1999969482422 115 | 2015-08-20 03:53:40.734,32.514028,35.013493,106.3000030517578 116 | 2015-08-20 03:53:41.686,32.514011,35.013514,107.1999969482422 117 | 2015-08-20 03:53:44.713,32.513947,35.013472,106.6999969482422 118 | 2015-08-20 03:53:45.682,32.513928,35.013445,107.3000030517578 119 | 2015-08-20 03:53:49.290,32.513882,35.013363,103.9000015258789 120 | 2015-08-20 03:53:49.679,32.513869,35.013336,102.5999984741211 121 | 2015-08-20 03:53:52.831,32.513823,35.01327,105.4000015258789 122 | 2015-08-20 03:53:53.737,32.513807,35.013251,105.0999984741211 123 | 2015-08-20 03:53:56.820,32.513777,35.013178,105.1999969482422 124 | 2015-08-20 03:53:57.772,32.513769,35.013153,104.6999969482422 125 | 2015-08-20 03:54:00.947,32.513739,35.013078,104.1999969482422 126 | 2015-08-20 03:54:01.713,32.513726,35.013053,103.9000015258789 127 | 2015-08-20 03:54:04.796,32.513683,35.012981,102.8000030517578 128 | 2015-08-20 03:54:05.739,32.513666,35.012958,102.3000030517578 129 | 2015-08-20 03:54:08.837,32.513614,35.012891,100.4000015258789 130 | 2015-08-20 03:54:09.736,32.513598,35.012869,100.4000015258789 131 | 2015-08-20 03:54:12.795,32.513558,35.012791,100.5999984741211 132 | 2015-08-20 03:54:13.691,32.513546,35.012765,100.4000015258789 133 | 2015-08-20 03:54:17.425,32.513513,35.012687,99.6999969482422 134 | 2015-08-20 03:54:17.724,32.513502,35.01266,99.9000015258789 135 | 2015-08-20 03:54:20.759,32.513469,35.012578,102.0 136 | 2015-08-20 03:54:21.692,32.51346,35.01255,102.0999984741211 137 | 2015-08-20 03:54:24.813,32.513433,35.012471,101.5999984741211 138 | 2015-08-20 03:54:25.692,32.513426,35.012445,100.9000015258789 139 | 2015-08-20 03:54:28.783,32.513402,35.012367,100.0999984741211 140 | 2015-08-20 03:54:29.687,32.513394,35.012338,99.1999969482422 141 | 2015-08-20 03:54:32.827,32.513355,35.01226,99.5 142 | 2015-08-20 03:54:33.691,32.51334,35.012236,99.4000015258789 143 | 2015-08-20 03:54:36.774,32.513301,35.012159,98.3000030517578 144 | 2015-08-20 03:54:37.686,32.513288,35.012135,96.6999969482422 145 | 2015-08-20 03:54:40.787,32.513249,35.012063,95.1999969482422 146 | 2015-08-20 03:54:41.686,32.513237,35.012037,95.0 147 | 2015-08-20 03:54:44.769,32.513199,35.011961,94.6999969482422 148 | 2015-08-20 03:54:45.688,32.513184,35.011937,95.1999969482422 149 | 2015-08-20 03:54:48.745,32.51314,35.011868,93.3000030517578 150 | 2015-08-20 03:54:49.689,32.513126,35.011844,93.1999969482422 151 | 2015-08-20 03:54:52.757,32.513097,35.011766,92.5 152 | 2015-08-20 03:54:53.684,32.513088,35.011741,91.4000015258789 153 | 2015-08-20 03:54:57.781,32.513055,35.011644,91.1999969482422 154 | 2015-08-20 03:54:58.688,32.513048,35.011618,90.9000015258789 155 | 2015-08-20 03:55:01.904,32.513024,35.011538,90.6999969482422 156 | 2015-08-20 03:55:02.695,32.513016,35.01151,91.0 157 | 2015-08-20 03:55:05.766,32.512991,35.011432,90.0 158 | 2015-08-20 03:55:06.696,32.512982,35.011409,88.9000015258789 159 | 2015-08-20 03:55:10.766,32.512965,35.01131,88.0 160 | 2015-08-20 03:55:11.690,32.512962,35.011284,88.0999984741211 161 | 2015-08-20 03:55:14.787,32.512944,35.011205,87.9000015258789 162 | 2015-08-20 03:55:15.692,32.512936,35.011179,87.80000305175781 163 | 2015-08-20 03:55:18.789,32.512908,35.0111,86.80000305175781 164 | 2015-08-20 03:55:19.724,32.512897,35.011073,87.69999694824219 165 | 2015-08-20 03:55:22.747,32.512862,35.010991,88.0 166 | 2015-08-20 03:55:23.801,32.51285,35.010963,88.30000305175781 167 | 2015-08-20 03:55:26.824,32.51282,35.010873,88.0999984741211 168 | 2015-08-20 03:55:27.730,32.51281,35.010844,87.30000305175781 169 | 2015-08-20 03:55:30.791,32.512774,35.010765,87.4000015258789 170 | 2015-08-20 03:55:31.786,32.512762,35.010739,87.5999984741211 171 | 2015-08-20 03:55:34.837,32.512726,35.010661,86.80000305175781 172 | 2015-08-20 03:55:35.724,32.512714,35.010636,86.69999694824219 173 | 2015-08-20 03:55:38.786,32.512676,35.010562,87.19999694824219 174 | 2015-08-20 03:55:39.770,32.512664,35.010537,87.30000305175781 175 | 2015-08-20 03:55:42.826,32.512645,35.010455,87.0999984741211 176 | 2015-08-20 03:55:43.699,32.512642,35.010426,86.5999984741211 177 | 2015-08-20 03:55:46.771,32.512637,35.01034,85.0 178 | 2015-08-20 03:55:47.692,32.512636,35.010313,84.9000015258789 179 | 2015-08-20 03:55:51.779,32.512629,35.010212,84.9000015258789 180 | 2015-08-20 03:55:52.694,32.512625,35.010189,84.4000015258789 181 | 2015-08-20 03:55:56.849,32.512594,35.010093,82.9000015258789 182 | 2015-08-20 03:55:57.697,32.512584,35.010068,83.69999694824219 183 | 2015-08-20 03:56:00.786,32.512551,35.009988,84.0999984741211 184 | 2015-08-20 03:56:01.697,32.512539,35.009961,84.5 185 | 2015-08-20 03:56:04.757,32.512505,35.009883,84.0 186 | 2015-08-20 03:56:05.839,32.512493,35.009857,84.0 187 | 2015-08-20 03:56:08.782,32.512456,35.009785,83.0 188 | 2015-08-20 03:56:09.705,32.512445,35.009762,82.9000015258789 189 | 2015-08-20 03:56:12.777,32.512408,35.009692,82.4000015258789 190 | 2015-08-20 03:56:13.701,32.512395,35.009668,82.80000305175781 191 | 2015-08-20 03:56:16.840,32.512362,35.009595,81.5999984741211 192 | 2015-08-20 03:56:17.698,32.512347,35.009574,81.30000305175781 193 | 2015-08-20 03:56:20.757,32.512291,35.009517,81.80000305175781 194 | 2015-08-20 03:56:21.708,32.512267,35.009495,81.69999694824219 195 | 2015-08-20 03:56:24.832,32.512213,35.00943,82.30000305175781 196 | 2015-08-20 03:56:25.698,32.512199,35.00941,82.0 197 | 2015-08-20 03:56:28.974,32.512144,35.009361,80.69999694824219 198 | 2015-08-20 03:57:10.713,32.511551,35.009294,84.0 199 | 2015-08-20 03:57:14.785,32.511533,35.009386,86.9000015258789 200 | 2015-08-20 03:57:15.920,32.511524,35.009408,87.5 201 | 2015-08-20 03:57:19.818,32.511467,35.009485,87.30000305175781 202 | 2015-08-20 03:57:20.757,32.51145,35.0095,86.80000305175781 203 | 2015-08-20 03:57:24.836,32.511379,35.009559,89.5999984741211 204 | 2015-08-20 03:57:25.763,32.511362,35.009573,89.5 205 | 2015-08-20 03:57:29.824,32.511303,35.009636,89.0 206 | 2015-08-20 03:57:30.702,32.511293,35.009653,88.80000305175781 207 | 2015-08-20 03:57:35.785,32.511252,35.009745,91.1999969482422 208 | 2015-08-20 03:57:36.709,32.511245,35.009764,91.6999969482422 209 | 2015-08-20 03:57:41.812,32.511216,35.009855,91.3000030517578 210 | 2015-08-20 03:57:42.760,32.511212,35.009875,91.8000030517578 211 | 2015-08-20 03:57:47.810,32.511215,35.009977,87.69999694824219 212 | 2015-08-20 03:57:48.711,32.511218,35.009998,88.5999984741211 213 | 2015-08-20 03:57:53.815,32.511226,35.010102,86.19999694824219 214 | 2015-08-20 03:57:54.704,32.511225,35.010123,86.5999984741211 215 | 2015-08-20 03:57:59.780,32.511209,35.010227,86.9000015258789 216 | 2015-08-20 03:58:00.710,32.511202,35.010248,87.9000015258789 217 | 2015-08-20 03:58:04.797,32.511172,35.010329,88.80000305175781 218 | 2015-08-20 03:58:05.710,32.511162,35.010348,88.5 219 | 2015-08-20 03:58:09.754,32.511117,35.010419,90.3000030517578 220 | 2015-08-20 03:58:23.793,32.510997,35.010643,93.5 221 | 2015-08-20 03:58:28.757,32.510988,35.010748,93.1999969482422 222 | 2015-08-20 03:58:29.705,32.510981,35.010764,93.5999984741211 223 | 2015-08-20 03:58:34.772,32.510925,35.010825,93.3000030517578 224 | 2015-08-20 03:58:35.709,32.510912,35.010837,93.8000030517578 225 | 2015-08-20 03:58:40.773,32.510838,35.010887,95.4000015258789 226 | 2015-08-20 03:58:41.710,32.510821,35.010891,94.6999969482422 227 | 2015-08-20 03:58:46.790,32.510745,35.010903,97.6999969482422 228 | 2015-08-20 03:58:47.755,32.510729,35.01091,98.4000015258789 229 | 2015-08-20 03:58:52.795,32.510651,35.010939,100.5 230 | 2015-08-20 03:58:53.723,32.510637,35.010948,99.6999969482422 231 | 2015-08-20 03:58:58.841,32.510557,35.010988,98.8000030517578 232 | 2015-08-20 03:58:59.753,32.510539,35.010993,97.8000030517578 233 | 2015-08-20 03:59:04.834,32.510462,35.011028,98.1999969482422 234 | 2015-08-20 03:59:05.760,32.510448,35.011037,98.0999984741211 235 | 2015-08-20 03:59:10.877,32.510369,35.011071,98.0 236 | 2015-08-20 03:59:11.758,32.510353,35.011076,99.3000030517578 237 | 2015-08-20 03:59:16.821,32.510278,35.011083,100.1999969482422 238 | 2015-08-20 03:59:17.799,32.510262,35.011083,100.0 239 | 2015-08-20 03:59:22.869,32.510184,35.011083,100.5999984741211 240 | 2015-08-20 03:59:23.773,32.510168,35.011081,101.0 241 | 2015-08-20 03:59:29.840,32.510085,35.011108,103.6999969482422 242 | 2015-08-20 03:59:30.719,32.510071,35.011108,103.1999969482422 243 | 2015-08-20 03:59:35.811,32.509998,35.011101,104.0 244 | 2015-08-20 03:59:36.722,32.50998,35.011102,105.3000030517578 245 | 2015-08-20 03:59:41.823,32.509892,35.011123,109.5999984741211 246 | 2015-08-20 03:59:42.900,32.509875,35.011126,109.8000030517578 247 | 2015-08-20 03:59:47.759,32.509797,35.011142,112.3000030517578 248 | 2015-08-20 03:59:48.718,32.509782,35.011142,112.8000030517578 249 | 2015-08-20 03:59:54.855,32.509693,35.011128,110.8000030517578 250 | 2015-08-20 03:59:55.709,32.509679,35.01113,110.4000015258789 251 | 2015-08-20 04:00:02.764,32.509592,35.011152,109.1999969482422 252 | 2015-08-20 04:00:03.761,32.509576,35.011153,108.4000015258789 253 | 2015-08-20 04:00:08.786,32.509491,35.011162,109.8000030517578 254 | 2015-08-20 04:00:09.727,32.509474,35.011171,110.0999984741211 255 | 2015-08-20 04:00:13.815,32.50941,35.011228,111.5999984741211 256 | 2015-08-20 04:00:14.721,32.509395,35.011246,111.8000030517578 257 | 2015-08-20 04:00:18.879,32.509335,35.011324,111.0999984741211 258 | 2015-08-20 04:00:19.739,32.509325,35.011348,111.0 259 | 2015-08-20 04:00:22.758,32.50931,35.011425,110.3000030517578 260 | 2015-08-20 04:00:26.765,32.509363,35.011497,109.4000015258789 261 | 2015-08-20 04:00:31.754,32.509427,35.011568,109.5 262 | 2015-08-20 04:00:32.724,32.509434,35.01158,109.4000015258789 263 | 2015-08-20 04:00:38.798,32.509408,35.01168,108.3000030517578 264 | 2015-08-20 04:00:39.732,32.509398,35.011698,108.3000030517578 265 | 2015-08-20 04:00:44.912,32.509339,35.011764,106.5999984741211 266 | 2015-08-20 04:00:45.722,32.509328,35.011776,106.6999969482422 267 | 2015-08-20 04:00:50.955,32.509276,35.011845,103.0 268 | 2015-08-20 04:00:51.724,32.509261,35.011857,102.1999969482422 269 | 2015-08-20 04:00:56.837,32.509182,35.011906,100.9000015258789 270 | 2015-08-20 04:00:57.790,32.509167,35.011919,100.6999969482422 271 | 2015-08-20 04:01:02.893,32.509097,35.011982,100.5 272 | 2015-08-20 04:01:03.767,32.509082,35.011995,100.0999984741211 273 | 2015-08-20 04:01:07.773,32.509023,35.012046,98.6999969482422 274 | 2015-08-20 04:01:08.723,32.509008,35.01206,98.4000015258789 275 | 2015-08-20 04:01:12.892,32.508949,35.012118,98.1999969482422 276 | 2015-08-20 04:01:13.730,32.508936,35.012133,97.8000030517578 277 | 2015-08-20 04:01:17.889,32.508888,35.012198,96.9000015258789 278 | 2015-08-20 04:01:18.737,32.508875,35.012215,96.9000015258789 279 | 2015-08-20 04:01:22.773,32.508815,35.012275,96.0 280 | 2015-08-20 04:01:23.738,32.508801,35.012291,95.6999969482422 281 | 2015-08-20 04:01:27.842,32.508754,35.012367,95.5 282 | 2015-08-20 04:01:28.724,32.508745,35.01239,95.3000030517578 283 | 2015-08-20 04:01:32.771,32.508719,35.012489,94.9000015258789 284 | 2015-08-20 04:01:33.737,32.508714,35.012511,94.1999969482422 285 | 2015-08-20 04:01:37.826,32.508683,35.012593,93.3000030517578 286 | 2015-08-20 04:01:38.805,32.50867,35.012613,93.6999969482422 287 | 2015-08-20 04:01:42.885,32.508632,35.012693,92.0999984741211 288 | 2015-08-20 04:01:43.769,32.508626,35.012715,91.3000030517578 289 | 2015-08-20 04:01:47.862,32.508605,35.012807,90.5999984741211 290 | 2015-08-20 04:01:48.809,32.508601,35.012831,90.1999969482422 291 | 2015-08-20 04:01:52.842,32.508585,35.012924,89.5999984741211 292 | 2015-08-20 04:01:53.730,32.508577,35.012946,88.4000015258789 293 | 2015-08-20 04:01:56.975,32.508545,35.013015,88.0999984741211 294 | 2015-08-20 04:01:57.734,32.508537,35.013042,88.4000015258789 295 | 2015-08-20 04:02:01.816,32.508514,35.013143,87.30000305175781 296 | 2015-08-20 04:02:02.766,32.508506,35.013164,87.19999694824219 297 | 2015-08-20 04:02:06.811,32.508474,35.01325,87.0999984741211 298 | 2015-08-20 04:02:07.740,32.508467,35.013272,87.19999694824219 299 | 2015-08-20 04:02:11.804,32.508432,35.013361,87.4000015258789 300 | 2015-08-20 04:02:12.733,32.508421,35.013383,88.0 301 | 2015-08-20 04:02:16.800,32.508376,35.013474,88.0999984741211 302 | 2015-08-20 04:02:17.734,32.508364,35.013495,87.30000305175781 303 | 2015-08-20 04:02:22.799,32.508313,35.013573,85.19999694824219 304 | 2015-08-20 04:02:23.743,32.5083,35.013586,85.0 305 | 2015-08-20 04:02:28.794,32.508228,35.013635,80.80000305175781 306 | 2015-08-20 04:02:29.755,32.508212,35.013642,80.19999694824219 307 | 2015-08-20 04:02:33.807,32.508138,35.013675,79.9000015258789 308 | 2015-08-20 04:02:34.804,32.508119,35.013685,80.0999984741211 309 | 2015-08-20 04:02:38.812,32.508092,35.013769,80.69999694824219 310 | 2015-08-20 04:02:39.879,32.508098,35.0138,81.0 311 | 2015-08-20 04:02:42.909,32.508128,35.013877,79.69999694824219 312 | 2015-08-20 04:02:43.754,32.508136,35.013901,80.80000305175781 313 | 2015-08-20 04:02:48.018,32.508157,35.014002,80.5999984741211 314 | 2015-08-20 04:02:48.746,32.508158,35.014028,80.5999984741211 315 | 2015-08-20 04:02:56.857,32.508152,35.014134,80.69999694824219 316 | 2015-08-20 04:02:57.964,32.508154,35.014166,80.4000015258789 317 | 2015-08-20 04:03:00.838,32.508153,35.014262,80.0999984741211 318 | 2015-08-20 04:03:01.834,32.508154,35.014292,79.80000305175781 319 | 2015-08-20 04:03:04.926,32.508161,35.014381,78.80000305175781 320 | 2015-08-20 04:03:05.735,32.508159,35.014411,79.19999694824219 321 | 2015-08-20 04:03:08.875,32.508163,35.014501,79.0 322 | 2015-08-20 04:03:09.740,32.508176,35.014527,79.9000015258789 323 | 2015-08-20 04:03:12.773,32.508198,35.014609,80.4000015258789 324 | 2015-08-20 04:03:13.733,32.508205,35.014635,81.4000015258789 325 | 2015-08-20 04:03:17.917,32.508223,35.01473,81.0 326 | 2015-08-20 04:03:18.741,32.508227,35.014754,81.5 327 | 2015-08-20 04:03:22.777,32.508247,35.014854,81.5999984741211 328 | 2015-08-20 04:03:23.734,32.508254,35.01488,81.19999694824219 329 | 2015-08-20 04:03:26.806,32.508274,35.014959,81.0 330 | 2015-08-20 04:03:27.736,32.508278,35.014985,81.19999694824219 331 | 2015-08-20 04:03:31.781,32.508291,35.015084,83.30000305175781 332 | 2015-08-20 04:03:32.733,32.508294,35.015108,83.5999984741211 333 | 2015-08-20 04:03:36.817,32.508315,35.015203,84.5999984741211 334 | 2015-08-20 04:03:37.735,32.508318,35.015227,84.30000305175781 335 | 2015-08-20 04:03:41.910,32.508329,35.015329,84.80000305175781 336 | 2015-08-20 04:03:42.735,32.508329,35.015354,84.9000015258789 337 | 2015-08-20 04:03:46.780,32.508337,35.015452,85.30000305175781 338 | 2015-08-20 04:03:47.739,32.50834,35.015477,85.0 339 | 2015-08-20 04:03:51.812,32.50836,35.015572,84.5999984741211 340 | 2015-08-20 04:03:52.753,32.50837,35.015594,83.5999984741211 341 | 2015-08-20 04:03:56.823,32.508393,35.015688,84.0999984741211 342 | 2015-08-20 04:03:57.748,32.508398,35.015712,83.5 343 | 2015-08-20 04:04:01.886,32.508414,35.015804,83.19999694824219 344 | 2015-08-20 04:04:02.806,32.508417,35.015827,82.80000305175781 345 | 2015-08-20 04:04:06.819,32.508435,35.015917,81.19999694824219 346 | 2015-08-20 04:04:07.737,32.508441,35.015939,80.5999984741211 347 | 2015-08-20 04:04:11.934,32.508457,35.016031,81.0999984741211 348 | 2015-08-20 04:04:12.809,32.50846,35.016053,81.19999694824219 349 | 2015-08-20 04:04:16.845,32.508471,35.016144,79.0999984741211 350 | 2015-08-20 04:04:17.756,32.508474,35.016168,79.19999694824219 351 | 2015-08-20 04:04:21.812,32.508485,35.016264,77.9000015258789 352 | 2015-08-20 04:04:22.738,32.508485,35.016287,77.5 353 | 2015-08-20 04:04:26.828,32.508482,35.016389,78.30000305175781 354 | 2015-08-20 04:04:27.741,32.508484,35.016415,79.5 355 | 2015-08-20 04:04:30.815,32.508498,35.016495,79.19999694824219 356 | 2015-08-20 04:04:31.780,32.508502,35.016521,79.19999694824219 357 | 2015-08-20 04:04:35.782,32.508519,35.016616,80.19999694824219 358 | 2015-08-20 04:04:36.758,32.508519,35.01664,80.5999984741211 359 | 2015-08-20 04:04:40.819,32.508524,35.016736,80.9000015258789 360 | 2015-08-20 04:04:41.739,32.508526,35.01676,80.5999984741211 361 | 2015-08-20 04:04:45.822,32.50854,35.016862,82.0999984741211 362 | 2015-08-20 04:04:46.754,32.508545,35.016889,81.69999694824219 363 | 2015-08-20 04:04:49.819,32.50856,35.016969,81.69999694824219 364 | 2015-08-20 04:04:50.751,32.508565,35.016995,81.69999694824219 365 | 2015-08-20 04:04:54.827,32.508588,35.017093,81.5 366 | 2015-08-20 04:04:55.741,32.508594,35.017118,81.30000305175781 367 | 2015-08-20 04:04:59.953,32.508622,35.017211,81.69999694824219 368 | 2015-08-20 04:05:00.898,32.508629,35.017233,81.9000015258789 369 | 2015-08-20 04:05:04.825,32.50865,35.017327,83.69999694824219 370 | 2015-08-20 04:05:05.753,32.508654,35.017352,83.9000015258789 371 | 2015-08-20 04:05:09.820,32.508676,35.017453,85.80000305175781 372 | 2015-08-20 04:05:10.752,32.508681,35.017477,85.19999694824219 373 | 2015-08-20 04:05:14.782,32.508707,35.017574,85.0 374 | 2015-08-20 04:05:15.746,32.508715,35.017599,84.69999694824219 375 | 2015-08-20 04:05:18.810,32.508727,35.017679,84.30000305175781 376 | 2015-08-20 04:05:19.754,32.508727,35.017706,85.0999984741211 377 | 2015-08-20 04:05:23.821,32.508727,35.017811,85.19999694824219 378 | 2015-08-20 04:05:24.748,32.508732,35.017839,85.19999694824219 379 | 2015-08-20 04:05:27.786,32.508745,35.017921,84.4000015258789 380 | 2015-08-20 04:05:28.751,32.508745,35.01795,84.69999694824219 381 | 2015-08-20 04:05:31.779,32.508764,35.018032,84.69999694824219 382 | 2015-08-20 04:05:32.778,32.508771,35.01806,84.5 383 | 2015-08-20 04:05:35.827,32.508779,35.018146,84.69999694824219 384 | 2015-08-20 04:05:36.757,32.508782,35.018173,83.30000305175781 385 | 2015-08-20 04:05:40.868,32.508792,35.018274,83.5 386 | 2015-08-20 04:05:41.830,32.508795,35.018298,84.5 387 | 2015-08-20 04:05:45.830,32.508801,35.018397,83.69999694824219 388 | 2015-08-20 04:05:46.745,32.508802,35.018421,82.80000305175781 389 | 2015-08-20 04:05:50.865,32.508796,35.018515,80.9000015258789 390 | 2015-08-20 04:05:51.774,32.508792,35.018539,81.5 391 | 2015-08-20 04:05:55.985,32.508787,35.018637,82.5999984741211 392 | 2015-08-20 04:05:56.877,32.508784,35.01866,82.9000015258789 393 | 2015-08-20 04:06:01.100,32.508772,35.018762,84.80000305175781 394 | 2015-08-20 04:06:01.788,32.508772,35.018789,84.80000305175781 395 | 2015-08-20 04:06:04.895,32.508772,35.018874,84.69999694824219 396 | 2015-08-20 04:06:05.832,32.508774,35.018902,83.80000305175781 397 | 2015-08-20 04:06:08.882,32.50878,35.018988,82.0999984741211 398 | 2015-08-20 04:06:10.029,32.508783,35.019016,81.80000305175781 399 | 2015-08-20 04:06:12.907,32.508795,35.019104,80.5999984741211 400 | 2015-08-20 04:06:13.760,32.508798,35.019135,79.5 401 | 2015-08-20 04:06:16.824,32.508818,35.01922,80.5 402 | 2015-08-20 04:06:17.748,32.508826,35.019248,79.5 403 | 2015-08-20 04:06:20.825,32.508859,35.019327,79.4000015258789 404 | 2015-08-20 04:06:21.750,32.508868,35.019355,79.9000015258789 405 | 2015-08-20 04:06:24.830,32.508895,35.019439,80.0 406 | 2015-08-20 04:06:25.755,32.508902,35.019465,80.4000015258789 407 | 2015-08-20 04:06:28.846,32.508922,35.019544,79.0 408 | 2015-08-20 04:06:29.760,32.50893,35.019568,79.30000305175781 409 | 2015-08-20 04:06:33.815,32.50896,35.019661,79.5 410 | 2015-08-20 04:06:34.814,32.508969,35.019684,80.19999694824219 411 | 2015-08-20 04:06:38.879,32.509004,35.019779,80.4000015258789 412 | 2015-08-20 04:06:39.758,32.509014,35.019804,79.19999694824219 413 | 2015-08-20 04:06:42.786,32.509039,35.01988,79.9000015258789 414 | 2015-08-20 04:06:43.754,32.509046,35.019905,79.4000015258789 415 | 2015-08-20 04:06:47.808,32.509086,35.019981,80.0 416 | 2015-08-20 04:06:48.764,32.509093,35.019999,79.69999694824219 417 | 2015-08-20 04:06:53.841,32.509119,35.020097,80.0 418 | 2015-08-20 04:06:54.756,32.509125,35.020119,79.30000305175781 419 | 2015-08-20 04:06:58.908,32.509153,35.020204,81.5999984741211 420 | 2015-08-20 04:06:59.766,32.509157,35.020226,81.80000305175781 421 | 2015-08-20 04:07:04.844,32.509181,35.020326,83.19999694824219 422 | 2015-08-20 04:07:05.792,32.509186,35.020345,82.0999984741211 423 | 2015-08-20 04:07:09.806,32.509207,35.020426,82.5999984741211 424 | 2015-08-20 04:07:10.753,32.509211,35.020448,81.9000015258789 425 | 2015-08-20 04:07:14.850,32.509228,35.020537,82.30000305175781 426 | 2015-08-20 04:07:15.779,32.509234,35.020559,82.5 427 | 2015-08-20 04:07:19.852,32.50925,35.02065,87.4000015258789 428 | 2015-08-20 04:07:20.770,32.509254,35.020673,86.9000015258789 429 | 2015-08-20 04:07:24.887,32.509278,35.020759,88.0999984741211 430 | 2015-08-20 04:07:25.772,32.509284,35.020781,88.69999694824219 431 | 2015-08-20 04:07:29.868,32.509304,35.020867,89.5999984741211 432 | 2015-08-20 04:07:30.822,32.509309,35.020888,88.4000015258789 433 | 2015-08-20 04:07:34.900,32.509322,35.020976,89.0999984741211 434 | 2015-08-20 04:07:35.760,32.509325,35.020997,87.9000015258789 435 | 2015-08-20 04:07:41.002,32.509351,35.021097,86.4000015258789 436 | 2015-08-20 04:07:41.805,32.509356,35.021117,86.5999984741211 437 | 2015-08-20 04:07:47.040,32.509381,35.021218,87.69999694824219 438 | 2015-08-20 04:07:47.830,32.509384,35.021238,87.69999694824219 439 | 2015-08-20 04:07:51.835,32.509403,35.021322,88.19999694824219 440 | 2015-08-20 04:07:52.792,32.509405,35.021342,88.30000305175781 441 | 2015-08-20 04:07:57.866,32.509433,35.021441,88.80000305175781 442 | 2015-08-20 04:07:58.770,32.509438,35.021462,88.5 443 | 2015-08-20 04:08:02.860,32.509445,35.021548,88.0 444 | 2015-08-20 04:08:03.761,32.509445,35.021571,88.0 445 | 2015-08-20 04:08:07.842,32.509489,35.021641,88.0 446 | 2015-08-20 04:08:08.772,32.509511,35.021648,88.5999984741211 447 | 2015-08-20 04:08:12.796,32.509599,35.02164,88.5999984741211 448 | 2015-08-20 04:08:13.757,32.509619,35.021636,88.30000305175781 449 | 2015-08-20 04:08:17.819,32.509691,35.021609,88.80000305175781 450 | 2015-08-20 04:08:18.850,32.509711,35.021606,89.5999984741211 451 | 2015-08-20 04:08:22.966,32.509787,35.021593,91.0999984741211 452 | 2015-08-20 04:08:23.757,32.509805,35.021589,91.3000030517578 453 | 2015-08-20 04:08:28.794,32.509887,35.021561,91.8000030517578 454 | 2015-08-20 04:08:29.759,32.509901,35.021551,92.1999969482422 455 | 2015-08-20 04:08:35.900,32.509982,35.021518,91.0 456 | 2015-08-20 04:08:36.758,32.509996,35.021516,91.0999984741211 457 | 2015-08-20 04:08:41.814,32.510072,35.021502,91.5 458 | 2015-08-20 04:08:42.760,32.510086,35.021494,92.0 459 | 2015-08-20 04:08:47.832,32.510153,35.021456,94.5 460 | 2015-08-20 04:08:48.774,32.510169,35.021447,94.0 461 | 2015-08-20 04:08:53.897,32.51024,35.021412,95.5999984741211 462 | 2015-08-20 04:08:54.788,32.510255,35.021404,95.8000030517578 463 | 2015-08-20 04:08:59.841,32.510334,35.021376,97.9000015258789 464 | 2015-08-20 04:09:00.764,32.51035,35.021375,98.5 465 | 2015-08-20 04:09:05.833,32.510434,35.021379,100.3000030517578 466 | 2015-08-20 04:09:06.775,32.510449,35.021382,100.3000030517578 467 | 2015-08-20 04:09:11.860,32.51053,35.021413,101.0 468 | 2015-08-20 04:09:12.835,32.510546,35.021419,101.0999984741211 469 | 2015-08-20 04:09:17.860,32.510605,35.021491,99.5999984741211 470 | 2015-08-20 04:09:18.765,32.510614,35.021508,99.1999969482422 471 | 2015-08-20 04:09:23.855,32.510657,35.021598,98.9000015258789 472 | 2015-08-20 04:09:24.776,32.510665,35.021618,98.6999969482422 473 | 2015-08-20 04:09:28.839,32.510702,35.021694,99.1999969482422 474 | 2015-08-20 04:09:29.768,32.510714,35.021709,99.1999969482422 475 | 2015-08-20 04:09:34.851,32.510775,35.021785,99.4000015258789 476 | 2015-08-20 04:09:35.768,32.510788,35.021799,98.9000015258789 477 | 2015-08-20 04:09:39.837,32.510838,35.021858,99.0999984741211 478 | 2015-08-20 04:09:40.769,32.510849,35.021877,98.8000030517578 479 | 2015-08-20 04:09:44.872,32.51089,35.02196,97.4000015258789 480 | 2015-08-20 04:09:45.774,32.510899,35.02198,98.1999969482422 481 | 2015-08-20 04:09:49.854,32.510933,35.022068,98.5 482 | 2015-08-20 04:09:50.768,32.51094,35.022091,97.6999969482422 483 | 2015-08-20 04:09:54.847,32.510969,35.022182,97.6999969482422 484 | 2015-08-20 04:09:55.768,32.510979,35.022202,97.5999984741211 485 | 2015-08-20 04:09:59.850,32.511022,35.022282,97.5 486 | 2015-08-20 04:10:00.776,32.511032,35.0223,97.5999984741211 487 | 2015-08-20 04:10:05.856,32.511085,35.022376,98.9000015258789 488 | 2015-08-20 04:10:06.766,32.511094,35.022391,98.6999969482422 489 | 2015-08-20 04:10:12.468,32.511146,35.022471,99.8000030517578 490 | 2015-08-20 04:10:12.830,32.511155,35.022488,99.9000015258789 491 | 2015-08-20 04:10:17.817,32.511197,35.022577,99.6999969482422 492 | 2015-08-20 04:10:18.783,32.511205,35.022595,99.5999984741211 493 | 2015-08-20 04:10:23.827,32.511237,35.022677,100.6999969482422 494 | 2015-08-20 04:10:24.781,32.511247,35.02269,100.4000015258789 495 | 2015-08-20 04:10:29.980,32.511298,35.022761,101.8000030517578 496 | 2015-08-20 04:10:30.838,32.511309,35.022774,102.3000030517578 497 | 2015-08-20 04:10:35.889,32.51139,35.022733,103.3000030517578 498 | 2015-08-20 04:10:36.783,32.511398,35.022713,103.3000030517578 499 | 2015-08-20 04:10:40.836,32.511421,35.022627,99.9000015258789 500 | 2015-08-20 04:10:41.777,32.511418,35.0226,100.0999984741211 501 | 2015-08-20 04:10:45.853,32.511412,35.022497,99.5999984741211 502 | 2015-08-20 04:10:46.785,32.511417,35.022477,99.6999969482422 503 | 2015-08-20 04:10:51.857,32.511476,35.022398,103.5 504 | 2015-08-20 04:10:52.769,32.511487,35.022382,103.3000030517578 505 | 2015-08-20 04:10:57.843,32.511493,35.022287,100.6999969482422 506 | 2015-08-20 04:10:58.777,32.511486,35.022269,100.4000015258789 507 | 2015-08-20 04:11:02.933,32.511446,35.022192,100.6999969482422 508 | 2015-08-20 04:11:03.781,32.511434,35.022173,101.5 509 | 2015-08-20 04:11:07.870,32.511387,35.022099,103.8000030517578 510 | 2015-08-20 04:11:08.771,32.511378,35.022078,104.3000030517578 511 | 2015-08-20 04:11:12.832,32.511372,35.02199,105.5 512 | 2015-08-20 04:11:13.785,32.511375,35.021969,104.4000015258789 513 | 2015-08-20 04:11:18.859,32.511364,35.021865,104.4000015258789 514 | 2015-08-20 04:11:19.774,32.511358,35.021844,104.3000030517578 515 | 2015-08-20 04:11:23.916,32.511348,35.021755,104.3000030517578 516 | 2015-08-20 04:11:24.856,32.511341,35.021733,104.5999984741211 517 | 2015-08-20 04:11:28.859,32.511297,35.021653,103.5999984741211 518 | 2015-08-20 04:11:29.785,32.511285,35.021634,103.5999984741211 519 | 2015-08-20 04:11:33.916,32.511249,35.021544,102.6999969482422 520 | 2015-08-20 04:11:34.777,32.511242,35.021523,102.0 521 | 2015-08-20 04:11:38.845,32.511193,35.021447,101.6999969482422 522 | 2015-08-20 04:11:39.776,32.511181,35.02143,101.9000015258789 523 | 2015-08-20 04:11:43.854,32.511127,35.021367,101.4000015258789 524 | 2015-08-20 04:11:44.781,32.511111,35.021355,100.6999969482422 525 | 2015-08-20 04:11:48.862,32.511036,35.021326,99.6999969482422 526 | 2015-08-20 04:11:49.796,32.511016,35.021322,100.0999984741211 527 | 2015-08-20 04:11:53.868,32.510939,35.021304,99.4000015258789 528 | 2015-08-20 04:11:54.783,32.51092,35.021295,99.3000030517578 529 | 2015-08-20 04:11:58.880,32.510854,35.021241,99.5 530 | 2015-08-20 04:11:59.783,32.51084,35.021223,98.6999969482422 531 | 2015-08-20 04:12:03.871,32.510782,35.021152,97.3000030517578 532 | 2015-08-20 04:12:04.793,32.510766,35.021134,97.5999984741211 533 | 2015-08-20 04:12:08.851,32.510714,35.021052,96.5999984741211 534 | 2015-08-20 04:12:09.802,32.510703,35.02103,96.9000015258789 535 | 2015-08-20 04:12:13.871,32.510683,35.020927,96.0999984741211 536 | 2015-08-20 04:12:14.784,32.510684,35.020899,96.0999984741211 537 | 2015-08-20 04:12:17.844,32.510691,35.020811,96.5999984741211 538 | 2015-08-20 04:12:18.868,32.510695,35.02078,97.0 539 | 2015-08-20 04:12:21.929,32.51071,35.020689,96.6999969482422 540 | 2015-08-20 04:12:22.857,32.510717,35.02066,96.5999984741211 541 | 2015-08-20 04:12:25.926,32.51074,35.020582,96.0999984741211 542 | 2015-08-20 04:12:26.841,32.510747,35.020556,95.5999984741211 543 | 2015-08-20 04:12:30.906,32.510777,35.020461,94.3000030517578 544 | 2015-08-20 04:12:32.078,32.510786,35.020438,94.1999969482422 545 | 2015-08-20 04:12:35.899,32.510816,35.02034,92.4000015258789 546 | 2015-08-20 04:12:37.006,32.51082,35.020313,92.5999984741211 547 | 2015-08-20 04:12:39.957,32.510831,35.020222,93.9000015258789 548 | 2015-08-20 04:12:40.800,32.510836,35.020193,93.3000030517578 549 | 2015-08-20 04:12:43.876,32.510856,35.020111,93.5 550 | 2015-08-20 04:12:44.798,32.510863,35.020084,93.5 551 | 2015-08-20 04:12:47.876,32.510892,35.02001,92.9000015258789 552 | 2015-08-20 04:12:48.814,32.510902,35.019987,92.6999969482422 553 | 2015-08-20 04:12:52.978,32.510944,35.019899,92.3000030517578 554 | 2015-08-20 04:12:53.847,32.510955,35.019877,92.0 555 | 2015-08-20 04:12:57.829,32.510988,35.019784,92.1999969482422 556 | 2015-08-20 04:12:58.800,32.510993,35.019759,91.9000015258789 557 | 2015-08-20 04:13:01.913,32.511,35.019676,90.5999984741211 558 | 2015-08-20 04:13:03.025,32.511004,35.019648,90.5999984741211 559 | 2015-08-20 04:13:05.853,32.511023,35.019567,90.0 560 | 2015-08-20 04:13:06.809,32.511031,35.019541,89.5999984741211 561 | 2015-08-20 04:13:09.907,32.511058,35.01947,88.69999694824219 562 | 2015-08-20 04:13:11.796,32.511085,35.019434,88.5 563 | 2015-08-20 04:13:15.810,32.511152,35.019368,89.5999984741211 564 | 2015-08-20 04:13:16.782,32.51117,35.019353,89.0999984741211 565 | 2015-08-20 04:13:19.841,32.511213,35.019291,90.3000030517578 566 | 2015-08-20 04:13:20.799,32.511225,35.019267,91.4000015258789 567 | 2015-08-20 04:13:24.818,32.511276,35.019184,91.8000030517578 568 | 2015-08-20 04:13:25.969,32.511286,35.019163,92.0999984741211 569 | 2015-08-20 04:13:29.993,32.511319,35.01907,92.1999969482422 570 | 2015-08-20 04:13:30.782,32.51133,35.019048,92.6999969482422 571 | 2015-08-20 04:13:34.847,32.511367,35.018962,92.1999969482422 572 | 2015-08-20 04:13:35.784,32.511371,35.01894,91.9000015258789 573 | 2015-08-20 04:13:40.817,32.511413,35.01886,92.0999984741211 574 | 2015-08-20 04:13:41.783,32.511419,35.018845,92.0 575 | 2015-08-20 04:13:47.873,32.511452,35.018747,90.4000015258789 576 | 2015-08-20 04:13:48.828,32.511457,35.018728,91.0 577 | 2015-08-20 04:13:52.897,32.511486,35.018646,92.4000015258789 578 | 2015-08-20 04:13:53.799,32.511495,35.018627,91.9000015258789 579 | 2015-08-20 04:13:57.883,32.511541,35.018559,92.5 580 | 2015-08-20 04:13:58.794,32.511551,35.018542,91.8000030517578 581 | 2015-08-20 04:14:03.880,32.511598,35.01846,92.8000030517578 582 | 2015-08-20 04:14:04.928,32.511604,35.018444,92.5999984741211 583 | 2015-08-20 04:14:10.074,32.511663,35.018369,92.8000030517578 584 | 2015-08-20 04:14:10.882,32.511675,35.018355,92.4000015258789 585 | 2015-08-20 04:14:16.882,32.511724,35.018267,90.4000015258789 586 | 2015-08-20 04:14:17.787,32.511738,35.018253,90.5 587 | 2015-08-20 04:14:21.900,32.511797,35.018196,89.0999984741211 588 | 2015-08-20 04:14:22.795,32.511806,35.018176,88.80000305175781 589 | 2015-08-20 04:14:27.035,32.511863,35.018103,93.5 590 | 2015-08-20 04:14:27.814,32.511876,35.018086,93.3000030517578 591 | 2015-08-20 04:14:32.930,32.51191,35.01799,91.3000030517578 592 | 2015-08-20 04:14:33.823,32.511919,35.017974,91.0 593 | 2015-08-20 04:14:39.152,32.511969,35.0179,93.0 594 | 2015-08-20 04:14:39.822,32.511981,35.017886,92.3000030517578 595 | 2015-08-20 04:14:45.935,32.512028,35.017796,94.1999969482422 596 | 2015-08-20 04:14:46.797,32.512037,35.017785,94.1999969482422 597 | 2015-08-20 04:14:52.855,32.5121,35.017713,93.9000015258789 598 | 2015-08-20 04:14:53.800,32.512113,35.017704,94.6999969482422 599 | 2015-08-20 04:14:58.953,32.512166,35.017636,96.3000030517578 600 | 2015-08-20 04:14:59.818,32.512176,35.017623,96.0999984741211 601 | 2015-08-20 04:15:05.903,32.512235,35.017543,96.8000030517578 602 | 2015-08-20 04:15:06.857,32.512245,35.01753,97.0 603 | 2015-08-20 04:15:12.020,32.512297,35.017461,94.1999969482422 604 | 2015-08-20 04:15:12.817,32.512305,35.017448,93.6999969482422 605 | 2015-08-20 04:15:19.098,32.512358,35.017372,95.1999969482422 606 | 2015-08-20 04:15:19.947,32.512367,35.017358,94.9000015258789 607 | 2015-08-20 04:15:24.889,32.512411,35.017285,94.3000030517578 608 | 2015-08-20 04:15:25.969,32.512421,35.01727,95.0 609 | 2015-08-20 04:15:31.057,32.51248,35.017192,96.4000015258789 610 | 2015-08-20 04:15:31.836,32.512492,35.017175,96.1999969482422 611 | 2015-08-20 04:15:36.910,32.512551,35.017096,98.1999969482422 612 | 2015-08-20 04:15:37.812,32.512563,35.017081,99.0 613 | 2015-08-20 04:15:42.857,32.512622,35.017014,97.1999969482422 614 | 2015-08-20 04:15:43.904,32.512629,35.016998,96.9000015258789 615 | 2015-08-20 04:15:48.929,32.512679,35.016924,98.0 616 | 2015-08-20 04:15:49.830,32.512686,35.016908,97.8000030517578 617 | 2015-08-20 04:15:54.946,32.512727,35.016819,98.6999969482422 618 | 2015-08-20 04:15:55.863,32.512735,35.0168,97.9000015258789 619 | 2015-08-20 04:15:59.939,32.512763,35.016714,97.0 620 | 2015-08-20 04:16:00.878,32.512769,35.016691,98.0 621 | 2015-08-20 04:16:05.942,32.512842,35.016637,99.8000030517578 622 | 2015-08-20 04:16:06.875,32.512859,35.016648,100.3000030517578 623 | 2015-08-20 04:16:10.956,32.512922,35.016715,100.0 624 | 2015-08-20 04:16:11.879,32.512936,35.016735,100.5 625 | 2015-08-20 04:16:15.900,32.512992,35.016803,101.5 626 | 2015-08-20 04:16:16.890,32.513005,35.016819,100.6999969482422 627 | 2015-08-20 04:16:20.894,32.51307,35.016871,102.4000015258789 628 | 2015-08-20 04:16:21.815,32.513084,35.016884,102.5 629 | 2015-08-20 04:16:27.117,32.513151,35.016949,105.4000015258789 630 | 2015-08-20 04:16:27.981,32.513166,35.016961,105.3000030517578 631 | 2015-08-20 04:16:31.960,32.513221,35.01702,106.5999984741211 632 | 2015-08-20 04:16:32.888,32.513232,35.017037,107.3000030517578 633 | 2015-08-20 04:16:36.966,32.513276,35.017107,106.1999969482422 634 | 2015-08-20 04:16:37.866,32.513287,35.017123,107.4000015258789 635 | 2015-08-20 04:16:43.057,32.51333,35.017208,108.8000030517578 636 | 2015-08-20 04:16:43.873,32.51334,35.017226,110.3000030517578 637 | 2015-08-20 04:16:47.848,32.513398,35.017278,109.5 638 | 2015-08-20 04:16:48.815,32.513411,35.017291,109.9000015258789 639 | 2015-08-20 04:16:52.875,32.513464,35.017348,111.1999969482422 640 | 2015-08-20 04:16:53.817,32.513477,35.017364,112.5 641 | 2015-08-20 04:16:57.999,32.513534,35.017427,113.4000015258789 642 | 2015-08-20 04:16:58.839,32.513548,35.017441,113.6999969482422 643 | 2015-08-20 04:17:03.026,32.513618,35.017485,113.0 644 | 2015-08-20 04:17:03.872,32.513639,35.01749,112.8000030517578 645 | 2015-08-20 04:17:07.843,32.513718,35.017455,113.5999984741211 646 | 2015-08-20 04:17:08.815,32.513731,35.017436,113.6999969482422 647 | 2015-08-20 04:17:11.930,32.51377,35.017373,114.0999984741211 648 | 2015-08-20 04:17:12.887,32.513784,35.017349,114.0 649 | 2015-08-20 04:17:15.874,32.513828,35.017284,114.5 650 | 2015-08-20 04:17:16.827,32.513843,35.017263,114.5999984741211 651 | 2015-08-20 04:17:19.920,32.513887,35.017201,114.4000015258789 652 | 2015-08-20 04:17:20.855,32.513897,35.017175,113.9000015258789 653 | 2015-08-20 04:17:24.052,32.51393,35.017102,113.5 654 | 2015-08-20 04:17:25.054,32.513935,35.017077,113.5999984741211 655 | 2015-08-20 04:17:27.916,32.51393,35.016994,113.9000015258789 656 | 2015-08-20 04:17:28.819,32.513929,35.016965,114.9000015258789 657 | 2015-08-20 04:17:31.911,32.513936,35.016881,114.9000015258789 658 | 2015-08-20 04:17:32.827,32.513941,35.016855,114.3000030517578 659 | 2015-08-20 04:17:36.970,32.513958,35.016764,113.5999984741211 660 | 2015-08-20 04:17:37.876,32.513959,35.016742,113.5999984741211 661 | 2015-08-20 04:17:41.925,32.513989,35.01666,113.5999984741211 662 | 2015-08-20 04:17:42.821,32.513999,35.016639,113.6999969482422 663 | 2015-08-20 04:17:46.931,32.514054,35.016579,111.9000015258789 664 | 2015-08-20 04:17:47.947,32.514065,35.016562,112.8000030517578 665 | 2015-08-20 04:17:51.892,32.514112,35.016492,113.6999969482422 666 | 2015-08-20 04:17:52.841,32.514126,35.016471,113.8000030517578 667 | 2015-08-20 04:17:56.908,32.51417,35.016384,114.1999969482422 668 | 2015-08-20 04:17:57.824,32.514178,35.016362,114.3000030517578 669 | 2015-08-20 04:18:01.921,32.51421,35.016274,114.3000030517578 670 | 2015-08-20 04:18:02.823,32.514221,35.016254,114.1999969482422 671 | 2015-08-20 04:18:06.896,32.514278,35.016184,114.8000030517578 672 | 2015-08-20 04:18:07.813,32.514296,35.016171,115.5999984741211 673 | 2015-08-20 04:18:10.895,32.514355,35.016146,115.5999984741211 674 | 2015-08-20 04:18:13.814,32.514421,35.016143,116.3000030517578 675 | 2015-08-20 04:18:17.869,32.514502,35.016162,117.5999984741211 676 | 2015-08-20 04:18:18.813,32.514522,35.016165,117.5 677 | 2015-08-20 04:18:22.862,32.514598,35.016182,117.4000015258789 678 | 2015-08-20 04:18:23.814,32.514616,35.016187,117.0999984741211 679 | 2015-08-20 04:18:27.863,32.514686,35.016171,116.6999969482422 680 | 2015-08-20 04:18:28.816,32.514703,35.016158,116.5999984741211 681 | 2015-08-20 04:18:32.870,32.514754,35.016085,116.5999984741211 682 | 2015-08-20 04:18:33.815,32.514765,35.01607,115.8000030517578 683 | 2015-08-20 04:18:37.847,32.514825,35.016018,117.3000030517578 684 | 2015-08-20 04:18:38.816,32.514843,35.016007,117.6999969482422 685 | 2015-08-20 04:18:42.882,32.514921,35.015984,117.5999984741211 686 | 2015-08-20 04:18:43.815,32.514942,35.015984,118.3000030517578 687 | 2015-08-20 04:18:47.897,32.51503,35.01597,118.3000030517578 688 | 2015-08-20 04:18:48.836,32.515053,35.01597,118.0999984741211 689 | 2015-08-20 04:18:50.877,32.515114,35.015958,116.4000015258789 690 | 2015-08-20 04:18:51.819,32.515146,35.015951,117.0999984741211 691 | 2015-08-20 04:18:54.007,32.515209,35.015942,117.0999984741211 692 | 2015-08-20 04:18:54.893,32.51524,35.015937,117.5 693 | 2015-08-20 04:18:57.939,32.515328,35.015943,118.5999984741211 694 | 2015-08-20 04:18:58.845,32.515358,35.015946,118.5 695 | 2015-08-20 04:19:01.992,32.515443,35.015964,118.3000030517578 696 | 2015-08-20 04:19:02.889,32.515462,35.015973,118.3000030517578 697 | 2015-08-20 04:19:06.990,32.515544,35.01601,118.6999969482422 698 | 2015-08-20 04:19:07.888,32.51556,35.016017,118.5999984741211 699 | 2015-08-20 04:19:11.886,32.515638,35.016042,118.5999984741211 700 | 2015-08-20 04:19:12.819,32.51566,35.016051,118.0 701 | 2015-08-20 04:19:16.911,32.515738,35.016069,117.9000015258789 702 | 2015-08-20 04:19:17.842,32.515757,35.016076,117.1999969482422 703 | 2015-08-20 04:19:21.908,32.515844,35.016087,116.4000015258789 704 | 2015-08-20 04:19:22.820,32.51587,35.016071,116.1999969482422 705 | 2015-08-20 04:19:25.934,32.515933,35.016016,116.0 706 | 2015-08-20 04:19:26.831,32.515953,35.015993,116.8000030517578 707 | 2015-08-20 04:19:29.879,32.516001,35.015918,116.5 708 | 2015-08-20 04:19:30.833,32.51602,35.015894,117.0 709 | 2015-08-20 04:19:34.152,32.516074,35.015828,116.5 710 | 2015-08-20 04:19:34.904,32.516091,35.015804,116.5 711 | 2015-08-20 04:19:37.851,32.516142,35.01573,116.5999984741211 712 | 2015-08-20 04:19:38.820,32.516157,35.015705,116.5 713 | 2015-08-20 04:19:41.881,32.516211,35.01564,115.4000015258789 714 | 2015-08-20 04:19:42.825,32.516225,35.015617,114.0999984741211 715 | 2015-08-20 04:19:45.963,32.516278,35.015551,113.5 716 | 2015-08-20 04:19:46.890,32.516301,35.015533,112.5 717 | 2015-08-20 04:19:49.987,32.516361,35.015468,112.0 718 | 2015-08-20 04:19:50.878,32.51638,35.015444,112.6999969482422 719 | 2015-08-20 04:19:53.937,32.516442,35.015369,112.5 720 | 2015-08-20 04:19:54.896,32.516462,35.015343,112.5999984741211 721 | 2015-08-20 04:19:58.048,32.516517,35.015264,112.3000030517578 722 | 2015-08-20 04:19:58.898,32.516537,35.015238,112.0999984741211 723 | 2015-08-20 04:20:01.965,32.516592,35.015157,110.0999984741211 724 | 2015-08-20 04:20:02.886,32.51661,35.015129,109.8000030517578 725 | 2015-08-20 04:20:05.959,32.516665,35.015048,107.6999969482422 726 | 2015-08-20 04:20:06.823,32.516683,35.015023,107.5 727 | 2015-08-20 04:20:09.926,32.516736,35.014943,107.5999984741211 728 | 2015-08-20 04:20:10.824,32.516754,35.014916,107.0999984741211 729 | 2015-08-20 04:20:14.040,32.5168,35.014835,106.0999984741211 730 | 2015-08-20 04:20:14.888,32.516818,35.01481,105.1999969482422 731 | 2015-08-20 04:20:17.897,32.516873,35.014737,106.4000015258789 732 | 2015-08-20 04:20:18.844,32.516889,35.014709,106.4000015258789 733 | 2015-08-20 04:20:21.996,32.516933,35.014617,103.5 734 | 2015-08-20 04:20:22.897,32.516945,35.014584,103.0999984741211 735 | 2015-08-20 04:20:24.905,32.516971,35.014518,103.8000030517578 736 | 2015-08-20 04:20:25.835,32.516984,35.014484,104.1999969482422 737 | 2015-08-20 04:20:28.982,32.51702,35.014387,104.8000030517578 738 | 2015-08-20 04:20:29.923,32.517035,35.014355,105.1999969482422 739 | 2015-08-20 04:20:32.863,32.517087,35.014279,102.9000015258789 740 | 2015-08-20 04:20:33.994,32.517098,35.014264,102.4000015258789 741 | 2015-08-20 04:20:42.329,32.517142,35.014212,103.4000015258789 742 | -------------------------------------------------------------------------------- /Ch03/03_05/speed.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | csv_file = 'track.csv' 5 | df = pd.read_csv(csv_file, parse_dates=['time']) 6 | df 7 | 8 | # %% 9 | import numpy as np 10 | 11 | lat_km = 92 12 | lng_km = 111 13 | 14 | 15 | def distance(lat1, lng1, lat2, lng2): 16 | delta_lat = (lat1 - lat2) * lat_km 17 | delta_lng = (lng1 - lng2) * lng_km 18 | return np.hypot(delta_lat, delta_lng) 19 | # %% 20 | lat1, lng1 = df.loc[200]['lat'], df.iloc[200]['lng'] 21 | lat2, lng2 = df.loc[201]['lat'], df.iloc[201]['lng'] 22 | distance(lat1, lng1, lat2, lng2) 23 | # %% 24 | s = pd.Series(np.arange(5)) 25 | s 26 | 27 | # %% 28 | s.shift() 29 | 30 | # %% 31 | s.shift(-1) 32 | 33 | 34 | # %% 35 | dist = distance( 36 | df['lat'], df['lng'], 37 | df['lat'].shift(), df['lng'].shift(), 38 | ) 39 | dist[:5] 40 | 41 | # %% 42 | dist.sum() 43 | 44 | # %% 45 | times = df['time'].diff() 46 | times[:5] 47 | 48 | # %% 49 | times.sum() 50 | 51 | # %% 52 | 53 | times_hour = times / pd.Timedelta(1, 'hour') 54 | times_hour[:5] 55 | 56 | # %% 57 | speed = dist / times_hour 58 | speed[:5] -------------------------------------------------------------------------------- /Ch03/03_06/box_plot.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | import numpy as np 4 | 5 | csv_file = 'track.csv' 6 | df = pd.read_csv(csv_file, parse_dates=['time']) 7 | 8 | lat_km = 92 9 | lng_km = 111 10 | 11 | def distance(lat1, lng1, lat2, lng2): 12 | delta_lat = (lat1 - lat2) * lat_km 13 | delta_lng = (lng1 - lng2) * lng_km 14 | return np.hypot(delta_lat, delta_lng) 15 | 16 | dist = distance( 17 | df['lat'], df['lng'], 18 | df['lat'].shift(), df['lng'].shift(), 19 | ) 20 | times = df['time'].diff() 21 | times_hour = times / pd.Timedelta(1, 'hour') 22 | speed = dist / times_hour 23 | 24 | # %% 25 | speed.describe() 26 | 27 | # %% 28 | speed.plot.box() 29 | 30 | # %% 31 | import matplotlib.pyplot as plt 32 | 33 | plt.rcParams['figure.figsize'] = (10, 6) 34 | plt.style.use('seaborn-whitegrid') 35 | speed.plot.box() 36 | 37 | # %% 38 | speed.name = '' 39 | ax = speed.plot.box(title="Miki's Run") 40 | ax.set_ylabel( 41 | r'Running speed $\frac{km}{h}$') 42 | # %% 43 | -------------------------------------------------------------------------------- /Ch03/challenge/download_data.py: -------------------------------------------------------------------------------- 1 | from urllib.request import urlretrieve 2 | 3 | dl_size = 0 4 | 5 | def reporthook(_, size, total): 6 | global dl_size 7 | 8 | dl_size += size 9 | precent = dl_size / total * 100 10 | print(f' {precent:.2f}%', end='\r') 11 | 12 | data_url = 'https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2020-08.parquet' 13 | out_file = 'taxi.parquet' 14 | urlretrieve(data_url, out_file, reporthook=reporthook) 15 | -------------------------------------------------------------------------------- /Ch03/challenge/mean_speed.py: -------------------------------------------------------------------------------- 1 | # What is the mean speed (mile/hour) in taxi.parquet? 2 | 3 | # - Run download_data.py to download the data 4 | -------------------------------------------------------------------------------- /Ch03/solution/download_data.py: -------------------------------------------------------------------------------- 1 | from urllib.request import urlretrieve 2 | 3 | dl_size = 0 4 | 5 | def reporthook(_, size, total): 6 | global dl_size 7 | 8 | dl_size += size 9 | precent = dl_size / total * 100 10 | print(f' {precent:.2f}%', end='\r') 11 | 12 | data_url = 'https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2020-08.parquet' 13 | out_file = 'taxi.parquet' 14 | urlretrieve(data_url, out_file, reporthook=reporthook) 15 | -------------------------------------------------------------------------------- /Ch03/solution/mean_speed.py: -------------------------------------------------------------------------------- 1 | # What is the mean speed (mile/hour) in taxi.parquet? 2 | 3 | # - Run download_data.py to download the data 4 | 5 | # %% 6 | import pandas as pd 7 | 8 | df = pd.read_parquet('taxi.parquet') 9 | 10 | # %% 11 | mask = df['tpep_dropoff_datetime'] > df['tpep_pickup_datetime'] 12 | df = df[mask] 13 | 14 | # %% 15 | times = df['tpep_dropoff_datetime'] - df['tpep_pickup_datetime'] 16 | times_hour = times / pd.Timedelta(1, 'hour') 17 | speed = df['trip_distance'] / times_hour 18 | 19 | # %% 20 | speed.mean() 21 | -------------------------------------------------------------------------------- /Ch04/04_01/map.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | df = pd.read_csv( 5 | 'track.csv', 6 | parse_dates=['time'], 7 | index_col='time', 8 | ) 9 | df.columns 10 | 11 | # %% 12 | df.index[:5] 13 | 14 | # %% 15 | import folium 16 | 17 | center = [df['lat'].mean(), df['lng'].mean()] 18 | m = folium.Map( 19 | location=center, 20 | zoom_start=15, 21 | ) 22 | m 23 | 24 | # %% 25 | m.save('track.html') -------------------------------------------------------------------------------- /Ch04/04_01/track.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Ch04/04_02/track.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | df = pd.read_csv( 5 | 'track.csv', 6 | parse_dates=['time'], 7 | index_col='time', 8 | ) 9 | 10 | # %% 11 | import folium 12 | 13 | center = [df['lat'].mean(), df['lng'].mean()] 14 | m = folium.Map( 15 | location=center, 16 | zoom_start=15, 17 | ) 18 | 19 | loc = tuple(df.iloc[100][['lat', 'lng']]) 20 | marker = folium.Marker(loc) 21 | marker.add_to(m) 22 | m 23 | 24 | # %% 25 | m = folium.Map( 26 | location=center, 27 | zoom_start=15, 28 | ) 29 | marker = folium.CircleMarker( 30 | loc, 31 | color='red') 32 | marker.add_to(m) 33 | m 34 | 35 | # %% 36 | m = folium.Map( 37 | location=center, 38 | zoom_start=15, 39 | ) 40 | marker = folium.CircleMarker( 41 | loc, 42 | color='red', 43 | popup='Hi there', 44 | ) 45 | marker.add_to(m) 46 | m 47 | 48 | # %% 49 | m = folium.Map( 50 | location=center, 51 | zoom_start=15, 52 | ) 53 | 54 | def add_marker(row): 55 | loc = tuple(row[['lat', 'lng']]) 56 | marker = folium.CircleMarker( 57 | loc, 58 | radius=5, 59 | color='red', 60 | popup=row.name.strftime('%H:%M'), 61 | ) 62 | marker.add_to(m) 63 | 64 | add_marker(df.iloc[200]) 65 | m 66 | # %% 67 | m = folium.Map( 68 | location=center, 69 | zoom_start=15, 70 | ) 71 | df.apply(add_marker, axis=1) 72 | m 73 | 74 | # %% 75 | m = folium.Map( 76 | location=center, 77 | zoom_start=15, 78 | ) 79 | min_df = df.resample('min').mean() 80 | min_df.apply(add_marker, axis=1) 81 | m -------------------------------------------------------------------------------- /Ch04/04_03/geo.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from shapely.geometry import Point 3 | 4 | pt = Point(1, 2) 5 | pt 6 | 7 | # %% 8 | pt.x, pt.y 9 | 10 | # %% 11 | from shapely.geometry import Polygon 12 | 13 | poly = Polygon([ 14 | [0, 0], 15 | [0, 10], 16 | [10, 10], 17 | [10, 0], 18 | ]) 19 | poly 20 | 21 | # %% 22 | poly.area 23 | 24 | # %% 25 | poly.centroid 26 | 27 | # %% 28 | poly.intersects(pt) 29 | 30 | # %% 31 | poly.intersects(Point(10, 20)) 32 | 33 | # %% 34 | import pandas as pd 35 | 36 | df = pd.read_csv( 37 | 'track.csv', 38 | parse_dates=['time'], 39 | index_col='time', 40 | ) 41 | df = df.resample('min').mean() 42 | 43 | # %% 44 | df['point'] = ( 45 | df[['lat', 'lng']] 46 | .apply(Point, axis=1) 47 | ) 48 | df.head() 49 | 50 | # %% 51 | mid_lat, max_lat = \ 52 | df['lat'].mean(), df['lat'].max() 53 | mid_lng, max_lng = \ 54 | df['lng'].mean(), df['lng'].max() 55 | poly = Polygon([ 56 | [mid_lat, mid_lng], 57 | [mid_lat, max_lng], 58 | [max_lat, max_lng], 59 | [max_lat, mid_lng], 60 | ]) 61 | poly 62 | 63 | # %% 64 | df[df['point'].apply(poly.intersects)] 65 | 66 | # %% 67 | poly.exterior.xy 68 | # %% 69 | import numpy as np 70 | 71 | np.stack(poly.exterior.xy) 72 | 73 | # %% 74 | np.stack(poly.exterior.xy).T 75 | 76 | # %% 77 | import folium 78 | 79 | m = folium.Map( 80 | location=[df['lat'].mean(), df['lng'].mean()], 81 | zoom_start=15, 82 | ) 83 | points = np.stack(poly.exterior.xy).T 84 | m.add_child(folium.PolyLine(points)) 85 | m 86 | 87 | # %% 88 | center = [df['lat'].mean(), df['lng'].mean()] 89 | m = folium.Map( 90 | location=center, 91 | zoom_start=15, 92 | ) 93 | m.add_child(folium.PolyLine(points)) 94 | 95 | def add_marker(row): 96 | loc = tuple(row[['lat', 'lng']]) 97 | in_poly = poly.intersects(row['point']) 98 | marker = folium.CircleMarker( 99 | loc, 100 | radius=5, 101 | color='yellow' if in_poly else 'green', 102 | popup=row.name.strftime('%H:%M'), 103 | ) 104 | marker.add_to(m) 105 | 106 | df.apply(add_marker, axis=1) 107 | m -------------------------------------------------------------------------------- /Ch04/challenge/height.py: -------------------------------------------------------------------------------- 1 | # Draw the running track from track.csv 2 | # 3 | # - Sample data to a minute interval 4 | # - Markers should be blue if the height is below 100 meter, otherwise red -------------------------------------------------------------------------------- /Ch04/solution/height.py: -------------------------------------------------------------------------------- 1 | # Draw the running track from track.csv 2 | # 3 | # - Sample data to a minute interval 4 | # - Markers should be blue if the height is below 100 meter, otherwise red 5 | 6 | # %% 7 | import pandas as pd 8 | 9 | df = pd.read_csv( 10 | 'track.csv', 11 | parse_dates=['time'], 12 | index_col='time', 13 | ) 14 | df = df.resample('min').mean() 15 | # %% 16 | import folium 17 | 18 | m = folium.Map( 19 | location=[df['lat'].mean(), df['lng'].mean()], 20 | zoom_start=15, 21 | ) 22 | 23 | def add_marker(row): 24 | loc = tuple(row[['lat', 'lng']]) 25 | marker = folium.CircleMarker( 26 | loc, 27 | radius=5, 28 | color='blue' if row['height'] < 100 else 'red', 29 | popup=row.name.strftime('%H:%M'), 30 | ) 31 | marker.add_to(m) 32 | 33 | df.apply(add_marker, axis=1) 34 | m -------------------------------------------------------------------------------- /Ch05/05_01/download_data.py: -------------------------------------------------------------------------------- 1 | """Download 10% of January 2016 taxi data to taxi.csv""" 2 | 3 | from urllib.request import urlopen 4 | from time import monotonic 5 | from pathlib import Path 6 | 7 | here = Path(__file__).absolute().parent 8 | csv_file = here / 'taxi.csv' 9 | url = 'https://s3.amazonaws.com/nyc-tlc/csv_backup/yellow_tripdata_2016-01.csv' 10 | out_name = '/'.join(csv_file.parts[-3:]) 11 | 12 | start = monotonic() 13 | with urlopen(url) as resp: 14 | payload_size = int(resp.headers['Content-Length']) 15 | size_mb = payload_size / (2**20) 16 | print(f'downloading 10% of {size_mb:.2f}MB to {out_name}') 17 | size = 0 18 | with open(csv_file, 'wb') as out: 19 | for i, line in enumerate(resp): 20 | size += len(line) 21 | prec = (size / payload_size) * 100 22 | print(f' {prec:.2f}%', end='\r') 23 | if i % 10 != 0: 24 | continue 25 | out.write(line) 26 | 27 | if size != payload_size: 28 | raise SystemError(f'error: expected {payload_size} bytes, got {size}') 29 | 30 | duration = int(monotonic() - start) 31 | print(f'{csv_file}: {size_mb:.1f}MB downloaded in {duration} seconds') 32 | -------------------------------------------------------------------------------- /Ch05/05_01/first_look.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from pathlib import Path 3 | 4 | csv_file = Path('taxi.csv') 5 | mb = 2**20 6 | csv_file.stat().st_size / mb 7 | 8 | # %% 9 | num_lines = 0 10 | with csv_file.open() as fp: 11 | for lnum, line in enumerate(fp): 12 | if lnum < 5: 13 | print(line, end='') 14 | num_lines += 1 15 | 16 | print(f'lines: {num_lines:,}') -------------------------------------------------------------------------------- /Ch05/05_02/download_data.py: -------------------------------------------------------------------------------- 1 | """Download 10% of January 2016 taxi data to taxi.csv""" 2 | 3 | from urllib.request import urlopen 4 | from time import monotonic 5 | from pathlib import Path 6 | 7 | here = Path(__file__).absolute().parent 8 | csv_file = here / 'taxi.csv' 9 | url = 'https://s3.amazonaws.com/nyc-tlc/csv_backup/yellow_tripdata_2016-01.csv' 10 | out_name = '/'.join(csv_file.parts[-3:]) 11 | 12 | start = monotonic() 13 | with urlopen(url) as resp: 14 | payload_size = int(resp.headers['Content-Length']) 15 | size_mb = payload_size / (2**20) 16 | print(f'downloading 10% of {size_mb:.2f}MB to {out_name}') 17 | size = 0 18 | with open(csv_file, 'wb') as out: 19 | for i, line in enumerate(resp): 20 | size += len(line) 21 | prec = (size / payload_size) * 100 22 | print(f' {prec:.2f}%', end='\r') 23 | if i % 10 != 0: 24 | continue 25 | out.write(line) 26 | 27 | if size != payload_size: 28 | raise SystemError(f'error: expected {payload_size} bytes, got {size}') 29 | 30 | duration = int(monotonic() - start) 31 | print(f'{csv_file}: {size_mb:.1f}MB downloaded in {duration} seconds') 32 | -------------------------------------------------------------------------------- /Ch05/05_02/load.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | csv_file = 'taxi.csv' 5 | df = pd.read_csv(csv_file) 6 | print(f'{len(df):,}') 7 | 8 | # %% 9 | df.iloc[0] 10 | 11 | # %% 12 | df.dtypes 13 | 14 | # %% 15 | time_cols = [ 16 | 'tpep_pickup_datetime', 17 | 'tpep_dropoff_datetime', 18 | ] 19 | df = pd.read_csv( 20 | csv_file, 21 | parse_dates=time_cols, 22 | ) 23 | df.dtypes -------------------------------------------------------------------------------- /Ch05/05_03/categorical.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | time_cols = [ 5 | 'tpep_pickup_datetime', 6 | 'tpep_dropoff_datetime', 7 | ] 8 | df = pd.read_csv( 9 | 'taxi.csv', 10 | parse_dates=time_cols, 11 | ) 12 | df.dtypes 13 | 14 | # %% 15 | df['VendorID'].unique() 16 | 17 | # %% 18 | vendors = { 19 | 1: 'Creative', 20 | 2: 'VeriFone', 21 | } 22 | df['Vendor'] = df['VendorID'].map(vendors) 23 | df['Vendor'].head() 24 | 25 | # %% 26 | mb = 2**20 27 | df['Vendor'].memory_usage(deep=True) / mb 28 | 29 | # %% 30 | df['Vendor'] = ( 31 | df['VendorID'] 32 | .map(vendors) 33 | .astype('category') 34 | ) 35 | df['Vendor'].head() 36 | 37 | # %% 38 | df['Vendor'].memory_usage(deep=True) / mb 39 | 40 | # %% 41 | df['Vendor'].head().cat.codes 42 | 43 | # %% 44 | len(df[df['Vendor'] == 'VeriFone']) -------------------------------------------------------------------------------- /Ch05/05_03/download_data.py: -------------------------------------------------------------------------------- 1 | """Download 10% of January 2016 taxi data to taxi.csv""" 2 | 3 | from urllib.request import urlopen 4 | from time import monotonic 5 | from pathlib import Path 6 | 7 | here = Path(__file__).absolute().parent 8 | csv_file = here / 'taxi.csv' 9 | url = 'https://s3.amazonaws.com/nyc-tlc/csv_backup/yellow_tripdata_2016-01.csv' 10 | out_name = '/'.join(csv_file.parts[-3:]) 11 | 12 | start = monotonic() 13 | with urlopen(url) as resp: 14 | payload_size = int(resp.headers['Content-Length']) 15 | size_mb = payload_size / (2**20) 16 | print(f'downloading 10% of {size_mb:.2f}MB to {out_name}') 17 | size = 0 18 | with open(csv_file, 'wb') as out: 19 | for i, line in enumerate(resp): 20 | size += len(line) 21 | prec = (size / payload_size) * 100 22 | print(f' {prec:.2f}%', end='\r') 23 | if i % 10 != 0: 24 | continue 25 | out.write(line) 26 | 27 | if size != payload_size: 28 | raise SystemError(f'error: expected {payload_size} bytes, got {size}') 29 | 30 | duration = int(monotonic() - start) 31 | print(f'{csv_file}: {size_mb:.1f}MB downloaded in {duration} seconds') 32 | -------------------------------------------------------------------------------- /Ch05/05_04/daily.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | time_cols = [ 5 | 'tpep_pickup_datetime', 6 | 'tpep_dropoff_datetime', 7 | ] 8 | df = pd.read_csv( 9 | 'taxi.csv', 10 | parse_dates=time_cols, 11 | ) 12 | vendors = { 13 | 1: 'Creative', 14 | 2: 'VeriFone', 15 | } 16 | df['Vendor'] = \ 17 | df['VendorID'].map(vendors).astype('category') 18 | 19 | # %% 20 | df['tpep_pickup_datetime'].head() 21 | 22 | # %% 23 | ts = pd.Timestamp(2021, 11, 1, 14, 37, 39, 3920) 24 | ts 25 | 26 | # %% 27 | ts.floor('D') 28 | 29 | # %% 30 | df['tpep_pickup_datetime'].head().floor('D') 31 | 32 | # %% 33 | df['tpep_pickup_datetime'].head().dt.floor('D') 34 | 35 | # %% 36 | keys = \ 37 | df['tpep_pickup_datetime'].dt.floor('D') 38 | df.groupby(keys) 39 | 40 | # %% 41 | df.groupby(keys).count() 42 | 43 | # %% 44 | ( 45 | df.groupby(keys) 46 | .count() 47 | ['VendorID'] 48 | .plot.bar() 49 | ) 50 | 51 | # %% 52 | s = ( 53 | df.groupby(keys) 54 | .count() 55 | ['VendorID'] 56 | ) 57 | s.index = s.index.day 58 | s.index.name = 'Date' 59 | ax = s.plot.bar( 60 | title='Daily Taxi Rides (Jan 2016)', 61 | rot=0, 62 | ) 63 | ax.set_ylabel('Number of Rides') 64 | -------------------------------------------------------------------------------- /Ch05/05_04/download_data.py: -------------------------------------------------------------------------------- 1 | """Download 10% of January 2016 taxi data to taxi.csv""" 2 | 3 | from urllib.request import urlopen 4 | from time import monotonic 5 | from pathlib import Path 6 | 7 | here = Path(__file__).absolute().parent 8 | csv_file = here / 'taxi.csv' 9 | url = 'https://s3.amazonaws.com/nyc-tlc/csv_backup/yellow_tripdata_2016-01.csv' 10 | out_name = '/'.join(csv_file.parts[-3:]) 11 | 12 | start = monotonic() 13 | with urlopen(url) as resp: 14 | payload_size = int(resp.headers['Content-Length']) 15 | size_mb = payload_size / (2**20) 16 | print(f'downloading 10% of {size_mb:.2f}MB to {out_name}') 17 | size = 0 18 | with open(csv_file, 'wb') as out: 19 | for i, line in enumerate(resp): 20 | size += len(line) 21 | prec = (size / payload_size) * 100 22 | print(f' {prec:.2f}%', end='\r') 23 | if i % 10 != 0: 24 | continue 25 | out.write(line) 26 | 27 | if size != payload_size: 28 | raise SystemError(f'error: expected {payload_size} bytes, got {size}') 29 | 30 | duration = int(monotonic() - start) 31 | print(f'{csv_file}: {size_mb:.1f}MB downloaded in {duration} seconds') 32 | -------------------------------------------------------------------------------- /Ch05/05_05/download_data.py: -------------------------------------------------------------------------------- 1 | """Download 10% of January 2016 taxi data to taxi.csv""" 2 | 3 | from urllib.request import urlopen 4 | from time import monotonic 5 | from pathlib import Path 6 | 7 | here = Path(__file__).absolute().parent 8 | csv_file = here / 'taxi.csv' 9 | url = 'https://s3.amazonaws.com/nyc-tlc/csv_backup/yellow_tripdata_2016-01.csv' 10 | out_name = '/'.join(csv_file.parts[-3:]) 11 | 12 | start = monotonic() 13 | with urlopen(url) as resp: 14 | payload_size = int(resp.headers['Content-Length']) 15 | size_mb = payload_size / (2**20) 16 | print(f'downloading 10% of {size_mb:.2f}MB to {out_name}') 17 | size = 0 18 | with open(csv_file, 'wb') as out: 19 | for i, line in enumerate(resp): 20 | size += len(line) 21 | prec = (size / payload_size) * 100 22 | print(f' {prec:.2f}%', end='\r') 23 | if i % 10 != 0: 24 | continue 25 | out.write(line) 26 | 27 | if size != payload_size: 28 | raise SystemError(f'error: expected {payload_size} bytes, got {size}') 29 | 30 | duration = int(monotonic() - start) 31 | print(f'{csv_file}: {size_mb:.1f}MB downloaded in {duration} seconds') 32 | -------------------------------------------------------------------------------- /Ch05/05_05/hourly.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | time_cols = [ 5 | 'tpep_pickup_datetime', 6 | 'tpep_dropoff_datetime', 7 | ] 8 | df = pd.read_csv( 9 | 'taxi.csv', 10 | parse_dates=time_cols, 11 | ) 12 | vendors = { 13 | 1: 'Creative', 14 | 2: 'VeriFone', 15 | } 16 | df['Vendor'] = \ 17 | df['VendorID'].map(vendors).astype('category') 18 | 19 | # %% 20 | df['hour'] = \ 21 | df['tpep_pickup_datetime'].dt.hour 22 | df['day'] = \ 23 | df['tpep_pickup_datetime'].dt.date 24 | df[['day', 'hour']].head() 25 | 26 | # %% 27 | ( 28 | df.groupby(['Vendor', 'day', 'hour']) 29 | .count() 30 | ['Vendor'] 31 | ) 32 | 33 | # %% 34 | ( 35 | df.groupby(['Vendor', 'day', 'hour']) 36 | .count() 37 | .index 38 | ) 39 | 40 | # %% 41 | ( 42 | df.groupby( 43 | ['Vendor', 'day', 'hour'], 44 | as_index=False 45 | ) 46 | .count() 47 | .columns 48 | ) 49 | 50 | # %% 51 | daily_df = ( 52 | df 53 | .groupby(['Vendor', 'day', 'hour'], as_index=False) 54 | .count() 55 | ) 56 | hourly_df = ( 57 | daily_df 58 | .groupby(['Vendor', 'hour'], as_index=False) 59 | ['VendorID'] 60 | .median() 61 | ) 62 | hourly_df 63 | 64 | # %% 65 | hourly_df.pivot( 66 | columns='Vendor', 67 | index='hour', 68 | values='VendorID' 69 | ).plot.bar(rot=0) -------------------------------------------------------------------------------- /Ch05/05_06/download_data.py: -------------------------------------------------------------------------------- 1 | """Download 10% of January 2016 taxi data to taxi.csv""" 2 | 3 | from urllib.request import urlopen 4 | from time import monotonic 5 | from pathlib import Path 6 | 7 | here = Path(__file__).absolute().parent 8 | csv_file = here / 'taxi.csv' 9 | url = 'https://s3.amazonaws.com/nyc-tlc/csv_backup/yellow_tripdata_2016-01.csv' 10 | out_name = '/'.join(csv_file.parts[-3:]) 11 | 12 | start = monotonic() 13 | with urlopen(url) as resp: 14 | payload_size = int(resp.headers['Content-Length']) 15 | size_mb = payload_size / (2**20) 16 | print(f'downloading 10% of {size_mb:.2f}MB to {out_name}') 17 | size = 0 18 | with open(csv_file, 'wb') as out: 19 | for i, line in enumerate(resp): 20 | size += len(line) 21 | prec = (size / payload_size) * 100 22 | print(f' {prec:.2f}%', end='\r') 23 | if i % 10 != 0: 24 | continue 25 | out.write(line) 26 | 27 | if size != payload_size: 28 | raise SystemError(f'error: expected {payload_size} bytes, got {size}') 29 | 30 | duration = int(monotonic() - start) 31 | print(f'{csv_file}: {size_mb:.1f}MB downloaded in {duration} seconds') 32 | -------------------------------------------------------------------------------- /Ch05/05_06/download_weather.py: -------------------------------------------------------------------------------- 1 | from urllib.request import urlretrieve 2 | from pathlib import Path 3 | 4 | here = Path(__file__).absolute().parent 5 | csv_file = here / 'weather.csv' 6 | 7 | url = ( 8 | 'https://www.ncei.noaa.gov/data/' 9 | 'global-historical-climatology-network-daily/access/USW00094789.csv' 10 | ) 11 | 12 | out_name = '/'.join(csv_file.parts[-3:]) 13 | print(f'downloading weather to {out_name}') 14 | urlretrieve(url, csv_file) -------------------------------------------------------------------------------- /Ch05/05_06/weather.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | time_cols = [ 5 | 'tpep_pickup_datetime', 6 | 'tpep_dropoff_datetime', 7 | ] 8 | df = pd.read_csv( 9 | 'taxi.csv', 10 | parse_dates=time_cols, 11 | ) 12 | vendors = { 13 | 1: 'Creative', 14 | 2: 'VeriFone', 15 | } 16 | df['Vendor'] = \ 17 | df['VendorID'].map(vendors).astype('category') 18 | 19 | # %% 20 | wdf = pd.read_csv( 21 | 'weather.csv', 22 | parse_dates=['DATE'], 23 | index_col='DATE' 24 | ) 25 | wdf.head() 26 | 27 | # %% 28 | wdf.describe() 29 | 30 | # %% 31 | from scipy.constants import convert_temperature 32 | 33 | wdf['tempF'] = convert_temperature( 34 | wdf['TMAX']/10, 'C', 'F') 35 | wdf['tempF'].sample(10) 36 | 37 | # %% 38 | ddf = ( 39 | df.groupby( 40 | df['tpep_pickup_datetime'].dt.date) 41 | .count() 42 | ) 43 | ddf.head() 44 | 45 | # %% 46 | jdf = pd.merge( 47 | ddf, wdf, 48 | left_index=True, right_index=True, 49 | ) 50 | jdf.head() 51 | 52 | # %% 53 | jdf.plot.scatter(x='tempF', y='Vendor'); -------------------------------------------------------------------------------- /Ch05/challenge/by_count.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinkedInLearning/data-science-foundations-python-scientific-stack-3084641/cb2d7702e66ff3e80816d9f49844c80c18cfa0ba/Ch05/challenge/by_count.png -------------------------------------------------------------------------------- /Ch05/challenge/by_weekday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinkedInLearning/data-science-foundations-python-scientific-stack-3084641/cb2d7702e66ff3e80816d9f49844c80c18cfa0ba/Ch05/challenge/by_weekday.png -------------------------------------------------------------------------------- /Ch05/challenge/download_data.py: -------------------------------------------------------------------------------- 1 | """Download 10% of January 2016 taxi data to taxi.csv""" 2 | 3 | from urllib.request import urlopen 4 | from time import monotonic 5 | from pathlib import Path 6 | 7 | here = Path(__file__).absolute().parent 8 | csv_file = here / 'taxi.csv' 9 | url = 'https://s3.amazonaws.com/nyc-tlc/csv_backup/yellow_tripdata_2016-01.csv' 10 | out_name = '/'.join(csv_file.parts[-3:]) 11 | 12 | start = monotonic() 13 | with urlopen(url) as resp: 14 | payload_size = int(resp.headers['Content-Length']) 15 | size_mb = payload_size / (2**20) 16 | print(f'downloading 10% of {size_mb:.2f}MB to {out_name}') 17 | size = 0 18 | with open(csv_file, 'wb') as out: 19 | for i, line in enumerate(resp): 20 | size += len(line) 21 | prec = (size / payload_size) * 100 22 | print(f' {prec:.2f}%', end='\r') 23 | if i % 10 != 0: 24 | continue 25 | out.write(line) 26 | 27 | if size != payload_size: 28 | raise SystemError(f'error: expected {payload_size} bytes, got {size}') 29 | 30 | duration = int(monotonic() - start) 31 | print(f'{csv_file}: {size_mb:.1f}MB downloaded in {duration} seconds') 32 | -------------------------------------------------------------------------------- /Ch05/challenge/tip.py: -------------------------------------------------------------------------------- 1 | """ 2 | - Load the taxi data. 3 | - Remove all rows with either total_amount <= 0 or 4 | passenger_count == 0 5 | - Create a bar chart of average tip % per passenger_count 6 | - Create a bar chart of average tip % per day of week 7 | """ 8 | -------------------------------------------------------------------------------- /Ch05/solution/download_data.py: -------------------------------------------------------------------------------- 1 | """Download 10% of January 2016 taxi data to taxi.csv""" 2 | 3 | from urllib.request import urlopen 4 | from time import monotonic 5 | from pathlib import Path 6 | 7 | here = Path(__file__).absolute().parent 8 | csv_file = here / 'taxi.csv' 9 | url = 'https://s3.amazonaws.com/nyc-tlc/csv_backup/yellow_tripdata_2016-01.csv' 10 | out_name = '/'.join(csv_file.parts[-3:]) 11 | 12 | start = monotonic() 13 | with urlopen(url) as resp: 14 | payload_size = int(resp.headers['Content-Length']) 15 | size_mb = payload_size / (2**20) 16 | print(f'downloading 10% of {size_mb:.2f}MB to {out_name}') 17 | size = 0 18 | with open(csv_file, 'wb') as out: 19 | for i, line in enumerate(resp): 20 | size += len(line) 21 | prec = (size / payload_size) * 100 22 | print(f' {prec:.2f}%', end='\r') 23 | if i % 10 != 0: 24 | continue 25 | out.write(line) 26 | 27 | if size != payload_size: 28 | raise SystemError(f'error: expected {payload_size} bytes, got {size}') 29 | 30 | duration = int(monotonic() - start) 31 | print(f'{csv_file}: {size_mb:.1f}MB downloaded in {duration} seconds') 32 | -------------------------------------------------------------------------------- /Ch05/solution/tip.py: -------------------------------------------------------------------------------- 1 | """ 2 | - Load the taxi data. 3 | - Remove all rows with either total_amount <= 0 or 4 | passenger_count == 0 5 | - Create a bar chart of average tip % per passenger_count 6 | - Create a bar chart of average tip % per day of week 7 | """ 8 | 9 | # %% 10 | import pandas as pd 11 | 12 | time_cols = [ 13 | 'tpep_pickup_datetime', 14 | 'tpep_dropoff_datetime', 15 | ] 16 | df = pd.read_csv( 17 | 'taxi.csv', 18 | parse_dates=time_cols, 19 | ) 20 | vendors = { 21 | 1: 'Creative', 22 | 2: 'VeriFone', 23 | } 24 | df['Vendor'] = \ 25 | df['VendorID'].map(vendors).astype('category') 26 | len(df) 27 | 28 | # %% Drop bad data 29 | bad = df[ 30 | (df['total_amount'] <= 0) | 31 | (df['passenger_count'] == 0) 32 | ] 33 | df.drop(bad.index, inplace=True) 34 | len(df) 35 | 36 | # %% Helper column 37 | df['tip_pct'] = \ 38 | df['tip_amount'] / df['total_amount'] * 100 39 | 40 | # %% Passenger Count 41 | 42 | by_count = ( 43 | df.groupby('passenger_count') 44 | ['tip_pct'] 45 | .mean() 46 | ) 47 | ax = by_count.plot.bar( 48 | title='Tip % by Passenger Count', 49 | rot=0, 50 | ) 51 | ax.set_ylabel('Tip %') 52 | 53 | # %% Week Day 54 | from calendar import day_abbr 55 | 56 | day_of_week = \ 57 | df['tpep_pickup_datetime'].dt.weekday 58 | by_day = ( 59 | df.groupby(day_of_week) 60 | ['tip_pct'] 61 | .mean() 62 | ) 63 | by_day.index.name = 'Day of Week' 64 | ax = by_day.plot.bar(title='Tip % by Day', rot=45) 65 | ax.set_ylabel('Tip %') 66 | ax.set_xticklabels( 67 | [day_abbr[v] for v in ax.get_xticks()]) 68 | None # quell ax output 69 | # %% 70 | -------------------------------------------------------------------------------- /Ch06/06_02/regression.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from sklearn.datasets import fetch_california_housing 3 | 4 | cal_housing = fetch_california_housing() 5 | 6 | # %% 7 | type(cal_housing) 8 | 9 | # %% 10 | cal_housing.keys() 11 | 12 | # %% 13 | type(cal_housing['data']) 14 | 15 | # %% 16 | cal_housing['feature_names'] 17 | 18 | # %% 19 | print(cal_housing['DESCR']) 20 | 21 | # %% 22 | cal_housing['target'][:10] 23 | 24 | # %% 25 | from sklearn.ensemble import RandomForestRegressor 26 | 27 | X, y = cal_housing['data'], cal_housing['target'] 28 | 29 | clf = RandomForestRegressor() 30 | clf.fit(X, y) # train 31 | 32 | # %% 33 | clf.score(X, y) 34 | 35 | # %% 36 | clf.score? 37 | 38 | # %% 39 | dir(clf) 40 | 41 | # %% 42 | clf.n_features_in_ 43 | 44 | # %% 45 | X.shape 46 | 47 | # %% 48 | from sklearn.tree import export_graphviz 49 | 50 | export_graphviz( 51 | clf.estimators_[0], 52 | 'tree.dot', 53 | feature_names=cal_housing['feature_names'], 54 | max_depth=5, 55 | ) 56 | # %% 57 | !dot -Tsvg -o tree.svg tree.dot 58 | 59 | # %% 60 | from IPython import display 61 | 62 | display.SVG('tree.svg') 63 | 64 | # %% 65 | i = 17 66 | row = X[i] 67 | clf.predict(row) 68 | 69 | # %% 70 | row.shape 71 | 72 | #%% 73 | 74 | row = X[i:i+1] 75 | row.shape 76 | 77 | # %% 78 | clf.predict(row) 79 | 80 | # %% 81 | y[i] -------------------------------------------------------------------------------- /Ch06/06_03/split.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from sklearn.datasets import fetch_california_housing 3 | 4 | cal_housing = fetch_california_housing() 5 | X, y = cal_housing['data'], cal_housing['target'] 6 | X.shape 7 | 8 | # %% 9 | from sklearn.model_selection import train_test_split 10 | 11 | X_train, X_test, y_train, y_test = train_test_split( 12 | X, y, 13 | test_size=0.3, 14 | ) 15 | X_train.shape 16 | 17 | # %% 18 | from sklearn.ensemble import RandomForestRegressor 19 | 20 | clf = RandomForestRegressor() 21 | clf.fit(X_train, y_train) 22 | clf.score(X_test, y_test) -------------------------------------------------------------------------------- /Ch06/06_04/preprocess.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from sklearn.datasets import fetch_california_housing 3 | 4 | cal_housing = fetch_california_housing(as_frame=True) 5 | df = cal_housing['data'] 6 | df.describe() 7 | 8 | # %% 9 | from sklearn.model_selection import train_test_split 10 | 11 | X, y = cal_housing['data'], cal_housing['target'] 12 | X_train, X_test, y_train, y_test = train_test_split( 13 | X, y, 14 | test_size=0.3, 15 | ) 16 | 17 | # %% 18 | from sklearn.svm import SVR 19 | 20 | clf = SVR() 21 | clf.fit(X_train, y_train) 22 | clf.score(X_test, y_test) 23 | 24 | # %% 25 | from sklearn import preprocessing 26 | 27 | X_scaled = preprocessing.scale(X) 28 | 29 | # %% 30 | import pandas as pd 31 | 32 | df = pd.DataFrame( 33 | X_scaled, 34 | columns=cal_housing['feature_names'] 35 | ) 36 | df.describe() 37 | 38 | # %% 39 | 40 | X_train, X_test, y_train, y_test = train_test_split( 41 | X_scaled, y, 42 | test_size=0.3, 43 | ) 44 | clf = SVR() 45 | clf.fit(X_train, y_train) 46 | clf.score(X_test, y_test) 47 | 48 | # %% 49 | from sklearn.decomposition import PCA 50 | 51 | pca = PCA(n_components=4) 52 | X_pca = pca.fit_transform(X) 53 | X_pca.shape -------------------------------------------------------------------------------- /Ch06/06_05/pipe.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from sklearn.datasets import fetch_california_housing 3 | from sklearn.model_selection import train_test_split 4 | 5 | cal_housing = fetch_california_housing() 6 | 7 | X, y = cal_housing['data'], cal_housing['target'] 8 | X_train, X_test, y_train, y_test = train_test_split( 9 | X, y, 10 | test_size=0.3, 11 | ) 12 | 13 | # %% 14 | from sklearn.decomposition import PCA 15 | from sklearn.pipeline import Pipeline 16 | from sklearn.preprocessing import StandardScaler 17 | from sklearn.svm import SVR 18 | 19 | pipe = Pipeline([ 20 | ('scale', StandardScaler()), 21 | ('pca', PCA(n_components=4)), 22 | ('svr', SVR()), 23 | ]) 24 | 25 | 26 | # %% 27 | pipe.fit(X_train, y_train) 28 | pipe.score(X_test, y_test) 29 | 30 | # %% 31 | pipe.steps 32 | 33 | # %% 34 | pipe.get_params() 35 | 36 | # %% 37 | pipe.set_params(svr__C=0.9) -------------------------------------------------------------------------------- /Ch06/06_06/save.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from sklearn.datasets import fetch_california_housing 3 | from sklearn.decomposition import PCA 4 | from sklearn.model_selection import train_test_split 5 | from sklearn.pipeline import Pipeline 6 | from sklearn.preprocessing import StandardScaler 7 | from sklearn.svm import SVR 8 | 9 | cal_housing = fetch_california_housing() 10 | 11 | X, y = cal_housing['data'], cal_housing['target'] 12 | X_train, X_test, y_train, y_test = train_test_split( 13 | X, y, 14 | test_size=0.3, 15 | ) 16 | 17 | pipe = Pipeline([ 18 | ('scale', StandardScaler()), 19 | ('pca', PCA(n_components=4)), 20 | ('svr', SVR()), 21 | ]) 22 | 23 | pipe.fit(X_train, y_train) 24 | pipe.score(X_test, y_test) 25 | 26 | # %% 27 | import pickle 28 | 29 | out_file = 'model.pkl' 30 | 31 | with open(out_file, 'wb') as out: 32 | pickle.dump(pipe, out) 33 | 34 | # %% 35 | with open(out_file, 'rb') as fp: 36 | pipe1 = pickle.load(fp) 37 | pipe1.score(X_test, y_test) -------------------------------------------------------------------------------- /Ch06/challenge/digits.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from sklearn.datasets import load_digits 3 | 4 | digits = load_digits() 5 | X, y = digits['data'], digits['target'] 6 | 7 | # %% 8 | import matplotlib.pyplot as plt 9 | 10 | i = 353 11 | print(y[i]) 12 | img = digits['images'][i] 13 | plt.imshow(img, cmap='gray') 14 | 15 | # %% 16 | img.shape 17 | 18 | # %% 19 | X.shape 20 | 21 | # %% 22 | 23 | """ 24 | Write a pipeline that will learn to predict digits. 25 | It should reduce the number of features to 10 and use a KNeighborsClassifier. 26 | 27 | Split the data to train and test, and answer: 28 | - What is the score of the pipeline on the test data? 29 | - What is the size (in kb) of the serialized pipeline? 30 | """ -------------------------------------------------------------------------------- /Ch06/solution/digits.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from sklearn.datasets import load_digits 3 | 4 | digits = load_digits() 5 | X, y = digits['data'], digits['target'] 6 | # %% 7 | import matplotlib.pyplot as plt 8 | 9 | i = 353 10 | print(y[i]) 11 | img = digits['images'][i] 12 | plt.imshow(img, cmap='gray') 13 | 14 | # %% 15 | img.shape 16 | 17 | # %% 18 | X.shape 19 | 20 | """ 21 | Write a pipeline that will learn to predict digits. 22 | It should reduce the number of features to 10 and use a KNeighborsClassifier. 23 | 24 | Split the data to train and test, and answer: 25 | - What is the score of the pipeline on the test data? 26 | - What is the size (in kb) of the serialized pipeline? 27 | """ 28 | 29 | # %% 30 | 31 | from sklearn.decomposition import PCA 32 | from sklearn.model_selection import train_test_split 33 | from sklearn.pipeline import Pipeline 34 | from sklearn.neighbors import KNeighborsClassifier 35 | 36 | pipe = Pipeline([ 37 | ('pca', PCA(n_components=10)), 38 | ('clf', KNeighborsClassifier()), 39 | ]) 40 | 41 | X_train, X_test, y_train, y_test = train_test_split( 42 | X, y, 43 | test_size=0.2, 44 | ) 45 | pipe.fit(X_train, y_train) 46 | pipe.score(X_test, y_test) 47 | 48 | # %% 49 | import pickle 50 | 51 | kb = 2**10 52 | 53 | data = pickle.dumps(pipe) 54 | len(data)/kb -------------------------------------------------------------------------------- /Ch07/07_02/style.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import matplotlib.pyplot as plt 3 | import numpy as np 4 | 5 | xs = np.linspace(-6, 6, 100) 6 | ys = np.sinc(xs) 7 | plt.plot(xs, ys) 8 | 9 | # %% 10 | plt.style.available 11 | 12 | # %% 13 | plt.style.use('seaborn-whitegrid') 14 | plt.plot(xs, ys) 15 | 16 | # %% 17 | plt.style.use('fivethirtyeight') 18 | plt.plot(xs, ys) -------------------------------------------------------------------------------- /Ch07/07_03/pd_style.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from sklearn.datasets import load_iris 3 | 4 | iris = load_iris(as_frame=True) 5 | df = iris['data'].head(5) 6 | df 7 | 8 | # %% 9 | df.style.highlight_max() 10 | 11 | # %% 12 | df.style.background_gradient() 13 | 14 | # %% 15 | df.style.bar() 16 | 17 | # %% 18 | def color_round(val): 19 | if round(val) == val: 20 | return 'color: blue' 21 | return None 22 | 23 | df.style.applymap(color_round) 24 | 25 | 26 | # %% 27 | def color_odd(val): 28 | if int(val) % 2 == 1: 29 | return 'background-color: orange' 30 | return '' 31 | 32 | df.style.applymap(color_round).applymap(color_odd) 33 | 34 | # %% 35 | df.style.applymap( 36 | color_odd, 37 | subset=df.columns[:2], 38 | ) 39 | 40 | # %% 41 | def top50(col): 42 | is_top50 = col >= col.median() 43 | return [ 44 | 'font-weight: bold' if v else '' 45 | for v in is_top50 46 | ] 47 | 48 | df.style.apply(top50) 49 | -------------------------------------------------------------------------------- /Ch07/07_04/download_data.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from urllib.request import urlopen 3 | import pandas as pd 4 | 5 | here = Path(__file__).absolute().parent 6 | csv_file = here / 'stocks.csv' 7 | 8 | dfs = [] 9 | symbols = [ 10 | 'GOOG', 11 | 'MSFT', 12 | 'ORCL', 13 | ] 14 | for sym in symbols: 15 | print(f'downloading {sym}') 16 | url = f'https://query1.finance.yahoo.com/v7/finance/download/{sym}' 17 | url += '?period1=1577836800&period2=1609372800&interval=1d&events=history' 18 | with urlopen(url) as resp: 19 | df = pd.read_csv(resp, parse_dates=['Date']) 20 | df['Symbol'] = sym 21 | df.insert(1, 'Symbol', df.pop('Symbol')) 22 | dfs.append(df) 23 | df = pd.concat(dfs) 24 | df.sort_values('Date', inplace=True) 25 | df.to_csv(csv_file, index=False) -------------------------------------------------------------------------------- /Ch07/07_04/pd_plot.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | df = pd.read_csv( 5 | 'stocks.csv', 6 | parse_dates=['Date'], 7 | index_col='Date' 8 | ) 9 | df.head() 10 | 11 | # %% 12 | msft = df.query('Symbol == "MSFT"') 13 | msft['Close'].plot() 14 | 15 | # %% 16 | msft['Close'].plot.kde() 17 | 18 | # %% 19 | ( 20 | df 21 | .pivot( 22 | columns='Symbol', 23 | values='Volume' 24 | ) 25 | .resample('M') 26 | .sum() 27 | .plot.bar(xticks=range(12), rot=0) 28 | ) -------------------------------------------------------------------------------- /Ch07/07_05/download_data.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from urllib.request import urlopen 3 | import pandas as pd 4 | 5 | here = Path(__file__).absolute().parent 6 | csv_file = here / 'stocks.csv' 7 | 8 | dfs = [] 9 | symbols = [ 10 | 'AAPL', 11 | 'MSFT', 12 | 'ORCL', 13 | ] 14 | for sym in symbols: 15 | print(f'downloading {sym}') 16 | url = f'https://query1.finance.yahoo.com/v7/finance/download/{sym}' 17 | url += '?period1=1577836800&period2=1609372800&interval=1d&events=history' 18 | with urlopen(url) as resp: 19 | df = pd.read_csv(resp, parse_dates=['Date']) 20 | df['Symbol'] = sym 21 | df.insert(1, 'Symbol', df.pop('Symbol')) 22 | dfs.append(df) 23 | df = pd.concat(dfs) 24 | df.sort_values('Date', inplace=True) 25 | df.to_csv(csv_file, index=False) -------------------------------------------------------------------------------- /Ch07/07_05/pd_mpl.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | df = pd.read_csv( 5 | 'stocks.csv', 6 | parse_dates=['Date'], 7 | index_col='Date' 8 | ) 9 | df.head() 10 | 11 | # %% 12 | msft = df.query('Symbol == "MSFT"') 13 | 14 | # %% 15 | daily = ( 16 | msft 17 | ['Volume'] 18 | .groupby(msft.index.weekday) 19 | .median() 20 | ) 21 | daily.plot.bar() 22 | 23 | # %% 24 | ax = daily.plot.bar( 25 | title='MSFT', 26 | rot=0, 27 | ) 28 | ax.set_xticklabels( 29 | ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'] 30 | ) 31 | ax.set_xlabel('Weekday') 32 | ax.set_ylabel('Volume') -------------------------------------------------------------------------------- /Ch07/07_06/interactive.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import matplotlib.pyplot as plt 3 | import numpy as np 4 | 5 | def plot_sin(limit): 6 | xs = np.linspace(-limit, limit, 100) 7 | plt.plot(xs, np.sin(xs), label='sin(x) [-%s - %s]' % (limit, limit)) 8 | 9 | plot_sin(6) 10 | 11 | # %% 12 | from ipywidgets import interact 13 | 14 | @interact(limit=6) 15 | def plot_sin(limit): 16 | xs = np.linspace(-limit, limit, 100) 17 | plt.plot(xs, np.sin(xs), label='sin(x) [-%s - %s]' % (limit, limit)) 18 | 19 | # %% 20 | from ipywidgets import IntSlider 21 | 22 | @interact(limit=IntSlider(min=0, max=20)) 23 | def plot_sin(limit): 24 | xs = np.linspace(-limit, limit, 100) 25 | plt.plot(xs, np.sin(xs), label='sin(x) [-%s - %s]' % (limit, limit)) 26 | -------------------------------------------------------------------------------- /Ch07/07_07/other.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import pandas as pd 3 | 4 | df = pd.read_csv( 5 | 'track.csv', 6 | parse_dates=['time'], 7 | index_col='time' 8 | ) 9 | df = ( 10 | df 11 | .resample('3min') 12 | .mean() 13 | .reset_index() 14 | ) 15 | df.head() 16 | 17 | # %% 18 | import plotly.express as px 19 | 20 | fig = px.bar( 21 | df, 22 | x='time', 23 | y='height', 24 | ) 25 | fig 26 | 27 | # %% 28 | fig.write_html('track.html') -------------------------------------------------------------------------------- /Ch07/challenge/chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinkedInLearning/data-science-foundations-python-scientific-stack-3084641/cb2d7702e66ff3e80816d9f49844c80c18cfa0ba/Ch07/challenge/chart.png -------------------------------------------------------------------------------- /Ch07/challenge/download_data.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from urllib.request import urlopen 3 | import pandas as pd 4 | 5 | here = Path(__file__).absolute().parent 6 | csv_file = here / 'stocks.csv' 7 | 8 | dfs = [] 9 | symbols = [ 10 | 'GOOG', 11 | 'MSFT', 12 | 'ORCL', 13 | ] 14 | for sym in symbols: 15 | print(f'downloading {sym}') 16 | url = f'https://query1.finance.yahoo.com/v7/finance/download/{sym}' 17 | url += '?period1=1577836800&period2=1609372800&interval=1d&events=history' 18 | with urlopen(url) as resp: 19 | df = pd.read_csv(resp, parse_dates=['Date']) 20 | df['Symbol'] = sym 21 | df.insert(1, 'Symbol', df.pop('Symbol')) 22 | dfs.append(df) 23 | df = pd.concat(dfs) 24 | df.sort_values('Date', inplace=True) 25 | df.to_csv(csv_file, index=False) -------------------------------------------------------------------------------- /Ch07/challenge/montly_close.py: -------------------------------------------------------------------------------- 1 | """ 2 | Using the stock data from stocks.csv, draw a bar chart were: 3 | - The x axis is the month 4 | - The y axis is the median closing price 5 | - Each stock should have it's own chart 6 | """ 7 | -------------------------------------------------------------------------------- /Ch07/solution/download_data.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from urllib.request import urlopen 3 | import pandas as pd 4 | 5 | here = Path(__file__).absolute().parent 6 | csv_file = here / 'stocks.csv' 7 | 8 | dfs = [] 9 | symbols = [ 10 | 'GOOG', 11 | 'MSFT', 12 | 'ORCL', 13 | ] 14 | for sym in symbols: 15 | print(f'downloading {sym}') 16 | url = f'https://query1.finance.yahoo.com/v7/finance/download/{sym}' 17 | url += '?period1=1577836800&period2=1609372800&interval=1d&events=history' 18 | with urlopen(url) as resp: 19 | df = pd.read_csv(resp, parse_dates=['Date']) 20 | df['Symbol'] = sym 21 | df.insert(1, 'Symbol', df.pop('Symbol')) 22 | dfs.append(df) 23 | df = pd.concat(dfs) 24 | df.sort_values('Date', inplace=True) 25 | df.to_csv(csv_file, index=False) -------------------------------------------------------------------------------- /Ch07/solution/montly_close.py: -------------------------------------------------------------------------------- 1 | """ 2 | Using the stock data from stocks.csv, draw a bar chart were: 3 | - The x axis is the month 4 | - The y axis is the median closing price 5 | - Each stock should have it's own chart 6 | """ 7 | # %% 8 | import pandas as pd 9 | 10 | df = pd.read_csv( 11 | 'stocks.csv', 12 | parse_dates=['Date'], 13 | ) 14 | df.head() 15 | 16 | # %% 17 | df['Month'] = df['Date'].dt.month 18 | 19 | mdf = df.pivot_table( 20 | columns='Symbol', 21 | index='Month', 22 | values='Close', 23 | aggfunc='median' 24 | ) 25 | mdf 26 | 27 | # %% 28 | from calendar import month_abbr 29 | 30 | ax = mdf.plot.bar( 31 | title='Median Monthly Close', 32 | rot=0, 33 | ) 34 | ax.set_xticklabels( 35 | [month_abbr[i+1] for i in ax.get_xticks()] 36 | ) 37 | ax.set_ylabel('Closing Price') -------------------------------------------------------------------------------- /Ch08/08_02/polysum.py: -------------------------------------------------------------------------------- 1 | # %% 2 | def polyn(n): 3 | total = 0 4 | for _ in range(n): 5 | total += (7*n*n) + (-3*n) + 42 6 | return total 7 | 8 | %timeit -n 10_000 polyn(1000) 9 | 10 | # %% 11 | import numba 12 | 13 | @numba.jit 14 | def polyn_jit(n): 15 | total = 0 16 | for _ in range(n): 17 | total += (7*n*n) + (-3*n) + 42 18 | return total 19 | 20 | %timeit -n 10_000 polyn_jit(1000) 21 | -------------------------------------------------------------------------------- /Ch08/08_03/digits.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from sklearn.datasets import load_digits 3 | 4 | digits = load_digits() 5 | 6 | # %% 7 | import matplotlib.pyplot as plt 8 | 9 | idx = 37 10 | plt.imshow(digits['images'][idx], cmap=plt.cm.gray) 11 | 12 | # %% 13 | digits['target'][idx] 14 | 15 | # %% 16 | digits['images'].shape, digits['data'].shape 17 | 18 | # %% 19 | from tensorflow.keras.utils import to_categorical 20 | 21 | to_categorical([0, 1, 2, 0, 1]) 22 | 23 | # %% 24 | X = digits['data'] 25 | y = to_categorical(digits['target']) 26 | 27 | # %% 28 | from sklearn.model_selection import train_test_split 29 | 30 | X_train, X_test, y_train, y_test = \ 31 | train_test_split(X, y, test_size=0.3) 32 | 33 | # %% 34 | from tensorflow.keras import Sequential 35 | from tensorflow.keras.layers import Dense, Activation 36 | 37 | in_dim = X.shape[1] 38 | out_dim = y.shape[1] 39 | 40 | model = Sequential() 41 | model.add(Dense(128, input_shape=(in_dim,))) 42 | model.add(Activation('relu')) 43 | model.add(Dense(out_dim)) 44 | model.add(Activation('sigmoid')) 45 | model.compile( 46 | loss='categorical_crossentropy', 47 | optimizer='adam', 48 | metrics=['accuracy'], 49 | ) 50 | 51 | # %% 52 | model.fit(X_train, y_train, epochs=10) 53 | 54 | # %% 55 | _, accuracy = model.evaluate(X_test, y_test) 56 | accuracy 57 | 58 | # %% 59 | model.predict(X_test[:3]) 60 | 61 | # %% 62 | model.predict(X_test[:3]).argmax(axis=1) 63 | 64 | # %% 65 | y_test[:3].argmax(axis=1) 66 | 67 | # %% 68 | model.save('digits.h5') 69 | # %% 70 | from tensorflow.keras.models import load_model 71 | 72 | model1 = load_model('digits.h5') 73 | model1.predict(X_test[:3]).argmax(axis=1) 74 | -------------------------------------------------------------------------------- /Ch08/08_04/images.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import cv2 3 | 4 | img = cv2.imread('sign.jpg') 5 | img.shape 6 | 7 | # %% 8 | import matplotlib.pyplot as plt 9 | 10 | plt.imshow(img) 11 | 12 | # %% 13 | mpl_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 14 | plt.imshow(mpl_img) 15 | 16 | # %% 17 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 18 | plt.imshow(gray) 19 | 20 | # %% 21 | plt.imshow(gray, cmap='gray') 22 | 23 | # %% 24 | edges = cv2.Canny(gray, 80, 150) 25 | plt.imshow(edges, cmap='gray') -------------------------------------------------------------------------------- /Ch08/08_04/sign.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinkedInLearning/data-science-foundations-python-scientific-stack-3084641/cb2d7702e66ff3e80816d9f49844c80c18cfa0ba/Ch08/08_04/sign.jpg -------------------------------------------------------------------------------- /Ch08/08_05/nlp.py: -------------------------------------------------------------------------------- 1 | # %% 2 | from sklearn.datasets import fetch_20newsgroups 3 | 4 | corpus = fetch_20newsgroups( 5 | categories=['sci.space'], 6 | remove=['headers', 'footers'], 7 | ) 8 | text = corpus['data'][4] 9 | print(text) 10 | 11 | # %% 12 | import spacy 13 | 14 | nlp = spacy.load("en_core_web_sm") 15 | doc = nlp(text) 16 | doc 17 | 18 | # %% 19 | type(doc) 20 | 21 | # %% 22 | sent = list(doc.sents)[1] 23 | print(sent) 24 | 25 | # %% 26 | for tok in sent: 27 | print(f'{tok.text!r} -> {tok.tag_}') 28 | 29 | # %% 30 | for ent in doc.ents: 31 | print(f'{ent.text} ({ent.label_})') 32 | -------------------------------------------------------------------------------- /Ch08/08_06/big.py: -------------------------------------------------------------------------------- 1 | # %% 2 | import sqlite3 3 | 4 | import pandas as pd 5 | from tqdm import tqdm 6 | 7 | time_cols = [ 8 | 'tpep_pickup_datetime', 9 | 'tpep_dropoff_datetime', 10 | ] 11 | 12 | with sqlite3.connect('taxi.db') as conn: 13 | chunks = pd.read_csv( 14 | 'taxi.csv', 15 | parse_dates=time_cols, 16 | chunksize=100_000) 17 | 18 | for chunk in tqdm(chunks): 19 | chunk.to_sql( 20 | 'rides', 21 | conn, 22 | index=False, 23 | if_exists='append', 24 | ) 25 | 26 | # %% 27 | sql = ''' 28 | SELECT 29 | passenger_count, 30 | COUNT(VendorID) AS count 31 | FROM rides 32 | WHERE passenger_count > 1 33 | GROUP BY passenger_count 34 | ''' 35 | 36 | df = pd.read_sql(sql, conn) 37 | df 38 | 39 | # %% 40 | import dask.dataframe as dd 41 | 42 | ddf = dd.read_csv( 43 | 'taxi.csv', 44 | parse_dates=time_cols, 45 | dtype={'VendorID': 'float64'}, 46 | ) 47 | 48 | # %% 49 | ddf['VendorID'].value_counts() 50 | 51 | # %% 52 | ddf['VendorID'].value_counts().compute() 53 | -------------------------------------------------------------------------------- /Ch08/08_06/download_data.py: -------------------------------------------------------------------------------- 1 | """Download 10% of January 2016 taxi data to taxi.csv""" 2 | 3 | from urllib.request import urlopen 4 | from time import monotonic 5 | from pathlib import Path 6 | 7 | here = Path(__file__).absolute().parent 8 | csv_file = here / 'taxi.csv' 9 | url = 'https://s3.amazonaws.com/nyc-tlc/csv_backup/yellow_tripdata_2016-01.csv' 10 | out_name = '/'.join(csv_file.parts[-3:]) 11 | 12 | start = monotonic() 13 | with urlopen(url) as resp: 14 | payload_size = int(resp.headers['Content-Length']) 15 | size_mb = payload_size / (2**20) 16 | print(f'downloading 10% of {size_mb:.2f}MB to {out_name}') 17 | size = 0 18 | with open(csv_file, 'wb') as out: 19 | for i, line in enumerate(resp): 20 | size += len(line) 21 | prec = (size / payload_size) * 100 22 | print(f' {prec:.2f}%', end='\r') 23 | if i % 10 != 0: 24 | continue 25 | out.write(line) 26 | 27 | if size != payload_size: 28 | raise SystemError(f'error: expected {payload_size} bytes, got {size}') 29 | 30 | duration = int(monotonic() - start) 31 | print(f'{csv_file}: {size_mb:.1f}MB downloaded in {duration} seconds') 32 | -------------------------------------------------------------------------------- /Ch09/09_05/scale.py: -------------------------------------------------------------------------------- 1 | def scale(vec, n): 2 | return vec * n -------------------------------------------------------------------------------- /Ch09/09_05/test_scale.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | from scale import scale 4 | 5 | 6 | def test_simple(): 7 | v = np.array([0.1, np.nan, 1.1]) 8 | n = 1.1 9 | expected = np.array([0.11, np.nan, 1.21]) 10 | out = scale(v, n) 11 | assert np.allclose(expected, out, equal_nan=True) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | LinkedIn Learning Exercise Files License Agreement 2 | ================================================== 3 | 4 | This License Agreement (the "Agreement") is a binding legal agreement 5 | between you (as an individual or entity, as applicable) and LinkedIn 6 | Corporation (“LinkedIn”). By downloading or using the LinkedIn Learning 7 | exercise files in this repository (“Licensed Materials”), you agree to 8 | be bound by the terms of this Agreement. If you do not agree to these 9 | terms, do not download or use the Licensed Materials. 10 | 11 | 1. License. 12 | - a. Subject to the terms of this Agreement, LinkedIn hereby grants LinkedIn 13 | members during their LinkedIn Learning subscription a non-exclusive, 14 | non-transferable copyright license, for internal use only, to 1) make a 15 | reasonable number of copies of the Licensed Materials, and 2) make 16 | derivative works of the Licensed Materials for the sole purpose of 17 | practicing skills taught in LinkedIn Learning courses. 18 | - b. Distribution. Unless otherwise noted in the Licensed Materials, subject 19 | to the terms of this Agreement, LinkedIn hereby grants LinkedIn members 20 | with a LinkedIn Learning subscription a non-exclusive, non-transferable 21 | copyright license to distribute the Licensed Materials, except the 22 | Licensed Materials may not be included in any product or service (or 23 | otherwise used) to instruct or educate others. 24 | 25 | 2. Restrictions and Intellectual Property. 26 | - a. You may not to use, modify, copy, make derivative works of, publish, 27 | distribute, rent, lease, sell, sublicense, assign or otherwise transfer the 28 | Licensed Materials, except as expressly set forth above in Section 1. 29 | - b. Linkedin (and its licensors) retains its intellectual property rights 30 | in the Licensed Materials. Except as expressly set forth in Section 1, 31 | LinkedIn grants no licenses. 32 | - c. You indemnify LinkedIn and its licensors and affiliates for i) any 33 | alleged infringement or misappropriation of any intellectual property rights 34 | of any third party based on modifications you make to the Licensed Materials, 35 | ii) any claims arising from your use or distribution of all or part of the 36 | Licensed Materials and iii) a breach of this Agreement. You will defend, hold 37 | harmless, and indemnify LinkedIn and its affiliates (and our and their 38 | respective employees, shareholders, and directors) from any claim or action 39 | brought by a third party, including all damages, liabilities, costs and 40 | expenses, including reasonable attorneys’ fees, to the extent resulting from, 41 | alleged to have resulted from, or in connection with: (a) your breach of your 42 | obligations herein; or (b) your use or distribution of any Licensed Materials. 43 | 44 | 3. Open source. This code may include open source software, which may be 45 | subject to other license terms as provided in the files. 46 | 47 | 4. Warranty Disclaimer. LINKEDIN PROVIDES THE LICENSED MATERIALS ON AN “AS IS” 48 | AND “AS AVAILABLE” BASIS. LINKEDIN MAKES NO REPRESENTATION OR WARRANTY, 49 | WHETHER EXPRESS OR IMPLIED, ABOUT THE LICENSED MATERIALS, INCLUDING ANY 50 | REPRESENTATION THAT THE LICENSED MATERIALS WILL BE FREE OF ERRORS, BUGS OR 51 | INTERRUPTIONS, OR THAT THE LICENSED MATERIALS ARE ACCURATE, COMPLETE OR 52 | OTHERWISE VALID. TO THE FULLEST EXTENT PERMITTED BY LAW, LINKEDIN AND ITS 53 | AFFILIATES DISCLAIM ANY IMPLIED OR STATUTORY WARRANTY OR CONDITION, INCLUDING 54 | ANY IMPLIED WARRANTY OR CONDITION OF MERCHANTABILITY OR FITNESS FOR A 55 | PARTICULAR PURPOSE, AVAILABILITY, SECURITY, TITLE AND/OR NON-INFRINGEMENT. 56 | YOUR USE OF THE LICENSED MATERIALS IS AT YOUR OWN DISCRETION AND RISK, AND 57 | YOU WILL BE SOLELY RESPONSIBLE FOR ANY DAMAGE THAT RESULTS FROM USE OF THE 58 | LICENSED MATERIALS TO YOUR COMPUTER SYSTEM OR LOSS OF DATA. NO ADVICE OR 59 | INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU FROM US OR THROUGH OR 60 | FROM THE LICENSED MATERIALS WILL CREATE ANY WARRANTY OR CONDITION NOT 61 | EXPRESSLY STATED IN THESE TERMS. 62 | 63 | 5. Limitation of Liability. LINKEDIN SHALL NOT BE LIABLE FOR ANY INDIRECT, 64 | INCIDENTAL, SPECIAL, PUNITIVE, CONSEQUENTIAL OR EXEMPLARY DAMAGES, INCLUDING 65 | BUT NOT LIMITED TO, DAMAGES FOR LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER 66 | INTANGIBLE LOSSES . IN NO EVENT WILL LINKEDIN'S AGGREGATE LIABILITY TO YOU 67 | EXCEED $100. THIS LIMITATION OF LIABILITY SHALL: 68 | - i. APPLY REGARDLESS OF WHETHER (A) YOU BASE YOUR CLAIM ON CONTRACT, TORT, 69 | STATUTE, OR ANY OTHER LEGAL THEORY, (B) WE KNEW OR SHOULD HAVE KNOWN ABOUT 70 | THE POSSIBILITY OF SUCH DAMAGES, OR (C) THE LIMITED REMEDIES PROVIDED IN THIS 71 | SECTION FAIL OF THEIR ESSENTIAL PURPOSE; AND 72 | - ii. NOT APPLY TO ANY DAMAGE THAT LINKEDIN MAY CAUSE YOU INTENTIONALLY OR 73 | KNOWINGLY IN VIOLATION OF THESE TERMS OR APPLICABLE LAW, OR AS OTHERWISE 74 | MANDATED BY APPLICABLE LAW THAT CANNOT BE DISCLAIMED IN THESE TERMS. 75 | 76 | 6. Termination. This Agreement automatically terminates upon your breach of 77 | this Agreement or termination of your LinkedIn Learning subscription. On 78 | termination, all licenses granted under this Agreement will terminate 79 | immediately and you will delete the Licensed Materials. Sections 2-7 of this 80 | Agreement survive any termination of this Agreement. LinkedIn may discontinue 81 | the availability of some or all of the Licensed Materials at any time for any 82 | reason. 83 | 84 | 7. Miscellaneous. This Agreement will be governed by and construed in 85 | accordance with the laws of the State of California without regard to conflict 86 | of laws principles. The exclusive forum for any disputes arising out of or 87 | relating to this Agreement shall be an appropriate federal or state court 88 | sitting in the County of Santa Clara, State of California. If LinkedIn does 89 | not act to enforce a breach of this Agreement, that does not mean that 90 | LinkedIn has waived its right to enforce this Agreement. The Agreement does 91 | not create a partnership, agency relationship, or joint venture between the 92 | parties. Neither party has the power or authority to bind the other or to 93 | create any obligation or responsibility on behalf of the other. You may not, 94 | without LinkedIn’s prior written consent, assign or delegate any rights or 95 | obligations under these terms, including in connection with a change of 96 | control. Any purported assignment and delegation shall be ineffective. The 97 | Agreement shall bind and inure to the benefit of the parties, their respective 98 | successors and permitted assigns. If any provision of the Agreement is 99 | unenforceable, that provision will be modified to render it enforceable to the 100 | extent possible to give effect to the parties’ intentions and the remaining 101 | provisions will not be affected. This Agreement is the only agreement between 102 | you and LinkedIn regarding the Licensed Materials, and supersedes all prior 103 | agreements relating to the Licensed Materials. 104 | 105 | Last Updated: March 2019 106 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | Copyright 2022 LinkedIn Corporation 2 | All Rights Reserved. 3 | 4 | Licensed under the LinkedIn Learning Exercise File License (the "License"). 5 | See LICENSE in the project root for license information. 6 | 7 | ATTRIBUTIONS: 8 | 9 | Dask 10 | https://github.com/dask/dask 11 | Copyright (c) 2014, Anaconda, Inc. and contributors 12 | License: BSD-3-Clause 13 | https://opensource.org/licenses/BSD-3-Clause 14 | 15 | Pandas 16 | https://github.com/pandas-dev/pandas 17 | Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team 18 | Copyright (c) 2011-2021, Open source contributors. 19 | License: BSD 3-Clause 20 | https://opensource.org/licenses/BSD-3-Clause 21 | 22 | Please note, this project may automatically load third party code from external 23 | repositories (for example, NPM modules, Composer packages, or other dependencies). 24 | If so, such third party code may be subject to other license terms than as set 25 | forth above. In addition, such third party code may also depend on and load 26 | multiple tiers of dependencies. Please review the applicable licenses of the 27 | additional dependencies. 28 | 29 | 30 | =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 31 | 32 | "BSD 3-Clause License 33 | 34 | Copyright (c) 2014, Anaconda, Inc. and contributors 35 | All rights reserved. 36 | 37 | Redistribution and use in source and binary forms, with or without 38 | modification, are permitted provided that the following conditions are met: 39 | 40 | * Redistributions of source code must retain the above copyright notice, this 41 | list of conditions and the following disclaimer. 42 | 43 | * Redistributions in binary form must reproduce the above copyright notice, 44 | this list of conditions and the following disclaimer in the documentation 45 | and/or other materials provided with the distribution. 46 | 47 | * Neither the name of the copyright holder nor the names of its 48 | contributors may be used to endorse or promote products derived from 49 | this software without specific prior written permission. 50 | 51 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" 52 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 53 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 54 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 55 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 56 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 57 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 58 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 59 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 60 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." 61 | 62 | =-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 63 | 64 | "BSD 3-Clause License 65 | 66 | Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team 67 | All rights reserved. 68 | 69 | Copyright (c) 2011-2022, Open source contributors. 70 | 71 | Redistribution and use in source and binary forms, with or without 72 | modification, are permitted provided that the following conditions are met: 73 | 74 | * Redistributions of source code must retain the above copyright notice, this 75 | list of conditions and the following disclaimer. 76 | 77 | * Redistributions in binary form must reproduce the above copyright notice, 78 | this list of conditions and the following disclaimer in the documentation 79 | and/or other materials provided with the distribution. 80 | 81 | * Neither the name of the copyright holder nor the names of its 82 | contributors may be used to endorse or promote products derived from 83 | this software without specific prior written permission. 84 | 85 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" 86 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 87 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 88 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 89 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 90 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 91 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 92 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 93 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 94 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." 95 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Data Science Foundations: Python Scientific Stack 2 | This is the repository for the LinkedIn Learning course Data Science Foundations: Python Scientific Stack. The full course is available from [LinkedIn Learning][lil-course-url]. 3 | 4 |  5 | 6 | Join instructor Miki Tebeka as he dives into the Python scientific stack and shows you how to use it to solve problems. Miki covers the major packages used throughout the data science process: numpy, pandas, matplotlib, scikit-learn, and others. He also guides you through how to load data, analyze data, run models, and display results.