From 6a66f3f3ed934e0615ff4ba283ee67fcc43d3656 Mon Sep 17 00:00:00 2001 From: jmaslek Date: Wed, 19 Jan 2022 05:45:56 -0500 Subject: [PATCH] Custom data context (#1193) * Add first iteration of custom context * Add sample data + improve plot * Change `head` to `show` with sorting and limit. Add "-x" to plot and dynamic update of completer * generate random time series for test csv * Make columns lower case. Check if date is in columns and convert to timestamp. Improve plotting for dates * Add qa to custom * Add pred to custom * Hugooooo * Testing * dang whitespace Co-authored-by: Colin Delahunty <72827203+colin99d@users.noreply.github.com> Co-authored-by: didierlopes.eth --- custom_imports/test.csv | 733 ++++++++++++++++++ exports/custom/.gitkeep | 0 .../common/quantitative_analysis/qa_view.py | 12 +- gamestonk_terminal/custom/__init__.py | 0 .../custom/custom_controller.py | 242 ++++++ gamestonk_terminal/custom/custom_model.py | 27 + gamestonk_terminal/custom/custom_view.py | 56 ++ .../custom/prediction_techniques/__init__.py | 0 .../prediction_techniques/pred_controller.py | 715 +++++++++++++++++ .../custom/quantitative_analysis/__init__.py | 0 .../quantitative_analysis/qa_controller.py | 694 +++++++++++++++++ terminal.py | 12 +- tests/gamestonk_terminal/custom/__init__.py | 0 .../test_test_empty_load.csv | 1 + .../test_test_load[test.csv].csv | 733 ++++++++++++++++++ .../custom/test_custom_controller.py | 120 +++ .../custom/test_custom_model.py | 24 + .../test_info_no_data.txt | 2 + .../test_print_help.txt | 11 + website/content/custom/_index.md | 24 + website/content/custom/info/_index.md | 28 + website/content/custom/load/_index.md | 11 + website/content/custom/plot/_index.md | 23 + website/content/custom/show/_index.md | 24 + website/data/menu/main.yml | 75 ++ 25 files changed, 3563 insertions(+), 4 deletions(-) create mode 100644 custom_imports/test.csv create mode 100644 exports/custom/.gitkeep create mode 100644 gamestonk_terminal/custom/__init__.py create mode 100644 gamestonk_terminal/custom/custom_controller.py create mode 100644 gamestonk_terminal/custom/custom_model.py create mode 100644 gamestonk_terminal/custom/custom_view.py create mode 100644 gamestonk_terminal/custom/prediction_techniques/__init__.py create mode 100644 gamestonk_terminal/custom/prediction_techniques/pred_controller.py create mode 100644 gamestonk_terminal/custom/quantitative_analysis/__init__.py create mode 100644 gamestonk_terminal/custom/quantitative_analysis/qa_controller.py create mode 100644 tests/gamestonk_terminal/custom/__init__.py create mode 100644 tests/gamestonk_terminal/custom/csv/test_custom_model/test_test_empty_load.csv create mode 100644 tests/gamestonk_terminal/custom/csv/test_custom_model/test_test_load[test.csv].csv create mode 100644 tests/gamestonk_terminal/custom/test_custom_controller.py create mode 100644 tests/gamestonk_terminal/custom/test_custom_model.py create mode 100644 tests/gamestonk_terminal/custom/txt/test_custom_controller/test_info_no_data.txt create mode 100644 tests/gamestonk_terminal/custom/txt/test_custom_controller/test_print_help.txt create mode 100644 website/content/custom/_index.md create mode 100644 website/content/custom/info/_index.md create mode 100644 website/content/custom/load/_index.md create mode 100644 website/content/custom/plot/_index.md create mode 100644 website/content/custom/show/_index.md diff --git a/custom_imports/test.csv b/custom_imports/test.csv new file mode 100644 index 00000000000..63346a24d55 --- /dev/null +++ b/custom_imports/test.csv @@ -0,0 +1,733 @@ +Date,ColNorm,Col2,ColNorm3,ColB +2020-01-01,0.9999525702125136,1.0123130194965915,1.0086674575012688,0.0012027960377402266 +2020-01-02,0.9838498192741062,1.0234212550466153,1.0042245214721552,0.004516903534694491 +2020-01-03,1.0026921290619137,1.0197488119578417,1.0062436813305022,0.00703506806240136 +2020-01-04,0.9880559292083877,1.0333080955589942,1.0443020108362489,0.008811731023127739 +2020-01-05,0.9779970244070624,1.0800643722419347,1.0793343716705162,0.01969649975651378 +2020-01-06,0.9769190810755058,1.074084939646055,1.0576481541518057,0.020894315874158437 +2020-01-07,0.9766394732308502,1.0543684802965811,1.0610302031972367,0.02204281942742464 +2020-01-08,1.0129570916424941,1.052787445634228,1.0726969194936098,0.024441869391977136 +2020-01-09,1.0358984262904671,1.0837030226137803,1.0728332396061548,0.025566331803853582 +2020-01-10,1.0573273623296362,1.0514770924225432,1.0712841902537005,0.027812301599060146 +2020-01-11,1.0591295348101435,1.0293934727855478,1.057462172431816,0.03609599421586869 +2020-01-12,1.0479705339307217,1.089499710414309,1.053145773285828,0.03757372570516329 +2020-01-13,1.0135011066008446,1.0647814334478263,1.0307643076773845,0.04702671062668252 +2020-01-14,1.0129001854523945,1.0838484969617903,1.0214500559731443,0.04865773201730687 +2020-01-15,1.0327050271538776,1.0974755645383598,1.0158943158591365,0.0500936104670989 +2020-01-16,1.0401611506598178,1.1055856016959222,1.017570962222138,0.051546510283918566 +2020-01-17,1.0592005527980166,1.1251400688546163,1.0279746739739088,0.05214905463605022 +2020-01-18,1.0656988484365215,1.1233181056126653,1.0057696407317656,0.057062781069887186 +2020-01-19,1.0774050013473389,1.1391739427677507,1.0214163214305862,0.062085692889891055 +2020-01-20,1.0743932195444494,1.1184045199564303,1.0191038847168161,0.06489656348696969 +2020-01-21,1.069314627826471,1.1213902310033308,0.981727142869055,0.07095929889656888 +2020-01-22,1.0677838384124778,1.1101107117435527,0.9937753008992988,0.07406390750197017 +2020-01-23,1.0721837052909196,1.1231339322396712,1.0063170364688099,0.07606729140605606 +2020-01-24,1.0519412984859928,1.1292660530353713,1.0249133848091416,0.07773201479298267 +2020-01-25,1.0144053512404119,1.1270914610841392,1.053700783473425,0.07980865059299411 +2020-01-26,1.023527191979995,1.1363592258852364,1.066955769678183,0.08530077858530441 +2020-01-27,1.0608121282898904,1.155767423142797,1.0649251904848016,0.09105858072239356 +2020-01-28,1.0610896881458836,1.1872998954313339,1.0910155077242598,0.09685493487836914 +2020-01-29,1.0729846116865194,1.2129254292196707,1.0953355367602375,0.0974095864886109 +2020-01-30,1.1070155748383577,1.2225436274180337,1.1023786574966623,0.09848659852335061 +2020-01-31,1.1276468893948646,1.2167827264140132,1.087327864804962,0.10185505176650272 +2020-02-01,1.1273047110213463,1.208962891615007,1.095389877912996,0.10246375370437492 +2020-02-02,1.164524331136035,1.2141411850554893,1.0930563724386055,0.10406407397455765 +2020-02-03,1.1572415510154523,1.1731428473855654,1.1125836529439332,0.10818540838270917 +2020-02-04,1.1361884175838584,1.1741534743835527,1.1507406424420272,0.11373486819069639 +2020-02-05,1.1328844654206718,1.1898517420599821,1.1516666823668786,0.11729473186219931 +2020-02-06,1.1577282806096219,1.2199844255344168,1.1629328914230879,0.1178542214000958 +2020-02-07,1.1537281271596571,1.2108667382965952,1.1507328444594875,0.12191828262069246 +2020-02-08,1.1692835730858917,1.2005025310124493,1.1151541642382754,0.12457818641843796 +2020-02-09,1.1919668653879631,1.2198402911308477,1.1186168740068323,0.127578616159381 +2020-02-10,1.1928488801117072,1.2301072065077974,1.1002903004732305,0.17395795170841832 +2020-02-11,1.1655878985554617,1.2630467330117316,1.0765044535602653,0.18134000110742077 +2020-02-12,1.1819220888988407,1.252233090663622,1.0685134162077423,0.2069576836007362 +2020-02-13,1.2051655299106299,1.2727144276434825,1.0952376144030738,0.21757943135536145 +2020-02-14,1.1630851464386232,1.32482490333701,1.0802690129905055,0.22080516417558 +2020-02-15,1.1467354653830693,1.3020387895317278,1.0732991680664263,0.2246416403749116 +2020-02-16,1.1383471887580776,1.3137746751723582,1.0387338079814246,0.2250781884637397 +2020-02-17,1.1103773042013345,1.339470245723512,1.0028362328380314,0.2319505028795682 +2020-02-18,1.0734165165514697,1.3427623639089172,1.0424779786809037,0.23394852038131905 +2020-02-19,1.113218756875525,1.4013943415047097,1.0561029872053347,0.23562256743645482 +2020-02-20,1.1071272883991254,1.4541633632206468,1.057236795132449,0.2506012730602552 +2020-02-21,1.105724295358014,1.4401036704211707,1.0483308464436794,0.25201524074539905 +2020-02-22,1.0993215352651164,1.444722748437034,1.089531331294008,0.2524740991954332 +2020-02-23,1.0932176054208576,1.4600263643757259,1.0792794931408676,0.25286420552167327 +2020-02-24,1.0587243077330883,1.4486161918765983,1.1104674454138383,0.25445107106535625 +2020-02-25,1.0620148726350802,1.424154391889335,1.0773223233839628,0.2569377491253046 +2020-02-26,1.0315209557997354,1.4164177419504707,1.0739795914770394,0.2595023947775753 +2020-02-27,1.0408864320197757,1.4801992864018505,1.1116443448045423,0.26088024547790445 +2020-02-28,1.0376663474071368,1.4887160430931639,1.1356346930253116,0.26348140088347216 +2020-02-29,1.0467208549192988,1.5173215466718972,1.107889288405897,0.2642320286926164 +2020-03-01,1.0207093385614623,1.5412863838442494,1.122015128887988,0.2696751096472305 +2020-03-02,1.037525121662198,1.5581551034870829,1.1309415361145174,0.2746277237987294 +2020-03-03,1.0248401372030551,1.5458008902947487,1.1345250503379347,0.276759867831347 +2020-03-04,1.0258486982695476,1.559046676440168,1.1400009349876374,0.28962530774736817 +2020-03-05,1.002432979064144,1.5755262943159305,1.1318408085437592,0.2952623175828989 +2020-03-06,1.012488554893676,1.5756485592282499,1.111311254937364,0.29810237891160546 +2020-03-07,1.0117961369959636,1.5773954804385641,1.11650214408987,0.3006270600511418 +2020-03-08,1.015909711457398,1.610322754539839,1.0839244099353011,0.30209359220406284 +2020-03-09,1.0601538083004134,1.641502594941999,1.1109289188088738,0.3084158226632153 +2020-03-10,1.077941802984011,1.6317374964162892,1.0963222783091267,0.3094796037573752 +2020-03-11,1.1260532732244515,1.6490931415766832,1.0936697895045775,0.3099120345112846 +2020-03-12,1.110425622953289,1.6984993918604234,1.1216131487616146,0.3107492140216191 +2020-03-13,1.0856390325998322,1.6757575671134193,1.1309905076439204,0.3127434128908777 +2020-03-14,1.086150833705044,1.7073637516801137,1.1323850834053195,0.3141475455207612 +2020-03-15,1.0776810151747587,1.6393961270334048,1.110184175943251,0.3153838542164429 +2020-03-16,1.053414211346851,1.6332378686087843,1.1075827734284756,0.31950179103149373 +2020-03-17,1.0357752542856478,1.6461573919889079,1.1148804108874288,0.3230351913660134 +2020-03-18,0.9882913088675116,1.6616420864028898,1.092897650763299,0.3295140538669318 +2020-03-19,0.9915459150909369,1.694505495048448,1.106224258642294,0.33442088687680743 +2020-03-20,0.9677329692322276,1.7011229906107403,1.1389107240383651,0.3352960661280704 +2020-03-21,0.9645668876148116,1.7509973638490954,1.1131190034356908,0.3371362857767921 +2020-03-22,1.009732918005037,1.7555981219117516,1.1097518910234518,0.34335410114824333 +2020-03-23,1.0029827116571677,1.7743131674956232,1.142290844824632,0.34723501348161845 +2020-03-24,0.9940867326226467,1.8231853913696645,1.1557981350878588,0.3643581466680069 +2020-03-25,0.9698510310554863,1.7593514459496427,1.1623510025356016,0.36688201971510703 +2020-03-26,0.9783694635515997,1.7587696051447823,1.1324509088625785,0.367345994699916 +2020-03-27,0.9535087219102177,1.7401060630906493,1.154405728070701,0.37027766558879577 +2020-03-28,0.9418042827123154,1.7538896088257767,1.137007812796809,0.3708727657834398 +2020-03-29,0.96810433350236,1.760480911558011,1.1305910909597376,0.3725369987816818 +2020-03-30,0.974808825820155,1.752151672427521,1.1502789106909035,0.3744820967547409 +2020-03-31,0.9797504957740842,1.798575628301122,1.1535167565595437,0.37639871046291373 +2020-04-01,0.9628955439898036,1.827407571913591,1.1544205314866829,0.3799940149129052 +2020-04-02,0.9754932364091347,1.8232947962202877,1.1564781737474252,0.38034404689313944 +2020-04-03,0.9873275891659168,1.7946562572896825,1.1849738887150674,0.3864074719660551 +2020-04-04,1.0108288103468548,1.7973517877152347,1.1801579800154647,0.3901233102314478 +2020-04-05,0.9736148567642324,1.8044247058734397,1.1850774038437282,0.3917694853658946 +2020-04-06,0.9653399776332667,1.8169983102180662,1.1616633135761323,0.3924900453927962 +2020-04-07,0.962409208328386,1.8141745618144531,1.178300401559042,0.3931171173402186 +2020-04-08,0.9628876392544286,1.9084553610072685,1.1641229279184822,0.3968013538209139 +2020-04-09,0.9333697175902921,1.9025819037665186,1.1717578731799263,0.39766086795338756 +2020-04-10,0.9143682378409272,1.8949236599105557,1.156556367606632,0.3996420215008127 +2020-04-11,0.895385718148122,1.9343903671704854,1.188574497939751,0.401212865147451 +2020-04-12,0.8740743938425345,1.942691462578191,1.211134163737765,0.40297466109168184 +2020-04-13,0.8380660562735384,1.8612114156206194,1.253856740874506,0.4211446222095411 +2020-04-14,0.8520114930850722,1.8606048835295306,1.275827191139803,0.42166033427879707 +2020-04-15,0.8516344906028086,1.8683539523097044,1.2518731047748375,0.42206667980265944 +2020-04-16,0.835552610602664,1.792725972711403,1.2793659536199955,0.42433474858566045 +2020-04-17,0.833052910582975,1.758248128204534,1.2561704403633422,0.4252241763854585 +2020-04-18,0.8392859957724058,1.7337610362834268,1.2786915765601048,0.4275722984496844 +2020-04-19,0.8746610758965373,1.6954668619732205,1.2678897090741965,0.4305271478114172 +2020-04-20,0.878673788351075,1.713805058565187,1.2502906968207468,0.4317764713835109 +2020-04-21,0.8767535247546682,1.7632021018354378,1.2663055769932812,0.43230259029918405 +2020-04-22,0.8770307343047253,1.789303994954698,1.2449466921867858,0.43591681913479735 +2020-04-23,0.8688819247505064,1.7801178820506536,1.247319180623821,0.43714779785266344 +2020-04-24,0.8712572077489298,1.8126629459732946,1.1785850108864557,0.4393666393556777 +2020-04-25,0.8752019965989468,1.7826892137128605,1.1619577030622186,0.44222079826215926 +2020-04-26,0.8738342993845689,1.7692676011973314,1.1772604709486858,0.4467959023170046 +2020-04-27,0.8597736281199799,1.816336026575841,1.2207076138026107,0.45138050497008525 +2020-04-28,0.8281893226773166,1.7791160644096362,1.204458594661689,0.4546959458841382 +2020-04-29,0.836203177555408,1.7935299496511174,1.2244487110001496,0.45519430839431474 +2020-04-30,0.8433768320154121,1.8021267508275394,1.2186995964505196,0.456487714432498 +2020-05-01,0.8610574283159262,1.8179880490122236,1.211596391706884,0.5032677683170869 +2020-05-02,0.8348339155837669,1.8329762133715592,1.232334831194072,0.5061044878931531 +2020-05-03,0.8294266411564094,1.7470937459849967,1.223432738495758,0.5105113908002137 +2020-05-04,0.8405262716109546,1.7492904866442132,1.2037649543745659,0.5130162377726127 +2020-05-05,0.8639276597819987,1.8076326060564027,1.1787876114922382,0.5144834231314999 +2020-05-06,0.8706715188631232,1.8152317063308048,1.1898508286284304,0.5163417466277547 +2020-05-07,0.8932902477660367,1.8248944901012816,1.1745421075877225,0.5253116053925546 +2020-05-08,0.9292530093247632,1.8666259242266827,1.1888858396446627,0.5261093638134726 +2020-05-09,0.914099566383566,1.8535959293626267,1.2058210197303287,0.5275315455348729 +2020-05-10,0.9008725520848793,1.8596853538255091,1.155408426884541,0.5286975757051593 +2020-05-11,0.9003979758283102,1.928069431657337,1.2107378814039818,0.5325518241586814 +2020-05-12,0.8900230757659284,1.8875159123214997,1.1839027235470037,0.5337608887621328 +2020-05-13,0.9006958785299365,1.9123856010771008,1.195637404491816,0.5348093389633294 +2020-05-14,0.9036296113002158,1.9097025948365052,1.198912413792671,0.5376854931262441 +2020-05-15,0.9075433132199904,1.9846404281453107,1.2343851890405675,0.5437445517365902 +2020-05-16,0.8848998045208422,1.9618337635732597,1.2117440383193852,0.5450930567159439 +2020-05-17,0.8830579864449316,1.913198176076837,1.2130085537858446,0.5520390802990911 +2020-05-18,0.8846769581394759,1.9632588698129179,1.2071416880612174,0.5544325112904755 +2020-05-19,0.9154201534517433,1.9835102422036717,1.1753609106428433,0.5583256085292775 +2020-05-20,0.9344135262197314,1.9683606589154659,1.1673976905013788,0.560208080529156 +2020-05-21,0.9732143169767573,1.93602343463149,1.17798079610132,0.5616098967643237 +2020-05-22,0.9730686691285166,1.9286876318079815,1.2185774476851847,0.5638831776794241 +2020-05-23,0.9878609570461825,1.9436075518434304,1.1970035409307191,0.5642855262406092 +2020-05-24,0.9963683545647176,1.9689072056752608,1.2300920949665672,0.5658770969529832 +2020-05-25,1.0018174257470982,1.9807455978731525,1.2863295043597427,0.5670664570002988 +2020-05-26,1.0323794656420129,1.986433207227409,1.2820608514026766,0.5689351200686489 +2020-05-27,1.0591764088147717,2.018300990083014,1.3087971163195562,0.5791493210849563 +2020-05-28,1.0543565899384209,1.9630661666978968,1.3372792287811608,0.5833566476963967 +2020-05-29,1.0419595558177785,1.898840299065144,1.3293907653782013,0.5842304945675731 +2020-05-30,1.0414202992577273,1.882316871058859,1.3291038297915918,0.5860386077339174 +2020-05-31,1.0572880297659135,1.904557874358223,1.306170615874509,0.5882642097939847 +2020-06-01,1.0520606263574148,1.8445426749048743,1.3339942892029724,0.5900023274500287 +2020-06-02,1.0659722213586111,1.8570302564383951,1.3558757821530338,0.5909020647119387 +2020-06-03,1.0656039525363368,1.8743014801338014,1.372185688108781,0.5920474859439436 +2020-06-04,1.0358577638256254,1.930773225339492,1.3526282848180564,0.5944853954946582 +2020-06-05,1.0089333673953484,1.9898046345316736,1.3628178046315713,0.5956210659548 +2020-06-06,1.0196919399093973,2.021669352765277,1.3859341395415308,0.5964508371820592 +2020-06-07,1.021781040273442,1.9723469958642448,1.3787384116005414,0.5989637695603802 +2020-06-08,1.0216307354401244,1.9143159472475906,1.3569619025531028,0.5997279251321306 +2020-06-09,1.0252951525306686,1.9635205225043117,1.3878055537360765,0.6008055961191918 +2020-06-10,1.0569657982856673,2.0338306423545314,1.4099079973949116,0.603045804651097 +2020-06-11,1.0587301242900011,1.9782634334719158,1.3977391153857357,0.6150561437971321 +2020-06-12,1.0714306810044087,1.9771940498211433,1.4206170585270756,0.6179519882991029 +2020-06-13,1.0522387861832565,1.9728414295620897,1.3762378861610598,0.6207784844352121 +2020-06-14,1.0475181490250334,1.9522977210035048,1.3788453761592088,0.6273159598727789 +2020-06-15,1.0234072353225911,1.940233262776903,1.412147349198787,0.6279621706403626 +2020-06-16,1.0189227881643945,1.9399345009150732,1.4200695913506778,0.6299345113347883 +2020-06-17,1.001028085535756,1.9674301947596378,1.4196530534097238,0.6354196210129143 +2020-06-18,0.9912641618976554,1.9251588499668064,1.4343893896623496,0.6358630075674107 +2020-06-19,0.9805087526933827,1.9994200883931081,1.4158425001018318,0.6406732231437341 +2020-06-20,1.009464040256068,2.0493123790500967,1.4486299245023713,0.6424250037998596 +2020-06-21,0.9952585976409621,2.0769530516397676,1.4478176424803664,0.644099320786275 +2020-06-22,0.9855112363074202,2.154240810255652,1.4728892769819055,0.65280314288818 +2020-06-23,1.0073268728636948,2.250014679802232,1.4336431865428896,0.6537610284791265 +2020-06-24,1.0066322355863426,2.2249349095517776,1.456538552996501,0.6642644900169009 +2020-06-25,0.9575855268333074,2.2522471079270177,1.4489673649411032,0.6662331802982429 +2020-06-26,0.9337977450912275,2.2473360044363764,1.4219169403245642,0.6712327430274364 +2020-06-27,0.9382604578618755,2.212321320270245,1.4158204261628429,0.6718141645698742 +2020-06-28,0.9465411154535147,2.2052582536214502,1.4301201853242347,0.6748761659021221 +2020-06-29,0.9676702771137915,2.2248062051288153,1.4205700210255783,0.6777010977843823 +2020-06-30,0.9730242802452448,2.2246965725926624,1.431301037561824,0.6810713167270627 +2020-07-01,1.0168182246966204,2.1805611732536536,1.413869125858902,0.6854507253006858 +2020-07-02,0.9884133039324408,2.1187033637482977,1.4585566422685736,0.6914250722668893 +2020-07-03,0.9585398824348965,2.2376378185309136,1.470639941407874,0.6981504848050071 +2020-07-04,0.9595913158376671,2.3120006109496005,1.4819897523145185,0.701585449803921 +2020-07-05,0.9757235638340338,2.2774986228750245,1.4960258331955485,0.7149469105534326 +2020-07-06,0.9827376276758062,2.2843900590421717,1.4898515668154009,0.7170969248236969 +2020-07-07,0.948286988931661,2.3596790863844497,1.4884166060259274,0.7200363865166225 +2020-07-08,0.95983945474466,2.3428537030368135,1.4814014755271234,0.733944628256304 +2020-07-09,0.9887179191768426,2.334739011274857,1.4816150241435395,0.7505784071243449 +2020-07-10,0.9802149969178717,2.3289077061155044,1.5012839517690568,0.7542827121165976 +2020-07-11,1.0111801099245266,2.3762608242412484,1.4822256204365474,0.7577808445549317 +2020-07-12,0.9908774679553789,2.338739493642145,1.4968229686233339,0.7581841098807811 +2020-07-13,1.0150580794369408,2.3904389954640255,1.5178366494862991,0.7590465695525171 +2020-07-14,1.0261743177955382,2.3420718549672097,1.5061115657909745,0.7639942976386366 +2020-07-15,1.0133960284012418,2.285218813106673,1.5284744513591788,0.7658450238084406 +2020-07-16,1.0033585655883903,2.2916211474658827,1.5526985398838336,0.7668377473401666 +2020-07-17,1.0214254580426407,2.284796272086247,1.5683537788630093,0.773666458664223 +2020-07-18,1.0258147735393117,2.326074282269038,1.5819812060864555,0.7741125330133553 +2020-07-19,1.0277799488903645,2.313494157425774,1.5255583651924847,0.7826372141983156 +2020-07-20,1.0250278191733373,2.278818786219646,1.54493640675825,0.7849066005951117 +2020-07-21,1.0257995914283937,2.292032861748544,1.5695257884532219,0.7905005243387364 +2020-07-22,1.0267879097412553,2.3357189250696235,1.6379610352759344,0.7927312499590004 +2020-07-23,1.0389261663290388,2.2745381792837516,1.6741344875394764,0.7932923787420468 +2020-07-24,1.0090611425619138,2.27252655110798,1.6670325422686327,0.800327607061777 +2020-07-25,1.0111313862047133,2.279455373088168,1.6518090188831573,0.8014076085285011 +2020-07-26,1.0067105716491014,2.337111200552414,1.6158039012294794,0.8029224068101758 +2020-07-27,0.9943272432378184,2.344620817213409,1.6592134355369355,0.8044242114850151 +2020-07-28,0.9771854889328592,2.3668944985219684,1.6834148760009815,0.8067735795987538 +2020-07-29,0.987198955879071,2.365490030794681,1.6573657588652606,0.8085471775881818 +2020-07-30,0.9888543540371442,2.4186434653114315,1.6948554904645168,0.8093127338406706 +2020-07-31,0.9842301412324337,2.439618652810949,1.6977441737817598,0.8150204456713851 +2020-08-01,0.965140237243522,2.3770419232099975,1.7130192709673837,0.820727682415597 +2020-08-02,0.9584029809666005,2.391147596111345,1.7102510175672765,0.8230434914696654 +2020-08-03,0.9759006091717436,2.316994177690388,1.677597065066447,0.8235096815101353 +2020-08-04,0.9501373549633251,2.3234590665120716,1.719964069915885,0.8300941688326845 +2020-08-05,0.9604065612739537,2.330382213682331,1.7245154724647795,0.8330687581297908 +2020-08-06,0.9763594060576909,2.299066090311157,1.7136462533090864,0.8353346614561531 +2020-08-07,0.9825778589100209,2.3206391377668742,1.7352866357509227,0.8405502317307677 +2020-08-08,1.002223311947791,2.3345124788636893,1.7789867378872073,0.848667172533915 +2020-08-09,0.9741775954468116,2.324104123933205,1.7881689205814137,0.8492059663380161 +2020-08-10,1.0023146422045273,2.3808768331064356,1.8032339491973044,0.8504486714663375 +2020-08-11,1.041041647377543,2.3125012385662798,1.8030267541146656,0.8506876858913054 +2020-08-12,1.0503909012329131,2.2980280882739854,1.814121400862128,0.8546087121913079 +2020-08-13,1.0569775764121196,2.3306666186256813,1.8310081827506195,0.8662994428865795 +2020-08-14,1.0610751998772194,2.3363040378262765,1.8097627942752057,0.8678325823246228 +2020-08-15,1.0587074374476746,2.284354698047326,1.78066771262294,0.8703173049285419 +2020-08-16,1.0302801853601309,2.2446697828141073,1.7874584634073543,0.8801515329571722 +2020-08-17,0.9883894003639239,2.3008989810868967,1.834774742181476,0.8882193510501148 +2020-08-18,0.9965310714959245,2.2772715399838837,1.8060015128893778,0.8903683125160616 +2020-08-19,0.9922031367470385,2.3985652088118314,1.8263341549540526,0.8988293192841955 +2020-08-20,1.0278693248798119,2.401476749244662,1.8651570576166208,0.8996447236089339 +2020-08-21,1.0307882824097563,2.4298134048782725,1.8874087431140567,0.9029573621962058 +2020-08-22,1.0330844780268693,2.5244338157761654,1.8877290724454998,0.9037817003330142 +2020-08-23,1.0307265586558383,2.41630656700321,1.96601286697562,0.905290251932482 +2020-08-24,1.076840824462609,2.5079409618888984,1.9931871139673032,0.9072579650740121 +2020-08-25,1.0642272088309062,2.4408526399836687,1.9102886541833064,0.9125308220473051 +2020-08-26,1.064986098507313,2.4741390097786224,1.9360680365863485,0.9176898336714856 +2020-08-27,1.0461636798460097,2.4800899394650915,1.906140707374937,0.92212480176119 +2020-08-28,1.063683537843083,2.452096428706089,1.8881021305991181,0.9253155271734814 +2020-08-29,1.0398601013283904,2.483553938997862,1.8943904930876099,0.9391703700917097 +2020-08-30,1.0503472744755464,2.5142671696226375,1.9286179775958903,0.9399395481270428 +2020-08-31,1.055469538934899,2.3986857123937475,1.8901320637279218,0.9417255088015568 +2020-09-01,1.103704230856668,2.4178944247065166,1.905143584657302,0.9429029942886286 +2020-09-02,1.0766389180345612,2.4034828942230027,1.9092635728505407,0.9533946056060972 +2020-09-03,1.097258004052795,2.3774517687052756,1.9709450781059117,0.9539742648075353 +2020-09-04,1.1083404943935347,2.3690200841752365,1.9654370007435749,0.9550537111541527 +2020-09-05,1.1202557945126657,2.3123747748020107,1.9676260548319016,0.9577583689599201 +2020-09-06,1.1342844694618273,2.2983710604071907,2.007218107882284,0.9611411682535353 +2020-09-07,1.1117651443837437,2.282342396269001,2.0665421477842556,0.9656206307046505 +2020-09-08,1.108258511313643,2.190755615666369,2.0715962187251686,0.9723784553998674 +2020-09-09,1.1113533876662005,2.2591635505601655,2.166177533441628,0.97616171542827 +2020-09-10,1.105488663733078,2.3239537844119202,2.1034191507163205,0.9771250074759058 +2020-09-11,1.1039642088212858,2.2641895522206923,2.081607237299805,0.9864870215008484 +2020-09-12,1.1185770391430765,2.2546066083105702,2.047143847752991,0.988477465020745 +2020-09-13,1.0628005734560901,2.2899804484534214,2.073500906870503,0.9948467554922771 +2020-09-14,1.0891822636651172,2.3070774686351068,2.1414893899122434,1.002187845607817 +2020-09-15,1.0962564434820237,2.276193543449068,2.2463275307813237,1.0032217115443585 +2020-09-16,1.1115531181137768,2.274219345565829,2.2357721025416546,1.0043792081936727 +2020-09-17,1.0859584169888061,2.2752096704885765,2.201605853297032,1.0093393608511672 +2020-09-18,1.146245860222447,2.282190388787204,2.1606408678853812,1.0123463768773904 +2020-09-19,1.1537778222934165,2.2253933387650817,2.0903069722471477,1.020003702924207 +2020-09-20,1.149390714927409,2.16159784585839,2.073014099305851,1.0220680452699864 +2020-09-21,1.1541331367221972,2.130893491509205,2.0458377760738213,1.0396518237179782 +2020-09-22,1.1498129074160868,2.0926609204347097,2.0541372762601307,1.0409175842445701 +2020-09-23,1.1446406343043778,2.1187642077264566,2.0509299468172397,1.0418509181037665 +2020-09-24,1.1700927924576903,2.091529617399207,2.05527559437275,1.0441420349922215 +2020-09-25,1.1838819765686315,1.984742627815592,1.9811476915854611,1.0524944862588175 +2020-09-26,1.184236071270645,1.986599749963918,2.0437484329144597,1.0539827163149076 +2020-09-27,1.1872652432410737,1.9923360376683188,2.0595813348935597,1.056606955810706 +2020-09-28,1.2111686025938448,2.0269520976346267,2.0885116021757817,1.0637811330951055 +2020-09-29,1.2128187476172962,2.008974500012182,2.1412710103887522,1.06704093548368 +2020-09-30,1.1837228636173038,1.9414782887063273,2.1037135913846106,1.0700352393561359 +2020-10-01,1.2012784798748297,1.9207662270192438,2.1904585636141896,1.072285071441802 +2020-10-02,1.229928289695723,1.926246724868972,2.164058954726515,1.0749903591448788 +2020-10-03,1.2576720294059205,1.9050928318638212,2.240899882087869,1.0772598449622313 +2020-10-04,1.259111975610874,1.9081145172437455,2.17868462965396,1.0790982068698378 +2020-10-05,1.214480304726046,1.9296654214009312,2.191037732205339,1.0799573343473532 +2020-10-06,1.2367119988436592,1.9930332488883804,2.1579497222077135,1.0894433635430334 +2020-10-07,1.1918461991333509,1.9366558570031924,2.1786587345427613,1.0929286737055888 +2020-10-08,1.2047382866267797,1.9700566515518636,2.2589719642075976,1.093509097146584 +2020-10-09,1.1955393840662745,1.9858037585074446,2.3163382795183165,1.0957275047277277 +2020-10-10,1.1867078724647688,2.0718447898888432,2.295617357121811,1.0970848927362957 +2020-10-11,1.207258078161285,2.0397735976409117,2.308352241653706,1.1031996811027127 +2020-10-12,1.2495117298527116,2.0519212522973787,2.358790991672946,1.104976811517453 +2020-10-13,1.2341412949594146,2.0094725225776973,2.3420936881844754,1.1185499443882925 +2020-10-14,1.2074457000680026,2.031792948771168,2.344083278864812,1.1200324757830094 +2020-10-15,1.220685304663726,2.016528400615362,2.308499703000712,1.1210530992163392 +2020-10-16,1.2319782138752637,2.033347365968653,2.3700021947604704,1.1356783068906011 +2020-10-17,1.2439887627555841,2.0766664578138805,2.4031351237219822,1.1374256499103375 +2020-10-18,1.258781393604108,2.105837478503288,2.3539787387736784,1.140862883538152 +2020-10-19,1.2792088654733011,2.163539707503391,2.402843392203179,1.1842957188393533 +2020-10-20,1.3144972047916126,2.111218248768162,2.4317077899697415,1.187223117766127 +2020-10-21,1.3280614214950373,2.1331589617090265,2.4163946030048042,1.1913137320144667 +2020-10-22,1.3387862074636503,2.107535080984876,2.368341209224261,1.194596165781971 +2020-10-23,1.3970068606474848,2.098383962783049,2.3540653842863253,1.1953094065118848 +2020-10-24,1.3950098407949878,2.1082489951221866,2.3878235750331687,1.1960562746315428 +2020-10-25,1.3683339090881992,2.1347223329261586,2.444757578755241,1.196971813667161 +2020-10-26,1.3597019290012515,2.132377251897591,2.550425021636159,1.1999538998132655 +2020-10-27,1.3252947022819863,2.110245072482122,2.5552854101958564,1.2460468434315568 +2020-10-28,1.350487359981082,2.1397843817490836,2.5033398105082383,1.2474069077322734 +2020-10-29,1.3532600119165674,2.104690167136623,2.4389435031573834,1.2544441138139752 +2020-10-30,1.370837466174858,2.054318178776854,2.3920591012804757,1.2575027402817323 +2020-10-31,1.436223081156546,2.119259500400969,2.327329785335115,1.2582356054099209 +2020-11-01,1.4339919936925012,2.1197163872917955,2.274828703304184,1.261388638872427 +2020-11-02,1.4422260672799314,2.1189832379676115,2.2351746919209416,1.267817347384253 +2020-11-03,1.4412699885652236,2.1027043143687516,2.2367901934335976,1.2817313772420904 +2020-11-04,1.419078208431615,2.1186752487054545,2.2135435667771803,1.2826957437003348 +2020-11-05,1.4384833276499038,2.0791707635930976,2.275386102582254,1.2889125409230113 +2020-11-06,1.397384185555799,2.018337080228104,2.2540174817473213,1.2891166579242537 +2020-11-07,1.4064626040344346,2.025141230630807,2.268675318606333,1.2914058011100833 +2020-11-08,1.390685803984185,2.0232486822523024,2.308631854848098,1.3061809174297856 +2020-11-09,1.3874874292995236,2.0714609249336666,2.2607000982157266,1.3070563693566266 +2020-11-10,1.3746878172998056,2.0837537678684472,2.2944440648182702,1.3114511900232557 +2020-11-11,1.3866512589572233,2.022117555885239,2.343260191406187,1.3149800302385661 +2020-11-12,1.3462517758485009,2.0294367203043713,2.3824104193365976,1.3182725372000237 +2020-11-13,1.3312751205259583,2.0035421855998568,2.4281997461920106,1.3216683285938853 +2020-11-14,1.3776766696563165,1.9232503097525762,2.4711215390402788,1.3244142233923455 +2020-11-15,1.366983297010691,1.9501873783889447,2.4544562234099843,1.3263463197175802 +2020-11-16,1.3597793148515092,1.996652165598607,2.528060405706684,1.327109604231372 +2020-11-17,1.3164281793115369,1.9423313390033174,2.6558357255967935,1.3313585124923695 +2020-11-18,1.3317846715448027,1.899596306016603,2.5992253259505036,1.3328689868089256 +2020-11-19,1.2902989563375766,1.8806147463941172,2.5515950944407972,1.3337422662350422 +2020-11-20,1.2749496031828011,1.8986996205516706,2.530436419305703,1.337173285028032 +2020-11-21,1.2434267658113127,1.904706777775782,2.5108927102295926,1.3446241059773827 +2020-11-22,1.2706429172588554,1.870104994476517,2.590074707794605,1.3469166244396142 +2020-11-23,1.2828191519336423,1.936549753732673,2.650096538165582,1.3490808275610164 +2020-11-24,1.3041379804862103,1.9348274686464317,2.627959424025244,1.3556184171933339 +2020-11-25,1.2987110107751347,1.8670997186862426,2.6316490214502246,1.3570177935958085 +2020-11-26,1.3269329819747593,1.8424779259913635,2.6388179194852506,1.3614280845340117 +2020-11-27,1.3152746770511103,1.8689955585211881,2.5686740839364846,1.364075927386591 +2020-11-28,1.3506954933107598,1.933073473149457,2.5947787360090837,1.373337402945247 +2020-11-29,1.3386361921791448,1.952838059952042,2.606648540927484,1.383557305443774 +2020-11-30,1.3618661935526004,2.0103250717243943,2.569802850158569,1.385963521814751 +2020-12-01,1.3956760399952601,2.052104646425733,2.5104994197308232,1.3877380840292992 +2020-12-02,1.392074385575624,2.0675494523563653,2.4855662070763356,1.3882444898984934 +2020-12-03,1.3819273790411657,2.093861994727276,2.4218083511035546,1.3890153699132768 +2020-12-04,1.4051363849106822,2.1709975111798006,2.371715986075685,1.3905562618256002 +2020-12-05,1.423109636717845,2.185225636169727,2.34109872040913,1.3907666382352197 +2020-12-06,1.4376836310550631,2.2230317694679256,2.3462328897020717,1.3939039559474664 +2020-12-07,1.526458472596805,2.1939381251150776,2.2648766180102133,1.4179149064159244 +2020-12-08,1.534007078003753,2.193890689106934,2.2376062578363416,1.4196537486195773 +2020-12-09,1.570120782220947,2.2521993496418387,2.323667673355853,1.4249394046116775 +2020-12-10,1.5739401045905157,2.2315715860387604,2.3112442787438057,1.429057781752709 +2020-12-11,1.5429616014165604,2.2591477950980847,2.2728118259357966,1.4308906056337822 +2020-12-12,1.5732341553653304,2.2032364263265896,2.229900385192739,1.4315477095379219 +2020-12-13,1.6286821951906507,2.1830978776161025,2.27740619343844,1.432422980432231 +2020-12-14,1.6469441508431684,2.1425076576757647,2.2352616823269775,1.443150704680311 +2020-12-15,1.5718020183057722,2.071913884488913,2.149424018035347,1.4445448113886517 +2020-12-16,1.5773081091715446,2.0638551560909177,2.1623471099672655,1.4451790340857336 +2020-12-17,1.5227909565144766,2.017921609850533,2.1672842000162413,1.4455625396386613 +2020-12-18,1.4891923221477237,1.9897836257363233,2.176754748496434,1.4526568222617808 +2020-12-19,1.484870487634522,1.951277912733069,2.134627098999995,1.4601245726602683 +2020-12-20,1.5217824616975881,1.951983033258623,2.17789187274426,1.4788068110669847 +2020-12-21,1.5544320141058037,1.8493659165896748,2.18099167487275,1.523962349286215 +2020-12-22,1.560503809998861,1.8611679736818592,2.2039993620760967,1.5246976088013537 +2020-12-23,1.5334971041093952,1.8330024279320971,2.3434762483076366,1.527360584807129 +2020-12-24,1.5794099876243317,1.9041534697937854,2.2901173676907534,1.5297409708066323 +2020-12-25,1.6065679801493142,1.9070647217180154,2.2919709432518562,1.5335846648050422 +2020-12-26,1.622247941424142,1.8928074424100145,2.3030020062181626,1.5352743389100947 +2020-12-27,1.7015908691024357,1.8482200241927493,2.2483812615718852,1.5383112052039312 +2020-12-28,1.6036866430723407,1.843769090979501,2.2314604816282477,1.5386363487762145 +2020-12-29,1.5375202384191342,1.8206896498491538,2.3074157180169994,1.5408157927481176 +2020-12-30,1.5600630935461406,1.7826799832793585,2.2825395987056125,1.5422252257198634 +2020-12-31,1.5104147622873492,1.7668565507355858,2.27695238139297,1.5440584612014132 +2021-01-01,1.5712035235637756,1.6846162848808761,2.233309322045018,1.5448667333098565 +2021-01-02,1.6210547964842792,1.7478151353494071,2.1574629701979298,1.548120419402096 +2021-01-03,1.6289254690471857,1.725836388519887,2.108581903630744,1.548817479707807 +2021-01-04,1.638734525965505,1.7155157917378676,2.044927121863865,1.5563047235141108 +2021-01-05,1.640752183801373,1.7799282303924182,2.016488033588845,1.5608661127582808 +2021-01-06,1.6570539499992365,1.739493941093581,2.0124389592880645,1.5631898777829367 +2021-01-07,1.578187832496174,1.6930194751764869,1.9445270476899645,1.5639680296502423 +2021-01-08,1.6227999393024517,1.7194595600353992,1.9401340947207162,1.5688337294998258 +2021-01-09,1.6283589854096432,1.7136349981154348,1.9080431172050114,1.5723522942035664 +2021-01-10,1.6665194133108947,1.7489061066079215,1.9509162559238367,1.5731664693150271 +2021-01-11,1.6341803105808728,1.7642624682341135,1.9938916226440977,1.575127738455531 +2021-01-12,1.6174970779436197,1.7923811797905562,1.9915053276010666,1.5827514383987595 +2021-01-13,1.615274568253002,1.8107248147139585,2.0359139549100713,1.5991695679580888 +2021-01-14,1.5705483210122417,1.8110093914349246,2.014040713826075,1.6002182868598922 +2021-01-15,1.5876924325730104,1.7660637238985082,2.033374626523945,1.6009281154165214 +2021-01-16,1.5833856066410776,1.8357591587069988,2.0709440693792813,1.6046925481203798 +2021-01-17,1.6013738886591906,1.76494118939999,2.0959265396433056,1.6061847148507544 +2021-01-18,1.578239155108473,1.792300094514741,2.1516234015963183,1.6077436031920698 +2021-01-19,1.537449450971578,1.8410157687393882,2.139618678346696,1.6091465678099 +2021-01-20,1.5270491611118588,1.9563703647019142,2.135332213061328,1.610305157178482 +2021-01-21,1.5228490032906876,1.953475585798639,2.1518202462407237,1.6247341328796 +2021-01-22,1.5407475786564149,2.0017857783766346,2.1879504389166824,1.6285351198690405 +2021-01-23,1.5329914046131201,2.031064990665913,2.220387841380747,1.629948456185217 +2021-01-24,1.5445889585878276,2.037409850509285,2.273437555128114,1.638005012705547 +2021-01-25,1.58644895560336,2.0471656735959542,2.240406426382125,1.638769754048435 +2021-01-26,1.6226036785791869,2.1083680144317913,2.155101334363854,1.6397391094752487 +2021-01-27,1.659383192723776,2.1732417729079967,2.252548140759632,1.64633831261166 +2021-01-28,1.6598891833149922,2.251700342705186,2.2430383173656727,1.655056750637973 +2021-01-29,1.6645972448464752,2.2182444807709443,2.258702561909861,1.6570632637103349 +2021-01-30,1.6583800311374666,2.2397181747086874,2.283747790019089,1.6594746246828356 +2021-01-31,1.6742978776507575,2.28219309133098,2.2449945212007565,1.679216139273793 +2021-02-01,1.6471122487215286,2.234029135013091,2.3347005588457224,1.6802015595330082 +2021-02-02,1.6149287680826088,2.1807981297572727,2.4359899638257314,1.686171899377342 +2021-02-03,1.6227338387550698,2.229245106413431,2.4535999640353876,1.68930490762624 +2021-02-04,1.672839630544011,2.288932619594801,2.45179858236766,1.6919945407776182 +2021-02-05,1.7155729521519976,2.313326745666048,2.37670567388363,1.6937145764169974 +2021-02-06,1.7414517672992007,2.318254663422098,2.387264194297231,1.695671502362838 +2021-02-07,1.7720413917578024,2.3664809566426888,2.4777721668076382,1.6986218980532843 +2021-02-08,1.763925697497288,2.237990831118396,2.499873971884452,1.7000766613841363 +2021-02-09,1.834507869796782,2.41518566629607,2.552919002279553,1.7157291227420661 +2021-02-10,1.835651382083144,2.3710976045171033,2.440534423653256,1.7163877387355815 +2021-02-11,1.8413081048813065,2.386345552129277,2.5432022215403247,1.7238816972371116 +2021-02-12,1.8497654498239466,2.399545791008636,2.5903358390807183,1.7247967038775016 +2021-02-13,1.885631903086976,2.326373973867991,2.4880432502469323,1.72773524757945 +2021-02-14,1.891688653528345,2.286846809475968,2.534049403146154,1.7283190673596367 +2021-02-15,1.879205069976963,2.3153570867912467,2.492408936297317,1.7292851368096562 +2021-02-16,1.839968824554305,2.4053844983623347,2.4770603822645016,1.731689271152427 +2021-02-17,1.8680257921782588,2.347633213984071,2.603642282426436,1.7355926511429076 +2021-02-18,1.8542029059135394,2.325881784724655,2.587474254919851,1.7365009545563135 +2021-02-19,1.882143268936907,2.3015734011198994,2.509811005142073,1.7374818756270234 +2021-02-20,1.8962267570181353,2.3243105765928385,2.546148882354917,1.7478063846297487 +2021-02-21,1.8620055980158459,2.332880010486286,2.522556583215778,1.754398521319979 +2021-02-22,1.9999575696430385,2.340741505413093,2.4518625833119922,1.755009060962941 +2021-02-23,2.042402885781202,2.376196948741956,2.3806418250084875,1.7654433572482449 +2021-02-24,1.9997714207092,2.3921343671989996,2.334373104272601,1.7668196950978072 +2021-02-25,1.9779708858567182,2.3746610694897172,2.4157404521087895,1.770506460232364 +2021-02-26,1.9789516205644688,2.3816546761240103,2.3429892024282744,1.7733391454918466 +2021-02-27,1.93466450603626,2.4461456378944346,2.3065235894018943,1.7831077679253902 +2021-02-28,1.9834071249674945,2.389894059542642,2.3389660816484548,1.7841591200189595 +2021-03-01,1.9741337047452883,2.3111236848031838,2.352691827360532,1.7865375388841398 +2021-03-02,1.937459530362731,2.342655159280589,2.357038931141847,1.7895296836370012 +2021-03-03,1.9706649677688288,2.3299895380302202,2.378363867496358,1.791199912081311 +2021-03-04,2.03454366312985,2.3866367468951792,2.3920543931700116,1.7924193817202656 +2021-03-05,1.9716624067037414,2.3865015749563554,2.378103877859073,1.794301161383427 +2021-03-06,1.9878431487139974,2.4690347112045545,2.347875859464776,1.7956860000056156 +2021-03-07,1.956488326385587,2.5196959406891035,2.3891533436436463,1.8012345301544177 +2021-03-08,2.054920532591151,2.4334746001474263,2.3865526703102056,1.802248520558456 +2021-03-09,2.0709763477762904,2.395801888982338,2.2848109125443656,1.8072296454374943 +2021-03-10,2.061576297676355,2.4757913954678323,2.3654797150002316,1.8128895596995835 +2021-03-11,1.9862895937127723,2.391079361141238,2.319173527252362,1.815566307558204 +2021-03-12,1.984479636847778,2.396957210396273,2.2929915727922676,1.820613332862434 +2021-03-13,1.9739317443337252,2.448548042194237,2.30053923586084,1.8219970155911784 +2021-03-14,1.9898766385379372,2.43624396068609,2.345667653143889,1.8232278681126308 +2021-03-15,1.9247659537591737,2.4335356321894195,2.3538967830230493,1.82373620083605 +2021-03-16,1.9341310435961214,2.3999419292101654,2.3403246389418837,1.824660227754222 +2021-03-17,1.9573630688785582,2.401650476079606,2.3890930472158614,1.830152091408726 +2021-03-18,1.916292220465363,2.4332795948146395,2.4975495346055325,1.8310288037157638 +2021-03-19,1.8902934928551036,2.487105183541092,2.532561024813717,1.8317358469267173 +2021-03-20,1.9033083111399878,2.493733053568105,2.539405350329571,1.8353913872672805 +2021-03-21,1.9469616337437587,2.4445653037914346,2.595591709796882,1.8410845456434617 +2021-03-22,1.9523561942623817,2.464833796058223,2.6360624213867467,1.8434269895174336 +2021-03-23,1.8778580145651458,2.48363158677985,2.7465161664442417,1.8443107942164694 +2021-03-24,1.9079717263254403,2.535945467088719,2.7826295754397847,1.8469647243444618 +2021-03-25,1.8743829208618998,2.5797476302779896,2.6868861321695707,1.850122201684514 +2021-03-26,1.834591128454573,2.610576220050714,2.7188298676243816,1.8517838466539527 +2021-03-27,1.8552127634041797,2.573051282643857,2.7351096355129183,1.855126490928391 +2021-03-28,1.8141910534008308,2.5187250675787283,2.7749074182260496,1.8572472707823149 +2021-03-29,1.8544333591368398,2.4443463293292975,2.8655936571670595,1.8585862793603416 +2021-03-30,1.8798507924095926,2.4149038067531605,2.774884268046476,1.8629393368582883 +2021-03-31,1.9009488168929618,2.4112448623448826,2.6882580643517056,1.8671463378855657 +2021-04-01,1.953119553197379,2.4450145143439017,2.751539545331297,1.8698580742202642 +2021-04-02,1.9208439336302838,2.3945306998424014,2.721056425435808,1.87330909439513 +2021-04-03,1.9043823831998434,2.4885420154624676,2.6598348867019803,1.878195130287063 +2021-04-04,1.9118325872114668,2.4300310533502008,2.7211384877273948,1.8839982986422057 +2021-04-05,1.9143311965206804,2.366572070037218,2.708626053048081,1.8850716239056435 +2021-04-06,1.8868214529678373,2.380104252886121,2.686516753657998,1.8871993251779393 +2021-04-07,1.915272401908787,2.5062371476041356,2.71344808649388,1.8934266304908813 +2021-04-08,1.8266991151730405,2.4886927324645174,2.646619960795338,1.8952255418305732 +2021-04-09,1.8500524861130612,2.4165463443216932,2.6599476022507953,1.9002134801109596 +2021-04-10,1.8195144950767264,2.465958801894828,2.6758564038772983,1.9013421033802682 +2021-04-11,1.8251075661045568,2.4745418174804223,2.7033897124033586,1.9042278480312262 +2021-04-12,1.8574721140724475,2.484584953936203,2.7440593089530627,1.9077837225054788 +2021-04-13,1.911298058653184,2.5605874195631344,2.8414368801570378,1.9099484681472971 +2021-04-14,1.8755803592000877,2.5772966956091943,2.9171447045049925,1.911040045228034 +2021-04-15,1.881151828474525,2.493092715001101,2.908716499524202,1.9117571556803035 +2021-04-16,1.901388647119129,2.533670653002471,2.897580626540045,1.9128440540294511 +2021-04-17,1.8455570976557,2.5107854787646064,2.8589457667876768,1.9179509029490625 +2021-04-18,1.8811275456102494,2.514417473356992,2.863591117645981,1.9203758611787909 +2021-04-19,1.934735684533444,2.441080790840025,2.8073681187362123,1.9216773546234265 +2021-04-20,1.9219636087498067,2.5198850671138677,2.6598177500405376,1.9223746165623774 +2021-04-21,1.8483009032647868,2.5668625547309216,2.6303836552790636,1.925845609587103 +2021-04-22,1.9073036166732469,2.635200116789085,2.6391794736120544,1.9321383005793755 +2021-04-23,1.938789170601118,2.7159817530096486,2.6299970076917005,1.9337504327285644 +2021-04-24,1.9254214485539767,2.68674800088486,2.6213656262579277,1.9391915608669554 +2021-04-25,1.9151980640721527,2.6416818289870436,2.698696546806226,1.9453402405280558 +2021-04-26,1.913556055665868,2.7154844837131242,2.7088420094437335,1.9627177070918458 +2021-04-27,1.8550709922539876,2.7165115356211165,2.7295919593511093,1.970618796089648 +2021-04-28,1.8559271396289394,2.7026332636150108,2.794411627669506,1.9716117398170636 +2021-04-29,1.8887764888453191,2.695615707368346,2.8386011677697285,1.974002338188185 +2021-04-30,1.87702571919354,2.6768278988154934,2.9324184345642834,1.9752019919798773 +2021-05-01,1.869673471855934,2.599014622216264,2.933679320366271,1.9809638585685387 +2021-05-02,1.8703018137152103,2.571181859813996,2.830813323929607,1.9851112456860178 +2021-05-03,1.9397508461882043,2.500067466520934,2.800771049001466,1.9881837519287002 +2021-05-04,1.9662895976827102,2.4880647404085687,2.7574211065527066,1.9924446913404674 +2021-05-05,1.9166876136302373,2.4511445383135855,2.7849793065045674,1.993086718932316 +2021-05-06,1.9105650628791355,2.492654665687748,2.7766387250167632,2.0051437219794908 +2021-05-07,1.96805977731422,2.550894868022315,2.792016997938374,2.0067558210471583 +2021-05-08,1.9762478446854255,2.5846124898397456,2.745681568662014,2.0073834860863173 +2021-05-09,2.0313261579996955,2.6455901447327093,2.7640253214408235,2.0101404950182102 +2021-05-10,2.010304032368663,2.6093978048274313,2.6839376415947034,2.011457989916723 +2021-05-11,1.9888886082655008,2.586485882320101,2.735085847161425,2.0154307660974595 +2021-05-12,2.0119766964891235,2.5795990402328908,2.7489754234614776,2.01927447499852 +2021-05-13,1.9812015301948789,2.5657754558807686,2.798778049554446,2.0196506872240665 +2021-05-14,1.9268653257020327,2.555530678112648,2.7382365105347186,2.0287022787569384 +2021-05-15,1.9676549288249392,2.545716493209544,2.680203454865353,2.0302263577189295 +2021-05-16,2.0345457844885786,2.5385168890809995,2.5767219866057958,2.0310066254357433 +2021-05-17,1.9606539671822019,2.597017465278317,2.654809884531759,2.031844316479567 +2021-05-18,1.949066953412906,2.665849564392086,2.6508616891901435,2.033985580665928 +2021-05-19,1.908705080541045,2.6746661043780247,2.6421100672231406,2.0392519402125733 +2021-05-20,1.903219918956071,2.635660526964302,2.582226260890573,2.041634853378214 +2021-05-21,1.8904485215794526,2.6739417239879977,2.585266889114871,2.0421520225416194 +2021-05-22,1.88099088601678,2.728493647516978,2.495186539060622,2.0425147282708327 +2021-05-23,1.8717741643600017,2.6999196484354004,2.5273052275976875,2.046161078526562 +2021-05-24,1.9511923780284222,2.6590518128951506,2.584550030434049,2.0523363620478525 +2021-05-25,1.925866085030401,2.624531676236537,2.5733349755383266,2.0641169119151375 +2021-05-26,1.979142234707904,2.585684531895416,2.608018521527197,2.0650347867261303 +2021-05-27,1.9929556304949054,2.541961224772388,2.674526052033722,2.0655998338659254 +2021-05-28,1.9489563897379485,2.5695891539521605,2.6504157845173917,2.0667250160164565 +2021-05-29,1.9304517954713933,2.651379750069219,2.7292148870002166,2.0686780200258923 +2021-05-30,1.8956594127156408,2.6824689199866794,2.8701441551837172,2.075140133220369 +2021-05-31,1.9161351501714543,2.559842530638906,2.8986259554264184,2.0780613110690633 +2021-06-01,1.910572978911347,2.5699319760599626,2.934204667154654,2.0795305493241236 +2021-06-02,1.8508997248925763,2.4324737732941655,2.87091985426918,2.0849842569343293 +2021-06-03,1.8288566166552969,2.331982409113071,2.858127947931026,2.0855919218160386 +2021-06-04,1.8346072759864436,2.284948722383677,2.8145071193382014,2.0955531039653197 +2021-06-05,1.8885168997932236,2.290326698915272,2.800462980076794,2.0982117670734555 +2021-06-06,1.8248895809375585,2.3324279303437487,2.7964135929013594,2.1018461280788134 +2021-06-07,1.8481756289460165,2.423256010588786,2.9067171477044207,2.105787599499597 +2021-06-08,1.8684848570095287,2.3977135286610025,2.9080980632719275,2.1067832445344865 +2021-06-09,1.8832576786291053,2.438906968392103,2.911343133245727,2.119006739692313 +2021-06-10,1.8889061489449825,2.4663316166179867,2.8706613540339623,2.1223381704874162 +2021-06-11,1.887797962992375,2.4618455427043773,2.7834343226272966,2.1228458217257864 +2021-06-12,1.8081989813409656,2.38622003153277,2.780969731760915,2.140551759451355 +2021-06-13,1.845294044028118,2.3480220047535156,2.7472498404525156,2.1516534679778947 +2021-06-14,1.87982248448568,2.3510193254934593,2.7581073282006066,2.1548648791531626 +2021-06-15,1.8338720562684567,2.342483386195582,2.724722353009969,2.1566576197096365 +2021-06-16,1.8377758052779498,2.35599816673883,2.739177328292277,2.157290355110665 +2021-06-17,1.8196301146220972,2.422132083942238,2.8244490368467146,2.161990467762121 +2021-06-18,1.8269018626454332,2.3547509115539627,2.887903688319278,2.162764295309903 +2021-06-19,1.8106009920802508,2.375169305086028,2.832486587581785,2.1652895904308656 +2021-06-20,1.8874377713675716,2.389128566489945,2.8568779106026585,2.166182992475619 +2021-06-21,1.8663872313620136,2.323202847900762,2.895433042491957,2.168569662637026 +2021-06-22,1.9378093869222215,2.286453398422873,2.857694799376853,2.171973951255609 +2021-06-23,1.9139717091235062,2.199961227842093,2.9421370312120145,2.1727974168934274 +2021-06-24,1.9438901432697355,2.20785203514083,2.9227064385331896,2.1766744731349945 +2021-06-25,1.9471892979068957,2.269913411493896,2.880360580277351,2.1774856245167253 +2021-06-26,1.9415855608604948,2.295153987435186,2.8826082196695824,2.1789435822974976 +2021-06-27,1.9518140378096729,2.3138490077854157,2.9100507898449455,2.1802505077055705 +2021-06-28,1.8636136811434287,2.3437251272394173,2.927263674542377,2.181806224834297 +2021-06-29,1.8638926435483791,2.3788782530038755,2.8338412698877353,2.183785998658097 +2021-06-30,1.9180444154340122,2.410473548964974,2.7231063331779746,2.2066550902131263 +2021-07-01,1.8680141028965276,2.4095546298490573,2.7236851887550073,2.2087739245872813 +2021-07-02,1.9000815805147049,2.446198538507121,2.754433971997974,2.21063494844427 +2021-07-03,1.8895083801803723,2.480581559774474,2.7079320699053278,2.214414901619294 +2021-07-04,1.8903362113990645,2.6044606499887233,2.655649764756849,2.2160967201726334 +2021-07-05,1.863847557940538,2.6054910686033943,2.6791890779968734,2.224511358845949 +2021-07-06,1.8500225507844492,2.6364143875653507,2.6507914696890436,2.2261640873455297 +2021-07-07,1.8545921896581472,2.633080317410046,2.685442500141768,2.227757799836993 +2021-07-08,1.8904007578732496,2.533747256777972,2.7347535358462505,2.228157877563259 +2021-07-09,1.8856416405504677,2.605524424291013,2.7457330943867726,2.231449946171915 +2021-07-10,1.97848257682334,2.579513338466467,2.788826378168117,2.235957503155089 +2021-07-11,2.0632880307246073,2.4775022572624024,2.7746491256465746,2.2382425762198683 +2021-07-12,2.110504407368901,2.456777769417417,2.7562873121227707,2.2406163223357334 +2021-07-13,2.1759202799695583,2.4984250322812254,2.798153363691262,2.2426404673589078 +2021-07-14,2.239321245772315,2.4492310807898523,2.726840989521577,2.2471386002780784 +2021-07-15,2.2426723865726506,2.402395574599132,2.7602278658235178,2.248833778751075 +2021-07-16,2.2166846403591,2.432506115526139,2.6676493828336945,2.252808270595654 +2021-07-17,2.2841196635189163,2.4972428267219686,2.7076292562719497,2.254000565733404 +2021-07-18,2.386529028336786,2.612095092640717,2.70298080169123,2.261076376791599 +2021-07-19,2.4238653313588148,2.504692276828355,2.7431136501996147,2.2616688822162763 +2021-07-20,2.460828534670216,2.452670936345254,2.7565685093396453,2.262601026466135 +2021-07-21,2.493045678463024,2.4046080113694286,2.7838084192636723,2.2649210605988244 +2021-07-22,2.441711218367391,2.463051137572334,2.799827862481423,2.274065287389161 +2021-07-23,2.418563467184,2.4653369858988423,2.7297221872526554,2.278754666823245 +2021-07-24,2.4304630704026624,2.3651852483193254,2.6663947216805783,2.2797382021876995 +2021-07-25,2.4126973135020275,2.417968008408696,2.787339710188789,2.281719698996362 +2021-07-26,2.47943083422814,2.4510484154227674,2.7912434692107113,2.2851382649621566 +2021-07-27,2.4380333408538903,2.4732696752148855,2.7378070926145313,2.2999182696038782 +2021-07-28,2.400138104550418,2.547255434790142,2.7396727778923124,2.302102827267749 +2021-07-29,2.360471368274433,2.5395460544086044,2.7388249104848317,2.3050948578374104 +2021-07-30,2.355666923260717,2.6254949266270313,2.74941124002447,2.3055518440923057 +2021-07-31,2.416684093944538,2.645511707304542,2.7077209324070077,2.30578825844753 +2021-08-01,2.4128068706501495,2.6219147891822914,2.6886059314060793,2.3136391114307 +2021-08-02,2.398413052480753,2.5677353523181545,2.618904838159212,2.318632597495367 +2021-08-03,2.380141405274328,2.5644643372967035,2.647740662535277,2.320630789130837 +2021-08-04,2.2921663161037276,2.6217937727878615,2.6269895965798953,2.321781634662929 +2021-08-05,2.3144012458599676,2.6548166586145934,2.548888166031659,2.3238221687478564 +2021-08-06,2.265961951621215,2.6070890825727435,2.5504701798220992,2.354673007548111 +2021-08-07,2.364145878366589,2.596710615869842,2.5490555586447248,2.3557410875692586 +2021-08-08,2.231803674581417,2.6717351713292774,2.5616542793907913,2.3584983044174184 +2021-08-09,2.238887015121952,2.7382321156821323,2.5826947578272046,2.359170765898252 +2021-08-10,2.2339645512297044,2.803751927137453,2.57422874290244,2.3603389590413566 +2021-08-11,2.268051347901983,2.849363150205823,2.581723168426758,2.3665125134273004 +2021-08-12,2.253106985644197,2.796967421021412,2.553964612663342,2.3672914355470946 +2021-08-13,2.222066888646865,2.8562837277560336,2.484163135633253,2.3680720623695324 +2021-08-14,2.1627827750859434,2.8381698041678036,2.435386230760158,2.3701761576689115 +2021-08-15,2.078189592625496,2.7198713977785234,2.4107837914568666,2.375395191808593 +2021-08-16,2.084025292809807,2.723601772599589,2.3715953022783283,2.380093186903871 +2021-08-17,2.114290260112508,2.8090650144079103,2.4499854688405223,2.3850957087611766 +2021-08-18,2.1049336334491655,2.7133625112373623,2.451094477786386,2.386094871815321 +2021-08-19,2.0761047423807946,2.7149022252692707,2.4588024793796577,2.3878169160184095 +2021-08-20,2.113261491761997,2.6886861501271544,2.474311580858028,2.3901432153753905 +2021-08-21,2.0554779790278466,2.73245396949763,2.3791016815694674,2.390384867652607 +2021-08-22,2.0121391257376247,2.772520606174383,2.370607589009269,2.391900058718593 +2021-08-23,2.04800026877506,2.6742802906201293,2.4478680243430997,2.3981448890519355 +2021-08-24,2.0716317081149627,2.7635374398801775,2.493017438618508,2.4016980477869465 +2021-08-25,2.1339147395651423,2.801894354817671,2.467735690801983,2.40987605607982 +2021-08-26,2.1550960560486985,2.8135636440796445,2.5732433270029658,2.4111271706772572 +2021-08-27,2.19013224067687,2.751699711247068,2.5839935508464693,2.4187399821881232 +2021-08-28,2.1686211513668545,2.7302426526005306,2.621243087864899,2.4227260952456464 +2021-08-29,2.2756644343885366,2.736448101694492,2.5676860539558284,2.424762688251853 +2021-08-30,2.228843873329216,2.802223133494886,2.5348558782909945,2.4253943176696806 +2021-08-31,2.290534657423185,2.817855286690285,2.492727930845802,2.42633340432104 +2021-09-01,2.3104956751915884,2.841595141956114,2.4917793669013726,2.4331152735594164 +2021-09-02,2.22052238974031,2.8456455944123817,2.480527325602523,2.4338623304549842 +2021-09-03,2.1406712190302226,2.8650549735152824,2.521739658044962,2.4550141443746236 +2021-09-04,2.064483788114315,2.882743039865439,2.60898554264686,2.460356391942159 +2021-09-05,2.048836580652613,2.9650824975909322,2.674911635952264,2.4609446369713437 +2021-09-06,2.0452877259592848,2.903798295648383,2.589414288722403,2.461562486765298 +2021-09-07,2.045620390684616,2.880026888266613,2.639903142275342,2.462835850497363 +2021-09-08,2.0594875117509366,2.9054528756662967,2.6302785319091284,2.4632941712837595 +2021-09-09,2.0715324032788986,2.9521185942197534,2.6582065884896116,2.4658060085407625 +2021-09-10,2.071919030271377,2.9520941932340077,2.6525011751284353,2.4659951096143957 +2021-09-11,2.1128175294359326,3.050636065940252,2.5421340523662264,2.470165291514924 +2021-09-12,2.1371401627561784,3.1088025349851285,2.5531725661354274,2.4714554938837856 +2021-09-13,2.1221979236093858,3.1130281070271884,2.605517396260833,2.4717594878998876 +2021-09-14,2.0922619883835316,3.103804334615367,2.56424106714332,2.484080598930304 +2021-09-15,2.1296373093354015,3.172278969984911,2.603103232320957,2.490925099842164 +2021-09-16,2.2085874383366293,3.2342944060088112,2.539366192461412,2.4920686838886708 +2021-09-17,2.160774656452423,3.1820020466198815,2.4437264197836135,2.497032314538377 +2021-09-18,2.1005571815313426,3.129989283779571,2.4341415711917005,2.5031585820990054 +2021-09-19,2.0349490727249426,3.050564070117339,2.47064740888052,2.5047729501678186 +2021-09-20,2.0122952532834035,2.9663385686230486,2.441739504965169,2.5073164957610614 +2021-09-21,2.0724809184474804,2.925469456042676,2.4118909546622125,2.510259868307541 +2021-09-22,1.999213691064068,2.8570766785494772,2.4272971274175705,2.5113889286847435 +2021-09-23,2.059941390098371,2.92693752803989,2.44880421524885,2.5145633658595057 +2021-09-24,2.105283568817446,2.9195652901295506,2.4374861206290914,2.5173561420402115 +2021-09-25,2.1210872152402542,2.873887502964376,2.4414828878082298,2.522210121483124 +2021-09-26,2.0931165389112834,2.822939979162219,2.4707550747404516,2.523669947695392 +2021-09-27,2.1371758885392134,2.828793719274986,2.3853774746030463,2.5248760447500147 +2021-09-28,2.1929488477227084,2.7593800720810338,2.378955877552903,2.5343482898075793 +2021-09-29,2.125507620414123,2.786935876211741,2.3575908361604307,2.5355289705924555 +2021-09-30,2.052905696214497,2.7282293914876763,2.3015941264528426,2.5382075807228244 +2021-10-01,2.0364080644140428,2.6681989554078887,2.3073491839835536,2.571650727264994 +2021-10-02,2.0422494296057234,2.666711228702867,2.299448424300495,2.5772059977898847 +2021-10-03,2.0947093536075942,2.6668556496516254,2.2328079684139888,2.5802566901785724 +2021-10-04,2.0687468535004876,2.7607929676207017,2.2814550397769966,2.5810454803385636 +2021-10-05,2.008593460234377,2.7751795981601792,2.352048274803163,2.5815117770626617 +2021-10-06,2.067000800313782,2.7068504554634094,2.4217255013963137,2.5820639027611594 +2021-10-07,2.0337696425008014,2.7466966292456103,2.4134972530938272,2.5828079811678166 +2021-10-08,2.0044733977436304,2.7826283421434157,2.4211296867432854,2.584337369306774 +2021-10-09,1.9878463912884312,2.6841407255222376,2.3725726981484647,2.588489827265691 +2021-10-10,1.9789591941446927,2.7547576924846537,2.3320178015335373,2.589656256725408 +2021-10-11,2.067812331771724,2.703092094928401,2.304381553794902,2.5931068769579664 +2021-10-12,2.1151319398016852,2.768753363299485,2.3514950875685137,2.5987731243489507 +2021-10-13,2.074380903246295,2.7573481888431717,2.4117239551590024,2.6094004651481804 +2021-10-14,2.126047656894596,2.7390587746687203,2.535038908206191,2.622306449658358 +2021-10-15,2.1612752917059335,2.7047397413058425,2.5053326748582028,2.6259677667747905 +2021-10-16,2.1956066155375216,2.7089062459147493,2.5817398338602966,2.632824059266838 +2021-10-17,2.241522724288997,2.7249894661547853,2.660616874008986,2.634181980519386 +2021-10-18,2.2751582578885703,2.7623042106401283,2.680746831749016,2.63602807072511 +2021-10-19,2.2563594988412343,2.7471749482664385,2.8041555813061247,2.6363794635692743 +2021-10-20,2.2099896086877795,2.676951221566803,2.920062106542289,2.637304172590792 +2021-10-21,2.282095580740634,2.753894947154244,2.9258750339197217,2.6409597905641258 +2021-10-22,2.2239343284733715,2.7274784269968815,2.9632255775263534,2.646001659676019 +2021-10-23,2.279319416831802,2.754567567751261,2.944829035632479,2.64811853509479 +2021-10-24,2.3453015700758875,2.8067055640853646,2.9700974711232964,2.6527765689500336 +2021-10-25,2.361824247126788,2.83282825313507,2.9242108348710816,2.6545196340698194 +2021-10-26,2.3280396834643073,2.75660559936471,2.9277325762489816,2.6555982638215743 +2021-10-27,2.3232044347597713,2.844989128944869,2.9056610131635514,2.6577179985426636 +2021-10-28,2.325234540964127,2.833538434926841,2.9382674014595938,2.6587683963493935 +2021-10-29,2.3174426156683516,2.827442931346405,2.8986258916038445,2.6614131001738768 +2021-10-30,2.303986868285237,2.7280140030480253,2.9094817433940383,2.6637064407947135 +2021-10-31,2.309969205499111,2.7066661434969617,2.9116358132766327,2.664841531544583 +2021-11-01,2.2788521507542145,2.800627486486081,2.881919827005178,2.682567431792886 +2021-11-02,2.289873879425013,2.8676013261263162,2.9716190686614548,2.6831658727899543 +2021-11-03,2.2502523830877394,2.8681376567654393,2.9549092796583802,2.6895120113039495 +2021-11-04,2.2499643871269837,2.850796290411571,2.8867884233120735,2.6911571478718797 +2021-11-05,2.26774160238118,2.8185360443737983,2.836387156970712,2.6953873599465203 +2021-11-06,2.2531753705339277,2.7826506313198807,2.8582663146238567,2.700841190429837 +2021-11-07,2.2556750085492188,2.8994922166269346,2.8632658419610806,2.7021513445161824 +2021-11-08,2.17027473713999,2.847771395681168,2.833256545930489,2.708092757039891 +2021-11-09,2.1510041519617005,2.872826551162227,2.744546887740383,2.7120664758301136 +2021-11-10,2.089156423071544,2.825751596322006,2.743451393425635,2.724715742479188 +2021-11-11,2.1606616535396515,2.779964928904481,2.781434990204661,2.7337340561236974 +2021-11-12,2.22697625120498,2.793285304179139,2.773887117599273,2.737728468385452 +2021-11-13,2.1257678330081498,2.8165362896066752,2.86750973045401,2.746084629737747 +2021-11-14,2.112117365784724,2.8367061005230485,2.9325662051535626,2.7478284073731647 +2021-11-15,2.1414712041108457,2.754303603858349,2.896365856714937,2.75215193604866 +2021-11-16,2.1557391557902115,2.753001275499925,2.937133059764655,2.754932413419881 +2021-11-17,2.154167768921914,2.810867199878264,2.8810554235577417,2.7554740519676866 +2021-11-18,2.1182579211691177,2.8273564859892204,2.9403688080111583,2.756343465752641 +2021-11-19,2.2080179477473396,2.8057718548817165,2.9615045184130424,2.758478486958606 +2021-11-20,2.2327113423585487,2.8661993143731945,3.0144956798093148,2.759566487000925 +2021-11-21,2.1995919926711824,2.900011718430837,3.0506828709701135,2.7620351530204914 +2021-11-22,2.1615880600950845,2.908847412336186,3.152681181917425,2.762940587626402 +2021-11-23,2.1327325640545864,2.869850036221621,3.2292999126763804,2.7697389936883785 +2021-11-24,2.1128289631029356,2.835360810270004,3.2629362630101233,2.7704335451649413 +2021-11-25,2.1331127276857518,2.744685656788545,3.2493270516880286,2.7713005224391805 +2021-11-26,2.1470826152283653,2.660082061731212,3.1330178519856156,2.773281874490202 +2021-11-27,2.1802836234277545,2.736207459206439,3.1821813755888866,2.7741755748091674 +2021-11-28,2.1696229236188276,2.838619128310465,3.128384633590994,2.7788775126744616 +2021-11-29,2.06697186301064,2.9386551954738698,3.221465553399786,2.814464179560515 +2021-11-30,2.0567800886382206,2.9032547346451127,3.2571867604362543,2.8160649972349403 +2021-12-01,2.0955998606819555,2.8110233635697357,3.229027714239134,2.8199523567872906 +2021-12-02,2.1462545477704857,2.826150809828675,3.1691053282583,2.8229404561199005 +2021-12-03,2.1232431187920686,2.7922683049865076,3.2608479312168894,2.8265425875930568 +2021-12-04,2.1436777950026475,2.747224835986388,3.234805249448213,2.83507130342911 +2021-12-05,2.139560011388713,2.7724527720485277,3.2523476506431717,2.862721448696889 +2021-12-06,2.072164179045985,2.8723039305403075,3.187133755200367,2.8672204458528934 +2021-12-07,2.0927664451122485,2.9330884462016695,3.16775417470898,2.867970299259265 +2021-12-08,2.0793825185416273,2.808423886842806,3.1785452959084544,2.870861724204546 +2021-12-09,2.0988910963722605,2.838298546728298,3.099368984918366,2.8746650385729047 +2021-12-10,2.05563112640476,2.795252673153229,3.0377446518358213,2.8766165408470483 +2021-12-11,2.052190526674436,2.790693445222851,3.018037249654266,2.88227507626334 +2021-12-12,2.0510203371839957,2.7795703215951537,3.062453072536595,2.884033781084639 +2021-12-13,2.0503659209385634,2.705757825920253,3.0577798467602184,2.88807208293864 +2021-12-14,2.065888904872756,2.640561562291197,3.051383213547955,2.890515761651997 +2021-12-15,2.0241158710009217,2.6562965129045946,3.1134644257491795,2.8915956102816867 +2021-12-16,2.011796559941659,2.5879087443206092,3.1071035379000675,2.9017588477036265 +2021-12-17,1.9471541934795626,2.534757152028258,3.118054855704814,2.9056966618689097 +2021-12-18,1.9891576149329404,2.554456971035494,3.190911598735974,2.9073356356281543 +2021-12-19,1.9977947742668283,2.521892010258683,3.1579358508854742,2.908694730596919 +2021-12-20,2.024489416921948,2.498849053678626,3.051474258701378,2.910257506232819 +2021-12-21,1.9101162709403734,2.4994923144947903,3.0417807443363,2.9158203024326323 +2021-12-22,1.8586335615962708,2.4474147650257,3.0696373922941342,2.91760329017934 +2021-12-23,1.8026154230569922,2.4134337813378286,3.10286303278097,2.918765537355731 +2021-12-24,1.8041416523202543,2.3443871803774843,3.1420884645008327,2.9270177310498138 +2021-12-25,1.8489534806960217,2.3553941020378786,3.1643414517660107,2.927586841263833 +2021-12-26,1.892760626762073,2.3910443162754316,3.1633800267770162,2.935788479523747 +2021-12-27,1.8698231750168643,2.430083480413742,3.215021219440133,2.940571664793773 +2021-12-28,1.8548311703170128,2.463051743097091,3.2040363362571576,2.9458838146565722 +2021-12-29,1.887209965197199,2.362401253797821,3.285868116298562,2.9466697183024904 +2021-12-30,1.9151284139685454,2.452230511452688,3.344048729792291,2.958261602966074 +2021-12-31,1.884547011974969,2.4427816715914323,3.391590176442121,2.9589938455406117 +2022-01-01,1.900999543673747,2.423951572030134,3.4221871729754443,2.959381744191336 diff --git a/exports/custom/.gitkeep b/exports/custom/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/gamestonk_terminal/common/quantitative_analysis/qa_view.py b/gamestonk_terminal/common/quantitative_analysis/qa_view.py index dd252c5ab03..d6bf83d5257 100644 --- a/gamestonk_terminal/common/quantitative_analysis/qa_view.py +++ b/gamestonk_terminal/common/quantitative_analysis/qa_view.py @@ -4,6 +4,7 @@ __docformat__ = "numpy" import os import warnings from typing import Any +from datetime import datetime import matplotlib.pyplot as plt import matplotlib.dates as mdates @@ -94,13 +95,18 @@ def display_hist( """ fig, ax = plt.subplots(figsize=plot_autoscale(), dpi=PLOT_DPI) data = df[target] - start = df.index[0] sns.histplot(data, bins=bins, kde=True, ax=ax, stat="proportion") sns.rugplot(data, c="r", ax=ax) - ax.set_title(f"Histogram of {name} {target} from {start.strftime('%Y-%m-%d')}") - ax.set_xlabel("Share Price") + if isinstance(df.index[0], datetime): + start = df.index[0] + + ax.set_title(f"Histogram of {name} {target} from {start.strftime('%Y-%m-%d')}") + else: + ax.set_title(f"Histogram of {name} {target}") + + ax.set_xlabel("Value") ax.grid(True) if gtff.USE_ION: diff --git a/gamestonk_terminal/custom/__init__.py b/gamestonk_terminal/custom/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/gamestonk_terminal/custom/custom_controller.py b/gamestonk_terminal/custom/custom_controller.py new file mode 100644 index 00000000000..c84a071c7b6 --- /dev/null +++ b/gamestonk_terminal/custom/custom_controller.py @@ -0,0 +1,242 @@ +"""Custom Data Controller Module""" +__docformat__ = "numpy" + +import argparse +import logging +from typing import List +from pathlib import Path + +import pandas as pd +from prompt_toolkit.completion import NestedCompleter + +from gamestonk_terminal.rich_config import console +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.parent_classes import BaseController +from gamestonk_terminal.menu import session +from gamestonk_terminal.helper_funcs import ( + parse_known_args_and_warn, + EXPORT_ONLY_FIGURES_ALLOWED, +) +from gamestonk_terminal.custom import custom_model, custom_view + +logger = logging.getLogger(__name__) +# pylint:disable=import-outside-toplevel + + +class CustomDataController(BaseController): + """Alternative Controller class""" + + CHOICES_COMMANDS: List[str] = ["load", "plot", "show", "info"] + CHOICES_MENUS: List[str] = ["qa", "pred"] + pandas_plot_choices = [ + "line", + "scatter", + "bar", + "barh", + "hist", + "box", + "kde", + "area", + "pie", + "hexbin", + ] + PATH = "/custom/" + + def __init__(self, queue: List[str] = None): + """Constructor""" + super().__init__(queue) + self.data = pd.DataFrame() + self.file = "" + self.DATA_FILES = [file.name for file in Path("custom_imports").iterdir()] + + if session and gtff.USE_PROMPT_TOOLKIT: + choices: dict = {c: {} for c in self.controller_choices} + choices["load"] = {c: None for c in self.DATA_FILES} + choices["plot"]["-k"] = {c: None for c in self.pandas_plot_choices} + self.choices = choices + self.completer = NestedCompleter.from_nested_dict(choices) + + def update_runtime_choices(self): + if session and gtff.USE_PROMPT_TOOLKIT: + self.choices["plot"] = {c: None for c in self.data.columns} + self.choices["plot"]["-y"] = {c: None for c in self.data.columns} + self.choices["plot"]["-x"] = {c: None for c in self.data.columns} + self.choices["plot"]["--vs"] = {c: None for c in self.data.columns} + self.choices["show"]["-s"] = {c: None for c in self.data.columns} + + self.completer = NestedCompleter.from_nested_dict(self.choices) + + def print_help(self): + """Print help""" + has_data_start = "" if not self.data.empty else "[unvl]" + has_data_end = "" if not self.data.empty else "[/unvl]" + help_text = f"""[cmds] + load load in custom data set[/cmds] + +Current file: {self.file or None}[cmds]{has_data_start} + show show portion of loaded data + info show data info (columns and datatypes) + plot plot data from loaded file{has_data_end}[/cmds] +[menus] +> qa quantitative analysis, \t e.g.: decompose, cusum, residuals analysis +> pred prediction techniques \t e.g.: regression, arima, rnn, lstm[/menus] +""" + console.print(text=help_text, menu="Custom") + + def call_load(self, other_args: List[str]): + """Process load""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="load", + description="Load custom data set into a dataframe", + ) + parser.add_argument( + "-f", + "--file", + choices=self.DATA_FILES, + help="File to load in.", + default="test.csv", + type=str, + ) + + if other_args and "-" not in other_args[0][0]: + other_args.insert(0, "-f") + ns_parser = parse_known_args_and_warn(parser, other_args) + if ns_parser: + file = Path("custom_imports") / ns_parser.file + self.data = custom_model.load(file) + self.data.columns = self.data.columns.map(lambda x: x.lower()) + for col in self.data.columns: + if col in ["date", "time", "timestamp"]: # Could be others? + self.data[col] = pd.to_datetime(self.data[col]) + self.data = self.data.set_index(col) + self.file = ns_parser.file + self.update_runtime_choices() + console.print("") + + def call_plot(self, other_args: List[str]): + """Process plot command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="plot", + description="Plot 2 columns of loaded data", + ) + parser.add_argument( + "-y", + help="Variable to plot along y", + dest="yvar", + type=str, + choices=list(self.data.columns), + ) + parser.add_argument( + "-x", + "--vs", + help="Variable along x axis", + dest="xvar", + type=str, + choices=list(self.data.columns), + default="", + ) + parser.add_argument( + "-k", + "--kind", + default="scatter", + help="Type of plot for data", + choices=self.pandas_plot_choices, + ) + if other_args and "-" not in other_args[0][0]: + other_args.insert(0, "-y") + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_FIGURES_ALLOWED + ) + if ns_parser: + if self.data.empty: + console.print("[red]No data loaded.[/red]\n") + return + custom_view.custom_plot( + self.data, + ns_parser.yvar, + ns_parser.xvar, + kind=ns_parser.kind, + export=ns_parser.export, + ) + console.print("") + + def call_show(self, other_args: List[str]): + """Process head command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="show", + description="Show loaded dataframe", + ) + parser.add_argument( + "-s", "--sortcol", nargs="+", type=str, dest="sortcol", default="" + ) + parser.add_argument( + "-a", "--ascend", action="store_true", default=False, dest="ascend" + ) + ns_parser = parse_known_args_and_warn(parser, other_args, limit=5) + if ns_parser: + if self.data.empty: + console.print("[red]No data loaded.[/red]\n") + return + if ns_parser.sortcol: + sort_column = " ".join(ns_parser.sortcol) + if sort_column not in self.data.columns: + console.print( + f"[red]{sort_column} not a valid column. Showing without sorting.\n[/red]" + ) + else: + console.print( + self.data.sort_values( + by=sort_column, ascending=ns_parser.ascend + ).head(ns_parser.limit) + ) + console.print() + return + + console.print(self.data.head(ns_parser.limit)) + console.print() + + def call_info(self, other_args: List[str]): + """Process info command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="info", + description="Show information of custom data.", + ) + + ns_parser = parse_known_args_and_warn(parser, other_args) + if ns_parser: + if self.data.empty: + console.print("[red]No data loaded.[/red]\n") + return + console.print(self.data.info()) + console.print() + + def call_qa(self, _): + """Process qa command""" + from gamestonk_terminal.custom.quantitative_analysis import qa_controller + + self.queue = self.load_class( + qa_controller.QaController, + custom_df=self.data, + file=self.file, + queue=self.queue, + ) + + def call_pred(self, _): + """Process pred command""" + if gtff.ENABLE_PREDICT: + from gamestonk_terminal.custom.prediction_techniques import pred_controller + + self.queue = self.load_class( + pred_controller.PredictionTechniquesController, + self.data, + self.file, + self.queue, + ) diff --git a/gamestonk_terminal/custom/custom_model.py b/gamestonk_terminal/custom/custom_model.py new file mode 100644 index 00000000000..405481870fb --- /dev/null +++ b/gamestonk_terminal/custom/custom_model.py @@ -0,0 +1,27 @@ +"""Custom Controller Model""" +__docformat__ = "numpy" + +from pathlib import Path +import pandas as pd + + +def load(file: str) -> pd.DataFrame: + """Load custom file into dataframe. Currently will work with csv + + Parameters + ---------- + file: str + Path to file + + Returns + ------- + pd.DataFrame: + Dataframe with custom data + """ + if not Path(file).exists(): + return pd.DataFrame() + file_type = Path(file).suffix + # TODO More data types + if file_type != ".csv": + return pd.DataFrame() + return pd.read_csv(file) diff --git a/gamestonk_terminal/custom/custom_view.py b/gamestonk_terminal/custom/custom_view.py new file mode 100644 index 00000000000..2a384f7a5e7 --- /dev/null +++ b/gamestonk_terminal/custom/custom_view.py @@ -0,0 +1,56 @@ +"""Custom Controller View""" +__docformat__ = "numpy" + +import os + +import matplotlib.pyplot as plt +import pandas as pd + +from gamestonk_terminal.helper_funcs import plot_autoscale, export_data +from gamestonk_terminal.config_plot import PLOT_DPI +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.rich_config import console + + +def custom_plot( + data: pd.DataFrame, + y_col: str, + x_col: str = "", + kind: str = "scatter", + export: str = "", +): + """Plot custom data + + Parameters + ---------- + data: pd.DataFrame + Dataframe of custom data + y_col: str + Column for y data + x_col: str + Column for x data. Uses index if not supplied. + kind : str + Kind of plot to pass to pandas plot function + export: str + Format to export image + """ + fig, ax = plt.subplots(figsize=plot_autoscale(), dpi=PLOT_DPI) + + if x_col: + data.plot(x=x_col, y=y_col, kind=kind, ax=ax) + else: + data.reset_index().plot(x="index", y=y_col, kind=kind, ax=ax) + + if x_col in ["date", "time", "timestamp"]: + fig.autofmt_xdate() + + fig.tight_layout(pad=2) + if gtff.USE_ION: + plt.ion() + plt.show() + console.print() + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "custom_plot", + ) diff --git a/gamestonk_terminal/custom/prediction_techniques/__init__.py b/gamestonk_terminal/custom/prediction_techniques/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/gamestonk_terminal/custom/prediction_techniques/pred_controller.py b/gamestonk_terminal/custom/prediction_techniques/pred_controller.py new file mode 100644 index 00000000000..a1430c78c16 --- /dev/null +++ b/gamestonk_terminal/custom/prediction_techniques/pred_controller.py @@ -0,0 +1,715 @@ +""" Custom Prediction Controller """ +__docformat__ = "numpy" + +import argparse +from typing import List +from pathlib import Path + +import pandas as pd +from prompt_toolkit.completion import NestedCompleter + +from gamestonk_terminal.custom import custom_model +from gamestonk_terminal.rich_config import console +from gamestonk_terminal.parent_classes import BaseController +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.helper_funcs import ( + parse_known_args_and_warn, + check_positive, + valid_date, + get_next_stock_market_days, + EXPORT_ONLY_FIGURES_ALLOWED, +) +from gamestonk_terminal.menu import session +from gamestonk_terminal.common.prediction_techniques import ( + arima_view, + arima_model, + ets_model, + mc_model, + ets_view, + knn_view, + neural_networks_view, + regression_view, + pred_helper, + mc_view, +) +from gamestonk_terminal.stocks import stocks_helper + + +class PredictionTechniquesController(BaseController): + """Prediction Techniques Controller class""" + + CHOICES_COMMANDS = [ + "load", + "pick", + "ets", + "knn", + "regression", + "arima", + "mlp", + "rnn", + "lstm", + "conv1d", + "mc", + ] + + PATH = "/custom/pred/" + + def __init__( + self, + custom_df: pd.DataFrame, + file: str, + queue: List[str] = None, + ): + """Constructor""" + super().__init__(queue) + self.DATA_FILES = [file.name for file in Path("custom_imports").iterdir()] + + self.df = custom_df + self.ticker = file + self.file = file + self.target = custom_df.columns[2] + + if session and gtff.USE_PROMPT_TOOLKIT: + choices: dict = {c: {} for c in self.controller_choices} + choices["pick"] = {c: None for c in self.df.columns} + choices["load"]["-r"] = {c: {} for c in stocks_helper.INTERVALS} + choices["pick"] = {c: {} for c in self.df.columns} + choices["ets"]["-t"] = {c: {} for c in ets_model.TRENDS} + choices["ets"]["-s"] = {c: {} for c in ets_model.SEASONS} + choices["arima"]["-i"] = {c: {} for c in arima_model.ICS} + choices["mc"]["--dist"] = {c: {} for c in mc_model.DISTRIBUTIONS} + self.choices = choices + self.completer = NestedCompleter.from_nested_dict(choices) + + def print_help(self): + """Print help""" + help_text = f"""[cmds] + load load new ticker + pick pick new target variable[/cmds] + +[param]File: [/param]{self.file} +[param]Target Column: [/param]{self.target} + +[info]Models:[/info][cmds] + ets exponential smoothing (e.g. Holt-Winters) + knn k-Nearest Neighbors + regression polynomial regression + arima autoregressive integrated moving average + mlp MultiLayer Perceptron + rnn Recurrent Neural Network + lstm Long-Short Term Memory + conv1d 1D Convolutional Neural Network + mc Monte-Carlo simulations[/cmds] + """ + console.print(text=help_text, menu="Custom - Prediction Techniques") + + def custom_reset(self): + """Class specific component of reset command""" + if self.ticker: + return ["custom", f"load {self.file}", "pred"] + return [] + + def update_runtime_choices(self): + """Add new columns to pick command""" + if session and gtff.USE_PROMPT_TOOLKIT: + self.choices["pick"] = {c: None for c in list(self.df.columns)} + self.completer = NestedCompleter.from_nested_dict(self.choices) + + def call_load(self, other_args: List[str]): + """Process load""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="load", + description="Load custom data set into a dataframe", + ) + parser.add_argument( + "-f", + "--file", + choices=self.DATA_FILES, + help="File to load in.", + default="test.csv", + type=str, + ) + + if other_args and "-" not in other_args[0][0]: + other_args.insert(0, "-f") + ns_parser = parse_known_args_and_warn(parser, other_args) + if ns_parser: + file = Path("custom_imports") / ns_parser.file + self.df = custom_model.load(file) + self.df.columns = self.df.columns.map(lambda x: x.lower()) + for col in self.df.columns: + if col in ["date", "time", "timestamp"]: # Could be others? + self.df[col] = pd.to_datetime(self.df[col]) + self.df = self.df.set_index(col) + self.file = ns_parser.file + self.update_runtime_choices() + console.print("") + + def call_pick(self, other_args: List[str]): + """Process pick command""" + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + add_help=False, + prog="pick", + description=""" + Change target variable + """, + ) + parser.add_argument( + "-t", + "--target", + dest="target", + choices=list(self.df.columns), + help="Select variable to analyze", + ) + if other_args and "-t" not in other_args and "-h" not in other_args: + other_args.insert(0, "-t") + + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_FIGURES_ALLOWED + ) + if ns_parser: + self.target = ns_parser.target + console.print("") + + def call_ets(self, other_args: List[str]): + """Process ets command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="ets", + description=""" + Exponential Smoothing, see https://otexts.com/fpp2/taxonomy.html + + Trend='N', Seasonal='N': Simple Exponential Smoothing + Trend='N', Seasonal='A': Exponential Smoothing + Trend='N', Seasonal='M': Exponential Smoothing + Trend='A', Seasonal='N': Holt’s linear method + Trend='A', Seasonal='A': Additive Holt-Winters’ method + Trend='A', Seasonal='M': Multiplicative Holt-Winters’ method + Trend='Ad', Seasonal='N': Additive damped trend method + Trend='Ad', Seasonal='A': Exponential Smoothing + Trend='Ad', Seasonal='M': Holt-Winters’ damped method + Trend component: N: None, A: Additive, Ad: Additive Damped + Seasonality component: N: None, A: Additive, M: Multiplicative + """, + ) + parser.add_argument( + "-d", + "--days", + action="store", + dest="n_days", + type=check_positive, + default=5, + help="prediction days.", + ) + parser.add_argument( + "-t", + "--trend", + action="store", + dest="trend", + choices=ets_model.TRENDS, + default="N", + help="Trend component: N: None, A: Additive, Ad: Additive Damped.", + ) + parser.add_argument( + "-s", + "--seasonal", + action="store", + dest="seasonal", + choices=ets_model.SEASONS, + default="N", + help="Seasonality component: N: None, A: Additive, M: Multiplicative.", + ) + parser.add_argument( + "-p", + "--periods", + action="store", + dest="seasonal_periods", + type=check_positive, + default=5, + help="Seasonal periods.", + ) + parser.add_argument( + "-e", + "--end", + action="store", + type=valid_date, + dest="s_end_date", + default=None, + help="The end date (format YYYY-MM-DD) to select - Backtesting", + ) + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_FIGURES_ALLOWED + ) + if ns_parser: + + if ns_parser.s_end_date: + + if ns_parser.s_end_date < self.df.index[0]: + console.print( + "Backtesting not allowed, since End Date is older than Start Date of historical data\n" + ) + + if ns_parser.s_end_date < get_next_stock_market_days( + last_stock_day=self.df.index[0], + n_next_days=5 + ns_parser.n_days, + )[-1]: + console.print( + "Backtesting not allowed, since End Date is too close to Start Date to train model\n" + ) + + ets_view.display_exponential_smoothing( + ticker=self.ticker, + values=self.df[self.target], + n_predict=ns_parser.n_days, + trend=ns_parser.trend, + seasonal=ns_parser.seasonal, + seasonal_periods=ns_parser.seasonal_periods, + s_end_date=ns_parser.s_end_date, + export=ns_parser.export, + ) + + def call_knn(self, other_args: List[str]): + """Process knn command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="knn", + description=""" + K nearest neighbors is a simple algorithm that stores all + available cases and predict the numerical target based on a similarity measure + (e.g. distance functions). + """, + ) + parser.add_argument( + "-i", + "--input", + action="store", + dest="n_inputs", + type=check_positive, + default=40, + help="number of days to use as input for prediction.", + ) + parser.add_argument( + "-d", + "--days", + action="store", + dest="n_days", + type=check_positive, + default=5, + help="prediction days.", + ) + parser.add_argument( + "-j", + "--jumps", + action="store", + dest="n_jumps", + type=check_positive, + default=1, + help="number of jumps in training data.", + ) + parser.add_argument( + "-n", + "--neighbors", + action="store", + dest="n_neighbors", + type=check_positive, + default=20, + help="number of neighbors to use on the algorithm.", + ) + parser.add_argument( + "-e", + "--end", + action="store", + type=valid_date, + dest="s_end_date", + default=None, + help="The end date (format YYYY-MM-DD) to select for testing", + ) + parser.add_argument( + "-t", + "--test_size", + default=0.2, + dest="valid_split", + type=float, + help="Percentage of data to validate in sample", + ) + parser.add_argument( + "--no_shuffle", + action="store_false", + dest="no_shuffle", + default=True, + help="Specify if shuffling validation inputs.", + ) + ns_parser = parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_FIGURES_ALLOWED + ) + if ns_parser: + knn_view.display_k_nearest_neighbors( + ticker=self.ticker, + data=self.df[self.target], + n_neighbors=ns_parser.n_neighbors, + n_input_days=ns_parser.n_inputs, + n_predict_days=ns_parser.n_days, + test_size=ns_parser.valid_split, + end_date=ns_parser.s_end_date, + no_shuffle=ns_parser.no_shuffle, + ) + + def call_regression(self, other_args: List[str]): + """Process linear command""" + parser = argparse.ArgumentParser( + add_help=False, + prog="regression", + description=""" + Regression attempts to model the relationship between + two variables by fitting a linear/quadratic/cubic/other equation to + observed data. One variable is considered to be an explanatory variable, + and the other is considered to be a dependent variable. + """, + ) + + parser.add_argument( + "-i", + "--input", + action="store", + dest="n_inputs", + type=check_positive, + default=40, + help="number of days to use for prediction.", + ) + parser.add_argument( + "-d", + "--days", + action="store", + dest="n_days", + type=check_positive, + default=5, + help="prediction days.", + ) + parser.add_argument( + "-j", + "--jumps", + action="store", + dest="n_jumps", + type=check_positive, + default=1, + help="number of jumps in training data.", + ) + parser.add_argument( + "-e", + "--end", + action="store", + type=valid_date, + dest="s_end_date", + default=None, + help="The end date (format YYYY-MM-DD) to select - Backtesting", + ) + parser.add_argument( + "-p", + "--polynomial", + action="store", + dest="n_polynomial", + type=check_positive, + default=1, + help="polynomial associated with regression.", + ) + if ( + other_args + and "-h" not in other_args + and ("-p" not in other_args or "--polynomial" not in other_args) + ): + other_args.insert(0, "-p") + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_FIGURES_ALLOWED + ) + if ns_parser: + # BACKTESTING CHECK + if ns_parser.s_end_date: + if ns_parser.s_end_date < self.df.index[0]: + console.print( + "Backtesting not allowed, since End Date is older than Start Date of historical data\n" + ) + + if ns_parser.s_end_date < get_next_stock_market_days( + last_stock_day=self.df.index[0], + n_next_days=5 + ns_parser.n_days, + )[-1]: + console.print( + "Backtesting not allowed, since End Date is too close to Start Date to train model\n" + ) + + regression_view.display_regression( + dataset=self.ticker, + values=self.df[self.target], + poly_order=ns_parser.n_polynomial, + n_input=ns_parser.n_inputs, + n_predict=ns_parser.n_days, + n_jumps=ns_parser.n_jumps, + s_end_date=ns_parser.s_end_date, + export=ns_parser.export, + ) + + def call_arima(self, other_args: List[str]): + """Process arima command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="arima", + description=""" + In statistics and econometrics, and in particular in time series analysis, an + autoregressive integrated moving average (ARIMA) model is a generalization of an + autoregressive moving average (ARMA) model. Both of these models are fitted to time + series data either to better understand the data or to predict future points in the + series (forecasting). ARIMA(p,d,q) where parameters p, d, and q are non-negative + integers, p is the order (number of time lags) of the autoregressive model, d is the + degree of differencing (the number of times the data have had past values subtracted), + and q is the order of the moving-average model. + """, + ) + parser.add_argument( + "-d", + "--days", + action="store", + dest="n_days", + type=check_positive, + default=5, + help="prediction days.", + ) + parser.add_argument( + "-i", + "--ic", + action="store", + dest="s_ic", + type=str, + default="aic", + choices=arima_model.ICS, + help="information criteria.", + ) + parser.add_argument( + "-s", + "--seasonal", + action="store_true", + default=False, + dest="b_seasonal", + help="Use weekly seasonal data.", + ) + parser.add_argument( + "-o", + "--order", + action="store", + dest="s_order", + default="", + type=str, + help="arima model order (p,d,q) in format: p,d,q.", + ) + parser.add_argument( + "-r", + "--results", + action="store_true", + dest="b_results", + default=False, + help="results about ARIMA summary flag.", + ) + parser.add_argument( + "-e", + "--end", + action="store", + type=valid_date, + dest="s_end_date", + default=None, + help="The end date (format YYYY-MM-DD) to select - Backtesting", + ) + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_FIGURES_ALLOWED + ) + if ns_parser: + # BACKTESTING CHECK + if ns_parser.s_end_date: + + if ns_parser.s_end_date < self.df.index[0]: + console.print( + "Backtesting not allowed, since End Date is older than Start Date of historical data\n" + ) + + if ns_parser.s_end_date < get_next_stock_market_days( + last_stock_day=self.df.index[0], + n_next_days=5 + ns_parser.n_days, + )[-1]: + console.print( + "Backtesting not allowed, since End Date is too close to Start Date to train model\n" + ) + + arima_view.display_arima( + dataset=self.ticker, + values=self.df[self.target], + arima_order=ns_parser.s_order, + n_predict=ns_parser.n_days, + seasonal=ns_parser.b_seasonal, + ic=ns_parser.s_ic, + results=ns_parser.b_results, + s_end_date=ns_parser.s_end_date, + export=ns_parser.export, + ) + + def call_mlp(self, other_args: List[str]): + """Process mlp command""" + try: + ns_parser = pred_helper.parse_args( + prog="mlp", + description="""Multi-Layered-Perceptron. """, + other_args=other_args, + ) + if ns_parser: + neural_networks_view.display_mlp( + dataset=self.ticker, + data=self.df[self.target], + n_input_days=ns_parser.n_inputs, + n_predict_days=ns_parser.n_days, + learning_rate=ns_parser.lr, + epochs=ns_parser.n_epochs, + batch_size=ns_parser.n_batch_size, + test_size=ns_parser.valid_split, + n_loops=ns_parser.n_loops, + no_shuffle=ns_parser.no_shuffle, + ) + except Exception as e: + console.print(e, "\n") + + finally: + pred_helper.restore_env() + + def call_rnn(self, other_args: List[str]): + """Process rnn command""" + try: + ns_parser = pred_helper.parse_args( + prog="rnn", + description="""Recurrent Neural Network. """, + other_args=other_args, + ) + if ns_parser: + neural_networks_view.display_rnn( + dataset=self.ticker, + data=self.df[self.target], + n_input_days=ns_parser.n_inputs, + n_predict_days=ns_parser.n_days, + learning_rate=ns_parser.lr, + epochs=ns_parser.n_epochs, + batch_size=ns_parser.n_batch_size, + test_size=ns_parser.valid_split, + n_loops=ns_parser.n_loops, + no_shuffle=ns_parser.no_shuffle, + ) + + except Exception as e: + console.print(e, "\n") + + finally: + pred_helper.restore_env() + + def call_lstm(self, other_args: List[str]): + """Process lstm command""" + try: + ns_parser = pred_helper.parse_args( + prog="lstm", + description="""Long-Short Term Memory. """, + other_args=other_args, + ) + if ns_parser: + neural_networks_view.display_lstm( + dataset=self.ticker, + data=self.df[self.target], + n_input_days=ns_parser.n_inputs, + n_predict_days=ns_parser.n_days, + learning_rate=ns_parser.lr, + epochs=ns_parser.n_epochs, + batch_size=ns_parser.n_batch_size, + test_size=ns_parser.valid_split, + n_loops=ns_parser.n_loops, + no_shuffle=ns_parser.no_shuffle, + ) + + except Exception as e: + console.print(e, "\n") + + finally: + pred_helper.restore_env() + + def call_conv1d(self, other_args: List[str]): + """Process conv1d command""" + try: + ns_parser = pred_helper.parse_args( + prog="conv1d", + description="""1D CNN.""", + other_args=other_args, + ) + if ns_parser: + neural_networks_view.display_conv1d( + dataset=self.ticker, + data=self.df[self.target], + n_input_days=ns_parser.n_inputs, + n_predict_days=ns_parser.n_days, + learning_rate=ns_parser.lr, + epochs=ns_parser.n_epochs, + batch_size=ns_parser.n_batch_size, + test_size=ns_parser.valid_split, + n_loops=ns_parser.n_loops, + no_shuffle=ns_parser.no_shuffle, + ) + + except Exception as e: + console.print(e, "\n") + + finally: + pred_helper.restore_env() + + def call_mc(self, other_args: List[str]): + """Process mc command""" + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + add_help=False, + prog="mc", + description=""" + Perform Monte Carlo forecasting + """, + ) + parser.add_argument( + "-d", + "--days", + help="Days to predict", + dest="n_days", + type=check_positive, + default=30, + ) + parser.add_argument( + "-n", + "--num", + help="Number of simulations to perform", + dest="n_sims", + default=100, + ) + parser.add_argument( + "--dist", + choices=mc_model.DISTRIBUTIONS, + default="lognormal", + dest="dist", + help="Whether to model returns or log returns", + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_FIGURES_ALLOWED + ) + if ns_parser: + if self.target != "AdjClose": + console.print("MC Prediction designed for AdjClose prices\n") + + mc_view.display_mc_forecast( + data=self.df[self.target], + n_future=ns_parser.n_days, + n_sims=ns_parser.n_sims, + use_log=ns_parser.dist == "lognormal", + export=ns_parser.export, + ) diff --git a/gamestonk_terminal/custom/quantitative_analysis/__init__.py b/gamestonk_terminal/custom/quantitative_analysis/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/gamestonk_terminal/custom/quantitative_analysis/qa_controller.py b/gamestonk_terminal/custom/quantitative_analysis/qa_controller.py new file mode 100644 index 00000000000..76294d865c1 --- /dev/null +++ b/gamestonk_terminal/custom/quantitative_analysis/qa_controller.py @@ -0,0 +1,694 @@ +"""Custom Quantitative Analysis Controller Module""" +__docformat__ = "numpy" + +import argparse +from typing import List +from pathlib import Path + +import pandas as pd +from prompt_toolkit.completion import NestedCompleter +from gamestonk_terminal.rich_config import console +from gamestonk_terminal.parent_classes import BaseController +from gamestonk_terminal.common.quantitative_analysis import ( + qa_view, + rolling_view, +) +from gamestonk_terminal import feature_flags as gtff +from gamestonk_terminal.helper_funcs import ( + EXPORT_ONLY_RAW_DATA_ALLOWED, + EXPORT_ONLY_FIGURES_ALLOWED, + check_positive, + check_proportion_range, + parse_known_args_and_warn, +) +from gamestonk_terminal.menu import session +from gamestonk_terminal.custom import custom_model + + +class QaController(BaseController): + """Quantitative Analysis Controller class""" + + CHOICES_COMMANDS = [ + "load", + "pick", + "raw", + "summary", + "line", + "hist", + "cdf", + "bw", + "rolling", + "decompose", + "cusum", + "acf", + "spread", + "quantile", + "skew", + "kurtosis", + "normality", + "qqplot", + "unitroot", + "goodness", + "unitroot", + "capm", + ] + + PATH = "/custom/qa/" + + def __init__( + self, + custom_df: pd.DataFrame, + file: str, + queue: List[str] = None, + ): + """Constructor""" + super().__init__(queue) + self.DATA_FILES = [file.name for file in Path("custom_imports").iterdir()] + + self.df = custom_df + self.ticker = file + self.target = custom_df.columns[1] + self.file = file + + if session and gtff.USE_PROMPT_TOOLKIT: + choices: dict = {c: {} for c in self.controller_choices} + choices["pick"] = {c: None for c in list(custom_df.columns)} + choices["load"] = {c: None for c in self.DATA_FILES} + self.choices = choices + self.completer = NestedCompleter.from_nested_dict(choices) + + def custom_reset(self): + """Class specific component of reset command""" + if self.ticker: + if self.target: + return ["custom", f"load {self.file}", "qa", f"pick {self.target}"] + return ["custom", f"load {self.file}", "qa"] + return [] + + def update_runtime_choices(self): + if session and gtff.USE_PROMPT_TOOLKIT: + self.choices["pick"] = {c: None for c in list(self.df.columns)} + self.completer = NestedCompleter.from_nested_dict(self.choices) + + def print_help(self): + """Print help""" + help_text = f"""[cmds] + load load new data file + pick pick target column for analysis[/cmds] + +[param]File: [/param]{self.file} +[param]Target Column: [/param]{self.target} +[cmds] +[info]Statistics:[/info] + summary brief summary statistics of loaded stock. + normality normality statistics and tests + unitroot unit root test for stationarity (ADF, KPSS) +[info]Plots:[/info] + line line plot of selected target + hist histogram with density plot + cdf cumulative distribution function + bw box and whisker plot + acf (partial) auto-correlation function differentials of prices + qqplot residuals against standard normal curve +[info]Rolling Metrics:[/info] + rolling rolling mean and std deviation of prices + spread rolling variance and std deviation of prices + quantile rolling median and quantile of prices + skew rolling skewness of distribution of prices + kurtosis rolling kurtosis of distribution of prices +[info]Other:[/info] + raw print raw data + decompose decomposition in cyclic-trend, season, and residuals of prices + cusum detects abrupt changes using cumulative sum algorithm of prices[/cmds] + """ + console.print(text=help_text, menu="Custom - Quantitative Analysis") + + def call_load(self, other_args: List[str]): + """Process load""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="load", + description="Load custom data set into a dataframe", + ) + parser.add_argument( + "-f", + "--file", + choices=self.DATA_FILES, + help="File to load in.", + default="test.csv", + type=str, + ) + + if other_args and "-" not in other_args[0][0]: + other_args.insert(0, "-f") + ns_parser = parse_known_args_and_warn(parser, other_args) + if ns_parser: + file = Path("custom_imports") / ns_parser.file + self.df = custom_model.load(file) + self.df.columns = self.df.columns.map(lambda x: x.lower()) + for col in self.df.columns: + if col in ["date", "time", "timestamp"]: # Could be others? + self.df[col] = pd.to_datetime(self.df[col]) + self.df = self.df.set_index(col) + self.file = ns_parser.file + self.update_runtime_choices() + console.print("") + + def call_pick(self, other_args: List[str]): + """Process pick command""" + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + add_help=False, + prog="pick", + description=""" + Change target variable + """, + ) + parser.add_argument( + "-t", + "--target", + dest="target", + type=lambda x: x.lower(), + choices=list(self.df.columns), + help="Select variable to analyze", + ) + if other_args and "-t" not in other_args and "-h" not in other_args: + other_args.insert(0, "-t") + + ns_parser = parse_known_args_and_warn(parser, other_args) + if ns_parser: + self.target = ns_parser.target + console.print("") + + def call_raw(self, other_args: List[str]): + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + add_help=False, + prog="raw", + description=""" + Print raw data to console + """, + ) + parser.add_argument( + "-l", + "--limit", + help="Number to show", + type=check_positive, + default=20, + dest="limit", + ) + parser.add_argument( + "-d", + "--descend", + action="store_true", + default=False, + dest="descend", + help="Sort in descending order", + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_RAW_DATA_ALLOWED + ) + if ns_parser: + qa_view.display_raw( + self.df[self.target], + num=ns_parser.limit, + sort="", + des=ns_parser.descend, + export=ns_parser.export, + ) + + def call_summary(self, other_args: List[str]): + """Process summary command""" + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + add_help=False, + prog="summary", + description=""" + Summary statistics + """, + ) + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_RAW_DATA_ALLOWED + ) + if ns_parser: + qa_view.display_summary(df=self.df, export=ns_parser.export) + + def call_line(self, other_args: List[str]): + """Process line command""" + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + add_help=False, + prog="line", + description="Show line plot of selected data", + ) + parser.add_argument( + "--log", + help="Plot with y on log scale", + dest="log", + action="store_true", + default=False, + ) + parser.add_argument( + "-d", + "--draw", + help="Draw lines and annotate on the plot", + dest="draw", + action="store_true", + default=False, + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_FIGURES_ALLOWED + ) + if ns_parser: + qa_view.display_line( + self.df[self.target], + title=f"{self.ticker} {self.target}", + log_y=ns_parser.log, + draw=ns_parser.draw, + ) + + def call_hist(self, other_args: List[str]): + """Process hist command""" + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + add_help=False, + prog="hist", + description=""" + Histogram with density and rug + """, + ) + parser.add_argument( + "-b", "--bins", type=check_positive, default=15, dest="n_bins" + ) + ns_parser = parse_known_args_and_warn(parser, other_args) + if ns_parser: + qa_view.display_hist( + name=self.ticker, + df=self.df, + target=self.target, + bins=ns_parser.n_bins, + ) + + def call_cdf(self, other_args: List[str]): + """Process cdf command""" + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + add_help=False, + prog="cdf", + description=""" + Cumulative distribution function + """, + ) + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_RAW_DATA_ALLOWED + ) + if ns_parser: + qa_view.display_cdf( + name=self.ticker, + df=self.df, + target=self.target, + export=ns_parser.export, + ) + + def call_bw(self, other_args: List[str]): + """Process bwy command""" + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + add_help=False, + prog="bw", + description=""" + Box and Whisker plot + """, + ) + parser.add_argument( + "-y", + "--yearly", + action="store_true", + default=False, + dest="year", + help="Flag to show yearly bw plot", + ) + ns_parser = parse_known_args_and_warn(parser, other_args) + if ns_parser: + qa_view.display_bw( + name=self.ticker, + df=self.df, + target=self.target, + yearly=ns_parser.year, + ) + + def call_decompose(self, other_args: List[str]): + """Process decompose command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="decompose", + description=""" + Decompose time series as: + - Additive Time Series = Level + CyclicTrend + Residual + Seasonality + - Multiplicative Time Series = Level * CyclicTrend * Residual * Seasonality + """, + ) + parser.add_argument( + "-m", + "--multiplicative", + action="store_true", + default=False, + dest="multiplicative", + help="decompose using multiplicative model instead of additive", + ) + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_RAW_DATA_ALLOWED + ) + if ns_parser: + qa_view.display_seasonal( + name=self.ticker, + df=self.df, + target=self.target, + multiplicative=ns_parser.multiplicative, + export=ns_parser.export, + ) + + def call_cusum(self, other_args: List[str]): + """Process cusum command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="cusum", + description=""" + Cumulative sum algorithm (CUSUM) to detect abrupt changes in data + """, + ) + parser.add_argument( + "-t", + "--threshold", + dest="threshold", + type=float, + default=( + max(self.df[self.target].values) - min(self.df[self.target].values) + ) + / 40, + help="threshold", + ) + parser.add_argument( + "-d", + "--drift", + dest="drift", + type=float, + default=( + max(self.df[self.target].values) - min(self.df[self.target].values) + ) + / 80, + help="drift", + ) + ns_parser = parse_known_args_and_warn(parser, other_args) + if ns_parser: + qa_view.display_cusum( + df=self.df, + target=self.target, + threshold=ns_parser.threshold, + drift=ns_parser.drift, + ) + + def call_acf(self, other_args: List[str]): + """Process acf command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="acf", + description=""" + Auto-Correlation and Partial Auto-Correlation Functions for diff and diff diff stock data + """, + ) + parser.add_argument( + "-l", + "--lags", + dest="lags", + type=check_positive, + default=15, + help="maximum lags to display in plots", + ) + ns_parser = parse_known_args_and_warn(parser, other_args) + if ns_parser: + qa_view.display_acf( + name=self.ticker, + df=self.df, + target=self.target, + lags=ns_parser.lags, + ) + + def call_rolling(self, other_args: List[str]): + """Process rolling command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="rolling", + description=""" + Rolling mean and std deviation + """, + ) + parser.add_argument( + "-l", + "--length", + action="store", + dest="n_length", + type=check_positive, + default=14, + help="Window length", + ) + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_RAW_DATA_ALLOWED + ) + if ns_parser: + rolling_view.display_mean_std( + name=self.ticker, + df=self.df, + target=self.target, + length=ns_parser.n_length, + export=ns_parser.export, + ) + + def call_spread(self, other_args: List[str]): + """Process spread command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="spread", + description="""Shows rolling spread measurement + """, + ) + parser.add_argument( + "-l", + "--length", + action="store", + dest="n_length", + type=check_positive, + default=14, + help="Window length", + ) + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_RAW_DATA_ALLOWED + ) + if ns_parser: + rolling_view.display_spread( + name=self.ticker, + df=self.df, + target=self.target, + length=ns_parser.n_length, + export=ns_parser.export, + ) + + def call_quantile(self, other_args: List[str]): + """Process quantile command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="quantile", + description=""" + The quantiles are values which divide the distribution such that + there is a given proportion of observations below the quantile. + For example, the median is a quantile. The median is the central + value of the distribution, such that half the points are less than + or equal to it and half are greater than or equal to it. + + By default, q is set at 0.5, which effectively is median. Change q to + get the desired quantile (0 funds > alternative > portfolio -> jupyter [/menu] +> jupyter +> custom[/menu] """, menu="Home", ) @@ -186,6 +188,14 @@ class TerminalController(BaseController): self.queue = self.load_class(AlternativeDataController, self.queue) + def call_custom(self, _): + """Process custom command""" + from gamestonk_terminal.custom.custom_controller import ( + CustomDataController, + ) + + self.queue = CustomDataController(self.queue).menu() + def call_portfolio(self, _): """Process portfolio command""" from gamestonk_terminal.portfolio.portfolio_controller import ( diff --git a/tests/gamestonk_terminal/custom/__init__.py b/tests/gamestonk_terminal/custom/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/gamestonk_terminal/custom/csv/test_custom_model/test_test_empty_load.csv b/tests/gamestonk_terminal/custom/csv/test_custom_model/test_test_empty_load.csv new file mode 100644 index 00000000000..e16c76dff88 --- /dev/null +++ b/tests/gamestonk_terminal/custom/csv/test_custom_model/test_test_empty_load.csv @@ -0,0 +1 @@ +"" diff --git a/tests/gamestonk_terminal/custom/csv/test_custom_model/test_test_load[test.csv].csv b/tests/gamestonk_terminal/custom/csv/test_custom_model/test_test_load[test.csv].csv new file mode 100644 index 00000000000..15f9663079b --- /dev/null +++ b/tests/gamestonk_terminal/custom/csv/test_custom_model/test_test_load[test.csv].csv @@ -0,0 +1,733 @@ +,Date,ColNorm,Col2,ColNorm3,ColB +0,2020-01-01,0.9999525702125136,1.0123130194965917,1.0086674575012688,0.0012027960377402 +1,2020-01-02,0.9838498192741062,1.0234212550466153,1.0042245214721552,0.0045169035346944 +2,2020-01-03,1.0026921290619135,1.0197488119578415,1.0062436813305022,0.0070350680624013 +3,2020-01-04,0.9880559292083876,1.0333080955589942,1.0443020108362489,0.0088117310231277 +4,2020-01-05,0.9779970244070624,1.0800643722419347,1.0793343716705162,0.0196964997565137 +5,2020-01-06,0.9769190810755058,1.074084939646055,1.0576481541518057,0.0208943158741584 +6,2020-01-07,0.9766394732308502,1.0543684802965811,1.0610302031972367,0.0220428194274246 +7,2020-01-08,1.012957091642494,1.052787445634228,1.0726969194936098,0.0244418693919771 +8,2020-01-09,1.0358984262904671,1.0837030226137805,1.0728332396061548,0.0255663318038535 +9,2020-01-10,1.0573273623296362,1.0514770924225432,1.0712841902537005,0.0278123015990601 +10,2020-01-11,1.0591295348101435,1.0293934727855478,1.057462172431816,0.0360959942158686 +11,2020-01-12,1.0479705339307217,1.089499710414309,1.053145773285828,0.0375737257051632 +12,2020-01-13,1.0135011066008446,1.0647814334478265,1.0307643076773845,0.0470267106266825 +13,2020-01-14,1.0129001854523945,1.0838484969617903,1.0214500559731443,0.0486577320173068 +14,2020-01-15,1.0327050271538776,1.0974755645383598,1.0158943158591365,0.0500936104670989 +15,2020-01-16,1.0401611506598178,1.1055856016959222,1.017570962222138,0.0515465102839185 +16,2020-01-17,1.0592005527980166,1.1251400688546165,1.0279746739739088,0.0521490546360502 +17,2020-01-18,1.0656988484365215,1.123318105612665,1.0057696407317656,0.0570627810698871 +18,2020-01-19,1.0774050013473389,1.1391739427677507,1.0214163214305862,0.062085692889891 +19,2020-01-20,1.0743932195444494,1.1184045199564303,1.019103884716816,0.0648965634869696 +20,2020-01-21,1.069314627826471,1.1213902310033308,0.981727142869055,0.0709592988965688 +21,2020-01-22,1.0677838384124778,1.1101107117435527,0.9937753008992988,0.0740639075019701 +22,2020-01-23,1.0721837052909196,1.1231339322396712,1.00631703646881,0.076067291406056 +23,2020-01-24,1.0519412984859928,1.1292660530353713,1.0249133848091416,0.0777320147929826 +24,2020-01-25,1.014405351240412,1.1270914610841392,1.053700783473425,0.0798086505929941 +25,2020-01-26,1.023527191979995,1.1363592258852364,1.066955769678183,0.0853007785853044 +26,2020-01-27,1.0608121282898904,1.155767423142797,1.0649251904848016,0.0910585807223935 +27,2020-01-28,1.0610896881458836,1.187299895431334,1.0910155077242598,0.0968549348783691 +28,2020-01-29,1.0729846116865194,1.2129254292196707,1.0953355367602375,0.0974095864886109 +29,2020-01-30,1.1070155748383577,1.2225436274180337,1.1023786574966623,0.0984865985233506 +30,2020-01-31,1.1276468893948646,1.2167827264140132,1.087327864804962,0.1018550517665027 +31,2020-02-01,1.1273047110213463,1.208962891615007,1.095389877912996,0.1024637537043749 +32,2020-02-02,1.164524331136035,1.2141411850554893,1.0930563724386055,0.1040640739745576 +33,2020-02-03,1.1572415510154523,1.1731428473855654,1.1125836529439332,0.1081854083827091 +34,2020-02-04,1.1361884175838584,1.1741534743835529,1.1507406424420272,0.1137348681906963 +35,2020-02-05,1.1328844654206718,1.189851742059982,1.1516666823668786,0.1172947318621993 +36,2020-02-06,1.157728280609622,1.2199844255344168,1.162932891423088,0.1178542214000958 +37,2020-02-07,1.1537281271596571,1.2108667382965952,1.1507328444594875,0.1219182826206924 +38,2020-02-08,1.1692835730858917,1.2005025310124493,1.1151541642382754,0.1245781864184379 +39,2020-02-09,1.1919668653879631,1.2198402911308477,1.1186168740068323,0.127578616159381 +40,2020-02-10,1.1928488801117072,1.2301072065077974,1.1002903004732305,0.1739579517084183 +41,2020-02-11,1.1655878985554615,1.2630467330117316,1.0765044535602653,0.1813400011074207 +42,2020-02-12,1.1819220888988409,1.252233090663622,1.0685134162077423,0.2069576836007362 +43,2020-02-13,1.20516552991063,1.2727144276434823,1.0952376144030738,0.2175794313553614 +44,2020-02-14,1.1630851464386232,1.32482490333701,1.0802690129905057,0.22080516417558 +45,2020-02-15,1.1467354653830693,1.3020387895317278,1.0732991680664263,0.2246416403749116 +46,2020-02-16,1.1383471887580776,1.3137746751723582,1.0387338079814246,0.2250781884637397 +47,2020-02-17,1.1103773042013343,1.339470245723512,1.0028362328380314,0.2319505028795682 +48,2020-02-18,1.0734165165514695,1.3427623639089172,1.0424779786809035,0.233948520381319 +49,2020-02-19,1.113218756875525,1.4013943415047097,1.056102987205335,0.2356225674364548 +50,2020-02-20,1.1071272883991254,1.4541633632206468,1.057236795132449,0.2506012730602552 +51,2020-02-21,1.105724295358014,1.4401036704211707,1.0483308464436794,0.252015240745399 +52,2020-02-22,1.0993215352651164,1.444722748437034,1.089531331294008,0.2524740991954332 +53,2020-02-23,1.0932176054208576,1.460026364375726,1.0792794931408676,0.2528642055216732 +54,2020-02-24,1.0587243077330883,1.4486161918765983,1.1104674454138383,0.2544510710653562 +55,2020-02-25,1.0620148726350802,1.424154391889335,1.0773223233839628,0.2569377491253046 +56,2020-02-26,1.0315209557997354,1.4164177419504709,1.0739795914770394,0.2595023947775753 +57,2020-02-27,1.0408864320197757,1.4801992864018505,1.1116443448045423,0.2608802454779044 +58,2020-02-28,1.0376663474071368,1.488716043093164,1.1356346930253116,0.2634814008834721 +59,2020-02-29,1.0467208549192988,1.5173215466718972,1.107889288405897,0.2642320286926164 +60,2020-03-01,1.0207093385614625,1.5412863838442494,1.122015128887988,0.2696751096472305 +61,2020-03-02,1.037525121662198,1.5581551034870829,1.1309415361145174,0.2746277237987294 +62,2020-03-03,1.0248401372030551,1.5458008902947489,1.1345250503379347,0.276759867831347 +63,2020-03-04,1.0258486982695476,1.559046676440168,1.1400009349876374,0.2896253077473681 +64,2020-03-05,1.002432979064144,1.5755262943159305,1.1318408085437592,0.2952623175828989 +65,2020-03-06,1.012488554893676,1.57564855922825,1.111311254937364,0.2981023789116054 +66,2020-03-07,1.0117961369959636,1.577395480438564,1.11650214408987,0.3006270600511418 +67,2020-03-08,1.015909711457398,1.610322754539839,1.0839244099353011,0.3020935922040628 +68,2020-03-09,1.0601538083004134,1.641502594941999,1.1109289188088738,0.3084158226632153 +69,2020-03-10,1.077941802984011,1.6317374964162892,1.0963222783091269,0.3094796037573752 +70,2020-03-11,1.1260532732244517,1.6490931415766832,1.0936697895045775,0.3099120345112846 +71,2020-03-12,1.110425622953289,1.6984993918604234,1.1216131487616146,0.3107492140216191 +72,2020-03-13,1.0856390325998322,1.6757575671134193,1.1309905076439204,0.3127434128908777 +73,2020-03-14,1.086150833705044,1.7073637516801137,1.1323850834053195,0.3141475455207612 +74,2020-03-15,1.077681015174759,1.6393961270334048,1.110184175943251,0.3153838542164429 +75,2020-03-16,1.053414211346851,1.6332378686087845,1.1075827734284756,0.3195017910314937 +76,2020-03-17,1.0357752542856478,1.646157391988908,1.1148804108874288,0.3230351913660134 +77,2020-03-18,0.9882913088675116,1.6616420864028898,1.092897650763299,0.3295140538669318 +78,2020-03-19,0.9915459150909368,1.694505495048448,1.106224258642294,0.3344208868768074 +79,2020-03-20,0.9677329692322276,1.7011229906107403,1.1389107240383651,0.3352960661280704 +80,2020-03-21,0.9645668876148116,1.7509973638490954,1.1131190034356908,0.3371362857767921 +81,2020-03-22,1.009732918005037,1.7555981219117516,1.1097518910234518,0.3433541011482433 +82,2020-03-23,1.0029827116571677,1.7743131674956232,1.142290844824632,0.3472350134816184 +83,2020-03-24,0.9940867326226468,1.8231853913696645,1.1557981350878588,0.3643581466680069 +84,2020-03-25,0.9698510310554864,1.7593514459496429,1.1623510025356016,0.366882019715107 +85,2020-03-26,0.9783694635515996,1.7587696051447823,1.1324509088625785,0.367345994699916 +86,2020-03-27,0.9535087219102176,1.7401060630906493,1.154405728070701,0.3702776655887957 +87,2020-03-28,0.9418042827123154,1.7538896088257767,1.137007812796809,0.3708727657834398 +88,2020-03-29,0.96810433350236,1.760480911558011,1.1305910909597376,0.3725369987816818 +89,2020-03-30,0.974808825820155,1.752151672427521,1.1502789106909037,0.3744820967547409 +90,2020-03-31,0.9797504957740842,1.798575628301122,1.1535167565595437,0.3763987104629137 +91,2020-04-01,0.9628955439898036,1.827407571913591,1.1544205314866829,0.3799940149129052 +92,2020-04-02,0.9754932364091348,1.823294796220288,1.1564781737474252,0.3803440468931394 +93,2020-04-03,0.9873275891659168,1.7946562572896825,1.1849738887150674,0.3864074719660551 +94,2020-04-04,1.0108288103468548,1.7973517877152347,1.180157980015465,0.3901233102314478 +95,2020-04-05,0.9736148567642324,1.80442470587344,1.1850774038437282,0.3917694853658946 +96,2020-04-06,0.9653399776332668,1.8169983102180665,1.1616633135761325,0.3924900453927962 +97,2020-04-07,0.962409208328386,1.8141745618144527,1.178300401559042,0.3931171173402186 +98,2020-04-08,0.9628876392544286,1.9084553610072683,1.1641229279184822,0.3968013538209139 +99,2020-04-09,0.933369717590292,1.9025819037665184,1.1717578731799263,0.3976608679533875 +100,2020-04-10,0.9143682378409272,1.894923659910556,1.156556367606632,0.3996420215008127 +101,2020-04-11,0.895385718148122,1.9343903671704852,1.188574497939751,0.401212865147451 +102,2020-04-12,0.8740743938425345,1.942691462578191,1.211134163737765,0.4029746610916818 +103,2020-04-13,0.8380660562735384,1.8612114156206196,1.253856740874506,0.4211446222095411 +104,2020-04-14,0.8520114930850722,1.8606048835295304,1.275827191139803,0.421660334278797 +105,2020-04-15,0.8516344906028086,1.8683539523097044,1.2518731047748377,0.4220666798026594 +106,2020-04-16,0.835552610602664,1.792725972711403,1.2793659536199955,0.4243347485856604 +107,2020-04-17,0.833052910582975,1.758248128204534,1.2561704403633422,0.4252241763854585 +108,2020-04-18,0.8392859957724058,1.7337610362834268,1.2786915765601048,0.4275722984496844 +109,2020-04-19,0.8746610758965373,1.6954668619732205,1.2678897090741963,0.4305271478114172 +110,2020-04-20,0.878673788351075,1.713805058565187,1.2502906968207468,0.4317764713835109 +111,2020-04-21,0.8767535247546682,1.7632021018354378,1.2663055769932812,0.432302590299184 +112,2020-04-22,0.8770307343047253,1.789303994954698,1.2449466921867858,0.4359168191347973 +113,2020-04-23,0.8688819247505064,1.7801178820506536,1.247319180623821,0.4371477978526634 +114,2020-04-24,0.8712572077489298,1.8126629459732944,1.1785850108864555,0.4393666393556777 +115,2020-04-25,0.8752019965989468,1.7826892137128605,1.1619577030622186,0.4422207982621592 +116,2020-04-26,0.8738342993845689,1.7692676011973314,1.1772604709486858,0.4467959023170046 +117,2020-04-27,0.8597736281199799,1.816336026575841,1.2207076138026107,0.4513805049700852 +118,2020-04-28,0.8281893226773166,1.7791160644096362,1.204458594661689,0.4546959458841382 +119,2020-04-29,0.836203177555408,1.7935299496511174,1.2244487110001496,0.4551943083943147 +120,2020-04-30,0.8433768320154121,1.8021267508275396,1.2186995964505196,0.456487714432498 +121,2020-05-01,0.8610574283159262,1.817988049012224,1.211596391706884,0.5032677683170869 +122,2020-05-02,0.8348339155837669,1.8329762133715592,1.232334831194072,0.5061044878931531 +123,2020-05-03,0.8294266411564094,1.747093745984997,1.223432738495758,0.5105113908002137 +124,2020-05-04,0.8405262716109546,1.7492904866442132,1.203764954374566,0.5130162377726127 +125,2020-05-05,0.8639276597819987,1.8076326060564027,1.1787876114922382,0.5144834231314999 +126,2020-05-06,0.8706715188631232,1.8152317063308048,1.1898508286284304,0.5163417466277547 +127,2020-05-07,0.8932902477660367,1.8248944901012816,1.1745421075877225,0.5253116053925546 +128,2020-05-08,0.9292530093247632,1.8666259242266827,1.1888858396446629,0.5261093638134726 +129,2020-05-09,0.914099566383566,1.8535959293626267,1.2058210197303287,0.5275315455348729 +130,2020-05-10,0.9008725520848792,1.8596853538255087,1.155408426884541,0.5286975757051593 +131,2020-05-11,0.9003979758283102,1.928069431657337,1.2107378814039818,0.5325518241586814 +132,2020-05-12,0.8900230757659284,1.8875159123215,1.1839027235470037,0.5337608887621328 +133,2020-05-13,0.9006958785299365,1.9123856010771008,1.195637404491816,0.5348093389633294 +134,2020-05-14,0.9036296113002158,1.9097025948365047,1.198912413792671,0.5376854931262441 +135,2020-05-15,0.9075433132199904,1.9846404281453107,1.2343851890405677,0.5437445517365902 +136,2020-05-16,0.8848998045208422,1.96183376357326,1.2117440383193852,0.5450930567159439 +137,2020-05-17,0.8830579864449316,1.913198176076837,1.2130085537858446,0.5520390802990911 +138,2020-05-18,0.8846769581394759,1.9632588698129176,1.2071416880612174,0.5544325112904755 +139,2020-05-19,0.9154201534517432,1.983510242203672,1.175360910642843,0.5583256085292775 +140,2020-05-20,0.9344135262197314,1.9683606589154656,1.1673976905013788,0.560208080529156 +141,2020-05-21,0.9732143169767572,1.93602343463149,1.17798079610132,0.5616098967643237 +142,2020-05-22,0.9730686691285166,1.9286876318079813,1.2185774476851847,0.5638831776794241 +143,2020-05-23,0.9878609570461824,1.9436075518434304,1.1970035409307191,0.5642855262406092 +144,2020-05-24,0.9963683545647176,1.9689072056752608,1.2300920949665672,0.5658770969529832 +145,2020-05-25,1.0018174257470982,1.9807455978731523,1.2863295043597427,0.5670664570002988 +146,2020-05-26,1.0323794656420129,1.986433207227409,1.2820608514026766,0.5689351200686489 +147,2020-05-27,1.0591764088147717,2.018300990083014,1.3087971163195562,0.5791493210849563 +148,2020-05-28,1.0543565899384209,1.9630661666978968,1.3372792287811608,0.5833566476963967 +149,2020-05-29,1.0419595558177783,1.898840299065144,1.3293907653782011,0.5842304945675731 +150,2020-05-30,1.0414202992577273,1.882316871058859,1.3291038297915918,0.5860386077339174 +151,2020-05-31,1.0572880297659135,1.904557874358223,1.306170615874509,0.5882642097939847 +152,2020-06-01,1.0520606263574148,1.8445426749048743,1.3339942892029724,0.5900023274500287 +153,2020-06-02,1.0659722213586111,1.8570302564383951,1.3558757821530338,0.5909020647119387 +154,2020-06-03,1.0656039525363368,1.8743014801338012,1.372185688108781,0.5920474859439436 +155,2020-06-04,1.0358577638256254,1.930773225339492,1.3526282848180564,0.5944853954946582 +156,2020-06-05,1.0089333673953484,1.9898046345316736,1.362817804631571,0.5956210659548 +157,2020-06-06,1.019691939909397,2.021669352765277,1.3859341395415308,0.5964508371820592 +158,2020-06-07,1.021781040273442,1.9723469958642448,1.3787384116005414,0.5989637695603802 +159,2020-06-08,1.0216307354401244,1.9143159472475904,1.3569619025531028,0.5997279251321306 +160,2020-06-09,1.0252951525306686,1.963520522504312,1.3878055537360765,0.6008055961191918 +161,2020-06-10,1.0569657982856673,2.033830642354532,1.4099079973949116,0.603045804651097 +162,2020-06-11,1.0587301242900011,1.978263433471916,1.3977391153857357,0.6150561437971321 +163,2020-06-12,1.0714306810044087,1.9771940498211436,1.4206170585270756,0.6179519882991029 +164,2020-06-13,1.0522387861832565,1.9728414295620895,1.3762378861610598,0.6207784844352121 +165,2020-06-14,1.0475181490250334,1.9522977210035048,1.3788453761592088,0.6273159598727789 +166,2020-06-15,1.0234072353225911,1.940233262776903,1.412147349198787,0.6279621706403626 +167,2020-06-16,1.0189227881643943,1.9399345009150728,1.4200695913506778,0.6299345113347883 +168,2020-06-17,1.001028085535756,1.9674301947596375,1.4196530534097238,0.6354196210129143 +169,2020-06-18,0.9912641618976554,1.9251588499668064,1.4343893896623496,0.6358630075674107 +170,2020-06-19,0.9805087526933828,1.999420088393108,1.4158425001018318,0.6406732231437341 +171,2020-06-20,1.009464040256068,2.0493123790500967,1.4486299245023713,0.6424250037998596 +172,2020-06-21,0.995258597640962,2.076953051639768,1.4478176424803664,0.644099320786275 +173,2020-06-22,0.9855112363074202,2.154240810255652,1.4728892769819055,0.65280314288818 +174,2020-06-23,1.0073268728636948,2.250014679802232,1.4336431865428896,0.6537610284791265 +175,2020-06-24,1.0066322355863426,2.2249349095517776,1.456538552996501,0.6642644900169009 +176,2020-06-25,0.9575855268333074,2.2522471079270177,1.4489673649411032,0.6662331802982429 +177,2020-06-26,0.9337977450912276,2.2473360044363764,1.4219169403245642,0.6712327430274364 +178,2020-06-27,0.9382604578618756,2.212321320270245,1.4158204261628429,0.6718141645698742 +179,2020-06-28,0.9465411154535148,2.2052582536214502,1.430120185324235,0.6748761659021221 +180,2020-06-29,0.9676702771137916,2.2248062051288158,1.4205700210255785,0.6777010977843823 +181,2020-06-30,0.9730242802452448,2.2246965725926624,1.431301037561824,0.6810713167270627 +182,2020-07-01,1.0168182246966204,2.1805611732536536,1.413869125858902,0.6854507253006858 +183,2020-07-02,0.9884133039324408,2.1187033637482977,1.4585566422685736,0.6914250722668893 +184,2020-07-03,0.9585398824348964,2.2376378185309136,1.470639941407874,0.6981504848050071 +185,2020-07-04,0.9595913158376672,2.3120006109496005,1.4819897523145185,0.701585449803921 +186,2020-07-05,0.9757235638340338,2.2774986228750245,1.4960258331955485,0.7149469105534326 +187,2020-07-06,0.9827376276758062,2.284390059042172,1.4898515668154009,0.7170969248236969 +188,2020-07-07,0.948286988931661,2.3596790863844497,1.4884166060259274,0.7200363865166225 +189,2020-07-08,0.95983945474466,2.342853703036813,1.4814014755271234,0.733944628256304 +190,2020-07-09,0.9887179191768426,2.334739011274857,1.4816150241435395,0.7505784071243449 +191,2020-07-10,0.9802149969178716,2.3289077061155044,1.5012839517690568,0.7542827121165976 +192,2020-07-11,1.0111801099245266,2.3762608242412484,1.4822256204365474,0.7577808445549317 +193,2020-07-12,0.9908774679553788,2.338739493642145,1.496822968623334,0.7581841098807811 +194,2020-07-13,1.0150580794369408,2.390438995464025,1.5178366494862991,0.7590465695525171 +195,2020-07-14,1.0261743177955382,2.3420718549672097,1.5061115657909745,0.7639942976386366 +196,2020-07-15,1.0133960284012418,2.285218813106673,1.5284744513591788,0.7658450238084406 +197,2020-07-16,1.0033585655883903,2.2916211474658827,1.5526985398838336,0.7668377473401666 +198,2020-07-17,1.0214254580426407,2.284796272086247,1.5683537788630093,0.773666458664223 +199,2020-07-18,1.0258147735393115,2.326074282269038,1.5819812060864555,0.7741125330133553 +200,2020-07-19,1.0277799488903645,2.313494157425774,1.5255583651924849,0.7826372141983156 +201,2020-07-20,1.0250278191733373,2.278818786219646,1.54493640675825,0.7849066005951117 +202,2020-07-21,1.0257995914283935,2.292032861748544,1.569525788453222,0.7905005243387364 +203,2020-07-22,1.0267879097412551,2.3357189250696235,1.6379610352759344,0.7927312499590004 +204,2020-07-23,1.0389261663290388,2.274538179283752,1.6741344875394764,0.7932923787420468 +205,2020-07-24,1.0090611425619138,2.27252655110798,1.6670325422686327,0.800327607061777 +206,2020-07-25,1.011131386204713,2.279455373088168,1.6518090188831571,0.8014076085285011 +207,2020-07-26,1.0067105716491014,2.337111200552414,1.6158039012294794,0.8029224068101758 +208,2020-07-27,0.9943272432378184,2.344620817213409,1.6592134355369357,0.8044242114850151 +209,2020-07-28,0.9771854889328592,2.3668944985219684,1.6834148760009815,0.8067735795987538 +210,2020-07-29,0.987198955879071,2.365490030794681,1.6573657588652606,0.8085471775881818 +211,2020-07-30,0.9888543540371442,2.4186434653114315,1.6948554904645168,0.8093127338406706 +212,2020-07-31,0.9842301412324336,2.439618652810949,1.6977441737817598,0.8150204456713851 +213,2020-08-01,0.965140237243522,2.377041923209997,1.7130192709673835,0.820727682415597 +214,2020-08-02,0.9584029809666004,2.391147596111345,1.7102510175672765,0.8230434914696654 +215,2020-08-03,0.9759006091717436,2.316994177690388,1.677597065066447,0.8235096815101353 +216,2020-08-04,0.9501373549633252,2.323459066512072,1.719964069915885,0.8300941688326845 +217,2020-08-05,0.9604065612739536,2.330382213682331,1.7245154724647795,0.8330687581297908 +218,2020-08-06,0.9763594060576908,2.299066090311157,1.7136462533090864,0.8353346614561531 +219,2020-08-07,0.9825778589100208,2.3206391377668742,1.735286635750923,0.8405502317307677 +220,2020-08-08,1.002223311947791,2.3345124788636893,1.7789867378872073,0.848667172533915 +221,2020-08-09,0.9741775954468116,2.324104123933205,1.7881689205814135,0.8492059663380161 +222,2020-08-10,1.0023146422045273,2.380876833106436,1.8032339491973044,0.8504486714663375 +223,2020-08-11,1.041041647377543,2.31250123856628,1.8030267541146656,0.8506876858913054 +224,2020-08-12,1.0503909012329131,2.2980280882739854,1.814121400862128,0.8546087121913079 +225,2020-08-13,1.0569775764121196,2.3306666186256813,1.8310081827506195,0.8662994428865795 +226,2020-08-14,1.0610751998772194,2.3363040378262765,1.8097627942752057,0.8678325823246228 +227,2020-08-15,1.0587074374476746,2.284354698047326,1.78066771262294,0.8703173049285419 +228,2020-08-16,1.0302801853601309,2.244669782814108,1.7874584634073545,0.8801515329571722 +229,2020-08-17,0.988389400363924,2.3008989810868967,1.834774742181476,0.8882193510501148 +230,2020-08-18,0.9965310714959243,2.277271539983884,1.8060015128893776,0.8903683125160616 +231,2020-08-19,0.9922031367470384,2.3985652088118314,1.8263341549540528,0.8988293192841955 +232,2020-08-20,1.027869324879812,2.401476749244662,1.8651570576166208,0.8996447236089339 +233,2020-08-21,1.0307882824097565,2.4298134048782725,1.8874087431140567,0.9029573621962058 +234,2020-08-22,1.033084478026869,2.524433815776165,1.8877290724455,0.9037817003330142 +235,2020-08-23,1.0307265586558385,2.41630656700321,1.96601286697562,0.905290251932482 +236,2020-08-24,1.076840824462609,2.5079409618888984,1.9931871139673032,0.907257965074012 +237,2020-08-25,1.0642272088309062,2.4408526399836687,1.9102886541833064,0.9125308220473052 +238,2020-08-26,1.064986098507313,2.4741390097786224,1.9360680365863483,0.9176898336714856 +239,2020-08-27,1.0461636798460097,2.4800899394650915,1.906140707374937,0.92212480176119 +240,2020-08-28,1.063683537843083,2.452096428706089,1.888102130599118,0.9253155271734814 +241,2020-08-29,1.0398601013283904,2.483553938997862,1.8943904930876097,0.9391703700917096 +242,2020-08-30,1.0503472744755464,2.514267169622637,1.9286179775958905,0.9399395481270428 +243,2020-08-31,1.055469538934899,2.3986857123937475,1.8901320637279215,0.9417255088015568 +244,2020-09-01,1.103704230856668,2.4178944247065166,1.905143584657302,0.9429029942886286 +245,2020-09-02,1.0766389180345612,2.4034828942230027,1.9092635728505407,0.9533946056060972 +246,2020-09-03,1.097258004052795,2.377451768705276,1.970945078105912,0.9539742648075352 +247,2020-09-04,1.1083404943935349,2.3690200841752365,1.9654370007435749,0.9550537111541528 +248,2020-09-05,1.1202557945126657,2.3123747748020107,1.9676260548319016,0.95775836895992 +249,2020-09-06,1.1342844694618273,2.2983710604071907,2.007218107882284,0.9611411682535352 +250,2020-09-07,1.1117651443837435,2.282342396269001,2.066542147784256,0.9656206307046504 +251,2020-09-08,1.108258511313643,2.190755615666369,2.0715962187251686,0.9723784553998674 +252,2020-09-09,1.1113533876662005,2.259163550560165,2.166177533441628,0.97616171542827 +253,2020-09-10,1.105488663733078,2.32395378441192,2.1034191507163205,0.9771250074759058 +254,2020-09-11,1.1039642088212858,2.2641895522206923,2.081607237299805,0.9864870215008484 +255,2020-09-12,1.1185770391430765,2.2546066083105702,2.047143847752991,0.988477465020745 +256,2020-09-13,1.06280057345609,2.2899804484534214,2.073500906870503,0.9948467554922772 +257,2020-09-14,1.0891822636651172,2.3070774686351068,2.141489389912244,1.002187845607817 +258,2020-09-15,1.0962564434820237,2.276193543449068,2.246327530781324,1.0032217115443585 +259,2020-09-16,1.1115531181137768,2.274219345565829,2.2357721025416546,1.0043792081936729 +260,2020-09-17,1.085958416988806,2.2752096704885765,2.201605853297032,1.0093393608511672 +261,2020-09-18,1.146245860222447,2.282190388787204,2.160640867885381,1.0123463768773904 +262,2020-09-19,1.1537778222934163,2.2253933387650817,2.090306972247148,1.020003702924207 +263,2020-09-20,1.149390714927409,2.16159784585839,2.073014099305851,1.0220680452699864 +264,2020-09-21,1.1541331367221972,2.130893491509205,2.0458377760738213,1.0396518237179782 +265,2020-09-22,1.1498129074160868,2.0926609204347097,2.0541372762601307,1.04091758424457 +266,2020-09-23,1.1446406343043778,2.118764207726457,2.05092994681724,1.0418509181037665 +267,2020-09-24,1.1700927924576905,2.091529617399207,2.05527559437275,1.0441420349922217 +268,2020-09-25,1.1838819765686317,1.984742627815592,1.981147691585461,1.0524944862588177 +269,2020-09-26,1.184236071270645,1.986599749963918,2.04374843291446,1.0539827163149076 +270,2020-09-27,1.1872652432410735,1.9923360376683188,2.05958133489356,1.056606955810706 +271,2020-09-28,1.2111686025938448,2.0269520976346267,2.0885116021757817,1.0637811330951057 +272,2020-09-29,1.2128187476172962,2.008974500012182,2.141271010388752,1.06704093548368 +273,2020-09-30,1.1837228636173038,1.9414782887063275,2.1037135913846106,1.070035239356136 +274,2020-10-01,1.2012784798748295,1.920766227019244,2.1904585636141896,1.072285071441802 +275,2020-10-02,1.229928289695723,1.926246724868972,2.164058954726515,1.0749903591448788 +276,2020-10-03,1.2576720294059205,1.9050928318638207,2.240899882087869,1.0772598449622313 +277,2020-10-04,1.259111975610874,1.9081145172437453,2.17868462965396,1.0790982068698378 +278,2020-10-05,1.214480304726046,1.9296654214009312,2.191037732205339,1.0799573343473532 +279,2020-10-06,1.2367119988436592,1.9930332488883804,2.157949722207713,1.0894433635430334 +280,2020-10-07,1.1918461991333509,1.9366558570031924,2.1786587345427613,1.0929286737055888 +281,2020-10-08,1.2047382866267795,1.970056651551864,2.2589719642075976,1.093509097146584 +282,2020-10-09,1.1955393840662745,1.9858037585074448,2.3163382795183165,1.0957275047277275 +283,2020-10-10,1.1867078724647688,2.0718447898888432,2.295617357121811,1.0970848927362955 +284,2020-10-11,1.207258078161285,2.039773597640912,2.308352241653706,1.1031996811027127 +285,2020-10-12,1.2495117298527116,2.0519212522973787,2.358790991672946,1.104976811517453 +286,2020-10-13,1.2341412949594146,2.0094725225776973,2.3420936881844754,1.1185499443882925 +287,2020-10-14,1.2074457000680026,2.031792948771168,2.344083278864812,1.1200324757830094 +288,2020-10-15,1.220685304663726,2.016528400615362,2.308499703000712,1.1210530992163392 +289,2020-10-16,1.2319782138752635,2.033347365968653,2.3700021947604704,1.1356783068906011 +290,2020-10-17,1.243988762755584,2.0766664578138805,2.4031351237219822,1.1374256499103377 +291,2020-10-18,1.258781393604108,2.105837478503288,2.3539787387736784,1.140862883538152 +292,2020-10-19,1.2792088654733011,2.163539707503391,2.402843392203179,1.1842957188393533 +293,2020-10-20,1.3144972047916126,2.111218248768162,2.431707789969741,1.187223117766127 +294,2020-10-21,1.3280614214950373,2.1331589617090265,2.416394603004804,1.1913137320144669 +295,2020-10-22,1.3387862074636503,2.107535080984876,2.368341209224261,1.194596165781971 +296,2020-10-23,1.3970068606474848,2.098383962783049,2.3540653842863253,1.1953094065118848 +297,2020-10-24,1.3950098407949878,2.1082489951221866,2.3878235750331687,1.1960562746315428 +298,2020-10-25,1.3683339090881992,2.134722332926158,2.444757578755241,1.196971813667161 +299,2020-10-26,1.3597019290012515,2.132377251897591,2.550425021636159,1.1999538998132655 +300,2020-10-27,1.3252947022819863,2.110245072482122,2.5552854101958564,1.2460468434315568 +301,2020-10-28,1.350487359981082,2.139784381749084,2.5033398105082383,1.2474069077322734 +302,2020-10-29,1.3532600119165674,2.104690167136623,2.4389435031573834,1.2544441138139752 +303,2020-10-30,1.370837466174858,2.054318178776854,2.392059101280476,1.2575027402817325 +304,2020-10-31,1.436223081156546,2.119259500400969,2.327329785335115,1.2582356054099209 +305,2020-11-01,1.4339919936925012,2.1197163872917955,2.274828703304184,1.261388638872427 +306,2020-11-02,1.4422260672799314,2.1189832379676115,2.2351746919209416,1.267817347384253 +307,2020-11-03,1.4412699885652236,2.102704314368752,2.2367901934335976,1.2817313772420904 +308,2020-11-04,1.419078208431615,2.1186752487054545,2.2135435667771803,1.2826957437003348 +309,2020-11-05,1.4384833276499038,2.0791707635930976,2.275386102582254,1.288912540923011 +310,2020-11-06,1.397384185555799,2.018337080228104,2.2540174817473213,1.2891166579242537 +311,2020-11-07,1.4064626040344346,2.025141230630807,2.268675318606333,1.2914058011100833 +312,2020-11-08,1.390685803984185,2.0232486822523024,2.308631854848098,1.3061809174297856 +313,2020-11-09,1.3874874292995236,2.071460924933666,2.2607000982157266,1.3070563693566266 +314,2020-11-10,1.3746878172998056,2.0837537678684472,2.2944440648182702,1.3114511900232555 +315,2020-11-11,1.3866512589572233,2.022117555885239,2.343260191406187,1.314980030238566 +316,2020-11-12,1.3462517758485009,2.0294367203043717,2.3824104193365976,1.3182725372000237 +317,2020-11-13,1.3312751205259583,2.0035421855998568,2.4281997461920106,1.3216683285938853 +318,2020-11-14,1.3776766696563163,1.923250309752576,2.4711215390402788,1.3244142233923455 +319,2020-11-15,1.366983297010691,1.9501873783889447,2.4544562234099843,1.3263463197175802 +320,2020-11-16,1.3597793148515092,1.996652165598607,2.528060405706684,1.327109604231372 +321,2020-11-17,1.3164281793115369,1.9423313390033172,2.655835725596793,1.3313585124923697 +322,2020-11-18,1.3317846715448027,1.899596306016603,2.599225325950504,1.3328689868089256 +323,2020-11-19,1.2902989563375766,1.8806147463941167,2.551595094440797,1.3337422662350422 +324,2020-11-20,1.2749496031828011,1.8986996205516704,2.530436419305703,1.337173285028032 +325,2020-11-21,1.2434267658113127,1.904706777775782,2.5108927102295926,1.344624105977383 +326,2020-11-22,1.2706429172588554,1.870104994476517,2.590074707794605,1.3469166244396142 +327,2020-11-23,1.2828191519336425,1.936549753732673,2.650096538165582,1.3490808275610164 +328,2020-11-24,1.3041379804862103,1.934827468646432,2.627959424025244,1.355618417193334 +329,2020-11-25,1.2987110107751347,1.8670997186862424,2.6316490214502246,1.3570177935958083 +330,2020-11-26,1.3269329819747593,1.8424779259913635,2.6388179194852506,1.3614280845340117 +331,2020-11-27,1.3152746770511103,1.868995558521188,2.568674083936485,1.364075927386591 +332,2020-11-28,1.3506954933107598,1.933073473149457,2.594778736009084,1.373337402945247 +333,2020-11-29,1.3386361921791448,1.952838059952042,2.606648540927484,1.383557305443774 +334,2020-11-30,1.3618661935526004,2.0103250717243943,2.569802850158569,1.385963521814751 +335,2020-12-01,1.39567603999526,2.052104646425733,2.5104994197308232,1.3877380840292992 +336,2020-12-02,1.392074385575624,2.0675494523563653,2.485566207076336,1.3882444898984934 +337,2020-12-03,1.3819273790411657,2.093861994727276,2.421808351103554,1.3890153699132768 +338,2020-12-04,1.4051363849106822,2.170997511179801,2.371715986075685,1.3905562618256002 +339,2020-12-05,1.423109636717845,2.185225636169727,2.34109872040913,1.3907666382352195 +340,2020-12-06,1.4376836310550631,2.2230317694679256,2.346232889702072,1.3939039559474664 +341,2020-12-07,1.526458472596805,2.1939381251150776,2.2648766180102133,1.4179149064159244 +342,2020-12-08,1.534007078003753,2.193890689106934,2.2376062578363416,1.4196537486195773 +343,2020-12-09,1.570120782220947,2.2521993496418387,2.323667673355853,1.4249394046116777 +344,2020-12-10,1.5739401045905157,2.2315715860387604,2.3112442787438057,1.429057781752709 +345,2020-12-11,1.5429616014165604,2.2591477950980847,2.272811825935797,1.4308906056337822 +346,2020-12-12,1.5732341553653304,2.2032364263265896,2.229900385192739,1.431547709537922 +347,2020-12-13,1.6286821951906507,2.1830978776161025,2.27740619343844,1.432422980432231 +348,2020-12-14,1.6469441508431684,2.1425076576757647,2.235261682326977,1.443150704680311 +349,2020-12-15,1.5718020183057722,2.071913884488913,2.149424018035347,1.4445448113886517 +350,2020-12-16,1.5773081091715446,2.0638551560909177,2.162347109967265,1.4451790340857336 +351,2020-12-17,1.5227909565144766,2.017921609850533,2.1672842000162413,1.445562539638661 +352,2020-12-18,1.4891923221477237,1.9897836257363235,2.176754748496434,1.4526568222617808 +353,2020-12-19,1.484870487634522,1.951277912733069,2.134627098999995,1.4601245726602683 +354,2020-12-20,1.521782461697588,1.951983033258623,2.17789187274426,1.4788068110669847 +355,2020-12-21,1.5544320141058037,1.8493659165896748,2.18099167487275,1.523962349286215 +356,2020-12-22,1.560503809998861,1.8611679736818592,2.2039993620760967,1.5246976088013535 +357,2020-12-23,1.5334971041093952,1.833002427932097,2.343476248307637,1.527360584807129 +358,2020-12-24,1.5794099876243315,1.9041534697937852,2.2901173676907534,1.5297409708066323 +359,2020-12-25,1.6065679801493142,1.9070647217180157,2.291970943251856,1.5335846648050422 +360,2020-12-26,1.622247941424142,1.8928074424100143,2.303002006218162,1.535274338910095 +361,2020-12-27,1.7015908691024355,1.8482200241927491,2.248381261571885,1.5383112052039312 +362,2020-12-28,1.6036866430723409,1.843769090979501,2.231460481628248,1.5386363487762145 +363,2020-12-29,1.5375202384191342,1.8206896498491536,2.3074157180169994,1.5408157927481176 +364,2020-12-30,1.5600630935461406,1.7826799832793585,2.2825395987056125,1.5422252257198634 +365,2020-12-31,1.5104147622873492,1.7668565507355858,2.27695238139297,1.5440584612014132 +366,2021-01-01,1.5712035235637756,1.684616284880876,2.233309322045018,1.5448667333098565 +367,2021-01-02,1.6210547964842792,1.7478151353494071,2.1574629701979298,1.548120419402096 +368,2021-01-03,1.6289254690471855,1.725836388519887,2.108581903630744,1.548817479707807 +369,2021-01-04,1.638734525965505,1.7155157917378676,2.044927121863865,1.5563047235141108 +370,2021-01-05,1.640752183801373,1.7799282303924182,2.016488033588845,1.5608661127582808 +371,2021-01-06,1.6570539499992365,1.739493941093581,2.0124389592880645,1.5631898777829367 +372,2021-01-07,1.578187832496174,1.6930194751764869,1.9445270476899643,1.5639680296502425 +373,2021-01-08,1.6227999393024517,1.7194595600353992,1.940134094720716,1.5688337294998258 +374,2021-01-09,1.6283589854096432,1.7136349981154348,1.9080431172050116,1.5723522942035664 +375,2021-01-10,1.6665194133108947,1.7489061066079217,1.9509162559238369,1.5731664693150271 +376,2021-01-11,1.6341803105808728,1.7642624682341137,1.9938916226440977,1.575127738455531 +377,2021-01-12,1.6174970779436195,1.7923811797905562,1.9915053276010664,1.5827514383987595 +378,2021-01-13,1.615274568253002,1.8107248147139583,2.0359139549100718,1.5991695679580888 +379,2021-01-14,1.5705483210122415,1.8110093914349248,2.014040713826075,1.6002182868598922 +380,2021-01-15,1.5876924325730104,1.7660637238985082,2.033374626523945,1.6009281154165214 +381,2021-01-16,1.5833856066410776,1.8357591587069988,2.0709440693792813,1.6046925481203798 +382,2021-01-17,1.6013738886591906,1.76494118939999,2.0959265396433056,1.6061847148507544 +383,2021-01-18,1.578239155108473,1.792300094514741,2.1516234015963183,1.6077436031920698 +384,2021-01-19,1.537449450971578,1.841015768739388,2.139618678346696,1.6091465678099 +385,2021-01-20,1.5270491611118588,1.9563703647019144,2.135332213061328,1.610305157178482 +386,2021-01-21,1.5228490032906876,1.953475585798639,2.151820246240724,1.6247341328796 +387,2021-01-22,1.5407475786564149,2.001785778376634,2.1879504389166824,1.6285351198690403 +388,2021-01-23,1.53299140461312,2.031064990665913,2.220387841380747,1.629948456185217 +389,2021-01-24,1.5445889585878276,2.037409850509285,2.273437555128114,1.638005012705547 +390,2021-01-25,1.58644895560336,2.0471656735959542,2.240406426382125,1.638769754048435 +391,2021-01-26,1.6226036785791869,2.108368014431792,2.155101334363854,1.6397391094752487 +392,2021-01-27,1.659383192723776,2.1732417729079967,2.252548140759632,1.64633831261166 +393,2021-01-28,1.6598891833149922,2.251700342705186,2.2430383173656727,1.655056750637973 +394,2021-01-29,1.6645972448464752,2.2182444807709443,2.258702561909861,1.6570632637103349 +395,2021-01-30,1.6583800311374666,2.2397181747086874,2.283747790019089,1.6594746246828356 +396,2021-01-31,1.6742978776507575,2.28219309133098,2.2449945212007565,1.679216139273793 +397,2021-02-01,1.6471122487215286,2.234029135013091,2.3347005588457224,1.6802015595330082 +398,2021-02-02,1.6149287680826088,2.1807981297572727,2.4359899638257314,1.686171899377342 +399,2021-02-03,1.6227338387550698,2.229245106413431,2.453599964035388,1.68930490762624 +400,2021-02-04,1.672839630544011,2.288932619594801,2.45179858236766,1.6919945407776182 +401,2021-02-05,1.7155729521519976,2.313326745666048,2.37670567388363,1.6937145764169974 +402,2021-02-06,1.7414517672992007,2.318254663422098,2.387264194297231,1.695671502362838 +403,2021-02-07,1.7720413917578024,2.3664809566426888,2.4777721668076382,1.6986218980532843 +404,2021-02-08,1.763925697497288,2.237990831118396,2.499873971884452,1.7000766613841365 +405,2021-02-09,1.834507869796782,2.41518566629607,2.552919002279553,1.715729122742066 +406,2021-02-10,1.835651382083144,2.3710976045171037,2.440534423653256,1.7163877387355817 +407,2021-02-11,1.8413081048813065,2.386345552129277,2.5432022215403247,1.7238816972371116 +408,2021-02-12,1.8497654498239464,2.399545791008636,2.5903358390807183,1.7247967038775016 +409,2021-02-13,1.885631903086976,2.326373973867991,2.4880432502469323,1.72773524757945 +410,2021-02-14,1.891688653528345,2.286846809475968,2.534049403146154,1.7283190673596367 +411,2021-02-15,1.879205069976963,2.3153570867912467,2.492408936297317,1.7292851368096562 +412,2021-02-16,1.839968824554305,2.4053844983623347,2.4770603822645016,1.731689271152427 +413,2021-02-17,1.8680257921782588,2.347633213984071,2.603642282426436,1.7355926511429076 +414,2021-02-18,1.8542029059135396,2.325881784724655,2.587474254919851,1.7365009545563137 +415,2021-02-19,1.882143268936907,2.3015734011198994,2.509811005142073,1.7374818756270234 +416,2021-02-20,1.8962267570181357,2.3243105765928385,2.546148882354917,1.747806384629749 +417,2021-02-21,1.8620055980158456,2.332880010486286,2.522556583215778,1.754398521319979 +418,2021-02-22,1.9999575696430385,2.340741505413093,2.451862583311992,1.755009060962941 +419,2021-02-23,2.042402885781202,2.376196948741956,2.3806418250084875,1.7654433572482449 +420,2021-02-24,1.9997714207092,2.392134367199,2.334373104272601,1.7668196950978072 +421,2021-02-25,1.9779708858567184,2.374661069489717,2.415740452108789,1.770506460232364 +422,2021-02-26,1.9789516205644688,2.3816546761240103,2.3429892024282744,1.7733391454918466 +423,2021-02-27,1.93466450603626,2.4461456378944346,2.3065235894018943,1.7831077679253902 +424,2021-02-28,1.9834071249674945,2.389894059542642,2.3389660816484548,1.7841591200189597 +425,2021-03-01,1.9741337047452885,2.311123684803184,2.352691827360532,1.7865375388841398 +426,2021-03-02,1.937459530362731,2.342655159280589,2.357038931141847,1.7895296836370012 +427,2021-03-03,1.9706649677688288,2.32998953803022,2.378363867496358,1.791199912081311 +428,2021-03-04,2.03454366312985,2.3866367468951792,2.392054393170012,1.7924193817202656 +429,2021-03-05,1.9716624067037412,2.3865015749563554,2.378103877859073,1.794301161383427 +430,2021-03-06,1.9878431487139971,2.4690347112045545,2.347875859464776,1.7956860000056156 +431,2021-03-07,1.956488326385587,2.5196959406891035,2.3891533436436463,1.8012345301544177 +432,2021-03-08,2.054920532591151,2.4334746001474263,2.3865526703102056,1.802248520558456 +433,2021-03-09,2.0709763477762904,2.395801888982338,2.2848109125443656,1.8072296454374943 +434,2021-03-10,2.061576297676355,2.4757913954678323,2.365479715000232,1.8128895596995835 +435,2021-03-11,1.9862895937127725,2.391079361141238,2.319173527252362,1.815566307558204 +436,2021-03-12,1.984479636847778,2.396957210396273,2.292991572792268,1.820613332862434 +437,2021-03-13,1.9739317443337248,2.448548042194237,2.30053923586084,1.8219970155911784 +438,2021-03-14,1.9898766385379367,2.43624396068609,2.345667653143889,1.8232278681126308 +439,2021-03-15,1.9247659537591737,2.4335356321894195,2.3538967830230493,1.82373620083605 +440,2021-03-16,1.9341310435961212,2.3999419292101654,2.340324638941884,1.824660227754222 +441,2021-03-17,1.9573630688785584,2.401650476079606,2.3890930472158614,1.830152091408726 +442,2021-03-18,1.916292220465363,2.4332795948146395,2.4975495346055325,1.831028803715764 +443,2021-03-19,1.890293492855104,2.487105183541092,2.532561024813717,1.831735846926717 +444,2021-03-20,1.903308311139988,2.493733053568105,2.539405350329571,1.8353913872672805 +445,2021-03-21,1.9469616337437587,2.4445653037914346,2.595591709796882,1.8410845456434617 +446,2021-03-22,1.9523561942623815,2.464833796058223,2.6360624213867467,1.8434269895174336 +447,2021-03-23,1.8778580145651456,2.48363158677985,2.7465161664442417,1.8443107942164692 +448,2021-03-24,1.9079717263254403,2.535945467088719,2.7826295754397847,1.8469647243444616 +449,2021-03-25,1.8743829208619,2.5797476302779896,2.6868861321695707,1.850122201684514 +450,2021-03-26,1.834591128454573,2.610576220050714,2.7188298676243816,1.851783846653953 +451,2021-03-27,1.85521276340418,2.573051282643857,2.7351096355129183,1.855126490928391 +452,2021-03-28,1.8141910534008308,2.5187250675787283,2.7749074182260496,1.8572472707823149 +453,2021-03-29,1.85443335913684,2.444346329329297,2.8655936571670595,1.8585862793603416 +454,2021-03-30,1.8798507924095929,2.4149038067531605,2.774884268046476,1.8629393368582885 +455,2021-03-31,1.9009488168929616,2.4112448623448826,2.6882580643517056,1.8671463378855655 +456,2021-04-01,1.953119553197379,2.4450145143439017,2.751539545331297,1.869858074220264 +457,2021-04-02,1.920843933630284,2.3945306998424014,2.721056425435808,1.87330909439513 +458,2021-04-03,1.9043823831998437,2.488542015462468,2.6598348867019803,1.878195130287063 +459,2021-04-04,1.9118325872114668,2.4300310533502008,2.7211384877273948,1.8839982986422057 +460,2021-04-05,1.9143311965206804,2.366572070037218,2.708626053048081,1.8850716239056435 +461,2021-04-06,1.886821452967837,2.380104252886121,2.686516753657998,1.8871993251779395 +462,2021-04-07,1.915272401908787,2.506237147604136,2.71344808649388,1.8934266304908811 +463,2021-04-08,1.8266991151730405,2.4886927324645174,2.646619960795338,1.8952255418305728 +464,2021-04-09,1.8500524861130607,2.416546344321693,2.6599476022507957,1.90021348011096 +465,2021-04-10,1.8195144950767264,2.465958801894828,2.6758564038772983,1.901342103380268 +466,2021-04-11,1.8251075661045568,2.4745418174804223,2.7033897124033586,1.9042278480312265 +467,2021-04-12,1.8574721140724475,2.484584953936203,2.7440593089530627,1.9077837225054788 +468,2021-04-13,1.911298058653184,2.5605874195631344,2.8414368801570378,1.909948468147297 +469,2021-04-14,1.875580359200088,2.5772966956091943,2.9171447045049925,1.911040045228034 +470,2021-04-15,1.881151828474525,2.493092715001101,2.908716499524202,1.9117571556803037 +471,2021-04-16,1.901388647119129,2.533670653002471,2.897580626540045,1.9128440540294511 +472,2021-04-17,1.8455570976557,2.5107854787646064,2.8589457667876768,1.9179509029490625 +473,2021-04-18,1.8811275456102492,2.514417473356992,2.863591117645981,1.9203758611787909 +474,2021-04-19,1.934735684533444,2.441080790840025,2.8073681187362123,1.9216773546234265 +475,2021-04-20,1.9219636087498069,2.519885067113868,2.6598177500405376,1.9223746165623772 +476,2021-04-21,1.8483009032647868,2.5668625547309216,2.630383655279064,1.925845609587103 +477,2021-04-22,1.9073036166732469,2.635200116789085,2.6391794736120544,1.9321383005793755 +478,2021-04-23,1.938789170601118,2.7159817530096486,2.6299970076917005,1.9337504327285644 +479,2021-04-24,1.925421448553977,2.68674800088486,2.621365626257928,1.9391915608669557 +480,2021-04-25,1.9151980640721529,2.641681828987044,2.698696546806226,1.945340240528056 +481,2021-04-26,1.913556055665868,2.715484483713124,2.708842009443733,1.9627177070918456 +482,2021-04-27,1.855070992253988,2.7165115356211165,2.7295919593511093,1.970618796089648 +483,2021-04-28,1.8559271396289396,2.7026332636150108,2.794411627669506,1.971611739817064 +484,2021-04-29,1.8887764888453191,2.695615707368346,2.8386011677697285,1.974002338188185 +485,2021-04-30,1.87702571919354,2.676827898815493,2.9324184345642834,1.9752019919798771 +486,2021-05-01,1.869673471855934,2.599014622216264,2.933679320366271,1.9809638585685387 +487,2021-05-02,1.8703018137152103,2.571181859813996,2.830813323929607,1.9851112456860176 +488,2021-05-03,1.9397508461882045,2.500067466520934,2.800771049001466,1.9881837519287 +489,2021-05-04,1.9662895976827104,2.4880647404085687,2.7574211065527066,1.9924446913404676 +490,2021-05-05,1.916687613630237,2.451144538313585,2.784979306504568,1.993086718932316 +491,2021-05-06,1.9105650628791355,2.492654665687748,2.7766387250167632,2.0051437219794908 +492,2021-05-07,1.96805977731422,2.550894868022315,2.792016997938374,2.0067558210471583 +493,2021-05-08,1.9762478446854252,2.5846124898397456,2.745681568662014,2.0073834860863173 +494,2021-05-09,2.0313261579996955,2.6455901447327093,2.7640253214408235,2.0101404950182102 +495,2021-05-10,2.010304032368663,2.6093978048274318,2.6839376415947034,2.011457989916723 +496,2021-05-11,1.9888886082655008,2.586485882320101,2.735085847161425,2.0154307660974595 +497,2021-05-12,2.0119766964891235,2.5795990402328908,2.7489754234614776,2.01927447499852 +498,2021-05-13,1.9812015301948789,2.5657754558807686,2.798778049554446,2.0196506872240665 +499,2021-05-14,1.9268653257020327,2.555530678112648,2.7382365105347186,2.0287022787569384 +500,2021-05-15,1.9676549288249392,2.545716493209544,2.680203454865353,2.030226357718929 +501,2021-05-16,2.0345457844885786,2.5385168890809995,2.576721986605796,2.0310066254357437 +502,2021-05-17,1.9606539671822016,2.597017465278317,2.654809884531759,2.031844316479567 +503,2021-05-18,1.949066953412906,2.665849564392086,2.6508616891901435,2.033985580665928 +504,2021-05-19,1.908705080541045,2.6746661043780247,2.642110067223141,2.0392519402125733 +505,2021-05-20,1.903219918956071,2.635660526964302,2.582226260890573,2.041634853378214 +506,2021-05-21,1.8904485215794529,2.6739417239879977,2.585266889114871,2.0421520225416194 +507,2021-05-22,1.88099088601678,2.728493647516978,2.495186539060622,2.0425147282708327 +508,2021-05-23,1.8717741643600017,2.6999196484354004,2.5273052275976875,2.046161078526562 +509,2021-05-24,1.9511923780284224,2.6590518128951506,2.584550030434049,2.0523363620478525 +510,2021-05-25,1.925866085030401,2.624531676236537,2.5733349755383266,2.064116911915137 +511,2021-05-26,1.979142234707904,2.585684531895416,2.608018521527197,2.0650347867261303 +512,2021-05-27,1.9929556304949052,2.541961224772388,2.674526052033722,2.0655998338659254 +513,2021-05-28,1.9489563897379485,2.5695891539521605,2.650415784517392,2.0667250160164565 +514,2021-05-29,1.9304517954713931,2.651379750069219,2.7292148870002166,2.0686780200258923 +515,2021-05-30,1.8956594127156408,2.68246891998668,2.870144155183717,2.075140133220369 +516,2021-05-31,1.9161351501714543,2.559842530638906,2.8986259554264184,2.0780613110690638 +517,2021-06-01,1.910572978911347,2.5699319760599626,2.934204667154654,2.079530549324124 +518,2021-06-02,1.8508997248925765,2.432473773294165,2.87091985426918,2.0849842569343293 +519,2021-06-03,1.8288566166552969,2.331982409113071,2.858127947931026,2.0855919218160386 +520,2021-06-04,1.834607275986444,2.284948722383677,2.8145071193382014,2.09555310396532 +521,2021-06-05,1.888516899793224,2.290326698915272,2.800462980076794,2.0982117670734555 +522,2021-06-06,1.8248895809375585,2.3324279303437487,2.7964135929013594,2.101846128078813 +523,2021-06-07,1.8481756289460165,2.423256010588786,2.9067171477044207,2.105787599499597 +524,2021-06-08,1.8684848570095287,2.3977135286610025,2.9080980632719275,2.1067832445344865 +525,2021-06-09,1.883257678629105,2.438906968392103,2.911343133245727,2.119006739692313 +526,2021-06-10,1.8889061489449823,2.4663316166179867,2.8706613540339623,2.122338170487416 +527,2021-06-11,1.887797962992375,2.4618455427043773,2.7834343226272966,2.1228458217257864 +528,2021-06-12,1.8081989813409656,2.38622003153277,2.780969731760915,2.140551759451355 +529,2021-06-13,1.845294044028118,2.348022004753516,2.747249840452516,2.1516534679778947 +530,2021-06-14,1.87982248448568,2.3510193254934597,2.7581073282006066,2.1548648791531626 +531,2021-06-15,1.8338720562684567,2.342483386195582,2.724722353009969,2.1566576197096365 +532,2021-06-16,1.8377758052779496,2.35599816673883,2.739177328292277,2.157290355110665 +533,2021-06-17,1.8196301146220968,2.422132083942238,2.8244490368467146,2.161990467762121 +534,2021-06-18,1.8269018626454328,2.3547509115539627,2.887903688319278,2.162764295309903 +535,2021-06-19,1.8106009920802508,2.375169305086028,2.832486587581785,2.1652895904308656 +536,2021-06-20,1.887437771367572,2.389128566489945,2.8568779106026585,2.166182992475619 +537,2021-06-21,1.8663872313620136,2.323202847900762,2.895433042491957,2.168569662637026 +538,2021-06-22,1.9378093869222213,2.286453398422873,2.857694799376853,2.171973951255609 +539,2021-06-23,1.9139717091235064,2.199961227842093,2.9421370312120145,2.1727974168934274 +540,2021-06-24,1.9438901432697355,2.20785203514083,2.9227064385331896,2.1766744731349945 +541,2021-06-25,1.947189297906896,2.269913411493896,2.880360580277351,2.1774856245167253 +542,2021-06-26,1.9415855608604948,2.295153987435186,2.8826082196695824,2.1789435822974976 +543,2021-06-27,1.9518140378096729,2.313849007785416,2.910050789844945,2.1802505077055705 +544,2021-06-28,1.8636136811434287,2.3437251272394173,2.927263674542377,2.181806224834297 +545,2021-06-29,1.8638926435483791,2.3788782530038755,2.8338412698877358,2.183785998658097 +546,2021-06-30,1.918044415434012,2.410473548964974,2.7231063331779746,2.2066550902131263 +547,2021-07-01,1.868014102896528,2.4095546298490573,2.7236851887550078,2.2087739245872813 +548,2021-07-02,1.9000815805147049,2.446198538507121,2.754433971997974,2.21063494844427 +549,2021-07-03,1.8895083801803725,2.480581559774474,2.707932069905328,2.214414901619294 +550,2021-07-04,1.8903362113990645,2.6044606499887237,2.655649764756849,2.2160967201726334 +551,2021-07-05,1.863847557940538,2.6054910686033943,2.679189077996873,2.224511358845949 +552,2021-07-06,1.8500225507844488,2.6364143875653507,2.650791469689044,2.2261640873455297 +553,2021-07-07,1.8545921896581472,2.633080317410046,2.685442500141768,2.227757799836993 +554,2021-07-08,1.8904007578732496,2.533747256777972,2.7347535358462505,2.228157877563259 +555,2021-07-09,1.885641640550468,2.605524424291013,2.7457330943867726,2.231449946171915 +556,2021-07-10,1.97848257682334,2.579513338466467,2.788826378168117,2.235957503155089 +557,2021-07-11,2.0632880307246078,2.4775022572624024,2.7746491256465746,2.2382425762198683 +558,2021-07-12,2.110504407368901,2.456777769417417,2.7562873121227707,2.2406163223357334 +559,2021-07-13,2.1759202799695583,2.4984250322812254,2.798153363691262,2.242640467358908 +560,2021-07-14,2.239321245772315,2.4492310807898523,2.726840989521577,2.2471386002780784 +561,2021-07-15,2.2426723865726506,2.402395574599132,2.7602278658235178,2.248833778751075 +562,2021-07-16,2.2166846403591,2.432506115526139,2.6676493828336945,2.252808270595654 +563,2021-07-17,2.2841196635189163,2.4972428267219686,2.7076292562719497,2.254000565733404 +564,2021-07-18,2.386529028336786,2.612095092640717,2.70298080169123,2.261076376791599 +565,2021-07-19,2.4238653313588148,2.504692276828355,2.7431136501996147,2.2616688822162763 +566,2021-07-20,2.460828534670216,2.452670936345254,2.7565685093396453,2.262601026466135 +567,2021-07-21,2.493045678463024,2.4046080113694286,2.7838084192636723,2.2649210605988244 +568,2021-07-22,2.441711218367391,2.463051137572334,2.799827862481423,2.274065287389161 +569,2021-07-23,2.418563467184,2.4653369858988423,2.729722187252656,2.278754666823245 +570,2021-07-24,2.4304630704026624,2.3651852483193254,2.6663947216805783,2.2797382021876995 +571,2021-07-25,2.4126973135020275,2.417968008408696,2.787339710188789,2.281719698996362 +572,2021-07-26,2.47943083422814,2.4510484154227674,2.7912434692107118,2.285138264962157 +573,2021-07-27,2.4380333408538903,2.473269675214885,2.7378070926145317,2.2999182696038782 +574,2021-07-28,2.400138104550418,2.547255434790142,2.7396727778923124,2.302102827267749 +575,2021-07-29,2.360471368274433,2.5395460544086044,2.738824910484832,2.3050948578374104 +576,2021-07-30,2.355666923260717,2.6254949266270318,2.74941124002447,2.3055518440923057 +577,2021-07-31,2.416684093944538,2.645511707304542,2.707720932407008,2.30578825844753 +578,2021-08-01,2.412806870650149,2.621914789182292,2.6886059314060797,2.3136391114307 +579,2021-08-02,2.398413052480753,2.5677353523181545,2.618904838159212,2.318632597495367 +580,2021-08-03,2.380141405274328,2.5644643372967035,2.647740662535277,2.320630789130837 +581,2021-08-04,2.292166316103728,2.621793772787861,2.6269895965798957,2.321781634662929 +582,2021-08-05,2.314401245859968,2.6548166586145934,2.548888166031659,2.3238221687478564 +583,2021-08-06,2.265961951621215,2.6070890825727435,2.5504701798220992,2.354673007548111 +584,2021-08-07,2.364145878366589,2.596710615869842,2.5490555586447248,2.3557410875692586 +585,2021-08-08,2.231803674581417,2.6717351713292774,2.5616542793907917,2.3584983044174184 +586,2021-08-09,2.238887015121952,2.7382321156821323,2.5826947578272046,2.359170765898252 +587,2021-08-10,2.2339645512297044,2.803751927137453,2.57422874290244,2.3603389590413566 +588,2021-08-11,2.268051347901983,2.849363150205823,2.581723168426758,2.3665125134273004 +589,2021-08-12,2.253106985644197,2.796967421021412,2.553964612663342,2.367291435547094 +590,2021-08-13,2.222066888646865,2.8562837277560336,2.484163135633253,2.3680720623695324 +591,2021-08-14,2.1627827750859434,2.838169804167804,2.435386230760158,2.3701761576689115 +592,2021-08-15,2.078189592625496,2.7198713977785234,2.4107837914568666,2.375395191808593 +593,2021-08-16,2.084025292809807,2.723601772599589,2.3715953022783283,2.380093186903871 +594,2021-08-17,2.114290260112508,2.8090650144079103,2.4499854688405223,2.3850957087611766 +595,2021-08-18,2.104933633449165,2.7133625112373623,2.451094477786386,2.386094871815321 +596,2021-08-19,2.0761047423807946,2.7149022252692707,2.4588024793796577,2.387816916018409 +597,2021-08-20,2.113261491761997,2.6886861501271544,2.474311580858028,2.3901432153753905 +598,2021-08-21,2.0554779790278466,2.73245396949763,2.3791016815694674,2.390384867652607 +599,2021-08-22,2.0121391257376247,2.772520606174383,2.370607589009269,2.391900058718593 +600,2021-08-23,2.04800026877506,2.6742802906201293,2.4478680243431,2.3981448890519355 +601,2021-08-24,2.0716317081149627,2.763537439880177,2.493017438618508,2.4016980477869465 +602,2021-08-25,2.1339147395651423,2.801894354817671,2.467735690801983,2.40987605607982 +603,2021-08-26,2.1550960560486985,2.8135636440796445,2.5732433270029658,2.411127170677257 +604,2021-08-27,2.19013224067687,2.751699711247068,2.5839935508464693,2.4187399821881232 +605,2021-08-28,2.1686211513668545,2.7302426526005306,2.621243087864899,2.4227260952456464 +606,2021-08-29,2.2756644343885366,2.736448101694492,2.5676860539558284,2.424762688251853 +607,2021-08-30,2.228843873329216,2.802223133494886,2.5348558782909945,2.4253943176696806 +608,2021-08-31,2.290534657423185,2.817855286690285,2.492727930845802,2.42633340432104 +609,2021-09-01,2.3104956751915884,2.841595141956114,2.4917793669013726,2.4331152735594164 +610,2021-09-02,2.22052238974031,2.8456455944123817,2.480527325602523,2.433862330454984 +611,2021-09-03,2.1406712190302226,2.8650549735152824,2.521739658044962,2.455014144374624 +612,2021-09-04,2.064483788114315,2.882743039865439,2.60898554264686,2.460356391942159 +613,2021-09-05,2.048836580652613,2.965082497590932,2.674911635952264,2.460944636971344 +614,2021-09-06,2.0452877259592848,2.903798295648383,2.589414288722403,2.461562486765298 +615,2021-09-07,2.045620390684616,2.880026888266613,2.639903142275342,2.462835850497363 +616,2021-09-08,2.0594875117509366,2.9054528756662967,2.6302785319091284,2.4632941712837595 +617,2021-09-09,2.071532403278898,2.952118594219753,2.658206588489612,2.4658060085407625 +618,2021-09-10,2.071919030271377,2.952094193234008,2.6525011751284358,2.465995109614396 +619,2021-09-11,2.1128175294359326,3.050636065940252,2.5421340523662264,2.470165291514924 +620,2021-09-12,2.1371401627561784,3.1088025349851285,2.5531725661354274,2.4714554938837856 +621,2021-09-13,2.1221979236093858,3.1130281070271884,2.605517396260833,2.471759487899888 +622,2021-09-14,2.092261988383532,3.103804334615367,2.56424106714332,2.484080598930304 +623,2021-09-15,2.129637309335401,3.172278969984911,2.603103232320957,2.490925099842164 +624,2021-09-16,2.2085874383366293,3.2342944060088112,2.539366192461412,2.4920686838886708 +625,2021-09-17,2.160774656452423,3.182002046619881,2.443726419783613,2.497032314538377 +626,2021-09-18,2.100557181531342,3.129989283779571,2.4341415711917005,2.503158582099005 +627,2021-09-19,2.034949072724942,3.050564070117339,2.47064740888052,2.504772950167818 +628,2021-09-20,2.0122952532834035,2.966338568623049,2.441739504965169,2.5073164957610614 +629,2021-09-21,2.0724809184474804,2.925469456042676,2.4118909546622125,2.510259868307541 +630,2021-09-22,1.999213691064068,2.857076678549477,2.4272971274175705,2.5113889286847435 +631,2021-09-23,2.059941390098371,2.92693752803989,2.44880421524885,2.5145633658595057 +632,2021-09-24,2.105283568817446,2.9195652901295506,2.4374861206290914,2.5173561420402115 +633,2021-09-25,2.1210872152402542,2.873887502964376,2.4414828878082298,2.522210121483124 +634,2021-09-26,2.093116538911284,2.822939979162219,2.470755074740452,2.523669947695392 +635,2021-09-27,2.1371758885392134,2.828793719274986,2.3853774746030463,2.5248760447500147 +636,2021-09-28,2.1929488477227084,2.7593800720810338,2.378955877552903,2.5343482898075798 +637,2021-09-29,2.125507620414123,2.786935876211741,2.3575908361604307,2.5355289705924555 +638,2021-09-30,2.052905696214497,2.7282293914876763,2.3015941264528426,2.5382075807228244 +639,2021-10-01,2.0364080644140428,2.6681989554078887,2.3073491839835536,2.571650727264994 +640,2021-10-02,2.0422494296057234,2.666711228702867,2.299448424300495,2.5772059977898847 +641,2021-10-03,2.0947093536075942,2.6668556496516254,2.2328079684139888,2.5802566901785724 +642,2021-10-04,2.068746853500488,2.7607929676207017,2.2814550397769966,2.581045480338564 +643,2021-10-05,2.008593460234377,2.7751795981601792,2.352048274803163,2.5815117770626617 +644,2021-10-06,2.067000800313782,2.7068504554634094,2.4217255013963137,2.5820639027611594 +645,2021-10-07,2.0337696425008014,2.7466966292456103,2.4134972530938272,2.5828079811678166 +646,2021-10-08,2.0044733977436304,2.782628342143416,2.421129686743285,2.584337369306774 +647,2021-10-09,1.9878463912884312,2.6841407255222376,2.3725726981484647,2.588489827265691 +648,2021-10-10,1.978959194144693,2.7547576924846537,2.3320178015335373,2.589656256725408 +649,2021-10-11,2.067812331771724,2.703092094928401,2.304381553794902,2.5931068769579664 +650,2021-10-12,2.115131939801685,2.768753363299485,2.3514950875685137,2.5987731243489507 +651,2021-10-13,2.074380903246295,2.757348188843172,2.4117239551590024,2.6094004651481804 +652,2021-10-14,2.126047656894596,2.7390587746687203,2.535038908206191,2.622306449658358 +653,2021-10-15,2.161275291705933,2.7047397413058425,2.5053326748582028,2.6259677667747905 +654,2021-10-16,2.1956066155375216,2.7089062459147493,2.5817398338602966,2.632824059266838 +655,2021-10-17,2.241522724288997,2.7249894661547853,2.660616874008986,2.634181980519386 +656,2021-10-18,2.2751582578885703,2.7623042106401283,2.680746831749016,2.63602807072511 +657,2021-10-19,2.2563594988412343,2.7471749482664385,2.8041555813061247,2.6363794635692743 +658,2021-10-20,2.2099896086877795,2.676951221566803,2.920062106542289,2.637304172590792 +659,2021-10-21,2.282095580740634,2.753894947154244,2.9258750339197217,2.6409597905641258 +660,2021-10-22,2.2239343284733715,2.727478426996881,2.9632255775263534,2.646001659676019 +661,2021-10-23,2.279319416831802,2.754567567751261,2.944829035632479,2.64811853509479 +662,2021-10-24,2.3453015700758875,2.8067055640853646,2.9700974711232964,2.6527765689500336 +663,2021-10-25,2.361824247126788,2.83282825313507,2.9242108348710816,2.6545196340698194 +664,2021-10-26,2.328039683464308,2.75660559936471,2.9277325762489816,2.6555982638215743 +665,2021-10-27,2.323204434759772,2.844989128944869,2.9056610131635514,2.657717998542664 +666,2021-10-28,2.325234540964127,2.833538434926841,2.9382674014595938,2.658768396349393 +667,2021-10-29,2.317442615668352,2.827442931346405,2.8986258916038445,2.6614131001738768 +668,2021-10-30,2.303986868285237,2.7280140030480253,2.9094817433940383,2.663706440794713 +669,2021-10-31,2.309969205499111,2.7066661434969617,2.9116358132766327,2.664841531544583 +670,2021-11-01,2.2788521507542145,2.800627486486081,2.881919827005178,2.682567431792886 +671,2021-11-02,2.289873879425013,2.867601326126316,2.9716190686614548,2.6831658727899543 +672,2021-11-03,2.2502523830877394,2.8681376567654397,2.95490927965838,2.689512011303949 +673,2021-11-04,2.249964387126984,2.850796290411571,2.886788423312073,2.69115714787188 +674,2021-11-05,2.26774160238118,2.8185360443737983,2.836387156970712,2.6953873599465203 +675,2021-11-06,2.253175370533928,2.7826506313198807,2.8582663146238567,2.700841190429837 +676,2021-11-07,2.2556750085492188,2.8994922166269346,2.8632658419610806,2.7021513445161824 +677,2021-11-08,2.17027473713999,2.847771395681168,2.833256545930489,2.708092757039891 +678,2021-11-09,2.1510041519617005,2.872826551162227,2.744546887740383,2.7120664758301136 +679,2021-11-10,2.089156423071544,2.825751596322006,2.743451393425635,2.724715742479188 +680,2021-11-11,2.1606616535396515,2.779964928904481,2.781434990204661,2.7337340561236974 +681,2021-11-12,2.22697625120498,2.793285304179139,2.773887117599273,2.737728468385452 +682,2021-11-13,2.1257678330081498,2.8165362896066752,2.86750973045401,2.746084629737747 +683,2021-11-14,2.112117365784724,2.8367061005230485,2.9325662051535626,2.7478284073731647 +684,2021-11-15,2.1414712041108457,2.754303603858349,2.896365856714937,2.75215193604866 +685,2021-11-16,2.1557391557902115,2.753001275499925,2.937133059764655,2.754932413419881 +686,2021-11-17,2.154167768921914,2.810867199878264,2.8810554235577417,2.7554740519676866 +687,2021-11-18,2.1182579211691177,2.8273564859892204,2.9403688080111583,2.756343465752641 +688,2021-11-19,2.20801794774734,2.8057718548817165,2.9615045184130424,2.758478486958606 +689,2021-11-20,2.2327113423585487,2.8661993143731945,3.0144956798093148,2.759566487000925 +690,2021-11-21,2.1995919926711824,2.900011718430837,3.050682870970113,2.7620351530204914 +691,2021-11-22,2.1615880600950845,2.908847412336186,3.152681181917425,2.762940587626402 +692,2021-11-23,2.1327325640545864,2.869850036221621,3.2292999126763804,2.7697389936883785 +693,2021-11-24,2.112828963102936,2.835360810270004,3.2629362630101237,2.7704335451649413 +694,2021-11-25,2.133112727685752,2.744685656788545,3.2493270516880286,2.7713005224391805 +695,2021-11-26,2.1470826152283653,2.660082061731212,3.133017851985616,2.773281874490202 +696,2021-11-27,2.1802836234277545,2.736207459206439,3.1821813755888866,2.7741755748091674 +697,2021-11-28,2.169622923618828,2.838619128310465,3.128384633590994,2.7788775126744616 +698,2021-11-29,2.06697186301064,2.9386551954738698,3.221465553399786,2.814464179560515 +699,2021-11-30,2.0567800886382206,2.9032547346451127,3.2571867604362543,2.8160649972349403 +700,2021-12-01,2.0955998606819555,2.811023363569736,3.229027714239134,2.8199523567872906 +701,2021-12-02,2.1462545477704857,2.826150809828675,3.1691053282583,2.8229404561199005 +702,2021-12-03,2.1232431187920686,2.792268304986508,3.260847931216889,2.8265425875930568 +703,2021-12-04,2.1436777950026475,2.747224835986388,3.234805249448213,2.83507130342911 +704,2021-12-05,2.139560011388713,2.772452772048528,3.252347650643172,2.862721448696889 +705,2021-12-06,2.072164179045985,2.8723039305403075,3.187133755200367,2.8672204458528934 +706,2021-12-07,2.0927664451122485,2.933088446201669,3.16775417470898,2.867970299259265 +707,2021-12-08,2.0793825185416277,2.808423886842806,3.1785452959084544,2.870861724204546 +708,2021-12-09,2.0988910963722605,2.838298546728298,3.099368984918366,2.8746650385729047 +709,2021-12-10,2.05563112640476,2.795252673153229,3.0377446518358213,2.8766165408470483 +710,2021-12-11,2.052190526674436,2.790693445222851,3.018037249654266,2.88227507626334 +711,2021-12-12,2.051020337183996,2.7795703215951537,3.062453072536595,2.884033781084639 +712,2021-12-13,2.0503659209385634,2.705757825920253,3.0577798467602184,2.88807208293864 +713,2021-12-14,2.065888904872756,2.640561562291197,3.051383213547955,2.890515761651997 +714,2021-12-15,2.0241158710009217,2.6562965129045946,3.1134644257491795,2.8915956102816867 +715,2021-12-16,2.011796559941659,2.587908744320609,3.1071035379000675,2.9017588477036265 +716,2021-12-17,1.9471541934795624,2.534757152028258,3.118054855704814,2.9056966618689097 +717,2021-12-18,1.9891576149329404,2.554456971035494,3.190911598735974,2.9073356356281543 +718,2021-12-19,1.9977947742668285,2.521892010258683,3.1579358508854742,2.908694730596919 +719,2021-12-20,2.024489416921948,2.498849053678626,3.051474258701378,2.910257506232819 +720,2021-12-21,1.9101162709403732,2.4994923144947903,3.0417807443363,2.9158203024326323 +721,2021-12-22,1.8586335615962708,2.4474147650257,3.0696373922941342,2.91760329017934 +722,2021-12-23,1.802615423056992,2.4134337813378286,3.10286303278097,2.918765537355731 +723,2021-12-24,1.8041416523202545,2.3443871803774843,3.1420884645008327,2.9270177310498138 +724,2021-12-25,1.8489534806960215,2.3553941020378786,3.1643414517660107,2.927586841263833 +725,2021-12-26,1.892760626762073,2.391044316275432,3.163380026777016,2.935788479523747 +726,2021-12-27,1.8698231750168643,2.430083480413742,3.215021219440133,2.940571664793773 +727,2021-12-28,1.8548311703170128,2.463051743097091,3.2040363362571576,2.945883814656572 +728,2021-12-29,1.887209965197199,2.362401253797821,3.285868116298562,2.9466697183024904 +729,2021-12-30,1.9151284139685452,2.452230511452688,3.344048729792291,2.958261602966074 +730,2021-12-31,1.884547011974969,2.4427816715914323,3.391590176442121,2.958993845540612 +731,2022-01-01,1.900999543673747,2.423951572030134,3.4221871729754443,2.959381744191336 diff --git a/tests/gamestonk_terminal/custom/test_custom_controller.py b/tests/gamestonk_terminal/custom/test_custom_controller.py new file mode 100644 index 00000000000..97d1b3b1aaf --- /dev/null +++ b/tests/gamestonk_terminal/custom/test_custom_controller.py @@ -0,0 +1,120 @@ +import os +import pytest +import pandas as pd +from gamestonk_terminal.custom import custom_controller + + +@pytest.mark.vcr(record_mode="none") +@pytest.mark.record_stdout +def test_print_help(): + controller = custom_controller.CustomDataController() + controller.print_help() + + +@pytest.mark.vcr(record_mode="none") +@pytest.mark.record_stdout +def test_info_no_data(): + controller = custom_controller.CustomDataController() + controller.choices = [] + controller.data = pd.DataFrame() + controller.call_info([]) + + +@pytest.mark.vcr(record_mode="none") +@pytest.mark.parametrize( + "queue, expected", + [ + (["load", "help"], []), + (["quit", "help"], ["help"]), + ], +) +def test_menu_with_queue(expected, mocker, queue): + path_controller = "gamestonk_terminal.custom.custom_controller" + + # MOCK SWITCH + mocker.patch( + target=f"{path_controller}.CustomDataController.switch", + return_value=["quit"], + ) + result_menu = custom_controller.CustomDataController(queue=queue).menu() + + assert result_menu == expected + + +@pytest.mark.vcr(record_mode="none") +@pytest.mark.parametrize( + "tested_func, other_args, mocked_func, called_args, called_kwargs", + [ + ( + "call_load", + [ + "-f test.csv", + ], + "", + [], + dict(), + ), + ], +) +def test_call_func_test( + tested_func, mocked_func, other_args, called_args, called_kwargs, mocker +): + path_controller = "gamestonk_terminal.custom.custom_controller" + + if mocked_func: + mock = mocker.Mock() + mocker.patch( + target=f"{path_controller}.{mocked_func}", + new=mock, + ) + + controller = custom_controller.CustomDataController(queue=None) + getattr(controller, tested_func)(other_args) + + if called_args or called_kwargs: + mock.assert_called_once_with(*called_args, **called_kwargs) + else: + mock.assert_called_once() + else: + controller = custom_controller.CustomDataController(queue=None) + getattr(controller, tested_func)(other_args) + + +@pytest.mark.vcr(record_mode="none") +@pytest.mark.parametrize( + "tested_func, other_args, mocked_func, called_args, called_kwargs", + [ + ( + "call_show", + [ + "-l 2", + ], + "", + [], + dict(), + ), + ], +) +def test_controller_show( + tested_func, mocked_func, other_args, called_args, called_kwargs, mocker +): + path_controller = "gamestonk_terminal.custom.custom_controller" + + if mocked_func: + mock = mocker.Mock() + mocker.patch( + target=f"{path_controller}.{mocked_func}", + new=mock, + ) + + controller = custom_controller.CustomDataController(queue=None) + controller.data = pd.read_csv(os.path.join("custom_imports", "test.csv")) + getattr(controller, tested_func)(other_args) + + if called_args or called_kwargs: + mock.assert_called_once_with(*called_args, **called_kwargs) + else: + mock.assert_called_once() + else: + controller = custom_controller.CustomDataController(queue=None) + getattr(controller, tested_func)(other_args) diff --git a/tests/gamestonk_terminal/custom/test_custom_model.py b/tests/gamestonk_terminal/custom/test_custom_model.py new file mode 100644 index 00000000000..7e5e40a9d00 --- /dev/null +++ b/tests/gamestonk_terminal/custom/test_custom_model.py @@ -0,0 +1,24 @@ +import os +import pytest + +from gamestonk_terminal.custom import custom_model + + +@pytest.mark.vcr() +@pytest.mark.parametrize( + "file", + [ + "test.csv", + ], +) +def test_test_load(recorder, file): + result_df = custom_model.load(os.path.join("custom_imports", file)) + assert not result_df.empty + recorder.capture(result_df) + + +@pytest.mark.vcr() +def test_test_empty_load(recorder): + result_df = custom_model.load("") + assert result_df.empty + recorder.capture(result_df) diff --git a/tests/gamestonk_terminal/custom/txt/test_custom_controller/test_info_no_data.txt b/tests/gamestonk_terminal/custom/txt/test_custom_controller/test_info_no_data.txt new file mode 100644 index 00000000000..4be2a4a5f39 --- /dev/null +++ b/tests/gamestonk_terminal/custom/txt/test_custom_controller/test_info_no_data.txt @@ -0,0 +1,2 @@ +[red]No data loaded.[/red] + diff --git a/tests/gamestonk_terminal/custom/txt/test_custom_controller/test_print_help.txt b/tests/gamestonk_terminal/custom/txt/test_custom_controller/test_print_help.txt new file mode 100644 index 00000000000..518ab04fd26 --- /dev/null +++ b/tests/gamestonk_terminal/custom/txt/test_custom_controller/test_print_help.txt @@ -0,0 +1,11 @@ + + load load in custom data set + +Current file: None[unvl] + show show portion of loaded data + info show data info (columns and datatypes) + plot plot data from loaded file[/unvl] +[menus] +> qa quantitative analysis, e.g.: decompose, cusum, residuals analysis +> pred prediction techniques e.g.: regression, arima, rnn, lstm[/menus] + diff --git a/website/content/custom/_index.md b/website/content/custom/_index.md new file mode 100644 index 00000000000..5dfff15f172 --- /dev/null +++ b/website/content/custom/_index.md @@ -0,0 +1,24 @@ +--- +geekdocCollapseSection: true +--- + +{{< toc-tree >}} + +# Loading in custom data + +There is a directory in root, labeled `custom_imports`. Here there is a sample +csv file titled `test.csv` that is __randomly__ generated data for visualization purposes. + +When loading in the data, we recommend working with time series. The prediction techniques menu +will plot against time data, so not using that may result in undesired outputs. + +## How to load in a time variable + +Note in the sample csv, the first row has the following form `Date,ColNorm,Col2,ColNorm3,ColB`. +The process for loading data into Gamestonk Terminal is that the code loops through all input columns and looks through +for one column that is either `Date`,`Time` or `Timestamp` (not case-sensitive). +If one of these are found, then the dataframe sets this column to be the index. + +If onc of these columns are not found, then the index will just be integers from 0 to the length of your data. + +Once again: __the prediction menu is designed for data with a datetime index__. \ No newline at end of file diff --git a/website/content/custom/info/_index.md b/website/content/custom/info/_index.md new file mode 100644 index 00000000000..b06a1e083b7 --- /dev/null +++ b/website/content/custom/info/_index.md @@ -0,0 +1,28 @@ +``` +usage: info [-h] +``` +Show information of custom data. + +``` +optional arguments: + -h, --help show this help message (default: False) +``` + +Sample Output: +```python + +DatetimeIndex: 732 entries, 2020-01-01 to 2022-01-01 +Data columns (total 4 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 colnorm 732 non-null float64 + 1 col2 732 non-null float64 + 2 colnorm3 732 non-null float64 + 3 colb 732 non-null float64 +dtypes: float64(4) +memory usage: 28.6 KB +None +``` + +This tells us the loaded dataframe, (which there is one saved as a default template as test.csv) +has 4 columns that are all floats (numeric). The index is a date time range from the start of 2020 to the start of 2022. diff --git a/website/content/custom/load/_index.md b/website/content/custom/load/_index.md new file mode 100644 index 00000000000..181240c05b3 --- /dev/null +++ b/website/content/custom/load/_index.md @@ -0,0 +1,11 @@ +``` +usage: load [-f {test.csv}] [-h] +``` +Load custom data set into a dataframe + +``` +optional arguments: + -f {test.csv}, --file {test.csv} + File to load in. (default: test.csv) + -h, --help show this help message (default: False) +``` \ No newline at end of file diff --git a/website/content/custom/plot/_index.md b/website/content/custom/plot/_index.md new file mode 100644 index 00000000000..7f52cc3e1e5 --- /dev/null +++ b/website/content/custom/plot/_index.md @@ -0,0 +1,23 @@ +``` +usage: plot [-y {colnorm,col2,colnorm3,colb}] [-x {colnorm,col2,colnorm3,colb}] [-k {line,scatter,bar,barh,hist,box,kde,area,pie,hexbin}] [-h] [--export {png,jpg,pdf,svg}] +``` +Plot 2 columns of loaded data. + +``` +optional arguments: + -y {colnorm,col2,colnorm3,colb} + Variable to plot along y (default: None) + -x {colnorm,col2,colnorm3,colb}, --vs {colnorm,col2,colnorm3,colb} + Variable along x axis (default: ) + -k {line,scatter,bar,barh,hist,box,kde,area,pie,hexbin}, --kind {line,scatter,bar,barh,hist,box,kde,area,pie,hexbin} + Type of plot for data (default: scatter) + -h, --help show this help message (default: False) + --export {png,jpg,pdf,svg} + Export figure into png, jpg, pdf, svg (default: ) +``` + +Note that when no "-x/--vs" is supplied, the x axis will be the dataframe index. The -x and -y defaults will be the +columns present in your data. In this scenario, the columns loaded are `colnorm,col2,colnorm3,colb` . + +The different kinds of plots can be seen in the `kind` kwarg of the +[pandas plot function](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html) \ No newline at end of file diff --git a/website/content/custom/show/_index.md b/website/content/custom/show/_index.md new file mode 100644 index 00000000000..43abd92bf83 --- /dev/null +++ b/website/content/custom/show/_index.md @@ -0,0 +1,24 @@ +``` +usage: show [-s SORTCOL [SORTCOL ...]] [-a] [-h] [-l LIMIT] +``` +Show loaded dataframe +``` +optional arguments: + -s SORTCOL [SORTCOL ...], --sortcol SORTCOL [SORTCOL ...] + -a, --ascend + -h, --help show this help message (default: False) + -l LIMIT, --limit LIMIT + Number of entries to show in data. (default: 5) +``` + +Sample Output: +``` +2022 Jan 18, 17:53 (✨) /custom/ $ show -l 3 + colnorm col2 colnorm3 colb +date +2020-01-01 0.999953 1.012313 1.008667 0.001203 +2020-01-02 0.983850 1.023421 1.004225 0.004517 +2020-01-03 1.002692 1.019749 1.006244 0.007035 +``` + +This shows the top 3 rows of my custom dataframe. This should primarily be used as a method of debugging that the load worked. \ No newline at end of file diff --git a/website/data/menu/main.yml b/website/data/menu/main.yml index 59c7c9ea0a6..5381b8e4ee9 100755 --- a/website/data/menu/main.yml +++ b/website/data/menu/main.yml @@ -1147,3 +1147,78 @@ main: ref: "/alternative/covid/cases" - name: rates ref: "/alternative/covid/rates" + - name: custom + ref: "/custom" + sub: + - name: load + ref: "/custom/load" + - name: show + ref: "/custom/show" + - name: info + ref: "/custom/info" + - name: plot + ref: "/custom/plot" + - name: quantitative analysis + ref: "/common/quantitative_analysis" + sub: + - name: load + ref: "/common/quantitative_analysis/load" + - name: pick + ref: "/common/quantitative_analysis/pick" + - name: summary + ref: "/common/quantitative_analysis/summary" + - name: normality + ref: "/common/quantitative_analysis/normality" + - name: unitroot + ref: "/common/quantitative_analysis/unitroot" + - name: hist + ref: "/common/quantitative_analysis/hist" + - name: cdf + ref: "/common/quantitative_analysis/cdf" + - name: bw + ref: "/common/quantitative_analysis/bw" + - name: acf + ref: "/common/quantitative_analysis/acf" + - name: qqplot + ref: "/common/quantitative_analysis/qqplot" + - name: rolling + ref: "/common/quantitative_analysis/rolling" + - name: spread + ref: "/common/quantitative_analysis/spread" + - name: quantile + ref: "/common/quantitative_analysis/quantile" + - name: skew + ref: "/common/quantitative_analysis/skew" + - name: kurtosis + ref: "/common/quantitative_analysis/kurtosis" + - name: decompose + ref: "/common/quantitative_analysis/decompose" + - name: cusum + ref: "/common/quantitative_analysis/cusum" + - name: capm + ref: "/common/quantitative_analysis/capm" + - name: data + ref: "/common/quantitative_analysis/data" + - name: line + ref: "/common/quantitative_analysis/line" + - name: prediction techniques + ref: "/common/prediction_techniques" + sub: + - name: ets + ref: "/common/prediction_techniques/ets" + - name: knn + ref: "/common/prediction_techniques/knn" + - name: regression + ref: "/common/prediction_techniques/regression" + - name: arima + ref: "/common/prediction_techniques/arima" + - name: mlp + ref: "/common/prediction_techniques/mlp" + - name: rnn + ref: "/common/prediction_techniques/rnn" + - name: lstm + ref: "/common/prediction_techniques/lstm" + - name: conv1d + ref: "/common/prediction_techniques/conv1d" + - name: mc + ref: "/common/prediction_techniques/mc" \ No newline at end of file