From 8dfd2b9e8590d1470ee739ae5a8d69298ee63fc4 Mon Sep 17 00:00:00 2001 From: CherryKitten Date: Sat, 3 Dec 2022 18:55:57 +0100 Subject: [PATCH] Add sea level predictor --- .../5-sea-level-predictor/README.md | 3 + .../5-sea-level-predictor/epa-sea-level.csv | 135 ++++++++++++++++++ .../5-sea-level-predictor/main.py | 9 ++ .../5-sea-level-predictor/poetry.lock | 70 +++++++++ .../5-sea-level-predictor/pyproject.toml | 11 ++ .../5-sea-level-predictor/sea_level_plot.png | Bin 0 -> 44726 bytes .../sea_level_predictor.py | 35 +++++ .../5-sea-level-predictor/test_module.py | 41 ++++++ 8 files changed, 304 insertions(+) create mode 100644 9-data-analysis-python/5-sea-level-predictor/README.md create mode 100644 9-data-analysis-python/5-sea-level-predictor/epa-sea-level.csv create mode 100644 9-data-analysis-python/5-sea-level-predictor/main.py create mode 100644 9-data-analysis-python/5-sea-level-predictor/poetry.lock create mode 100644 9-data-analysis-python/5-sea-level-predictor/pyproject.toml create mode 100644 9-data-analysis-python/5-sea-level-predictor/sea_level_plot.png create mode 100644 9-data-analysis-python/5-sea-level-predictor/sea_level_predictor.py create mode 100644 9-data-analysis-python/5-sea-level-predictor/test_module.py diff --git a/9-data-analysis-python/5-sea-level-predictor/README.md b/9-data-analysis-python/5-sea-level-predictor/README.md new file mode 100644 index 0000000..f89ce47 --- /dev/null +++ b/9-data-analysis-python/5-sea-level-predictor/README.md @@ -0,0 +1,3 @@ +# Sea Level Predictor + +This is the boilerplate for the Sea Level Predictor project. Instructions for building your project can be found at https://www.freecodecamp.org/learn/data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor diff --git a/9-data-analysis-python/5-sea-level-predictor/epa-sea-level.csv b/9-data-analysis-python/5-sea-level-predictor/epa-sea-level.csv new file mode 100644 index 0000000..7ad553c --- /dev/null +++ b/9-data-analysis-python/5-sea-level-predictor/epa-sea-level.csv @@ -0,0 +1,135 @@ +Year,CSIRO Adjusted Sea Level,Lower Error Bound,Upper Error Bound,NOAA Adjusted Sea Level +1880,0,-0.952755905,0.952755905, +1881,0.220472441,-0.732283464,1.173228345, +1882,-0.440944881,-1.346456692,0.464566929, +1883,-0.232283464,-1.129921259,0.66535433, +1884,0.590551181,-0.283464567,1.464566928, +1885,0.531496062,-0.330708661,1.393700786, +1886,0.437007874,-0.381889763,1.255905511, +1887,0.216535433,-0.602362204,1.03543307, +1888,0.299212598,-0.519685039,1.118110235, +1889,0.362204724,-0.456692913,1.181102361, +1890,0.440944881,-0.374015748,1.255905511, +1891,0.374015748,-0.440944881,1.188976377, +1892,0.499999999,-0.31496063,1.314960629, +1893,0.685039369,-0.114173228,1.484251967, +1894,0.303149606,-0.547244094,1.153543306, +1895,0.767716535,-0.082677165,1.618110235, +1896,0.468503937,-0.366141732,1.303149605, +1897,0.673228346,-0.145669291,1.492125983, +1898,1.043307086,0.267716535,1.818897636, +1899,1.338582676,0.574803149,2.102362203, +1900,1.125984251,0.405511811,1.846456691, +1901,1.110236219,0.417322834,1.803149604, +1902,1.291338581,0.61023622,1.972440943, +1903,1.606299211,0.937007873,2.275590549, +1904,1.2007874,0.53543307,1.86614173, +1905,0.984251968,0.377952756,1.590551179, +1906,1.251968503,0.673228346,1.83070866, +1907,1.196850392,0.61023622,1.783464565, +1908,1.098425196,0.527559055,1.669291337, +1909,1.27559055,0.700787401,1.850393699, +1910,1.271653542,0.696850393,1.846456691, +1911,1.598425195,1.039370078,2.157480313, +1912,1.476377951,0.917322834,2.035433069, +1913,1.547244093,0.992125983,2.102362203, +1914,1.795275589,1.251968503,2.338582675, +1915,2.10629921,1.57086614,2.641732281, +1916,2.031496061,1.519685038,2.543307084, +1917,1.854330707,1.350393699,2.358267714, +1918,1.791338581,1.291338581,2.29133858, +1919,1.854330707,1.354330707,2.354330706, +1920,1.905511809,1.393700786,2.417322832, +1921,1.988188974,1.472440943,2.503937005, +1922,1.952755904,1.433070865,2.472440942, +1923,1.999999998,1.488188975,2.511811021, +1924,1.712598423,1.196850392,2.228346454, +1925,1.791338581,1.255905511,2.326771651, +1926,2.047244092,1.507874014,2.586614171, +1927,2.003937006,1.496062991,2.511811021, +1928,1.850393699,1.366141731,2.334645667, +1929,1.905511809,1.429133857,2.381889761, +1930,2.062992124,1.590551179,2.535433068, +1931,2.047244092,1.566929132,2.527559053, +1932,2.271653541,1.803149604,2.740157478, +1933,2.440944879,1.976377951,2.905511808, +1934,2.228346454,1.759842518,2.696850391, +1935,2.448818895,1.980314959,2.917322832, +1936,2.295275588,1.83070866,2.759842517, +1937,2.519685037,2.055118108,2.984251965, +1938,2.622047241,2.157480313,3.08661417, +1939,2.826771651,2.346456691,3.307086611, +1940,2.618110234,2.18110236,3.055118107, +1941,3.098425194,2.673228344,3.523622044, +1942,3.098425194,2.673228344,3.523622044, +1943,3.098425194,2.673228344,3.523622044, +1944,2.84645669,2.425196848,3.267716532, +1945,2.95669291,2.535433068,3.377952752, +1946,3.251968501,2.834645666,3.669291335, +1947,3.374015745,2.996062989,3.7519685, +1948,3.562992122,3.19685039,3.929133854, +1949,3.51181102,3.181102359,3.842519681, +1950,3.598425193,3.287401571,3.909448815, +1951,3.972440941,3.665354327,4.279527555, +1952,3.870078736,3.56692913,4.173228342, +1953,4.043307082,3.748031492,4.338582673, +1954,3.929133854,3.64173228,4.216535429, +1955,3.964566925,3.685039366,4.244094484, +1956,3.763779524,3.488188973,4.039370075, +1957,4.291338578,4.019685035,4.562992121, +1958,4.346456688,4.086614169,4.606299208, +1959,4.358267712,4.102362201,4.614173224, +1960,4.503937003,4.244094484,4.763779523, +1961,4.748031491,4.488188972,5.007874011, +1962,4.543307082,4.283464563,4.803149601, +1963,4.480314956,4.220472437,4.740157475, +1964,4.169291334,3.905511807,4.433070862, +1965,4.610236216,4.346456688,4.874015743, +1966,4.397637791,4.137795271,4.65748031, +1967,4.452755901,4.196850389,4.708661413, +1968,4.484251964,4.220472437,4.748031491, +1969,4.751968499,4.476377948,5.02755905, +1970,4.67716535,4.401574799,4.9527559, +1971,4.881889759,4.610236216,5.153543302, +1972,5.240157475,4.968503932,5.511811018, +1973,5.003937003,4.736220468,5.271653538, +1974,5.472440939,5.204724404,5.740157474, +1975,5.409448813,5.145669286,5.673228341, +1976,5.370078735,5.1023622,5.63779527, +1977,5.303149601,5.043307081,5.56299212, +1978,5.555118105,5.291338577,5.818897632, +1979,5.362204719,5.098425192,5.625984246, +1980,5.598425191,5.34251968,5.854330703, +1981,6.086614167,5.830708655,6.342519679, +1982,5.858267711,5.610236215,6.106299206, +1983,6.188976372,5.93307086,6.444881883, +1984,6.153543301,5.905511805,6.401574797, +1985,5.74803149,5.499999994,5.996062986, +1986,5.771653537,5.523622042,6.019685033, +1987,5.795275585,5.551181097,6.039370073, +1988,5.980314955,5.732283459,6.22834645, +1989,6.157480309,5.905511805,6.409448812, +1990,6.232283458,5.972440939,6.492125978, +1991,6.334645663,6.074803143,6.594488182, +1992,6.35826771,6.094488183,6.622047237, +1993,6.291338576,6.027559049,6.555118104,6.297493046 +1994,6.499999993,6.236220466,6.763779521,6.310933553 +1995,6.618110229,6.354330702,6.881889757,6.452568661 +1996,6.787401568,6.523622041,7.051181095,6.62763131 +1997,7.066929127,6.803149599,7.330708654,6.733920367 +1998,6.665354324,6.393700781,6.937007867,6.865806069 +1999,7.011811016,6.736220466,7.287401567,6.848689771 +2000,7.062992119,6.791338576,7.334645662,6.920582014 +2001,7.287401567,7.019685032,7.555118103,7.087460011 +2002,7.381889756,7.110236213,7.653543299,7.319697525 +2003,7.759842512,7.484251961,8.035433063,7.488352718 +2004,7.740157472,7.464566922,8.015748023,7.507932839 +2005,7.74409448,7.472440937,8.015748023,7.644563144 +2006,7.917322827,7.645669284,8.18897637,7.697420009 +2007,7.996062984,7.712598417,8.279527551,7.70214715 +2008,8.350393692,8.078740149,8.622047235,7.90736541 +2009,8.586614164,8.311023614,8.862204715,8.04635409 +2010,8.901574794,8.618110227,9.185039361,8.122972567 +2011,8.96456692,8.661417314,9.267716526,8.053065004 +2012,9.326771644,8.992125975,9.661417313,8.457057629 +2013,8.980314951,8.622047235,9.338582668,8.546648227 \ No newline at end of file diff --git a/9-data-analysis-python/5-sea-level-predictor/main.py b/9-data-analysis-python/5-sea-level-predictor/main.py new file mode 100644 index 0000000..e3fa261 --- /dev/null +++ b/9-data-analysis-python/5-sea-level-predictor/main.py @@ -0,0 +1,9 @@ +# This entrypoint file to be used in development. Start by reading README.md +import sea_level_predictor +from unittest import main + +# Test your function by calling it here +sea_level_predictor.draw_plot() + +# Run unit tests automatically +main(module='test_module', exit=False) \ No newline at end of file diff --git a/9-data-analysis-python/5-sea-level-predictor/poetry.lock b/9-data-analysis-python/5-sea-level-predictor/poetry.lock new file mode 100644 index 0000000..ba1acc2 --- /dev/null +++ b/9-data-analysis-python/5-sea-level-predictor/poetry.lock @@ -0,0 +1,70 @@ +[[package]] +category = "main" +description = "NumPy is the fundamental package for array computing with Python." +name = "numpy" +optional = false +python-versions = ">=3.5" +version = "1.17.4" + +[[package]] +category = "main" +description = "Powerful data structures for data analysis, time series, and statistics" +name = "pandas" +optional = false +python-versions = ">=3.5.3" +version = "0.25.3" + +[package.dependencies] +numpy = ">=1.13.3" +python-dateutil = ">=2.6.1" +pytz = ">=2017.2" + +[[package]] +category = "main" +description = "Extensions to the standard Python datetime module" +name = "python-dateutil" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +version = "2.8.1" + +[package.dependencies] +six = ">=1.5" + +[[package]] +category = "main" +description = "World timezone definitions, modern and historical" +name = "pytz" +optional = false +python-versions = "*" +version = "2019.3" + +[[package]] +category = "main" +description = "SciPy: Scientific Library for Python" +name = "scipy" +optional = false +python-versions = ">=3.5" +version = "1.4.1" + +[package.dependencies] +numpy = ">=1.13.3" + +[[package]] +category = "main" +description = "Python 2 and 3 compatibility utilities" +name = "six" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*" +version = "1.13.0" + +[metadata] +content-hash = "2b7d90476e9a0bb8e18181af41a4cac15addc5d71a9834f08f8fae9eb3711690" +python-versions = "^3.7" + +[metadata.hashes] +numpy = ["0a7a1dd123aecc9f0076934288ceed7fd9a81ba3919f11a855a7887cbe82a02f", "0c0763787133dfeec19904c22c7e358b231c87ba3206b211652f8cbe1241deb6", "3d52298d0be333583739f1aec9026f3b09fdfe3ddf7c7028cb16d9d2af1cca7e", "43bb4b70585f1c2d153e45323a886839f98af8bfa810f7014b20be714c37c447", "475963c5b9e116c38ad7347e154e5651d05a2286d86455671f5b1eebba5feb76", "64874913367f18eb3013b16123c9fed113962e75d809fca5b78ebfbb73ed93ba", "683828e50c339fc9e68720396f2de14253992c495fdddef77a1e17de55f1decc", "6ca4000c4a6f95a78c33c7dadbb9495c10880be9c89316aa536eac359ab820ae", "75fd817b7061f6378e4659dd792c84c0b60533e867f83e0d1e52d5d8e53df88c", "7d81d784bdbed30137aca242ab307f3e65c8d93f4c7b7d8f322110b2e90177f9", "8d0af8d3664f142414fd5b15cabfd3b6cc3ef242a3c7a7493257025be5a6955f", "9679831005fb16c6df3dd35d17aa31dc0d4d7573d84f0b44cc481490a65c7725", "a8f67ebfae9f575d85fa859b54d3bdecaeece74e3274b0b5c5f804d7ca789fe1", "acbf5c52db4adb366c064d0b7c7899e3e778d89db585feadd23b06b587d64761", "ada4805ed51f5bcaa3a06d3dd94939351869c095e30a2b54264f5a5004b52170", "c7354e8f0eca5c110b7e978034cd86ed98a7a5ffcf69ca97535445a595e07b8e", "e2e9d8c87120ba2c591f60e32736b82b67f72c37ba88a4c23c81b5b8fa49c018", "e467c57121fe1b78a8f68dd9255fbb3bb3f4f7547c6b9e109f31d14569f490c3", "ede47b98de79565fcd7f2decb475e2dcc85ee4097743e551fe26cfc7eb3ff143", "f58913e9227400f1395c7b800503ebfdb0772f1c33ff8cb4d6451c06cabdf316", "fe39f5fd4103ec4ca3cb8600b19216cd1ff316b4990f4c0b6057ad982c0a34d5"] +pandas = ["00dff3a8e337f5ed7ad295d98a31821d3d0fe7792da82d78d7fd79b89c03ea9d", "22361b1597c8c2ffd697aa9bf85423afa9e1fcfa6b1ea821054a244d5f24d75e", "255920e63850dc512ce356233081098554d641ba99c3767dde9e9f35630f994b", "26382aab9c119735908d94d2c5c08020a4a0a82969b7e5eefb92f902b3b30ad7", "33970f4cacdd9a0ddb8f21e151bfb9f178afb7c36eb7c25b9094c02876f385c2", "4545467a637e0e1393f7d05d61dace89689ad6d6f66f267f86fff737b702cce9", "52da74df8a9c9a103af0a72c9d5fdc8e0183a90884278db7f386b5692a2220a4", "61741f5aeb252f39c3031d11405305b6d10ce663c53bc3112705d7ad66c013d0", "6a3ac2c87e4e32a969921d1428525f09462770c349147aa8e9ab95f88c71ec71", "7458c48e3d15b8aaa7d575be60e1e4dd70348efcd9376656b72fecd55c59a4c3", "78bf638993219311377ce9836b3dc05f627a666d0dbc8cec37c0ff3c9ada673b", "8153705d6545fd9eb6dd2bc79301bff08825d2e2f716d5dced48daafc2d0b81f", "975c461accd14e89d71772e89108a050fa824c0b87a67d34cedf245f6681fc17", "9962957a27bfb70ab64103d0a7b42fa59c642fb4ed4cb75d0227b7bb9228535d", "adc3d3a3f9e59a38d923e90e20c4922fc62d1e5a03d083440468c6d8f3f1ae0a", "bbe3eb765a0b1e578833d243e2814b60c825b7fdbf4cdfe8e8aae8a08ed56ecf", "df8864824b1fe488cf778c3650ee59c3a0d8f42e53707de167ba6b4f7d35f133", "e45055c30a608076e31a9fcd780a956ed3b1fa20db61561b8d88b79259f526f7", "ee50c2142cdcf41995655d499a157d0a812fce55c97d9aad13bc1eef837ed36c"] +python-dateutil = ["73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", "75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"] +pytz = ["1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d", "b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"] +scipy = ["00af72998a46c25bdb5824d2b729e7dabec0c765f9deb0b504f928591f5ff9d4", "0902a620a381f101e184a958459b36d3ee50f5effd186db76e131cbefcbb96f7", "1e3190466d669d658233e8a583b854f6386dd62d655539b77b3fa25bfb2abb70", "2cce3f9847a1a51019e8c5b47620da93950e58ebc611f13e0d11f4980ca5fecb", "3092857f36b690a321a662fe5496cb816a7f4eecd875e1d36793d92d3f884073", "386086e2972ed2db17cebf88610aab7d7f6e2c0ca30042dc9a89cf18dcc363fa", "71eb180f22c49066f25d6df16f8709f215723317cc951d99e54dc88020ea57be", "770254a280d741dd3436919d47e35712fb081a6ff8bafc0f319382b954b77802", "787cc50cab3020a865640aba3485e9fbd161d4d3b0d03a967df1a2881320512d", "8a07760d5c7f3a92e440ad3aedcc98891e915ce857664282ae3c0220f3301eb6", "8d3bc3993b8e4be7eade6dcc6fd59a412d96d3a33fa42b0fa45dc9e24495ede9", "9508a7c628a165c2c835f2497837bf6ac80eb25291055f56c129df3c943cbaf8", "a144811318853a23d32a07bc7fd5561ff0cac5da643d96ed94a4ffe967d89672", "a1aae70d52d0b074d8121333bc807a485f9f1e6a69742010b33780df2e60cfe0", "a2d6df9eb074af7f08866598e4ef068a2b310d98f87dc23bd1b90ec7bdcec802", "bb517872058a1f087c4528e7429b4a44533a902644987e7b2fe35ecc223bc408", "c5cac0c0387272ee0e789e94a570ac51deb01c796b37fb2aad1fb13f85e2f97d", "cc971a82ea1170e677443108703a2ec9ff0f70752258d0e9f5433d00dda01f59", "dba8306f6da99e37ea08c08fef6e274b5bf8567bb094d1dbe86a20e532aca088", "dc60bb302f48acf6da8ca4444cfa17d52c63c5415302a9ee77b3b21618090521", "dee1bbf3a6c8f73b6b218cb28eed8dd13347ea2f87d572ce19b289d6fd3fbc59"] +six = ["1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", "30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"] diff --git a/9-data-analysis-python/5-sea-level-predictor/pyproject.toml b/9-data-analysis-python/5-sea-level-predictor/pyproject.toml new file mode 100644 index 0000000..ab957fa --- /dev/null +++ b/9-data-analysis-python/5-sea-level-predictor/pyproject.toml @@ -0,0 +1,11 @@ +[tool] +[tool.poetry] +authors = ["Your Name "] +name = "root" +version = "0.0.0" +description = "" + +[tool.poetry.dependencies] +pandas = "*" +python = "^3.7" +scipy = "*" diff --git a/9-data-analysis-python/5-sea-level-predictor/sea_level_plot.png b/9-data-analysis-python/5-sea-level-predictor/sea_level_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..22523aca602c5d196ca98f30d66848ddbc490361 GIT binary patch literal 44726 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 2000] + + res = linregress(df['Year'], df['CSIRO Adjusted Sea Level']) + + plt.plot(np.arange(2000, 2051), res.intercept + res.slope * np.arange(2000, 2051), 'r') + + # Add labels and title + plt.xlabel('Year') + plt.ylabel('Sea Level (inches)') + plt.title('Rise in Sea Level') + plt.xlim(1850, 2075) + + # Save plot and return data for testing (DO NOT MODIFY) + plt.savefig('sea_level_plot.png') + return plt.gca() \ No newline at end of file diff --git a/9-data-analysis-python/5-sea-level-predictor/test_module.py b/9-data-analysis-python/5-sea-level-predictor/test_module.py new file mode 100644 index 0000000..24630d1 --- /dev/null +++ b/9-data-analysis-python/5-sea-level-predictor/test_module.py @@ -0,0 +1,41 @@ +import unittest +import sea_level_predictor +import matplotlib as mpl +import numpy as np + + +# the test case +class LinePlotTestCase(unittest.TestCase): + def setUp(self): + self.ax = sea_level_predictor.draw_plot() + + def test_plot_title(self): + actual = self.ax.get_title() + expected = "Rise in Sea Level" + self.assertEqual(actual, expected, "Expected line plot title to be 'Rise in Sea Level'") + + def test_plot_labels(self): + actual = self.ax.get_xlabel() + expected = "Year" + self.assertEqual(actual, expected, "Expected line plot xlabel to be 'Year'") + actual = self.ax.get_ylabel() + expected = "Sea Level (inches)" + self.assertEqual(actual, expected, "Expected line plot ylabel to be 'Sea Level (inches)'") + actual = self.ax.get_xticks().tolist() + expected = [1850.0, 1875.0, 1900.0, 1925.0, 1950.0, 1975.0, 2000.0, 2025.0, 2050.0, 2075.0] + self.assertEqual(actual, expected, "Expected x tick labels to be '1850.0, 1875.0, 1900.0, 1925.0, 1950.0, 1975.0, 2000.0, 2025.0, 2050.0, 2075.0'") + + def test_plot_data_points(self): + actual = self.ax.get_children()[0].get_offsets().data.tolist() + expected = [[1880.0, 0.0], [1881.0, 0.220472441], [1882.0, -0.440944881], [1883.0, -0.232283464], [1884.0, 0.590551181], [1885.0, 0.531496062], [1886.0, 0.437007874], [1887.0, 0.216535433], [1888.0, 0.299212598], [1889.0, 0.362204724], [1890.0, 0.440944881], [1891.0, 0.374015748], [1892.0, 0.499999999], [1893.0, 0.685039369], [1894.0, 0.303149606], [1895.0, 0.767716535], [1896.0, 0.468503937], [1897.0, 0.673228346], [1898.0, 1.043307086], [1899.0, 1.338582676], [1900.0, 1.125984251], [1901.0, 1.110236219], [1902.0, 1.291338581], [1903.0, 1.606299211], [1904.0, 1.2007874], [1905.0, 0.984251968], [1906.0, 1.251968503], [1907.0, 1.196850392], [1908.0, 1.098425196], [1909.0, 1.27559055], [1910.0, 1.271653542], [1911.0, 1.598425195], [1912.0, 1.476377951], [1913.0, 1.547244093], [1914.0, 1.795275589], [1915.0, 2.10629921], [1916.0, 2.031496061], [1917.0, 1.854330707], [1918.0, 1.791338581], [1919.0, 1.854330707], [1920.0, 1.905511809], [1921.0, 1.988188974], [1922.0, 1.952755904], [1923.0, 1.999999998], [1924.0, 1.712598423], [1925.0, 1.791338581], [1926.0, 2.047244092], [1927.0, 2.003937006], [1928.0, 1.850393699], [1929.0, 1.905511809], [1930.0, 2.062992124], [1931.0, 2.047244092], [1932.0, 2.271653541], [1933.0, 2.440944879], [1934.0, 2.228346454], [1935.0, 2.448818895], [1936.0, 2.295275588], [1937.0, 2.519685037], [1938.0, 2.622047241], [1939.0, 2.826771651], [1940.0, 2.618110234], [1941.0, 3.098425194], [1942.0, 3.098425194], [1943.0, 3.098425194], [1944.0, 2.84645669], [1945.0, 2.95669291], [1946.0, 3.251968501], [1947.0, 3.374015745], [1948.0, 3.562992122], [1949.0, 3.51181102], [1950.0, 3.598425193], [1951.0, 3.972440941], [1952.0, 3.870078736], [1953.0, 4.043307082], [1954.0, 3.929133854], [1955.0, 3.964566925], [1956.0, 3.763779524], [1957.0, 4.291338578], [1958.0, 4.346456688], [1959.0, 4.358267712], [1960.0, 4.503937003], [1961.0, 4.748031491], [1962.0, 4.543307082], [1963.0, 4.480314956], [1964.0, 4.169291334], [1965.0, 4.610236216], [1966.0, 4.397637791], [1967.0, 4.452755901], [1968.0, 4.484251964], [1969.0, 4.751968499], [1970.0, 4.67716535], [1971.0, 4.881889759], [1972.0, 5.240157475], [1973.0, 5.003937003], [1974.0, 5.472440939], [1975.0, 5.409448813], [1976.0, 5.370078735], [1977.0, 5.303149601], [1978.0, 5.555118105], [1979.0, 5.362204719], [1980.0, 5.598425191], [1981.0, 6.086614167], [1982.0, 5.858267711], [1983.0, 6.188976372], [1984.0, 6.153543301], [1985.0, 5.74803149], [1986.0, 5.771653537], [1987.0, 5.795275585], [1988.0, 5.980314955], [1989.0, 6.157480309], [1990.0, 6.232283458], [1991.0, 6.334645663], [1992.0, 6.35826771], [1993.0, 6.291338576], [1994.0, 6.499999993], [1995.0, 6.618110229], [1996.0, 6.787401568], [1997.0, 7.066929127], [1998.0, 6.665354324], [1999.0, 7.011811016], [2000.0, 7.062992119], [2001.0, 7.287401567], [2002.0, 7.381889756], [2003.0, 7.759842512], [2004.0, 7.740157472], [2005.0, 7.74409448], [2006.0, 7.917322827], [2007.0, 7.996062984], [2008.0, 8.350393692], [2009.0, 8.586614164], [2010.0, 8.901574794], [2011.0, 8.96456692], [2012.0, 9.326771644], [2013.0, 8.980314951]] + np.testing.assert_almost_equal(actual, expected, 7, "Expected different data points in scatter plot.") + def test_plot_lines(self): + actual = self.ax.get_lines()[0].get_ydata().tolist() + expected = [-0.5421240249263661, -0.4790794409142336, -0.41603485690208686, -0.3529902728899543, -0.2899456888778218, -0.22690110486568926, -0.16385652085355673, -0.1008119368414242, -0.037767352829277456, 0.025277231182855076, 0.08832181519498761, 0.15136639920712014, 0.21441098321925267, 0.2774555672313852, 0.34050015124351773, 0.4035447352556645, 0.466589319267797, 0.5296339032799295, 0.5926784872920621, 0.6557230713041946, 0.7187676553163271, 0.7818122393284739, 0.8448568233406064, 0.9079014073527389, 0.9709459913648715, 1.033990575377004, 1.0970351593891365, 1.1600797434012833, 1.2231243274134158, 1.2861689114255483, 1.3492134954376809, 1.4122580794498134, 1.475302663461946, 1.5383472474740927, 1.6013918314862252, 1.6644364154983577, 1.7274809995104903, 1.7905255835226228, 1.8535701675347553, 1.9166147515468879, 1.9796593355590346, 2.042703919571167, 2.1057485035832997, 2.168793087595432, 2.2318376716075647, 2.2948822556196973, 2.357926839631844, 2.4209714236439766, 2.484016007656109, 2.5470605916682416, 2.610105175680374, 2.6731497596925067, 2.7361943437046534, 2.799238927716786, 2.8622835117289185, 2.925328095741051, 2.9883726797531835, 3.051417263765316, 3.1144618477774486, 3.1775064317895954, 3.240551015801728, 3.3035955998138604, 3.366640183825993, 3.4296847678381255, 3.492729351850258, 3.5557739358624048, 3.6188185198745373, 3.68186310388667, 3.7449076878988024, 3.807952271910935, 3.8709968559230674, 3.934041439935214, 3.9970860239473467, 4.060130607959479, 4.123175191971612, 4.186219775983744, 4.249264359995877, 4.312308944008024, 4.375353528020156, 4.438398112032289, 4.501442696044421, 4.564487280056554, 4.627531864068686, 4.690576448080819, 4.7536210320929655, 4.816665616105098, 4.879710200117231, 4.942754784129363, 5.005799368141496, 5.068843952153628, 5.131888536165775, 5.194933120177907, 5.25797770419004, 5.3210222882021725, 5.384066872214305, 5.4471114562264376, 5.510156040238584, 5.573200624250717, 5.636245208262849, 5.699289792274982, 5.762334376287114, 5.825378960299247, 5.8884235443113795, 5.951468128323526, 6.014512712335659, 6.077557296347791, 6.140601880359924, 6.203646464372056, 6.266691048384189, 6.329735632396336, 6.392780216408468, 6.455824800420601, 6.518869384432733, 6.581913968444866, 6.644958552456998, 6.708003136469145, 6.771047720481278, 6.83409230449341, 6.897136888505543, 6.960181472517675, 7.023226056529808, 7.086270640541954, 7.149315224554087, 7.2123598085662195, 7.275404392578352, 7.338448976590485, 7.401493560602617, 7.46453814461475, 7.527582728626896, 7.590627312639029, 7.653671896651161, 7.716716480663294, 7.7797610646754265, 7.842805648687559, 7.905850232699706, 7.968894816711838, 8.03193940072397, 8.094983984736103, 8.158028568748236, 8.221073152760368, 8.284117736772515, 8.347162320784648, 8.41020690479678, 8.473251488808913, 8.536296072821045, 8.599340656833178, 8.66238524084531, 8.725429824857457, 8.78847440886959, 8.851518992881722, 8.914563576893855, 8.977608160905987, 9.040652744918134, 9.103697328930252, 9.166741912942399, 9.229786496954517, 9.292831080966664, 9.35587566497881, 9.41892024899093, 9.481964833003076, 9.545009417015194, 9.608054001027341, 9.671098585039488, 9.734143169051606, 9.797187753063753, 9.860232337075871, 9.923276921088018, 9.986321505100136, 10.049366089112283, 10.11241067312443, 10.175455257136548] + np.testing.assert_almost_equal(actual, expected, 7, "Expected different line for first line of best fit.") + actual = self.ax.get_lines()[1].get_ydata().tolist() + expected = [7.06107985777146, 7.227507131103323, 7.393934404435242, 7.560361677767105, 7.726788951098968, 7.89321622443083, 8.059643497762693, 8.226070771094555, 8.392498044426418, 8.55892531775828, 8.725352591090143, 8.891779864422006, 9.058207137753925, 9.224634411085788, 9.39106168441765, 9.557488957749513, 9.723916231081375, 9.890343504413238, 10.0567707777451, 10.223198051076963, 10.389625324408826, 10.556052597740688, 10.72247987107255, 10.88890714440447, 11.055334417736333, 11.221761691068195, 11.388188964400058, 11.55461623773192, 11.721043511063783, 11.887470784395646, 12.053898057727508, 12.220325331059371, 12.386752604391233, 12.553179877723153, 12.719607151055015, 12.886034424386878, 13.05246169771874, 13.218888971050603, 13.385316244382466, 13.551743517714328, 13.718170791046191, 13.884598064378054, 14.051025337709916, 14.217452611041836, 14.383879884373698, 14.55030715770556, 14.716734431037423, 14.883161704369286, 15.049588977701148, 15.216016251033011, 15.382443524364874] + np.testing.assert_almost_equal(actual, expected, 7, "Expected different line for second line of best fit.") + +if __name__ == "__main__": + unittest.main()