diff --git "a/test.ipynb" "b/test.ipynb" deleted file mode 100644--- "a/test.ipynb" +++ /dev/null @@ -1,4935 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[*********************100%***********************] 40 of 40 completed\n" - ] - } - ], - "source": [ - "import yfinance as yf\n", - "import pandas as pd\n", - "\n", - "# List of 40 example tickers\n", - "tickers = [\n", - " \"AAPL\", \"MSFT\", \"GOOGL\", \"AMZN\", \"META\", \"TSLA\", \"NVDA\", \"JPM\", \"JNJ\", \"V\",\n", - " \"UNH\", \"HD\", \"PG\", \"MA\", \"BAC\", \"PFE\", \"KO\", \"DIS\", \"PEP\", \"INTC\",\n", - " \"NFLX\", \"CSCO\", \"CMCSA\", \"ABT\", \"XOM\", \"T\", \"CVX\", \"MCD\", \"NKE\", \"ADBE\",\n", - " \"WMT\", \"CRM\", \"ORCL\", \"IBM\", \"QCOM\", \"LLY\", \"MRK\", \"BA\", \"TMO\", \"COST\"\n", - "]\n", - "\n", - "# Download 15-minute interval data for the last 60 days (max allowed)\n", - "data = yf.download(tickers, period=\"60d\", interval=\"5m\", auto_adjust=False)[\"Adj Close\"]\n", - "\n", - "# Transpose to have each row as one company’s 15-minute interval time series\n", - "df = pd.DataFrame(data.transpose())\n", - "\n", - "\n", - "# At this point, `df` has:\n", - "# • Index: the 10 tickers\n", - "# • Columns: one column per trading day in the last month\n", - "# • Values: adjusted close price for that ticker on that date\n", - "df.to_csv(\"stocks_data.csv\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
2025-04-29 18:35:00+00:002025-04-29 18:40:00+00:002025-04-29 18:45:00+00:002025-04-29 18:50:00+00:002025-04-29 18:55:00+00:002025-04-29 19:00:00+00:002025-04-29 19:05:00+00:002025-04-29 19:10:00+00:002025-04-29 19:15:00+00:002025-04-29 19:20:00+00:00...2025-06-05 19:25:00+00:002025-06-05 19:30:00+00:002025-06-05 19:35:00+00:002025-06-05 19:40:00+00:002025-06-05 19:45:00+00:002025-06-05 19:50:00+00:002025-06-05 19:55:00+00:002025-06-06 13:30:00+00:002025-06-06 13:35:00+00:002025-06-06 13:40:00+00:00
0211.920105211.804993211.550003211.460007211.300003211.241302211.495605211.509995211.199997211.410004...200.729996200.880005201.210007200.800003200.914993200.380005200.550003205.021698204.977707NaN
1131.119995131.139999130.985001130.970001130.939896130.925003131.035004131.110001131.095001131.119995...133.899994133.899994133.985001134.039993134.104996133.740005133.919998134.529999134.389999NaN
2371.709991371.940002371.690002371.600006371.179993371.304993371.470001371.480011371.500000371.700012...415.299988416.000000416.904999416.554993416.359985414.904999415.200012417.290009417.079987417.500000
3187.830002187.729996187.600006187.520004187.464996187.520004187.679199187.565002187.429993187.625000...208.494995208.506195209.110001208.910004208.964996208.100006207.850006210.779999211.850800212.429993
4182.020004182.229996182.009995181.970001181.880005181.797501182.050003182.139999182.320007182.235001...208.860001209.088303209.705002209.425003209.669998208.934998209.179993209.990005210.395004NaN
540.01499940.00000039.99499939.99000239.96530239.97499839.99499940.02339940.03500040.040001...44.28500044.35500044.43500144.38499844.41500144.36500244.36999944.90499944.935001NaN
633.96500033.92499933.93019933.93420033.92499933.91999833.92499933.91999833.96360033.994999...34.18899934.22499834.28500034.27500234.30500034.17499934.24000234.68999934.65499934.654999
7990.640015989.539978989.715027989.380005988.895386990.369995989.239990988.799988988.580017989.422485...1010.7899781010.6599731012.7199711010.7100221012.5599981009.4400021010.5300291012.3150021011.4199831014.000000
8267.640015267.369202267.394989267.630005267.575012267.779999267.929993267.959991267.730988268.179993...266.265015266.744995267.019989267.070007267.174988266.440002267.100006268.722504268.924988NaN
957.41500157.39500057.37500057.38499857.38990057.39500057.33499957.33499957.30500057.395000...64.61000164.62500064.72499864.72499864.79000164.55000364.65000265.58999665.38999965.443298
10139.585007139.554993139.449997139.485001139.378998139.419998139.580002139.630005139.649994139.625000...136.964996136.990005137.164993137.240005137.210007136.850006136.945007139.449997139.634995NaN
1191.55000391.51499991.47000191.44999791.37999791.37500091.41000491.44000291.40000291.455002...112.285004112.440002112.684998112.680000112.775002112.360001112.514999114.129997113.919998NaN
12160.529907160.429993160.365005160.315002160.059998160.050003160.330002160.419998160.379898160.360001...168.210007168.255005168.869995168.654999168.690002168.169998168.220001171.669998171.525497171.580002
13359.584991359.635010359.195007359.209991359.730011359.890015359.825012359.730011359.609985359.959991...368.829987369.135010369.855011369.660004369.700012368.570007369.350006371.404999370.375000NaN
14239.585007239.581894239.580002239.619995239.504700239.490005239.479996239.649994239.580002239.794998...265.850006266.309998266.920013266.899994267.209991266.540009266.820007268.142487268.236511NaN
1520.59000020.59499920.56500120.55500020.52000020.47020020.50499920.51370020.47500020.469999...19.95500020.02969920.09880120.05500020.08499919.99000019.99000020.36000120.40550020.410000
16156.490005156.434998156.350006156.320007156.065002156.125000156.066193156.160004156.110001156.125000...153.845001153.710007153.800003153.934998153.979996153.470001153.639999155.089996154.930496NaN
17245.190002244.845001244.634995244.537796244.238403244.404495244.669998244.679993244.619995244.910004...261.047485261.350006261.890015261.739990262.024994261.559998261.970001265.095001264.950012NaN
1872.39499772.40000272.36000172.40499972.38999972.40000272.43499872.48000372.45729872.455002...71.00499770.93499871.00499771.02500271.02500270.84999870.94000271.27999971.270203NaN
19891.500000891.059998890.415894890.369995889.929993889.916077889.750000890.099976889.000000889.659973...761.500000762.429993764.650024765.104980765.890015764.120789765.969971768.690002768.664978NaN
20538.905029538.835022538.525024538.315125538.380005538.842590538.760010539.049988539.195007539.688782...583.924988584.419983585.380005585.200012585.320007584.062927585.440002588.650024588.349976NaN
21315.899994315.950012315.465912315.510010315.390015315.730103315.637512315.470001315.299988315.454987...308.454987308.720001309.390015309.579987309.609009308.665009308.970001308.325012308.649994NaN
22556.359924555.941223555.840027555.900024555.025024554.700012554.479980555.000000554.193176555.000000...684.989990686.200012687.695007685.770020686.349976685.010010684.419983697.229980700.359985701.509583
2384.83010184.82000084.78199884.73999884.59999884.70500284.73000384.83499984.80500084.919998...77.55000377.58000277.74500377.83000277.88500277.63999977.65000278.95999978.860001NaN
24394.160004393.859497393.750000393.809998393.484985393.850006393.787415393.935913393.769989394.010010...467.429993467.859985468.959991468.410004468.565002467.350006467.609985469.520294470.404999471.000000
251121.9350591121.7508541120.9649661121.1964111119.5100101119.9300541121.3688961120.9300541120.7999271122.050049...1248.3549801251.7099611254.9250491253.3100591253.5900881250.5749511250.8299561248.1818851247.8900151250.069946
2657.29000157.40990157.45000157.49499957.50000057.48000057.50500157.56000157.56499957.619999...62.41999862.52000062.68000062.68999962.73280062.61000162.63999962.79000162.669998NaN
27109.989998110.054497109.870003109.791000109.565002109.580002109.688904109.699997109.255699109.379997...139.590103140.048996140.350006140.175003140.460007139.990005139.949997141.990005142.125000142.380005
28140.850006140.779999140.729996140.740005140.701996140.779404140.759995140.875000140.681198140.835007...170.584793170.820007171.270004171.169998171.460007170.964996171.199997174.239304173.419998NaN
29133.889999133.850006133.800003133.990005134.044998134.065002134.110001134.130005134.223801134.320007...130.970993130.850006130.975006131.100006131.089996130.955002131.089996130.470001130.429993130.301697
3023.93499923.94440123.93499923.94500023.92499923.94500023.98440024.02170024.00989924.090000...23.11500023.11500023.13500023.15500123.17000023.12000123.11000123.45500023.455000NaN
31161.500000161.660004161.619995161.660004161.660004161.679993161.820007161.929993161.899994161.889999...162.869995162.910004163.220001163.062500162.970001162.542496162.779999164.559998164.494995NaN
32148.220001148.119995147.970001148.115997147.779999147.520004147.679993147.800003147.550003147.729996...147.695007148.000000148.399994148.138000148.300003147.720001147.539993149.725006150.080002150.208405
3327.35479927.33000027.33499927.31500127.31500127.32010127.31500127.31500127.34000027.334999...27.70500027.72500027.77500027.78500027.82500127.76000027.77000027.94000127.905001NaN
34428.820007428.809998429.019989429.614990429.622101429.619995429.940002429.825012429.779999429.911804...398.369995398.579987399.429993399.350006399.640015398.029999398.359985403.609985403.510010NaN
35285.842712285.929993285.815002285.850006285.760010285.904999286.339996286.250000286.035004286.564209...281.750000285.200012286.614990283.140106284.559998284.709991284.731689298.609314298.989990299.092896
36411.345001411.029999411.119995411.170013411.304993411.344788411.605011412.149994412.100006412.114990...294.782990294.915009295.869995295.420013296.375000295.600006295.890015300.200012298.815002NaN
37341.195007341.394989340.850006340.880005340.625000340.785004340.894989340.869995340.875000341.208008...366.557190366.709991367.230011367.165009367.394989366.684998366.825012369.334991368.484985NaN
3895.79989695.82000095.73000395.69999795.67500395.75000095.72499895.75000095.75000095.779999...97.80000397.87500098.00499797.94500098.08999697.80000397.94000298.16500198.260803NaN
39108.184998108.264999108.169998108.199997108.144997108.143700108.379997108.480003108.595001108.561302...101.874001101.924698102.019997102.139999102.110001101.805000101.875000103.430000103.779999NaN
\n", - "

40 rows × 2048 columns

\n", - "
" - ], - "text/plain": [ - " 2025-04-29 18:35:00+00:00 2025-04-29 18:40:00+00:00 \\\n", - "0 211.920105 211.804993 \n", - "1 131.119995 131.139999 \n", - "2 371.709991 371.940002 \n", - "3 187.830002 187.729996 \n", - "4 182.020004 182.229996 \n", - "5 40.014999 40.000000 \n", - "6 33.965000 33.924999 \n", - "7 990.640015 989.539978 \n", - "8 267.640015 267.369202 \n", - "9 57.415001 57.395000 \n", - "10 139.585007 139.554993 \n", - "11 91.550003 91.514999 \n", - "12 160.529907 160.429993 \n", - "13 359.584991 359.635010 \n", - "14 239.585007 239.581894 \n", - "15 20.590000 20.594999 \n", - "16 156.490005 156.434998 \n", - "17 245.190002 244.845001 \n", - "18 72.394997 72.400002 \n", - "19 891.500000 891.059998 \n", - "20 538.905029 538.835022 \n", - "21 315.899994 315.950012 \n", - "22 556.359924 555.941223 \n", - "23 84.830101 84.820000 \n", - "24 394.160004 393.859497 \n", - "25 1121.935059 1121.750854 \n", - "26 57.290001 57.409901 \n", - "27 109.989998 110.054497 \n", - "28 140.850006 140.779999 \n", - "29 133.889999 133.850006 \n", - "30 23.934999 23.944401 \n", - "31 161.500000 161.660004 \n", - "32 148.220001 148.119995 \n", - "33 27.354799 27.330000 \n", - "34 428.820007 428.809998 \n", - "35 285.842712 285.929993 \n", - "36 411.345001 411.029999 \n", - "37 341.195007 341.394989 \n", - "38 95.799896 95.820000 \n", - "39 108.184998 108.264999 \n", - "\n", - " 2025-04-29 18:45:00+00:00 2025-04-29 18:50:00+00:00 \\\n", - "0 211.550003 211.460007 \n", - "1 130.985001 130.970001 \n", - "2 371.690002 371.600006 \n", - "3 187.600006 187.520004 \n", - "4 182.009995 181.970001 \n", - "5 39.994999 39.990002 \n", - "6 33.930199 33.934200 \n", - "7 989.715027 989.380005 \n", - "8 267.394989 267.630005 \n", - "9 57.375000 57.384998 \n", - "10 139.449997 139.485001 \n", - "11 91.470001 91.449997 \n", - "12 160.365005 160.315002 \n", - "13 359.195007 359.209991 \n", - "14 239.580002 239.619995 \n", - "15 20.565001 20.555000 \n", - "16 156.350006 156.320007 \n", - "17 244.634995 244.537796 \n", - "18 72.360001 72.404999 \n", - "19 890.415894 890.369995 \n", - "20 538.525024 538.315125 \n", - "21 315.465912 315.510010 \n", - "22 555.840027 555.900024 \n", - "23 84.781998 84.739998 \n", - "24 393.750000 393.809998 \n", - "25 1120.964966 1121.196411 \n", - "26 57.450001 57.494999 \n", - "27 109.870003 109.791000 \n", - "28 140.729996 140.740005 \n", - "29 133.800003 133.990005 \n", - "30 23.934999 23.945000 \n", - "31 161.619995 161.660004 \n", - "32 147.970001 148.115997 \n", - "33 27.334999 27.315001 \n", - "34 429.019989 429.614990 \n", - "35 285.815002 285.850006 \n", - "36 411.119995 411.170013 \n", - "37 340.850006 340.880005 \n", - "38 95.730003 95.699997 \n", - "39 108.169998 108.199997 \n", - "\n", - " 2025-04-29 18:55:00+00:00 2025-04-29 19:00:00+00:00 \\\n", - "0 211.300003 211.241302 \n", - "1 130.939896 130.925003 \n", - "2 371.179993 371.304993 \n", - "3 187.464996 187.520004 \n", - "4 181.880005 181.797501 \n", - "5 39.965302 39.974998 \n", - "6 33.924999 33.919998 \n", - "7 988.895386 990.369995 \n", - "8 267.575012 267.779999 \n", - "9 57.389900 57.395000 \n", - "10 139.378998 139.419998 \n", - "11 91.379997 91.375000 \n", - "12 160.059998 160.050003 \n", - "13 359.730011 359.890015 \n", - "14 239.504700 239.490005 \n", - "15 20.520000 20.470200 \n", - "16 156.065002 156.125000 \n", - "17 244.238403 244.404495 \n", - "18 72.389999 72.400002 \n", - "19 889.929993 889.916077 \n", - "20 538.380005 538.842590 \n", - "21 315.390015 315.730103 \n", - "22 555.025024 554.700012 \n", - "23 84.599998 84.705002 \n", - "24 393.484985 393.850006 \n", - "25 1119.510010 1119.930054 \n", - "26 57.500000 57.480000 \n", - "27 109.565002 109.580002 \n", - "28 140.701996 140.779404 \n", - "29 134.044998 134.065002 \n", - "30 23.924999 23.945000 \n", - "31 161.660004 161.679993 \n", - "32 147.779999 147.520004 \n", - "33 27.315001 27.320101 \n", - "34 429.622101 429.619995 \n", - "35 285.760010 285.904999 \n", - "36 411.304993 411.344788 \n", - "37 340.625000 340.785004 \n", - "38 95.675003 95.750000 \n", - "39 108.144997 108.143700 \n", - "\n", - " 2025-04-29 19:05:00+00:00 2025-04-29 19:10:00+00:00 \\\n", - "0 211.495605 211.509995 \n", - "1 131.035004 131.110001 \n", - "2 371.470001 371.480011 \n", - "3 187.679199 187.565002 \n", - "4 182.050003 182.139999 \n", - "5 39.994999 40.023399 \n", - "6 33.924999 33.919998 \n", - "7 989.239990 988.799988 \n", - "8 267.929993 267.959991 \n", - "9 57.334999 57.334999 \n", - "10 139.580002 139.630005 \n", - "11 91.410004 91.440002 \n", - "12 160.330002 160.419998 \n", - "13 359.825012 359.730011 \n", - "14 239.479996 239.649994 \n", - "15 20.504999 20.513700 \n", - "16 156.066193 156.160004 \n", - "17 244.669998 244.679993 \n", - "18 72.434998 72.480003 \n", - "19 889.750000 890.099976 \n", - "20 538.760010 539.049988 \n", - "21 315.637512 315.470001 \n", - "22 554.479980 555.000000 \n", - "23 84.730003 84.834999 \n", - "24 393.787415 393.935913 \n", - "25 1121.368896 1120.930054 \n", - "26 57.505001 57.560001 \n", - "27 109.688904 109.699997 \n", - "28 140.759995 140.875000 \n", - "29 134.110001 134.130005 \n", - "30 23.984400 24.021700 \n", - "31 161.820007 161.929993 \n", - "32 147.679993 147.800003 \n", - "33 27.315001 27.315001 \n", - "34 429.940002 429.825012 \n", - "35 286.339996 286.250000 \n", - "36 411.605011 412.149994 \n", - "37 340.894989 340.869995 \n", - "38 95.724998 95.750000 \n", - "39 108.379997 108.480003 \n", - "\n", - " 2025-04-29 19:15:00+00:00 2025-04-29 19:20:00+00:00 ... \\\n", - "0 211.199997 211.410004 ... \n", - "1 131.095001 131.119995 ... \n", - "2 371.500000 371.700012 ... \n", - "3 187.429993 187.625000 ... \n", - "4 182.320007 182.235001 ... \n", - "5 40.035000 40.040001 ... \n", - "6 33.963600 33.994999 ... \n", - "7 988.580017 989.422485 ... \n", - "8 267.730988 268.179993 ... \n", - "9 57.305000 57.395000 ... \n", - "10 139.649994 139.625000 ... \n", - "11 91.400002 91.455002 ... \n", - "12 160.379898 160.360001 ... \n", - "13 359.609985 359.959991 ... \n", - "14 239.580002 239.794998 ... \n", - "15 20.475000 20.469999 ... \n", - "16 156.110001 156.125000 ... \n", - "17 244.619995 244.910004 ... \n", - "18 72.457298 72.455002 ... \n", - "19 889.000000 889.659973 ... \n", - "20 539.195007 539.688782 ... \n", - "21 315.299988 315.454987 ... \n", - "22 554.193176 555.000000 ... \n", - "23 84.805000 84.919998 ... \n", - "24 393.769989 394.010010 ... \n", - "25 1120.799927 1122.050049 ... \n", - "26 57.564999 57.619999 ... \n", - "27 109.255699 109.379997 ... \n", - "28 140.681198 140.835007 ... \n", - "29 134.223801 134.320007 ... \n", - "30 24.009899 24.090000 ... \n", - "31 161.899994 161.889999 ... \n", - "32 147.550003 147.729996 ... \n", - "33 27.340000 27.334999 ... \n", - "34 429.779999 429.911804 ... \n", - "35 286.035004 286.564209 ... \n", - "36 412.100006 412.114990 ... \n", - "37 340.875000 341.208008 ... \n", - "38 95.750000 95.779999 ... \n", - "39 108.595001 108.561302 ... \n", - "\n", - " 2025-06-05 19:25:00+00:00 2025-06-05 19:30:00+00:00 \\\n", - "0 200.729996 200.880005 \n", - "1 133.899994 133.899994 \n", - "2 415.299988 416.000000 \n", - "3 208.494995 208.506195 \n", - "4 208.860001 209.088303 \n", - "5 44.285000 44.355000 \n", - "6 34.188999 34.224998 \n", - "7 1010.789978 1010.659973 \n", - "8 266.265015 266.744995 \n", - "9 64.610001 64.625000 \n", - "10 136.964996 136.990005 \n", - "11 112.285004 112.440002 \n", - "12 168.210007 168.255005 \n", - "13 368.829987 369.135010 \n", - "14 265.850006 266.309998 \n", - "15 19.955000 20.029699 \n", - "16 153.845001 153.710007 \n", - "17 261.047485 261.350006 \n", - "18 71.004997 70.934998 \n", - "19 761.500000 762.429993 \n", - "20 583.924988 584.419983 \n", - "21 308.454987 308.720001 \n", - "22 684.989990 686.200012 \n", - "23 77.550003 77.580002 \n", - "24 467.429993 467.859985 \n", - "25 1248.354980 1251.709961 \n", - "26 62.419998 62.520000 \n", - "27 139.590103 140.048996 \n", - "28 170.584793 170.820007 \n", - "29 130.970993 130.850006 \n", - "30 23.115000 23.115000 \n", - "31 162.869995 162.910004 \n", - "32 147.695007 148.000000 \n", - "33 27.705000 27.725000 \n", - "34 398.369995 398.579987 \n", - "35 281.750000 285.200012 \n", - "36 294.782990 294.915009 \n", - "37 366.557190 366.709991 \n", - "38 97.800003 97.875000 \n", - "39 101.874001 101.924698 \n", - "\n", - " 2025-06-05 19:35:00+00:00 2025-06-05 19:40:00+00:00 \\\n", - "0 201.210007 200.800003 \n", - "1 133.985001 134.039993 \n", - "2 416.904999 416.554993 \n", - "3 209.110001 208.910004 \n", - "4 209.705002 209.425003 \n", - "5 44.435001 44.384998 \n", - "6 34.285000 34.275002 \n", - "7 1012.719971 1010.710022 \n", - "8 267.019989 267.070007 \n", - "9 64.724998 64.724998 \n", - "10 137.164993 137.240005 \n", - "11 112.684998 112.680000 \n", - "12 168.869995 168.654999 \n", - "13 369.855011 369.660004 \n", - "14 266.920013 266.899994 \n", - "15 20.098801 20.055000 \n", - "16 153.800003 153.934998 \n", - "17 261.890015 261.739990 \n", - "18 71.004997 71.025002 \n", - "19 764.650024 765.104980 \n", - "20 585.380005 585.200012 \n", - "21 309.390015 309.579987 \n", - "22 687.695007 685.770020 \n", - "23 77.745003 77.830002 \n", - "24 468.959991 468.410004 \n", - "25 1254.925049 1253.310059 \n", - "26 62.680000 62.689999 \n", - "27 140.350006 140.175003 \n", - "28 171.270004 171.169998 \n", - "29 130.975006 131.100006 \n", - "30 23.135000 23.155001 \n", - "31 163.220001 163.062500 \n", - "32 148.399994 148.138000 \n", - "33 27.775000 27.785000 \n", - "34 399.429993 399.350006 \n", - "35 286.614990 283.140106 \n", - "36 295.869995 295.420013 \n", - "37 367.230011 367.165009 \n", - "38 98.004997 97.945000 \n", - "39 102.019997 102.139999 \n", - "\n", - " 2025-06-05 19:45:00+00:00 2025-06-05 19:50:00+00:00 \\\n", - "0 200.914993 200.380005 \n", - "1 134.104996 133.740005 \n", - "2 416.359985 414.904999 \n", - "3 208.964996 208.100006 \n", - "4 209.669998 208.934998 \n", - "5 44.415001 44.365002 \n", - "6 34.305000 34.174999 \n", - "7 1012.559998 1009.440002 \n", - "8 267.174988 266.440002 \n", - "9 64.790001 64.550003 \n", - "10 137.210007 136.850006 \n", - "11 112.775002 112.360001 \n", - "12 168.690002 168.169998 \n", - "13 369.700012 368.570007 \n", - "14 267.209991 266.540009 \n", - "15 20.084999 19.990000 \n", - "16 153.979996 153.470001 \n", - "17 262.024994 261.559998 \n", - "18 71.025002 70.849998 \n", - "19 765.890015 764.120789 \n", - "20 585.320007 584.062927 \n", - "21 309.609009 308.665009 \n", - "22 686.349976 685.010010 \n", - "23 77.885002 77.639999 \n", - "24 468.565002 467.350006 \n", - "25 1253.590088 1250.574951 \n", - "26 62.732800 62.610001 \n", - "27 140.460007 139.990005 \n", - "28 171.460007 170.964996 \n", - "29 131.089996 130.955002 \n", - "30 23.170000 23.120001 \n", - "31 162.970001 162.542496 \n", - "32 148.300003 147.720001 \n", - "33 27.825001 27.760000 \n", - "34 399.640015 398.029999 \n", - "35 284.559998 284.709991 \n", - "36 296.375000 295.600006 \n", - "37 367.394989 366.684998 \n", - "38 98.089996 97.800003 \n", - "39 102.110001 101.805000 \n", - "\n", - " 2025-06-05 19:55:00+00:00 2025-06-06 13:30:00+00:00 \\\n", - "0 200.550003 205.021698 \n", - "1 133.919998 134.529999 \n", - "2 415.200012 417.290009 \n", - "3 207.850006 210.779999 \n", - "4 209.179993 209.990005 \n", - "5 44.369999 44.904999 \n", - "6 34.240002 34.689999 \n", - "7 1010.530029 1012.315002 \n", - "8 267.100006 268.722504 \n", - "9 64.650002 65.589996 \n", - "10 136.945007 139.449997 \n", - "11 112.514999 114.129997 \n", - "12 168.220001 171.669998 \n", - "13 369.350006 371.404999 \n", - "14 266.820007 268.142487 \n", - "15 19.990000 20.360001 \n", - "16 153.639999 155.089996 \n", - "17 261.970001 265.095001 \n", - "18 70.940002 71.279999 \n", - "19 765.969971 768.690002 \n", - "20 585.440002 588.650024 \n", - "21 308.970001 308.325012 \n", - "22 684.419983 697.229980 \n", - "23 77.650002 78.959999 \n", - "24 467.609985 469.520294 \n", - "25 1250.829956 1248.181885 \n", - "26 62.639999 62.790001 \n", - "27 139.949997 141.990005 \n", - "28 171.199997 174.239304 \n", - "29 131.089996 130.470001 \n", - "30 23.110001 23.455000 \n", - "31 162.779999 164.559998 \n", - "32 147.539993 149.725006 \n", - "33 27.770000 27.940001 \n", - "34 398.359985 403.609985 \n", - "35 284.731689 298.609314 \n", - "36 295.890015 300.200012 \n", - "37 366.825012 369.334991 \n", - "38 97.940002 98.165001 \n", - "39 101.875000 103.430000 \n", - "\n", - " 2025-06-06 13:35:00+00:00 2025-06-06 13:40:00+00:00 \n", - "0 204.977707 NaN \n", - "1 134.389999 NaN \n", - "2 417.079987 417.500000 \n", - "3 211.850800 212.429993 \n", - "4 210.395004 NaN \n", - "5 44.935001 NaN \n", - "6 34.654999 34.654999 \n", - "7 1011.419983 1014.000000 \n", - "8 268.924988 NaN \n", - "9 65.389999 65.443298 \n", - "10 139.634995 NaN \n", - "11 113.919998 NaN \n", - "12 171.525497 171.580002 \n", - "13 370.375000 NaN \n", - "14 268.236511 NaN \n", - "15 20.405500 20.410000 \n", - "16 154.930496 NaN \n", - "17 264.950012 NaN \n", - "18 71.270203 NaN \n", - "19 768.664978 NaN \n", - "20 588.349976 NaN \n", - "21 308.649994 NaN \n", - "22 700.359985 701.509583 \n", - "23 78.860001 NaN \n", - "24 470.404999 471.000000 \n", - "25 1247.890015 1250.069946 \n", - "26 62.669998 NaN \n", - "27 142.125000 142.380005 \n", - "28 173.419998 NaN \n", - "29 130.429993 130.301697 \n", - "30 23.455000 NaN \n", - "31 164.494995 NaN \n", - "32 150.080002 150.208405 \n", - "33 27.905001 NaN \n", - "34 403.510010 NaN \n", - "35 298.989990 299.092896 \n", - "36 298.815002 NaN \n", - "37 368.484985 NaN \n", - "38 98.260803 NaN \n", - "39 103.779999 NaN \n", - "\n", - "[40 rows x 2048 columns]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "df = pd.read_csv(\"data/stocks_data_noindex.csv\")\n", - "\n", - "df.shape\n", - "df.iloc[:,-2048:]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stable version" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import io\n", - "import gradio as gr\n", - "import pandas as pd\n", - "import torch\n", - "import matplotlib.pyplot as plt\n", - "from PIL import Image\n", - "import numpy as np\n", - "\n", - "torch.manual_seed(42)\n", - "output = torch.load(\"stocks_data_forecast.pt\") # (n_timeseries, pred_len, n_quantiles)\n", - "\n", - "def model_forecast(input_data):\n", - " return output\n", - "\n", - "def plot_forecast_image(timeseries, quantile_predictions, timeseries_name):\n", - " \"\"\"Returns a NumPy array of the plotted figure.\"\"\"\n", - " fig, ax = plt.subplots(figsize=(10, 6), dpi=150)\n", - " ax.plot(timeseries, color=\"blue\")\n", - " x_pred = range(len(timeseries) - 1, len(timeseries) - 1 + len(quantile_predictions))\n", - " for i in range(quantile_predictions.shape[1]):\n", - " ax.plot(x_pred, quantile_predictions[:, i], color=f\"C{i}\")\n", - " buf = io.BytesIO()\n", - "\n", - " # Add title\n", - " ax.set_title(f\"Timeseries: {timeseries_name}\")\n", - " # Add labels to the legend (quantiles)\n", - " labels = [f\"Quantile {i+1}\" for i in range(quantile_predictions.shape[1])]\n", - " ax.legend(labels, loc='center left', bbox_to_anchor=(1, 0.5))\n", - " plt.tight_layout(rect=[0, 0, 0.85, 1])\n", - "\n", - " fig.savefig(buf, format=\"png\", bbox_inches=\"tight\")\n", - " plt.close(fig)\n", - " buf.seek(0)\n", - " img = Image.open(buf).convert(\"RGB\")\n", - " return np.array(img) # Return as an H×W×3 array\n", - "\n", - "def display_forecast(file, preset_filename):\n", - " accepted_formats = ['csv', 'xls', 'xlsx', 'parquet']\n", - "\n", - " def load_table(file_path):\n", - " ext = file_path.split('.')[-1].lower()\n", - " if ext == 'csv':\n", - " return pd.read_csv(file_path)\n", - " elif ext in ['xls', 'xlsx']:\n", - " return pd.read_excel(file_path)\n", - " elif ext == 'parquet':\n", - " return pd.read_parquet(file_path)\n", - " else:\n", - " raise ValueError(f\"Unsupported file format '.{ext}'. Acceptable formats: CSV, XLS, XLSX, PARQUET.\")\n", - " \n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return [], \"Please upload a file or select a preset.\"\n", - " df = load_table(preset_filename)\n", - " \n", - " # Check first column for timeseries names\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object:\n", - " if not df.iloc[:, 0].str.isnumeric().all():\n", - " timeseries_names = df.iloc[:, 0].tolist()\n", - " df = df.iloc[:, 1:]\n", - " else:\n", - " timeseries_names = [f\"Series {i}\" for i in range(len(df))]\n", - " else:\n", - " timeseries_names = [f\"Series {i}\" for i in range(len(df))]\n", - "\n", - " _input = torch.tensor(df.values)\n", - " _output = model_forecast(_input)\n", - "\n", - " gallery_images = []\n", - " for i in range(_input.shape[0]):\n", - " img_array = plot_forecast_image(_input[i], _output[i], timeseries_names[i])\n", - " gallery_images.append(img_array)\n", - "\n", - " return gallery_images, \"\"\n", - " except Exception as e:\n", - " return [], f\"Error: {e}. Please upload files in one of the following formats: CSV, XLS, XLSX, PARQUET.\"\n", - "\n", - "\n", - "\n", - "iface = gr.Interface(\n", - " fn=display_forecast,\n", - " inputs=[\n", - " gr.File(label=\"Upload your CSV file (optional)\"),\n", - " gr.Dropdown(\n", - " label=\"Or select a preset CSV file\",\n", - " choices=[\"stocks_data_noindex.csv\", \"stocks_data.csv\"],\n", - " value=\"stocks_data_noindex.csv\"\n", - " )\n", - " ],\n", - " outputs=[\n", - " gr.Gallery(label=\"Forecast Plots (one per row)\"), \n", - " gr.Textbox(label=\"Error Message\")\n", - " ],\n", - " title=\"CSV→Dynamic Forecast Gallery\",\n", - " description=\"Upload a CSV with any number of rows; each row’s forecast becomes one image in a gallery.\",\n", - " allow_flagging=\"never\",\n", - ")\n", - "\n", - "if __name__ == \"__main__\":\n", - " iface.launch()\n", - "\n", - "\n", - "\n", - "# '''\n", - "# 1. Prepared datasets\n", - "# 2. Plots of different quiantilies (different colors)\n", - "# 3. Filters for plots...\n", - "# 4. Different input options\n", - "# 5. README.md in there (in UI) (contact us for fine-tuning)\n", - "# 6. Requirements for dimensions\n", - "# 7. Multivariate data (x_t is vector)\n", - "# 8. LOGO of NX-AI and xLSTM and tirex\n", - "# '''" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Ticker2024-12-042024-12-052024-12-062024-12-092024-12-102024-12-112024-12-122024-12-132024-12-16...2025-05-212025-05-222025-05-232025-05-272025-05-282025-05-292025-05-302025-06-022025-06-032025-06-04
0AAPL242.425201242.455124242.255600246.156204247.173752245.896820247.363297247.532883250.435867...202.089996201.360001195.270004200.210007200.419998199.949997200.850006201.699997203.270004203.150101
1AMZN218.160004220.550003227.029999226.089996225.039993230.259995228.970001227.460007232.929993...201.119995203.100006200.990005206.020004204.720001205.699997205.009995206.649994205.710007207.472000
2GOOGL173.970016172.244003174.309265175.168259184.956985195.175217191.739182189.601639196.433777...168.559998170.869995168.470001172.899994172.360001171.860001171.740005169.029999166.179993167.785004
3JNJ148.006256147.071823146.865265147.150513146.786560144.238968143.845535144.219299141.494659...151.877960151.312805151.639999153.250000152.429993153.580002155.210007155.399994154.419998153.419998
4JPM240.666992242.723633244.582520241.072388240.133057240.795532238.817978237.245850236.889893...261.040009260.670013260.709991265.290009263.489990264.369995264.000000264.660004266.269989265.065002
5META612.740173607.898376622.713257612.530518618.270813631.608154629.721375619.299072623.685120...635.500000636.570007627.059998642.320007643.580017645.049988647.489990670.900024666.849976685.159973
6MSFT435.744720440.924805441.871155444.311768441.632050447.270416447.838196445.556976449.860413...452.570007454.859985450.179993460.690002457.359985458.679993460.359985461.970001462.970001464.190002
7NVDA145.116653145.046661142.426895138.797226135.057587139.297180137.327362134.237656131.987854...131.800003132.830002131.289993135.500000134.809998139.190002135.130005137.380005141.220001141.854996
8TSLA357.929993369.489990389.220001389.790009400.989990424.769989418.100006436.230011463.019989...334.619995341.040009339.339996362.890015356.899994358.429993346.459991342.690002344.269989334.671600
9V308.866455308.049194309.972778307.271790311.338196312.743500313.182037313.690308314.836517...358.299988357.970001353.540009359.299988359.730011362.399994365.190002365.320007365.859985368.179993
\n", - "

10 rows × 125 columns

\n", - "
" - ], - "text/plain": [ - " Ticker 2024-12-04 2024-12-05 2024-12-06 2024-12-09 2024-12-10 \\\n", - "0 AAPL 242.425201 242.455124 242.255600 246.156204 247.173752 \n", - "1 AMZN 218.160004 220.550003 227.029999 226.089996 225.039993 \n", - "2 GOOGL 173.970016 172.244003 174.309265 175.168259 184.956985 \n", - "3 JNJ 148.006256 147.071823 146.865265 147.150513 146.786560 \n", - "4 JPM 240.666992 242.723633 244.582520 241.072388 240.133057 \n", - "5 META 612.740173 607.898376 622.713257 612.530518 618.270813 \n", - "6 MSFT 435.744720 440.924805 441.871155 444.311768 441.632050 \n", - "7 NVDA 145.116653 145.046661 142.426895 138.797226 135.057587 \n", - "8 TSLA 357.929993 369.489990 389.220001 389.790009 400.989990 \n", - "9 V 308.866455 308.049194 309.972778 307.271790 311.338196 \n", - "\n", - " 2024-12-11 2024-12-12 2024-12-13 2024-12-16 ... 2025-05-21 \\\n", - "0 245.896820 247.363297 247.532883 250.435867 ... 202.089996 \n", - "1 230.259995 228.970001 227.460007 232.929993 ... 201.119995 \n", - "2 195.175217 191.739182 189.601639 196.433777 ... 168.559998 \n", - "3 144.238968 143.845535 144.219299 141.494659 ... 151.877960 \n", - "4 240.795532 238.817978 237.245850 236.889893 ... 261.040009 \n", - "5 631.608154 629.721375 619.299072 623.685120 ... 635.500000 \n", - "6 447.270416 447.838196 445.556976 449.860413 ... 452.570007 \n", - "7 139.297180 137.327362 134.237656 131.987854 ... 131.800003 \n", - "8 424.769989 418.100006 436.230011 463.019989 ... 334.619995 \n", - "9 312.743500 313.182037 313.690308 314.836517 ... 358.299988 \n", - "\n", - " 2025-05-22 2025-05-23 2025-05-27 2025-05-28 2025-05-29 2025-05-30 \\\n", - "0 201.360001 195.270004 200.210007 200.419998 199.949997 200.850006 \n", - "1 203.100006 200.990005 206.020004 204.720001 205.699997 205.009995 \n", - "2 170.869995 168.470001 172.899994 172.360001 171.860001 171.740005 \n", - "3 151.312805 151.639999 153.250000 152.429993 153.580002 155.210007 \n", - "4 260.670013 260.709991 265.290009 263.489990 264.369995 264.000000 \n", - "5 636.570007 627.059998 642.320007 643.580017 645.049988 647.489990 \n", - "6 454.859985 450.179993 460.690002 457.359985 458.679993 460.359985 \n", - "7 132.830002 131.289993 135.500000 134.809998 139.190002 135.130005 \n", - "8 341.040009 339.339996 362.890015 356.899994 358.429993 346.459991 \n", - "9 357.970001 353.540009 359.299988 359.730011 362.399994 365.190002 \n", - "\n", - " 2025-06-02 2025-06-03 2025-06-04 \n", - "0 201.699997 203.270004 203.150101 \n", - "1 206.649994 205.710007 207.472000 \n", - "2 169.029999 166.179993 167.785004 \n", - "3 155.399994 154.419998 153.419998 \n", - "4 264.660004 266.269989 265.065002 \n", - "5 670.900024 666.849976 685.159973 \n", - "6 461.970001 462.970001 464.190002 \n", - "7 137.380005 141.220001 141.854996 \n", - "8 342.690002 344.269989 334.671600 \n", - "9 365.320007 365.859985 368.179993 \n", - "\n", - "[10 rows x 125 columns]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.read_csv(\"stocks_data.csv\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Not checked but with labels filter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import io\n", - "import pandas as pd\n", - "import torch\n", - "import matplotlib.pyplot as plt\n", - "from PIL import Image\n", - "import numpy as np\n", - "import gradio as gr\n", - "\n", - "# Set random seed and load your pretrained forecast tensor\n", - "torch.manual_seed(42)\n", - "_forecast_tensor = torch.load(\"stocks_data_forecast.pt\") # shape = (n_series, pred_len, n_q)\n", - "\n", - "def model_forecast(input_data):\n", - " return _forecast_tensor\n", - "\n", - "def plot_forecast_image(timeseries, quantile_predictions, timeseries_name):\n", - " \"\"\"Given one 1D series + quantile‐matrix, return a NumPy array of the plotted figure.\"\"\"\n", - " fig, ax = plt.subplots(figsize=(10, 6), dpi=150)\n", - " ax.plot(timeseries, color=\"blue\")\n", - " x_pred = range(len(timeseries) - 1, len(timeseries) - 1 + len(quantile_predictions))\n", - " for i in range(quantile_predictions.shape[1]):\n", - " ax.plot(x_pred, quantile_predictions[:, i], color=f\"C{i}\")\n", - " ax.set_title(f\"Timeseries: {timeseries_name}\")\n", - "\n", - " labels = [f\"Quantile {i}\" for i in range(quantile_predictions.shape[1])]\n", - " ax.legend(labels, loc=\"center left\", bbox_to_anchor=(1, 0.5))\n", - " plt.tight_layout(rect=[0, 0, 0.85, 1])\n", - "\n", - " buf = io.BytesIO()\n", - " fig.savefig(buf, format=\"png\", bbox_inches=\"tight\")\n", - " plt.close(fig)\n", - " buf.seek(0)\n", - " img = Image.open(buf).convert(\"RGB\")\n", - " return np.array(img)\n", - "\n", - "def load_table(file_path):\n", - " \"\"\"Load CSV / XLS(X) / Parquet by extension, else raise.\"\"\"\n", - " ext = file_path.split(\".\")[-1].lower()\n", - " if ext == \"csv\":\n", - " return pd.read_csv(file_path)\n", - " elif ext in (\"xls\", \"xlsx\"):\n", - " return pd.read_excel(file_path)\n", - " elif ext == \"parquet\":\n", - " return pd.read_parquet(file_path)\n", - " else:\n", - " raise ValueError(\n", - " f\"Unsupported file format '.{ext}'. Accepted: CSV, XLS, XLSX, PARQUET.\"\n", - " )\n", - "\n", - "def extract_names_and_update(file, preset_filename):\n", - " \"\"\"\n", - " Read the table (uploaded or preset), extract timeseries names, and return:\n", - " 1) gr.update for the CheckboxGroup (all names pre‐checked)\n", - " 2) the full list of names to store in state.\n", - " \"\"\"\n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return gr.update(choices=[], value=[]), []\n", - " df = load_table(preset_filename)\n", - "\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object and not df.iloc[:, 0].str.isnumeric().all():\n", - " names = df.iloc[:, 0].tolist()\n", - " else:\n", - " names = [f\"Series {i}\" for i in range(len(df))]\n", - "\n", - " return gr.update(choices=names, value=names), names\n", - " except Exception:\n", - " return gr.update(choices=[], value=[]), []\n", - "\n", - "def filter_names(search_term, all_names):\n", - " \"\"\"\n", - " Filter the full list of names (all_names) by the search_term (case‐insensitive substring).\n", - " Return gr.update with filtered choices and keep checked those that remain in both.\n", - " \"\"\"\n", - " if not all_names:\n", - " return gr.update(choices=[], value=[])\n", - " if not search_term:\n", - " # No search term → show all\n", - " return gr.update(choices=all_names, value=all_names)\n", - " lower = search_term.lower()\n", - " filtered = [n for n in all_names if lower in str(n).lower()]\n", - " return gr.update(choices=filtered, value=filtered)\n", - "\n", - "def check_all(names_list):\n", - " \"\"\"Return an update that checks all names in the checkbox.\"\"\"\n", - " return gr.update(value=names_list)\n", - "\n", - "def uncheck_all(_):\n", - " \"\"\"Return an update that unchecks all names.\"\"\"\n", - " return gr.update(value=[])\n", - "\n", - "def display_filtered_forecast(file, preset_filename, selected_names):\n", - " \"\"\"\n", - " Load the table, filter by selected_names, run forecast, and return:\n", - " - list of images (NumPy arrays) for the gallery\n", - " - error string (empty if OK)\n", - " \"\"\"\n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return [], \"No file selected.\"\n", - " df = load_table(preset_filename)\n", - "\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object and not df.iloc[:, 0].str.isnumeric().all():\n", - " all_names = df.iloc[:, 0].tolist()\n", - " data_only = df.iloc[:, 1:].astype(float)\n", - " else:\n", - " all_names = [f\"Series {i}\" for i in range(len(df))]\n", - " data_only = df.astype(float)\n", - "\n", - " mask = [name in selected_names for name in all_names]\n", - " if not any(mask):\n", - " return [], \"No timeseries chosen to plot.\"\n", - "\n", - " filtered_data = data_only.iloc[mask, :].values\n", - " filtered_names = [all_names[i] for i, m in enumerate(mask) if m]\n", - "\n", - " inp = torch.tensor(filtered_data) # (n_chosen, length)\n", - " out = model_forecast(inp) # (n_chosen, pred_len, n_q)\n", - "\n", - " gallery_images = []\n", - " for i in range(inp.shape[0]):\n", - " gallery_images.append(\n", - " plot_forecast_image(inp[i], out[i], filtered_names[i])\n", - " )\n", - "\n", - " return gallery_images, \"\"\n", - " except Exception as e:\n", - " return [], f\"Error: {e}. Please upload a valid CSV, XLS, XLSX, or PARQUET file.\"\n", - "\n", - "with gr.Blocks() as demo:\n", - " gr.Markdown(\"## Upload or select a preset → search/filter by name → click Plot\")\n", - "\n", - " with gr.Row():\n", - " file_input = gr.File(\n", - " label=\"Upload CSV/XLSX/PARQUET (optional)\",\n", - " file_types=[\".csv\", \".xls\", \".xlsx\", \".parquet\"]\n", - " )\n", - " preset_dropdown = gr.Dropdown(\n", - " label=\"Or pick a preset:\",\n", - " choices=[\"stocks_data_noindex.csv\", \"stocks_data.csv\"],\n", - " value=\"stocks_data_noindex.csv\"\n", - " )\n", - "\n", - " # A text box to type a substring (search term)\n", - " search_box = gr.Textbox(\n", - " label=\"Search/Filter timeseries by name\",\n", - " placeholder=\"Type to filter (e.g. 'AMZN')\",\n", - " value=\"\"\n", - " )\n", - "\n", - " # A CheckboxGroup to show matching names; choices/value will be updated dynamically\n", - " filter_checkbox = gr.CheckboxGroup(\n", - " choices=[], value=[], label=\"Select which timeseries to show\"\n", - " )\n", - "\n", - " # Buttons to check or uncheck all\n", - " with gr.Row():\n", - " check_all_btn = gr.Button(\"Check All\")\n", - " uncheck_all_btn = gr.Button(\"Uncheck All\")\n", - "\n", - " plot_button = gr.Button(\"Plot\")\n", - "\n", - " gallery = gr.Gallery(label=\"Forecast Plots (filtered)\")\n", - " errbox = gr.Textbox(label=\"Error Message\")\n", - "\n", - " # State to hold the full list of names\n", - " names_state = gr.State([])\n", - "\n", - " # 1) When file or preset changes, extract full names and update the checkbox + state\n", - " file_input.change(\n", - " fn=extract_names_and_update,\n", - " inputs=[file_input, preset_dropdown],\n", - " outputs=[filter_checkbox, names_state]\n", - " )\n", - " preset_dropdown.change(\n", - " fn=extract_names_and_update,\n", - " inputs=[file_input, preset_dropdown],\n", - " outputs=[filter_checkbox, names_state]\n", - " )\n", - "\n", - " # 2) When search text changes, filter names_state and update the checkbox\n", - " search_box.change(\n", - " fn=filter_names,\n", - " inputs=[search_box, names_state],\n", - " outputs=filter_checkbox\n", - " )\n", - "\n", - " # 3) Check All button: set checkbox value to all names in state\n", - " check_all_btn.click(\n", - " fn=check_all,\n", - " inputs=names_state,\n", - " outputs=filter_checkbox\n", - " )\n", - "\n", - " # 4) Uncheck All button: set checkbox value to empty list\n", - " uncheck_all_btn.click(\n", - " fn=uncheck_all,\n", - " inputs=names_state,\n", - " outputs=filter_checkbox\n", - " )\n", - "\n", - " # 5) When \"Plot\" is clicked, generate the filtered plots\n", - " plot_button.click(\n", - " fn=display_filtered_forecast,\n", - " inputs=[file_input, preset_dropdown, filter_checkbox],\n", - " outputs=[gallery, errbox],\n", - " )\n", - "\n", - "demo.launch()\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Checked, filter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import io\n", - "import pandas as pd\n", - "import torch\n", - "import matplotlib.pyplot as plt\n", - "from PIL import Image\n", - "import numpy as np\n", - "import gradio as gr\n", - "\n", - "# ----------------------------\n", - "# Helper functions (logic unchanged)\n", - "# ----------------------------\n", - "\n", - "torch.manual_seed(42)\n", - "_forecast_tensor = torch.load(\"stocks_data_forecast.pt\") # shape = (n_series, pred_len, n_q)\n", - "\n", - "def model_forecast(input_data):\n", - " return _forecast_tensor\n", - "\n", - "def plot_forecast_image(timeseries, quantile_predictions, timeseries_name):\n", - " fig, ax = plt.subplots(figsize=(10, 6), dpi=150)\n", - " ax.plot(timeseries, color=\"blue\")\n", - " x_pred = range(len(timeseries) - 1, len(timeseries) - 1 + len(quantile_predictions))\n", - " for i in range(quantile_predictions.shape[1]):\n", - " ax.plot(x_pred, quantile_predictions[:, i], color=f\"C{i}\")\n", - " ax.set_title(f\"Timeseries: {timeseries_name}\")\n", - " labels = [f\"Quantile {i}\" for i in range(quantile_predictions.shape[1])]\n", - " ax.legend(labels, loc=\"center left\", bbox_to_anchor=(1, 0.5))\n", - " plt.tight_layout(rect=[0, 0, 0.85, 1])\n", - " buf = io.BytesIO()\n", - " fig.savefig(buf, format=\"png\", bbox_inches=\"tight\")\n", - " plt.close(fig)\n", - " buf.seek(0)\n", - " img = Image.open(buf).convert(\"RGB\")\n", - " return np.array(img)\n", - "\n", - "def load_table(file_path):\n", - " ext = file_path.split(\".\")[-1].lower()\n", - " if ext == \"csv\":\n", - " return pd.read_csv(file_path)\n", - " elif ext in (\"xls\", \"xlsx\"):\n", - " return pd.read_excel(file_path)\n", - " elif ext == \"parquet\":\n", - " return pd.read_parquet(file_path)\n", - " else:\n", - " raise ValueError(\"Unsupported format. Use CSV, XLS, XLSX, or PARQUET.\")\n", - "\n", - "def extract_names_and_update(file, preset_filename):\n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return gr.update(choices=[], value=[]), []\n", - " df = load_table(preset_filename)\n", - "\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object and not df.iloc[:, 0].str.isnumeric().all():\n", - " names = df.iloc[:, 0].tolist()\n", - " else:\n", - " names = [f\"Series {i}\" for i in range(len(df))]\n", - " return gr.update(choices=names, value=names), names\n", - " except Exception:\n", - " return gr.update(choices=[], value=[]), []\n", - "\n", - "def filter_names(search_term, all_names):\n", - " if not all_names:\n", - " return gr.update(choices=[], value=[])\n", - " if not search_term:\n", - " return gr.update(choices=all_names, value=all_names)\n", - " lower = search_term.lower()\n", - " filtered = [n for n in all_names if lower in str(n).lower()]\n", - " return gr.update(choices=filtered, value=filtered)\n", - "\n", - "def check_all(names_list):\n", - " return gr.update(value=names_list)\n", - "\n", - "def uncheck_all(_):\n", - " return gr.update(value=[])\n", - "\n", - "def display_filtered_forecast(file, preset_filename, selected_names):\n", - " \"\"\"\n", - " Load the table, filter by selected_names, run forecast (correctly sliced),\n", - " and return a gallery + error string.\n", - " \"\"\"\n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return [], \"No file selected.\"\n", - " df = load_table(preset_filename)\n", - "\n", - " # Extract all_names and numeric data\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object \\\n", - " and not df.iloc[:, 0].str.isnumeric().all():\n", - " all_names = df.iloc[:, 0].tolist()\n", - " data_only = df.iloc[:, 1:].astype(float)\n", - " else:\n", - " all_names = [f\"Series {i}\" for i in range(len(df))]\n", - " data_only = df.astype(float)\n", - "\n", - " # Build mask and filtered subset\n", - " mask = [name in selected_names for name in all_names]\n", - " if not any(mask):\n", - " return [], \"No timeseries chosen to plot.\"\n", - "\n", - " filtered_data = data_only.iloc[mask, :].values\n", - " filtered_names = [all_names[i] for i, m in enumerate(mask) if m]\n", - "\n", - " # ------------------------\n", - " # HERE is the only change:\n", - " # Instead of calling model_forecast(inp), slice the full tensor by mask:\n", - " # ------------------------\n", - " out = _forecast_tensor[mask] # shape = (n_chosen, pred_len, n_q)\n", - " inp = torch.tensor(filtered_data)\n", - "\n", - " # Plot each chosen series against its properly‐aligned forecast\n", - " gallery_images = []\n", - " for i in range(inp.shape[0]):\n", - " gallery_images.append(\n", - " plot_forecast_image(inp[i], out[i], filtered_names[i])\n", - " )\n", - "\n", - " return gallery_images, \"\"\n", - " except Exception as e:\n", - " return [], f\"Error: {e}. Please upload a valid CSV, XLS, XLSX, or PARQUET file.\"\n", - "\n", - "\n", - "# ----------------------------\n", - "# Gradio layout: two columns\n", - "# ----------------------------\n", - "\n", - "with gr.Blocks() as demo:\n", - " gr.Markdown(\"# 📈 Stock Forecast Viewer 📊\")\n", - " gr.Markdown(\"Upload data or choose a preset, filter by name, then click Plot.\")\n", - "\n", - " with gr.Row():\n", - " # Left column: controls\n", - " with gr.Column():\n", - " gr.Markdown(\"## Data Selection\")\n", - " file_input = gr.File(\n", - " label=\"Upload CSV / XLSX / PARQUET\",\n", - " file_types=[\".csv\", \".xls\", \".xlsx\", \".parquet\"]\n", - " )\n", - " preset_dropdown = gr.Dropdown(\n", - " label=\"Or choose a preset:\",\n", - " choices=[\"stocks_data_noindex.csv\", \"stocks_data.csv\"],\n", - " value=\"stocks_data_noindex.csv\"\n", - " )\n", - "\n", - " gr.Markdown(\"## Search / Filter\")\n", - " search_box = gr.Textbox(\n", - " placeholder=\"Type to filter (e.g. 'AMZN')\"\n", - " )\n", - " filter_checkbox = gr.CheckboxGroup(\n", - " choices=[], value=[], label=\"Select which timeseries to show\"\n", - " )\n", - "\n", - " with gr.Row():\n", - " check_all_btn = gr.Button(\"✅ Check All\")\n", - " uncheck_all_btn = gr.Button(\"❎ Uncheck All\")\n", - "\n", - " plot_button = gr.Button(\"▶️ Plot Forecasts\")\n", - " errbox = gr.Textbox(interactive=False, placeholder=\"\")\n", - "\n", - " # Right column: gallery\n", - " with gr.Column():\n", - " gr.Markdown(\"## Forecast Gallery\")\n", - " gallery = gr.Gallery()\n", - "\n", - " names_state = gr.State([])\n", - "\n", - " # When file or preset changes, update names\n", - " file_input.change(\n", - " fn=extract_names_and_update,\n", - " inputs=[file_input, preset_dropdown],\n", - " outputs=[filter_checkbox, names_state]\n", - " )\n", - " preset_dropdown.change(\n", - " fn=extract_names_and_update,\n", - " inputs=[file_input, preset_dropdown],\n", - " outputs=[filter_checkbox, names_state]\n", - " )\n", - "\n", - " # When search term changes, filter names\n", - " search_box.change(\n", - " fn=filter_names,\n", - " inputs=[search_box, names_state],\n", - " outputs=filter_checkbox\n", - " )\n", - "\n", - " # Check All / Uncheck All\n", - " check_all_btn.click(fn=check_all, inputs=names_state, outputs=filter_checkbox)\n", - " uncheck_all_btn.click(fn=uncheck_all, inputs=names_state, outputs=filter_checkbox)\n", - "\n", - " # Plot button\n", - " plot_button.click(\n", - " fn=display_filtered_forecast,\n", - " inputs=[file_input, preset_dropdown, filter_checkbox],\n", - " outputs=[gallery, errbox]\n", - " )\n", - "\n", - "demo.launch()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Checked, almost ideal" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import io\n", - "import pandas as pd\n", - "import torch\n", - "import matplotlib.pyplot as plt\n", - "from PIL import Image\n", - "import numpy as np\n", - "import gradio as gr\n", - "\n", - "# ----------------------------\n", - "# Helper functions (logic unchanged)\n", - "# ----------------------------\n", - "\n", - "torch.manual_seed(42)\n", - "_forecast_tensor = torch.load(\"stocks_data_forecast.pt\") # shape = (n_series, pred_len, n_q)\n", - "\n", - "def model_forecast(input_data):\n", - " return _forecast_tensor\n", - "\n", - "def plot_forecast_image(timeseries, quantile_predictions, timeseries_name):\n", - " fig, ax = plt.subplots(figsize=(10, 6), dpi=150)\n", - " ax.plot(timeseries, color=\"blue\")\n", - " x_pred = range(len(timeseries) - 1, len(timeseries) - 1 + len(quantile_predictions))\n", - " for i in range(quantile_predictions.shape[1]):\n", - " ax.plot(x_pred, quantile_predictions[:, i], color=f\"C{i}\")\n", - " ax.set_title(f\"Timeseries: {timeseries_name}\")\n", - " labels = [f\"Quantile {i}\" for i in range(quantile_predictions.shape[1])]\n", - " ax.legend(labels, loc=\"center left\", bbox_to_anchor=(1, 0.5))\n", - " plt.tight_layout(rect=[0, 0, 0.85, 1])\n", - " buf = io.BytesIO()\n", - " fig.savefig(buf, format=\"png\", bbox_inches=\"tight\")\n", - " plt.close(fig)\n", - " buf.seek(0)\n", - " img = Image.open(buf).convert(\"RGB\")\n", - " return np.array(img)\n", - "\n", - "def load_table(file_path):\n", - " ext = file_path.split(\".\")[-1].lower()\n", - " if ext == \"csv\":\n", - " return pd.read_csv(file_path)\n", - " elif ext in (\"xls\", \"xlsx\"):\n", - " return pd.read_excel(file_path)\n", - " elif ext == \"parquet\":\n", - " return pd.read_parquet(file_path)\n", - " else:\n", - " raise ValueError(\"Unsupported format. Use CSV, XLS, XLSX, or PARQUET.\")\n", - "\n", - "def extract_names_and_update(file, preset_filename):\n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return gr.update(choices=[], value=[]), []\n", - " df = load_table(preset_filename)\n", - "\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object and not df.iloc[:, 0].str.isnumeric().all():\n", - " names = df.iloc[:, 0].tolist()\n", - " else:\n", - " names = [f\"Series {i}\" for i in range(len(df))]\n", - " return gr.update(choices=names, value=names), names\n", - " except Exception:\n", - " return gr.update(choices=[], value=[]), []\n", - "\n", - "def filter_names(search_term, all_names):\n", - " if not all_names:\n", - " return gr.update(choices=[], value=[])\n", - " if not search_term:\n", - " return gr.update(choices=all_names, value=all_names)\n", - " lower = search_term.lower()\n", - " filtered = [n for n in all_names if lower in str(n).lower()]\n", - " return gr.update(choices=filtered, value=filtered)\n", - "\n", - "def check_all(names_list):\n", - " return gr.update(value=names_list)\n", - "\n", - "def uncheck_all(_):\n", - " return gr.update(value=[])\n", - "\n", - "def display_filtered_forecast(file, preset_filename, selected_names):\n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return [], \"No file selected.\"\n", - " df = load_table(preset_filename)\n", - "\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object and not df.iloc[:, 0].str.isnumeric().all():\n", - " all_names = df.iloc[:, 0].tolist()\n", - " data_only = df.iloc[:, 1:].astype(float)\n", - " else:\n", - " all_names = [f\"Series {i}\" for i in range(len(df))]\n", - " data_only = df.astype(float)\n", - "\n", - " mask = [name in selected_names for name in all_names]\n", - " if not any(mask):\n", - " return [], \"No timeseries chosen to plot.\"\n", - "\n", - " filtered_data = data_only.iloc[mask, :].values\n", - " filtered_names = [all_names[i] for i, m in enumerate(mask) if m]\n", - " out = _forecast_tensor[mask] # slice forecasts to match filtered rows\n", - " inp = torch.tensor(filtered_data)\n", - "\n", - " gallery_images = []\n", - " for i in range(inp.shape[0]):\n", - " gallery_images.append(plot_forecast_image(inp[i], out[i], filtered_names[i]))\n", - "\n", - " return gallery_images, \"\"\n", - " except Exception as e:\n", - " return [], f\"Error: {e}. Use CSV, XLS, XLSX, or PARQUET.\"\n", - "\n", - "# ----------------------------\n", - "# Gradio layout: two columns + instructions\n", - "# ----------------------------\n", - "\n", - "with gr.Blocks() as demo:\n", - " gr.Markdown(\"# 📈 Stock Forecast Viewer 📊\")\n", - " gr.Markdown(\"Upload data or choose a preset, filter by name, then click Plot.\")\n", - "\n", - " with gr.Row():\n", - " # Left column: controls\n", - " with gr.Column():\n", - " gr.Markdown(\"## Data Selection\")\n", - " file_input = gr.File(\n", - " label=\"Upload CSV / XLSX / PARQUET\",\n", - " file_types=[\".csv\", \".xls\", \".xlsx\", \".parquet\"]\n", - " )\n", - " preset_dropdown = gr.Dropdown(\n", - " label=\"Or choose a preset:\",\n", - " choices=[\"stocks_data_noindex.csv\", \"stocks_data.csv\"],\n", - " value=\"stocks_data_noindex.csv\"\n", - " )\n", - "\n", - " gr.Markdown(\"## Search / Filter\")\n", - " search_box = gr.Textbox(placeholder=\"Type to filter (e.g. 'AMZN')\")\n", - " filter_checkbox = gr.CheckboxGroup(\n", - " choices=[], value=[], label=\"Select which timeseries to show\"\n", - " )\n", - "\n", - " with gr.Row():\n", - " check_all_btn = gr.Button(\"✅ Check All\")\n", - " uncheck_all_btn = gr.Button(\"❎ Uncheck All\")\n", - "\n", - " plot_button = gr.Button(\"▶️ Plot Forecasts\")\n", - " errbox = gr.Textbox(interactive=False, placeholder=\"\")\n", - "\n", - " # Right column: gallery + instructions\n", - " with gr.Column():\n", - " gr.Markdown(\"## Forecast Gallery\")\n", - " gallery = gr.Gallery()\n", - "\n", - " # Instruction text below gallery\n", - " gr.Markdown(\n", - " \"\"\"\n", - " **How to format your data:**\n", - " - Your file must be a table (CSV, XLS, XLSX, or Parquet).\n", - " - If you haven't prepared the data, the preset file will be used.\n", - " - **One row per timeseries.** Each row is treated as a separate series.\n", - " - If you want to **name** each series, put the name as the first value in **every** row:\n", - " - Example (CSV): \n", - " `AAPL, 120.5, 121.0, 119.8, ...` \n", - " `AMZN, 3300.0, 3310.5, 3295.2, ...` \n", - " - In that case, the first column is not numeric, so it will be used as the series name.\n", - " - If you do **not** want named series, simply leave out the first column entirely and have all values numeric:\n", - " - Example: \n", - " `120.5, 121.0, 119.8, ...` \n", - " `3300.0, 3310.5, 3295.2, ...` \n", - " - Then every row will be auto-named “Series 0, Series 1, …” in order.\n", - " - **Consistency rule:** Either all rows have a non-numeric first entry for the name, or none do. Do not mix.\n", - " - The rest of the columns (after the optional name) must be numeric data points for that series.\n", - " - You can filter by typing in the search box. Then check or uncheck individual names before plotting.\n", - " - Use “Check All” / “Uncheck All” to quickly select or deselect every series.\n", - " - Finally, click **Plot Forecasts** to view the quantile forecast for each selected series.\n", - " \"\"\"\n", - " )\n", - "\n", - " names_state = gr.State([])\n", - "\n", - " # When file or preset changes, update names\n", - " file_input.change(\n", - " fn=extract_names_and_update,\n", - " inputs=[file_input, preset_dropdown],\n", - " outputs=[filter_checkbox, names_state]\n", - " )\n", - " preset_dropdown.change(\n", - " fn=extract_names_and_update,\n", - " inputs=[file_input, preset_dropdown],\n", - " outputs=[filter_checkbox, names_state]\n", - " )\n", - "\n", - " # When search term changes, filter names\n", - " search_box.change(\n", - " fn=filter_names,\n", - " inputs=[search_box, names_state],\n", - " outputs=filter_checkbox\n", - " )\n", - "\n", - " # Check All / Uncheck All\n", - " check_all_btn.click(fn=check_all, inputs=names_state, outputs=filter_checkbox)\n", - " uncheck_all_btn.click(fn=uncheck_all, inputs=names_state, outputs=filter_checkbox)\n", - "\n", - " # Plot button\n", - " plot_button.click(\n", - " fn=display_filtered_forecast,\n", - " inputs=[file_input, preset_dropdown, filter_checkbox],\n", - " outputs=[gallery, errbox]\n", - " )\n", - "\n", - "demo.launch()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# The default choice isn't processed when the default choice is chosen" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import io\n", - "import pandas as pd\n", - "import torch\n", - "import matplotlib.pyplot as plt\n", - "from PIL import Image\n", - "import numpy as np\n", - "import gradio as gr\n", - "\n", - "# ----------------------------\n", - "# Helper functions (logic unchanged)\n", - "# ----------------------------\n", - "\n", - "torch.manual_seed(42)\n", - "_forecast_tensor = torch.load(\"stocks_data_forecast.pt\") # shape = (n_series, pred_len, n_q)\n", - "\n", - "def model_forecast(input_data):\n", - " return _forecast_tensor\n", - "\n", - "def plot_forecast_image(timeseries, quantile_predictions, timeseries_name):\n", - " fig, ax = plt.subplots(figsize=(10, 6), dpi=150)\n", - " ax.plot(timeseries, color=\"blue\")\n", - " x_pred = range(len(timeseries) - 1, len(timeseries) - 1 + len(quantile_predictions))\n", - " for i in range(quantile_predictions.shape[1]):\n", - " ax.plot(x_pred, quantile_predictions[:, i], color=f\"C{i}\")\n", - " ax.set_title(f\"Timeseries: {timeseries_name}\")\n", - " labels = [f\"Quantile {i}\" for i in range(quantile_predictions.shape[1])]\n", - " ax.legend(labels, loc=\"center left\", bbox_to_anchor=(1, 0.5))\n", - " plt.tight_layout(rect=[0, 0, 0.85, 1])\n", - " buf = io.BytesIO()\n", - " fig.savefig(buf, format=\"png\", bbox_inches=\"tight\")\n", - " plt.close(fig)\n", - " buf.seek(0)\n", - " img = Image.open(buf).convert(\"RGB\")\n", - " return np.array(img)\n", - "\n", - "def load_table(file_path):\n", - " ext = file_path.split(\".\")[-1].lower()\n", - " if ext == \"csv\":\n", - " return pd.read_csv(file_path)\n", - " elif ext in (\"xls\", \"xlsx\"):\n", - " return pd.read_excel(file_path)\n", - " elif ext == \"parquet\":\n", - " return pd.read_parquet(file_path)\n", - " else:\n", - " raise ValueError(\"Unsupported format. Use CSV, XLS, XLSX, or PARQUET.\")\n", - "\n", - "def extract_names_and_update(file, preset_filename):\n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return gr.update(choices=[], value=[]), []\n", - " df = load_table(preset_filename)\n", - "\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object and not df.iloc[:, 0].str.isnumeric().all():\n", - " names = df.iloc[:, 0].tolist()\n", - " else:\n", - " names = [f\"Series {i}\" for i in range(len(df))]\n", - " return gr.update(choices=names, value=names), names\n", - " except Exception:\n", - " return gr.update(choices=[], value=[]), []\n", - "\n", - "def filter_names(search_term, all_names):\n", - " if not all_names:\n", - " return gr.update(choices=[], value=[])\n", - " if not search_term:\n", - " return gr.update(choices=all_names, value=all_names)\n", - " lower = search_term.lower()\n", - " filtered = [n for n in all_names if lower in str(n).lower()]\n", - " return gr.update(choices=filtered, value=filtered)\n", - "\n", - "def check_all(names_list):\n", - " return gr.update(value=names_list)\n", - "\n", - "def uncheck_all(_):\n", - " return gr.update(value=[])\n", - "\n", - "def display_filtered_forecast(file, preset_filename, selected_names):\n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return [], \"No file selected.\"\n", - " df = load_table(preset_filename)\n", - "\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object and not df.iloc[:, 0].str.isnumeric().all():\n", - " all_names = df.iloc[:, 0].tolist()\n", - " data_only = df.iloc[:, 1:].astype(float)\n", - " else:\n", - " all_names = [f\"Series {i}\" for i in range(len(df))]\n", - " data_only = df.astype(float)\n", - "\n", - " mask = [name in selected_names for name in all_names]\n", - " if not any(mask):\n", - " return [], \"No timeseries chosen to plot.\"\n", - "\n", - " filtered_data = data_only.iloc[mask, :].values\n", - " filtered_names = [all_names[i] for i, m in enumerate(mask) if m]\n", - " out = _forecast_tensor[mask] # slice forecasts to match filtered rows\n", - " inp = torch.tensor(filtered_data)\n", - "\n", - " gallery_images = []\n", - " for i in range(inp.shape[0]):\n", - " gallery_images.append(plot_forecast_image(inp[i], out[i], filtered_names[i]))\n", - "\n", - " return gallery_images, \"\"\n", - " except Exception as e:\n", - " return [], f\"Error: {e}. Use CSV, XLS, XLSX, or PARQUET.\"\n", - "\n", - "\n", - "# ----------------------------\n", - "# Gradio layout: two columns + instructions\n", - "# ----------------------------\n", - "\n", - "with gr.Blocks() as demo:\n", - " gr.Markdown(\"# 📈 Stock Forecast Viewer 📊\")\n", - " gr.Markdown(\"Upload data or choose a preset, filter by name, then click Plot.\")\n", - "\n", - " with gr.Row():\n", - " # Left column: controls\n", - " with gr.Column():\n", - " gr.Markdown(\"## Data Selection\")\n", - " gr.Markdown(\"*If you haven't prepared the data, the preset file will be used.*\")\n", - " file_input = gr.File(\n", - " label=\"Upload CSV / XLSX / PARQUET\",\n", - " file_types=[\".csv\", \".xls\", \".xlsx\", \".parquet\"]\n", - " )\n", - " preset_dropdown = gr.Dropdown(\n", - " label=\"Or choose a preset:\",\n", - " choices=[\"stocks_data_noindex.csv\", \"stocks_data.csv\"],\n", - " value=\"stocks_data_noindex.csv\"\n", - " )\n", - "\n", - " gr.Markdown(\"## Search / Filter\")\n", - " search_box = gr.Textbox(placeholder=\"Type to filter (e.g. 'AMZN')\")\n", - " filter_checkbox = gr.CheckboxGroup(\n", - " choices=[], value=[], label=\"Select which timeseries to show\"\n", - " )\n", - "\n", - " with gr.Row():\n", - " check_all_btn = gr.Button(\"✅ Check All\")\n", - " uncheck_all_btn = gr.Button(\"❎ Uncheck All\")\n", - "\n", - " plot_button = gr.Button(\"▶️ Plot Forecasts\")\n", - " errbox = gr.Textbox(label=\"Error Message\", interactive=False)\n", - "\n", - " # Right column: gallery + instructions\n", - " with gr.Column():\n", - " gr.Markdown(\"## Forecast Gallery\")\n", - " gallery = gr.Gallery()\n", - "\n", - " # Instruction text below gallery\n", - " gr.Markdown(\n", - " \"\"\"\n", - " **How to format your data:**\n", - " - Your file must be a table (CSV, XLS, XLSX, or Parquet).\n", - " - **One row per timeseries.** Each row is treated as a separate series.\n", - " - If you want to **name** each series, put the name as the first value in **every** row:\n", - " - Example (CSV): \n", - " `AAPL, 120.5, 121.0, 119.8, ...` \n", - " `AMZN, 3300.0, 3310.5, 3295.2, ...` \n", - " - In that case, the first column is not numeric, so it will be used as the series name.\n", - " - If you do **not** want named series, simply leave out the first column entirely and have all values numeric:\n", - " - Example: \n", - " `120.5, 121.0, 119.8, ...` \n", - " `3300.0, 3310.5, 3295.2, ...` \n", - " - Then every row will be auto-named “Series 0, Series 1, …” in order.\n", - " - **Consistency rule:** Either all rows have a non-numeric first entry for the name, or none do. Do not mix.\n", - " - The rest of the columns (after the optional name) must be numeric data points for that series.\n", - " - You can filter by typing in the search box. Then check or uncheck individual names before plotting.\n", - " - Use “Check All” / “Uncheck All” to quickly select or deselect every series.\n", - " - Finally, click **Plot Forecasts** to view the quantile forecast for each selected series.\n", - " \"\"\"\n", - " )\n", - "\n", - " names_state = gr.State([])\n", - "\n", - " # When file or preset changes, update names\n", - " file_input.change(\n", - " fn=extract_names_and_update,\n", - " inputs=[file_input, preset_dropdown],\n", - " outputs=[filter_checkbox, names_state]\n", - " )\n", - " preset_dropdown.change(\n", - " fn=extract_names_and_update,\n", - " inputs=[file_input, preset_dropdown],\n", - " outputs=[filter_checkbox, names_state]\n", - " )\n", - "\n", - " # When search term changes, filter names\n", - " search_box.change(\n", - " fn=filter_names,\n", - " inputs=[search_box, names_state],\n", - " outputs=filter_checkbox\n", - " )\n", - "\n", - " # Check All / Uncheck All\n", - " check_all_btn.click(fn=check_all, inputs=names_state, outputs=filter_checkbox)\n", - " uncheck_all_btn.click(fn=uncheck_all, inputs=names_state, outputs=filter_checkbox)\n", - "\n", - " # Plot button\n", - " plot_button.click(\n", - " fn=display_filtered_forecast,\n", - " inputs=[file_input, preset_dropdown, filter_checkbox],\n", - " outputs=[gallery, errbox]\n", - " )\n", - "\n", - "demo.launch()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Default choice - None" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import io\n", - "import pandas as pd\n", - "import torch\n", - "import matplotlib.pyplot as plt\n", - "from PIL import Image\n", - "import numpy as np\n", - "import gradio as gr\n", - "\n", - "# ----------------------------\n", - "# Helper functions (logic unchanged)\n", - "# ----------------------------\n", - "\n", - "torch.manual_seed(42)\n", - "_forecast_tensor = torch.load(\"stocks_data_forecast.pt\") # shape = (n_series, pred_len, n_q)\n", - "\n", - "def model_forecast(input_data):\n", - " return _forecast_tensor\n", - "\n", - "def plot_forecast_image(timeseries, quantile_predictions, timeseries_name):\n", - " fig, ax = plt.subplots(figsize=(10, 6), dpi=300)\n", - " \n", - " # Plot the original timeseries with thicker line and marker\n", - " ax.plot(timeseries, color=\"blue\", linewidth=2.5, marker='o', label=\"Given Data\")\n", - " \n", - " x_pred = range(len(timeseries) - 1, len(timeseries) - 1 + len(quantile_predictions))\n", - " # Use distinct colors with higher alpha for smoothness\n", - " for i in range(quantile_predictions.shape[1]):\n", - " ax.plot(x_pred, quantile_predictions[:, i], color=f\"C{i}\", linewidth=2, alpha=0.8, label=f\"Quantile {i+1}\")\n", - " \n", - " ax.set_title(f\"Timeseries: {timeseries_name}\", fontsize=16, fontweight='bold')\n", - " ax.set_xlabel(\"Time\", fontsize=12)\n", - " ax.set_ylabel(\"Value\", fontsize=12)\n", - " \n", - " ax.grid(True, which='both', linestyle='--', linewidth=0.7, alpha=0.6)\n", - " ax.legend(loc=\"center left\", bbox_to_anchor=(1, 0.5), fontsize=10, frameon=True, shadow=True)\n", - " \n", - " plt.tight_layout(rect=[0, 0, 0.82, 1])\n", - " \n", - " buf = io.BytesIO()\n", - " fig.savefig(buf, format=\"png\", bbox_inches=\"tight\", transparent=True)\n", - " plt.close(fig)\n", - " buf.seek(0)\n", - " img = Image.open(buf).convert(\"RGB\")\n", - " return np.array(img)\n", - "\n", - "def load_table(file_path):\n", - " ext = file_path.split(\".\")[-1].lower()\n", - " if ext == \"csv\":\n", - " return pd.read_csv(file_path)\n", - " elif ext in (\"xls\", \"xlsx\"):\n", - " return pd.read_excel(file_path)\n", - " elif ext == \"parquet\":\n", - " return pd.read_parquet(file_path)\n", - " else:\n", - " raise ValueError(\"Unsupported format. Use CSV, XLS, XLSX, or PARQUET.\")\n", - "\n", - "def extract_names_and_update(file, preset_filename):\n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return gr.update(choices=[], value=[]), []\n", - " df = load_table(preset_filename)\n", - "\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object and not df.iloc[:, 0].str.isnumeric().all():\n", - " names = df.iloc[:, 0].tolist()\n", - " else:\n", - " names = [f\"Series {i}\" for i in range(len(df))]\n", - " return gr.update(choices=names, value=names), names\n", - " except Exception:\n", - " return gr.update(choices=[], value=[]), []\n", - "\n", - "def filter_names(search_term, all_names):\n", - " if not all_names:\n", - " return gr.update(choices=[], value=[])\n", - " if not search_term:\n", - " return gr.update(choices=all_names, value=all_names)\n", - " lower = search_term.lower()\n", - " filtered = [n for n in all_names if lower in str(n).lower()]\n", - " return gr.update(choices=filtered, value=filtered)\n", - "\n", - "def check_all(names_list):\n", - " return gr.update(value=names_list)\n", - "\n", - "def uncheck_all(_):\n", - " return gr.update(value=[])\n", - "\n", - "def display_filtered_forecast(file, preset_filename, selected_names):\n", - " try:\n", - " if file is not None:\n", - " df = load_table(file.name)\n", - " else:\n", - " if not preset_filename:\n", - " return [], \"No file selected.\"\n", - " df = load_table(preset_filename)\n", - "\n", - " if df.shape[1] > 0 and df.iloc[:, 0].dtype == object and not df.iloc[:, 0].str.isnumeric().all():\n", - " all_names = df.iloc[:, 0].tolist()\n", - " data_only = df.iloc[:, 1:].astype(float)\n", - " else:\n", - " all_names = [f\"Series {i}\" for i in range(len(df))]\n", - " data_only = df.astype(float)\n", - "\n", - " mask = [name in selected_names for name in all_names]\n", - " if not any(mask):\n", - " return [], \"No timeseries chosen to plot.\"\n", - "\n", - " filtered_data = data_only.iloc[mask, :].values\n", - " filtered_names = [all_names[i] for i, m in enumerate(mask) if m]\n", - " out = _forecast_tensor[mask] # slice forecasts to match filtered rows\n", - " inp = torch.tensor(filtered_data)\n", - "\n", - " gallery_images = []\n", - " for i in range(inp.shape[0]):\n", - " gallery_images.append(plot_forecast_image(inp[i], out[i], filtered_names[i]))\n", - "\n", - " return gallery_images, \"\"\n", - " except Exception as e:\n", - " return [], f\"Error: {e}. Use CSV, XLS, XLSX, or PARQUET.\"\n", - "\n", - "\n", - "# ----------------------------\n", - "# Gradio layout: two columns + instructions\n", - "# ----------------------------\n", - "\n", - "with gr.Blocks() as demo:\n", - " gr.Markdown(\"# 📈 Stock Forecast Viewer 📊\")\n", - " gr.Markdown(\"Upload data or choose a preset, filter by name, then click Plot.\")\n", - "\n", - " with gr.Row():\n", - " # Left column: controls\n", - " with gr.Column():\n", - " gr.Markdown(\"## Data Selection\")\n", - " file_input = gr.File(\n", - " label=\"Upload CSV / XLSX / PARQUET\",\n", - " file_types=[\".csv\", \".xls\", \".xlsx\", \".parquet\"]\n", - " )\n", - " preset_dropdown = gr.Dropdown(\n", - " label=\"Or choose a preset:\",\n", - " choices=[\"stocks_data_noindex.csv\", \"stocks_data.csv\"],\n", - " value=\"No file selected\"\n", - " )\n", - "\n", - " gr.Markdown(\"## Search / Filter\")\n", - " search_box = gr.Textbox(placeholder=\"Type to filter (e.g. 'AMZN')\")\n", - " filter_checkbox = gr.CheckboxGroup(\n", - " choices=[], value=[], label=\"Select which timeseries to show\"\n", - " )\n", - "\n", - " with gr.Row():\n", - " check_all_btn = gr.Button(\"✅ Check All\")\n", - " uncheck_all_btn = gr.Button(\"❎ Uncheck All\")\n", - "\n", - " plot_button = gr.Button(\"▶️ Plot Forecasts\")\n", - " errbox = gr.Textbox(label=\"Error Message\", interactive=False)\n", - "\n", - " # Right column: gallery + instructions\n", - " with gr.Column():\n", - " gr.Markdown(\"## Forecast Gallery\")\n", - " gallery = gr.Gallery()\n", - "\n", - " # Instruction text below gallery\n", - " gr.Markdown(\"## Instructions\")\n", - " gr.Markdown(\n", - " \"\"\"\n", - " **How to format your data:**\n", - " - Your file must be a table (CSV, XLS, XLSX, or Parquet).\n", - " - **One row per timeseries.** Each row is treated as a separate series.\n", - " - If you want to **name** each series, put the name as the first value in **every** row:\n", - " - Example (CSV): \n", - " `AAPL, 120.5, 121.0, 119.8, ...` \n", - " `AMZN, 3300.0, 3310.5, 3295.2, ...` \n", - " - In that case, the first column is not numeric, so it will be used as the series name.\n", - " - If you do **not** want named series, simply leave out the first column entirely and have all values numeric:\n", - " - Example: \n", - " `120.5, 121.0, 119.8, ...` \n", - " `3300.0, 3310.5, 3295.2, ...` \n", - " - Then every row will be auto-named “Series 0, Series 1, …” in order.\n", - " - **Consistency rule:** Either all rows have a non-numeric first entry for the name, or none do. Do not mix.\n", - " - The rest of the columns (after the optional name) must be numeric data points for that series.\n", - " - You can filter by typing in the search box. Then check or uncheck individual names before plotting.\n", - " - Use “Check All” / “Uncheck All” to quickly select or deselect every series.\n", - " - Finally, click **Plot Forecasts** to view the quantile forecast for each selected series.\n", - " \"\"\"\n", - " )\n", - "\n", - " names_state = gr.State([])\n", - "\n", - " # When file or preset changes, update names\n", - " file_input.change(\n", - " fn=extract_names_and_update,\n", - " inputs=[file_input, preset_dropdown],\n", - " outputs=[filter_checkbox, names_state]\n", - " )\n", - " preset_dropdown.change(\n", - " fn=extract_names_and_update,\n", - " inputs=[file_input, preset_dropdown],\n", - " outputs=[filter_checkbox, names_state]\n", - " )\n", - "\n", - " # When search term changes, filter names\n", - " search_box.change(\n", - " fn=filter_names,\n", - " inputs=[search_box, names_state],\n", - " outputs=filter_checkbox\n", - " )\n", - "\n", - " # Check All / Uncheck All\n", - " check_all_btn.click(fn=check_all, inputs=names_state, outputs=filter_checkbox)\n", - " uncheck_all_btn.click(fn=uncheck_all, inputs=names_state, outputs=filter_checkbox)\n", - "\n", - " # Plot button\n", - " plot_button.click(\n", - " fn=display_filtered_forecast,\n", - " inputs=[file_input, preset_dropdown, filter_checkbox],\n", - " outputs=[gallery, errbox]\n", - " )\n", - "\n", - "demo.launch()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# maybe some sanity checks in regard to the input would be good\n", - "# maxium of idk maybe 30? variates (to save compute and avoid visualization problems) -> with just sending error messages when more thant that are in the input file\n", - "# series longer than 2048 we can cut off (tirex is anyway doing that internally)\n", - "# apart from that maybe check with \n", - "# @Elias Bürger\n", - "# how one then can set this up in hugginface (if there are open questions) - it would be cool if it would be possible to set it up first \"private\" so that we can test it on hugginface and then set it public afterwards (edited) \n", - "\n", - "# '''\n", - "# 8. *Range of prediction length customizable \n", - "# 9. *Multivariate data (x_t is vector)\n", - "# '''" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(torch.Size([1, 256, 9]), torch.Size([4, 256, 9]))" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "torch.load('data/air_passengers_forecast_256.pt').shape, torch.load('data/merged_ett2_loop_forecast_256.pt').shape" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
index012345678...132133134135136137138139140141
0air_passangers132.0129.0121.0135.0148.0148.0136.0119.0104.0...419.0461.0472.0535.0622.0606.0508.0461.0390.0432.0
\n", - "

1 rows × 143 columns

\n", - "
" - ], - "text/plain": [ - " index 0 1 2 3 4 5 6 7 \\\n", - "0 air_passangers 132.0 129.0 121.0 135.0 148.0 148.0 136.0 119.0 \n", - "\n", - " 8 ... 132 133 134 135 136 137 138 139 140 \\\n", - "0 104.0 ... 419.0 461.0 472.0 535.0 622.0 606.0 508.0 461.0 390.0 \n", - "\n", - " 141 \n", - "0 432.0 \n", - "\n", - "[1 rows x 143 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.read_csv('data/air_passangers.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Unnamed: 0012345678...2517251825192520252125222523252425252526
0ett2_225.21400121.19300119.60199922.61700125.88400125.54900024.62800023.28700122.701000...31.32900028.56500132.58599932.16700030.24000030.07300029.98900029.48600031.32900032.417999
1ett2_512.64900013.06800013.40300012.73300012.48100013.06800011.89500011.64400011.225000...33.00500131.41300029.82099930.07300032.58599930.82700027.47600028.56500131.32900031.747999
2loop_654.27152356.40681855.32881952.33034954.27947255.75888455.38152756.36927454.589359...58.92448860.13721159.65306156.78518758.36787855.98988756.79193156.68906456.75397557.298767
3loop_758.64450552.88511354.29756955.95280560.13664260.02655053.07751153.96574857.957455...63.77026063.09194962.02981962.58770464.20034863.07670264.51759364.43183962.69583564.302551
\n", - "

4 rows × 2528 columns

\n", - "
" - ], - "text/plain": [ - " Unnamed: 0 0 1 2 3 4 \\\n", - "0 ett2_2 25.214001 21.193001 19.601999 22.617001 25.884001 \n", - "1 ett2_5 12.649000 13.068000 13.403000 12.733000 12.481000 \n", - "2 loop_6 54.271523 56.406818 55.328819 52.330349 54.279472 \n", - "3 loop_7 58.644505 52.885113 54.297569 55.952805 60.136642 \n", - "\n", - " 5 6 7 8 ... 2517 2518 \\\n", - "0 25.549000 24.628000 23.287001 22.701000 ... 31.329000 28.565001 \n", - "1 13.068000 11.895000 11.644000 11.225000 ... 33.005001 31.413000 \n", - "2 55.758884 55.381527 56.369274 54.589359 ... 58.924488 60.137211 \n", - "3 60.026550 53.077511 53.965748 57.957455 ... 63.770260 63.091949 \n", - "\n", - " 2519 2520 2521 2522 2523 2524 \\\n", - "0 32.585999 32.167000 30.240000 30.073000 29.989000 29.486000 \n", - "1 29.820999 30.073000 32.585999 30.827000 27.476000 28.565001 \n", - "2 59.653061 56.785187 58.367878 55.989887 56.791931 56.689064 \n", - "3 62.029819 62.587704 64.200348 63.076702 64.517593 64.431839 \n", - "\n", - " 2525 2526 \n", - "0 31.329000 32.417999 \n", - "1 31.329000 31.747999 \n", - "2 56.753975 57.298767 \n", - "3 62.695835 64.302551 \n", - "\n", - "[4 rows x 2528 columns]" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.read_csv('data/merged_ett2_loop.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnQd4I9XVhr9Rc197e+8LLLuwS++99w6B0EOA0HtL/tBL6L2HBEjovSSU0CFAYFnYZXvvvbjbKjPzP98dS5ZtyR7JKiPpvDxm5bE0mjszd+65557zHc00TROCIAiCIAiCIAiCIAiCkEFcmfwyQRAEQRAEQRAEQRAEQSDilBIEQRAEQRAEQRAEQRAyjjilBEEQBEEQBEEQBEEQhIwjTilBEARBEARBEARBEAQh44hTShAEQRAEQRAEQRAEQcg44pQSBEEQBEEQBEEQBEEQMo44pQRBEARBEARBEARBEISMI04pQRAEQRAEQRAEQRAEIeOIU0oQBEEQBEEQBEEQBEHIOOKUEgRBEBLmjDPOwIgRI1CoFHr785VErivfW15ejlzjiy++gKZp6t9Cup9zpY2ZuD7PPvus+o5FixalbJ9CR3jNeO0EQRCEzhGnlCAIgqDgJMXOT/RkyUlwgnXmmWdi9OjRKC4uxoABA7DHHnvghhtuQD6w1157xb0ms2bNQj7T2NiIG2+8MeP3Xjq/N3w9N9lkk5h//89//hO5vq+//nrKv1+w18969eqF7bffHn/7299gGAZyidtvvx1vv/02nOaoOeyww5L67L///W/VHwVBEIT8wpPtAxAEQRCcwT/+8Y82vz///PNqYtx+++abb46nn37aURO0efPmqYljSUkJfve736mJz8qVKzF58mTceeeduOmmm1L6fdlq/5AhQ3DHHXd02D5o0CDkM3QOha8hnQbpov11Tff30nnKe/eHH37ADjvs0OZvL7zwgvp7c3Mz0o3T+nO2ie5na9euVc/Cs846C3PmzMFf/vKXjB9PsteHTqnjjjsORx11VJvtp556Kk488UQUFRUhl6BT6tFHHxXHlCAIQp4hTilBEARBccopp7T5/fvvv1dOqfbbncj999+P+vp6/PLLLxg+fHibv61ZsyZl39PQ0ICysjJ4vV5kg8rKyrRcD9M0lfODTr1CJtPXlVF9oVAIL730UhunFK/FW2+9hUMPPRRvvPFG2o8jW/ezU2nfz84991xsttlmeOSRR3DLLbfEPF90GgUCAeVIdPr1cbvd6keQZ58gCIITkPQ9QRAEIWHaa5wwdY6pLvfcc49ayR41ahRKS0txwAEHYOnSpcrw52SOEQg0/o888khs2LChw34/+OAD7L777srxU1FRoSbl06dP7/J45s+fr/bd3iFF+vXrl9T3hDWDuO9DDjlEve/kk0+O2f7wpPSBBx7A+PHj1cS0f//+ajK7cePGNu+bNGkSDjzwQPTp00edi5EjR6rorlRABwfPM50djILgMf7xj3+E3++PmULz0UcfYbvttlPH8eSTT6q/VVdX49JLL8XQoUPVPsaMGaOizdpHavD3Bx98EFtuuaVqb9++fXHQQQep9oX5+9//jn322UddA+5r3LhxePzxxzscd2fnhPcW900YtRROq4oXLcHj54T7oYceimxbt24dXC4Xevfure7FMOedd55K8wwTfV3tfu/y5ctVJArvFb7/yiuvhK7rsMtJJ52EV155pc35fe+991SU1gknnBDzM/xOnh/eYzyvvOeYXtaeZcuWqWPjfc5rcNlll3W4F9q3Owz78i677KLOGa/JtttuGzONkOfkwgsvVGliW2yxReR4Pvzwwy7bTifO9ddfr/ZNRxCPk/3y888/b/O+6OfLU089Fbm/GR35448/dthv+Fh4X/JfOvi6A59lO+20k3JKM3Iqut2MaGN7eTzhNmfi+nTV/3h8PN7nnnsucu+G9Y3iaUo99thjkbYw+vKCCy5Q/SkaRgzynM6YMQN77723OjeDBw/GXXfdldS5tXtteewcW8JtC/8k+vyN9+xjm9ie9nC/bB8jzhLtG4IgCII9JFJKEARBSBmcoHGiedFFFymnEycqnFjTMUFdnmuuuUalKz388MNq8h49UWOa4Omnn66cE3SCcFJOB8Zuu+2Gn3/+uVOhXzqjPvnkE3z22Wfquzojke+hk4fv4984EeEELB6cAHGyR12riy++GAsXLlSRFdznf//7XxXtwKgtOuo4gbz22mtRVVWlJmVvvvmmrfNLZwcdLNFwAhYW3P7973+vJqGcQF1xxRX43//+p9KQZs6c2WFiPnv2bOUQ4XGfffbZKhKE52LPPfdUk2puHzZsGL799ltcd911Kh2Sk74wTGdiew8++GD1vTxXX3/9tYqw42SP8LxyknjEEUfA4/EoZ8v555+vJnqc8JKuzgm3cz90IB199NE45phj1PYJEybEPEf8PCeYX331lboO5JtvvlETWN6TnEzzmAiPl06QWNj5Xl4P3h877rijuj94D957771qYs3P2eG3v/1tRLcqfO+++OKL2HfffWM6VFevXq0cJGGnCI+TTlZej9raWuVQJE1NTWofS5YsUeeBTgbe++wjdqDDg9eNjlj26ZdffhnHH3883n//feXEjYbnl9eL15bOWzoEjz32WPXdnLjHg8f717/+Vd2HvAfr6urwzDPPqHPKlMatttqqzft5Xvge3ptsP58vvC4LFiyIRBN9/PHH6rvpAOW9v379etUn6bTuDvwOOjt5f4XhuXz11VfVdaBDlc+OTF2frvof98XtjMA755xz1Gd4X8aD9yCdr/vtt5+6d/l84P1Px1D4+RWGjh46wHju+XynQ4bPdjrIeDzJ0NW15fYVK1bETCm3+/zt7Nn3m9/8Rp2DVatWtXFU897m9zLdMZm+IQiCINjAFARBEIQYXHDBBQwpifm3008/3Rw+fHjk94ULF6r39u3b16yuro5sv+6669T2iRMnmsFgMLL9pJNOMn0+n9nc3Kx+r6urM6uqqsyzzz67zfesWrXKrKys7LC9PdOmTTNLSkrUd2211VbmJZdcYr799ttmQ0NDm/cl8j1sI/d37bXXdtn+r7/+Wr33hRdeaPO+Dz/8sM32t956S/3+448/momy5557qs+2/+GxkF9++UX9/vvf/77N56688kq1/bPPPots47FzG48vmltuucUsKysz58yZ02Y7z4Hb7TaXLFmifue++PmLL764w3EahhF53djY2OHvBx54oDlq1KjI73bOydq1a9V7brjhBtPuvdu/f//I75dffrm5xx57mP369TMff/xxtW39+vWmpmnmgw8+GPe6dva94fvj5ptvbrN96623Nrfddltb13P8+PHq9XbbbWeeddZZ6vXGjRtV33juuefMzz//XH3Ha6+9Fvkc3zdw4EBz3bp1bfZ34oknqns4fM4feOAB9dlXX3018h72hzFjxqjt3He8dse6doFAwNxiiy3MffbZp8127ovHO2/evMi2KVOmqO0PP/xwp+cgFAqZfr+/zTa2n9fud7/7XYfnS+/evc0NGzZEtr/zzjtq+3vvvRfZxv7P8xP9HPr444/V+9q3Md51GTt2rLr2/Jk5c6a6z/n5ww8/vE27XS6XOX369Dafz8T1sdv/2JfDz4do/v73v6vP87ySNWvWqGt4wAEHmLquR973yCOPqPf97W9/a3N+uO3555+PbOM1HDBggHnsscd2cXatZ8+hhx6a1LWNNybZff529uybPXt2zHv2/PPPN8vLy9v0B7t9g98V6/wLgiAIbZH0PUEQBCFlcLWYaThhGEFCqM/CSJno7VxhZkQO4eo300S4es1IoPAPIxP43vbpPO1h5Av1pPg9jLLhSjbTYpjCQZHgMMl8j52Il9dee021e//992+zX6Z1MIopvN9wlAVX1IPBIBKFkRhsQ/TP1VdfHREBJpdffnmbzzBiivzrX/9qs50pcoxIad8ORg717NmzTTsYPcGoIEYfEeocMZohVmXD6JSaaJ2WmpoatS9GYjH6gb+n4pzEgm1gxAojIggjSFiJkdv5OhwBQd9CvEgpu/zhD3/o8N1sXyIwWoqRRuwTjDrh/cjorPbweHnuDz/8cPU6+hrxWvKcUtw/fD8MHDiwTdoRI/3CUTNdEX3tGBnDfbNt4f1Hw/sjOgqH0WQ9evTo8jywnT6fT71m9Bwj2Rjxw0ifWN/DaBbem2HC1y78PYzm43OAkZDRzyH2S0ZO2YXVLBnhxB8WdmBkJyNg2qfg8V6O3m+mro/d/mcXRvjx3mMUF9NcwzCKiNex/bODz7RozS1eQ0ZkJXrfJ3JtU/H87ezZt+mmm6rIPKbShuEzj/2R1zO6PyTSNwRBEISukfQ9QRAEIWUw3Sua8MSQ+kSxtof1PubOnav+jZd6x4lRV3BSwbQOTiSYokUnB1NAOMnjJIQT50S/h440O2k/3C8nJrHSraLF1jmJZWoR02Qozk59FjrP6JSwUwmL2jNsRywWL16sJpTUgIqGqSh0/PDv0fCcxGrH1KlTI1pK8dpBnS2mG/Xq1avT42XaDCfO3333nUoNjIbni/dBd89JLMITWjqgeP2YwnPrrbeqdjHNLvw3Xu+JEyciWcJaPtFwYt1ex6YrmBrEdFameTEFlpo3TINrD/WM6FSl9g5/OrtGvN68F9o7KZiqZAf2H54zOnmidY5iOT3a9/tEzgPTTZnySEdQtFMy1v3Z/nvCTozw94Tv8U022aTDZ9luu04DOn/pzGZbeY25v1h9u/0xZur62O1/dgmft/bfTWcT9QHbPzvYp9ofN68Fnx3J0tW1TcXzt7N7K+wYowYfF0uoI8WUWn6W25PtG4IgCELXiFNKEARBSBnxKjrF2x4WnQ6LPNOpFK3nESY6ysrOMVDbhD8777yzEq/lRJ/OnES/h06R6MiBeHC/nBDxe2IRdlxw0sKVd+q+UF+JYrsUROaknNvC2lDdwe7EKFa1KbaD0Qbh6KtYjj+7cOJMzZyxY8fivvvuU45JTnIZIULnU/hapOOccMLOiScju+hg4H3Ge4HX4ZJLLlGTbDqlKFZs5/rGI1UVzBgxQ2cc20xHXryKe+FzxigVRgPFIp7WViLw3FAzh9FlFL/m8VGTh8L11P5JtH/H45///KcSsKYT8qqrrlJ9iPuiFhTvn1R9T6J05vztrA9l6vpkm3Rch+7s0+7zN0y8Snt0PlE/j5FXjBqjXhgd59TPSrZvCIIgCF0jTilBEAQh64RTfzixsDMZtEtYcJtpPen8Hu6XKTC77rqrrdLiFELmz2233aYmMhTMpVguhYmThWLvnJwxaoApR2GYxsbojViVCWO1o76+vstzw/fRecR0q3jRGnQwMYrg3XffbRMFES8Vs7NzkkwEAqOl6JSic4ppOYw8YlQUJ5msksaoGUZndUYmIx8YGca2MqqN1R7jTa7ZDkYDdnWNeL2nTZumJvXR7QinNHYGnWKMEOI1jo5W48Q7ldAZyUgcpi5GH2OstDQ7hO/xcERkNHba3V0ydX3s9L9E7t/weeN383qEYUofBcNT+azsDvHak+jzNx58VjANkSl8FKnnfUmHaXQfyFTfEARBKCREU0oQBEHIOtT3YCrV7bffHlNXKFyGPR5cvY71ubDOUjgtpbvfEw9WoOJE9JZbbunwN2rkhMuqMxWl/cp/uMJYrFLwiRB2ZERXyCOMUiJ2qkKxHUy144SrPWwD20KYbsd2xHLqhNsXjnyIbi9TbNpP3uyck3DVw/bl6btySlFfjBPMcDofo6IYHcVzwuvflZ5UMt+bLNQWojOG0RdhnaX28Jzy3HNiTIdGZ/cv7wdWDYsuVc8UynhpZe2/hw4A3tNheC7ffvvtJFrW+feQ6OvPipG8B5OBUSu8d5gSGNYsI9ReY0pvusnU9bHT/8IRX3buXTqdeM+xamL051kJkefRKRXl2B7Svk12n792YLQUIzSpH0Zdqvape5nqG4IgCIWEREoJgiAIWYeOIpYfP/XUU7HNNtsojR1GHbBcOkV2uQLO8t7xuPPOO/HTTz+pEuLh9BhGwjz//PMqkiBchr273xMP6iKxvDjTjqgzcsABB6iUDkZsMBWEwut0OnCyTKcDRay5us8S6NSu4XHFi46xC6OAmDLESS0nYTymH374QX0nV/uZxtgVTKFiZBM1jZhWRaHghoYG/Prrr2ryzMlXnz591L54DjmJZRuZ3sIoLToH+TdGGfAccKJLkWCeG0Zgsa2MUgtHrhE754TRDxSUpoOJKYS8pltssYX6iUfY4cToDzohwzDthtpNjHLYfvvtOz0fyXxvsjCCiyXpu+Ivf/mLijajMD+FqHl8jJjh/c5oEb4m/Bvv5dNOO031DTpsmLYadrR1Bp0QdNzxujKCi7o6jz76qNJA6o5uUHt4nzEahdee38monCeeeEK1ifdLMrAPcl+77babSgPl+aBQOYshJLvPRMjE9bHT/wj7L7+T1zKc0houPhENn4FMW6OTi/tiehr7Dfsl+0i0qHk2YXvIxRdfrBYY6CDiM9zu89cOdHBR340/7O/to8Qy1TcEQRAKinbV+ARBEASh0/LbsUqUh8t633333W3eF6ukfXRJ8h9//LHD+w888EBVOr24uNgcPXq0ecYZZ5iTJk3q9Fj/+9//quNlWW5+1uv1msOGDVOfnT9/fof32/ketpEl1e20P8xTTz1lbrvttmZJSYlZUVFhbrnllubVV19trlixQv198uTJ5kknnaSOraioyOzXr5952GGHddm+cCn28ePHd/qeYDBo3nTTTebIkSPVORg6dKh53XXXmc3NzZ2WZY+mrq5OfYal6Vkmvk+fPuYuu+xi3nPPPar0eZhQKKSu99ixY9X7+vbtax588MHmTz/9FHnPu+++a06YMEGd4xEjRph33nmnKi8fXY7e7jn59ttv1bnld/HzN9xwQ5fnjPvie1evXh3Z9s0336htu+++u63rGu97490f/Lsd88rO9YzXf9ge3u+8vrzOAwYMMPfdd191/0WzePFi84gjjjBLS0vVdbzkkkvMDz/8UO2T++6s3c8884y5ySabqGvCa8w+G6tt/J3H0h7uj/vtDMMwzNtvv129l9+z9dZbm++//77t50v4+9vfC2+88Ya5+eabq32OGzfOfPPNN+P22WSuS2ftztT1sdP/Zs2aZe6xxx7qecR9hq9H+Pkb7oNhHnnk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GYvjhcgcjhmi7BsvDKUaCQHRb1trZMHmxJ3weEaDKS0oslgs6uR0OlUgceedd4rH45Gm9t5778ldd91l6LrffPON2satW7c2+D4a6vfff1ePPXv2bMO3uf3226Vv376Sbp555hnp1KmTHHTQQXG7z5UrV8rQoUMlLy9PBSvXXXddva+vzZs3y9lnny1FRUVSUlIio0ePlh07duz2nISfpk2bJk3J7/fLrbfeKq1bt5bc3FwZNGiQ/PbbbzFvs337dhWcdujQQd0Gx3bGjBlRx6F2OvbYY4OXN2/eXM477zy57bbbmmzfiCh1uOxWFEmpXlLoKUVERESUjdjovJHQD6La61e9IexhSzw3BY+qyvKrx3WI8cfDh9+XXnpJampqZOLEiTJmzBhxOBzyj3/8I2IlDcKreCgrK0uJ+0hl8TzeRgKXJ554QoWS8YJkHoFUq1atVPXVmjVrVLiC19c999wT9XYIpHDdSZMmidvtlpEjR8rFF18sr7/+esj1vvzyS+nVq1fw/82aNZOm9MADD8hjjz0mr7zyigrvbrnlFhk8eLAsWLBAcnJyIt7mwgsvlF9//VX++9//Sps2beS1115TYRZus8cee+w2DjUulyvkfnAM9ttvP3nwwQcz/nVPlO0cu943FDltKqQmIiIiykaslIoTvLF0JOBkJvjSv8nFh1+EBqjkuPTSS9UH5g8//DBkyt24cePUB+q99tpLnf/nn3/KGWecoapY8AH5pJNOUtUr+jDimmuuUZcjKLj++utV6BFr6h1CsRtuuEHatWuntglVW//5z3/U/R5xxBHqOqWlpWrbsV2R7mPLli0q9MD1UJkzZMiQkEqWl19+WW3T559/Lj169JCCggIVBiAAMUqr2vrqq69U8zg8DqpfFi9eHHyMO+64Q+bMmROsesF5gEovhBQtWrRQVUBHHnmkul54hdULL7ygQg8EHc8995w69uF9jXDMR40apb5ftmyZ+n/Lli3VPu2///4qsDHj559/VveDEElv+vTp0q9fP7Ut2N/333/fcOXYF198ocIXBDHYLzwfqGx78skno85xXrhwoXz22WfqGBxwwAHyt7/9TR5//HF58803ZfXq1SHXxWsLr13thLArlsrKSvX6wDFCtdNDDz1kaAoo9hevX0x/vPnmm9Wx7tOnj7z66qtqmyZMmBB12t+7776rwqxDDz1UvabxHOPr008/HXJdbRxqJ7yG9RC+4XWA40+UytK9oWYqwO/0fLtV8pFOUUbjeCEyh2OGKLvGC98JZSh8wMZqYtH++oopRvrAAOELAhdUrXz88ceqcgXVIYWFhfLdd9/JDz/8EAx3tNvhwz6CmBdffFG+//57NR2rvg/TCAveeOMNVYmCYOLZZ59V94uQCh/sAduBAOnRRx+NeB8Iq2bOnKlCtalTp6og4bjjjlPbrNm5c6f861//UpUrU6ZMUdPLrr32WtPH8aabblL7icez2+3BgGj48OHy97//XYUI2FaccB4MGzZM1q9fL59++qkKgfbdd1856qij1PHRLF26VO0vpiYi+MFtNm3aJJMnTw5eB9dHcIOKIsDUNuwnnqtffvlFPRcnnHCC2jej8Fzuueee6nnV4H6PP/546dmzp9peBCpmjhWeg7333luFZRq8drZt2ybz58+PehsEhwjANAhKrVar/PTTTyHXPfHEE9WUQARXWpAaC6YOfvvtt/LBBx+owAwB46xZswyNF4Sja9euVduiKS4uVsEZtjkSTFNEQBteRYUxhnGhh23BviD4RTiM5zzcgAED1PNElKrwsxChOL5Sw+XYrFLgsKpgijIXxwuRORwzRNk3XtJ76ykqBDX4oByenOJ8hBqoIrriiiuC5+MDOapWtGlkqHpB1Q7O04ItTDtCkIAP1sccc4yqKMH0v1NPPTXYqwj3G82SJUvk7bffVsGX9qG/c+fOwcu16Ur40I7HiQQVUQgmEJJpPZHGjx+vQi1UsiDcAQRU2J4uXbqo/19++eUNmrKG6rHDDjtMfX/jjTeqCqPq6moVOCBMww8AVLxoEEKg6gihlDY1C+EYtu1///ufmp4GCPZQgYNqKg0qjDB1DQEW4ProM6RVkO2zzz7qpEE1EkJAHA/snxF//PGHqsTRw2PiuUbFGoIVBG1oto3QxAiEOPpACrT/47Jot8HzrIdjideAdhscXwSCBx98sAqrEOKhog/HEkFVJAjYsB94/WrHEdPw2rZta2i8aNV0kfYn2r4g4Bs4cKB6PlCZh+sieEWIhWopDUJEjBVUx6Fa7Z///Kd6znE9/TjF84PQkShVYbxUVFSowJbTzhrOabNIp6LETN2m5OF4ITKHY4Yo+8YL/zyXwRCeaFD9hA/5CB3wQRhVPaiI0aDSRd/XCNPNUM2DD9y4HU4IDHCf+ECNFz8+wKOCRB8q6CtfwqEiCB++tZCnIVBdhcfRPy6md6HyBJdpMN1OC6QA07gQFJmF6Vv6+4BY94PjhmAE26QdN5xWrFihjpsG0yj1gRSgIgrBC6Y4amHbmWeeqQIZwP2iggnBB0I73C/22UylFKaahVf04D6wn/rzEbIkGwI5TA/Fc42/ANx3331yzjnnqH5LgGoi/THG8cIxRuCnf33gdatNSTU6XsxCRR5+KaB/FMJIVAKOGDEi+NwBnkuEaRhrCNcwJtEMHSGvHgJPVPoRpSoEuIsWLUr7lV6IEoHjhcgcjhmi7BsvrJTKEqi2QX8bBE+oxAgv8UOllB4CEDRcxgf9cOFhilH4sJ0o4X2HtH5BjbkfLX0O7/sUftwQXoUHDaCv/go/3oCpeNjGTz75RIUwCF3+/e9/By9HIIUqM1ReoQIHx/P000+P2rcpWtAzb948iSdUiqE6TG/dunXBy6LdJjzcwzQ4TFmMdhtA2IRjAAhA9T2vUKG0fPnyRu+Ltv1aCKn9P9ZKiwhAMWUQ/awwbRG3RfCrrwQMh8vwfCD81aq6AMegoWOMiIiIiIgonbBSKksgBEGQ0b59e0NzTtEHCVPlMMUKt9OfUB6IEz546/v/IFRAT6JoUCGCQAcf3iPRKrViJb2oEsLj6B8XfXnQhwo9kRIJ2xu+rThumOaFYxx+3BBAxIJKJUzvQhCI6V+o7sH9aTBlEf20TjnlFHUsEaDoG88bgWbmSNP1AR2O6dy5c0MqhaZNm2b4PlFVhaBLHzIhOEKT92jPCW6DhvD618vXX3+tXh/6KqdwCKG0sAihnP74oqoP4RCCRP3rA43xMXXUCEytw3HFFFcNQibcn5HqMYwzbB8eE1NZ0Sw9GkyRxGtXH34BVvHD80RERERERJTpGEplMP3UIbMwlQwhCj5Uo2IH089Q/XPllVeqD9Nw1VVXqSlV6PGDoOOyyy5TQUM0HTt2lPPPP181C8dttPtEnyltShuqkTCtacOGDarqKFy3bt3UNl100UWqfxOmy2FKF6ZNxQoAmgL2B/uAoGTjxo1q2h16ZSG8wPQsNNlGaPTjjz+qhulolm7kuKNSCs3jtQbn+n3XGqNjv88666yYVVvRKuZwXPUNyHE/OO44plhFb+LEiaoayyj0F0P4dO6556rtQhiD1evGjBkT7KuFSqru3bvLX3/9FQzC0GMJj4nLELihLxamuGk9r9ALCuEcXls43XPPPeq46HuhhcM0vtGjR6tm5wi5EPAgyDMyFnAdHAes0nf33XerXl0I29CcH9uE51SDyqYnnngi+H/sM5rS4/WAQA7HGfs7cuRIdTmOObYJYR9eEwi98HpFmIam8BpM20NQh2NKlKowThAKp3PvAqJE4XghModjhij7xgtDqTjx+PziTsAJj2MEXpjoq9TQFyhui1XrUFmF6h2ECPiwj2oaVMAAVp9DEIGgCUEMKlVQxRMLphBiyhkCLHxoRyiBKU+AYOmOO+5QDcUxFSta8240XMfUQqwYh8dF1Q+ClPApe03ttNNOU8EKAghMt0KAguONbTn00ENVIIGV7hC0oMF4ePPsSI488kjVAwmVXwiL9B5++GEpLS1VDd4x1Q9hhr6Sygj0usJzpJ+WiSDno48+UgEMKnQQoN1///2G7xN9whAk4iueD4SECHL0jeURtmCf9CskYhvwGkDAg1UFsbrec889F3LfaB6O5xrVU1hN76233goGPdGg59QhhxyijhFCQtwv7sPoeLn++utV8IWm9JhGiUAJgZO+5xZ6VyGI1KDHGkI47A/2HY+JoEp7TeLYoBoNPaXwmsBYwjYh8NWCO8A+Ysxh+4lSFV7PWHQhE5YgJmpqHC9E5nDMEGXfeLH4G9JoJ4Nhqg6mpuFDpha+AMIYVEFgeo/+wymCot+21ki1N3GHMcdmkW4lLnFYowdOeFoxzQ3TyNI9OaX4Qjhy9NFHq2AFgVQkqObBax2rwMXqpZQuDj/8cLUfWDEylcfLgQceqKoRwwPJ+n4OESUSKjQRyqKatjEVuUTZgOOFyByOGaLMGS/RspVwbHTeSAiGEBB5E5jt2SyWmIGUBtPJjPSPouyClfZQCYVwA72pKDXGC36hoCoRq/YRpfobICwqgKrOVHwDRJRKOF6IzOGYIcq+8cLEIg4QEDmE1UiUPtBnyahLLrlEXnvttYiXYareM888I+kC0+WGDBkS9fLt27dLsuAvHJg6SERERERElC0YShFRxCbu2sxe9Ia69tprI14vVhlmKkFDfaiqqlKN4sNhX9H3ioiIiIiIiBKHoVQGS/eGZ5QaysvL1SkTYHUKrHgXKZRCvyYiqh/6rqE/APsVEtWP44XIHI4ZouwbLwylMnx5SCKqH8cLkbk/eGBFViKqH8cLkTkcM0TZN17StxtWkqTLYoXYztra2rTZXqJkSpfxkurbR9nTVHPVqlXqKxHFxvFCZA7HDFH2jReGUgY5HA71NZ36zuBDNhFlznjRtpFTcymZMuUNEFEicLwQmcMxQ5R944XT9wzCh8CSkhJZv369+n9eXl5Kz91ERQWWuMd2p/J2EqWCdBgv+GWzYcMG9bPHbuePbiIiIiIiSn/8ZGNCq1at1FctmEqH6UhOpzNlP2QTpYp0GS9Wq1Xat2+f0ttIRERERERkFEMpE/BBsHXr1molMrfbLelQyte2bVv1QZaI0n+8IDRL5e2j7IDXYIsWLfhaJDKA44XIHI4ZouwbLxY/O+eG2LZtm1pWsaKiQoqKipK9OUREREREREREGZmtpHekRjErP5YtW5b2Tc+IEoHjhcg4jhci4zheiMzhmCHKvvHCUCpDaU2R0/0FSpQIHC9ExnG8EBnH8UJkDscMUfaNF4ZSRERERERERESUcGx0HkZrsYX5j+nM4/FIZWWl2g8uH08UG8cLkXEcL0TGcbwQmcMxQ5Q540XLVOprY556W55k27dvV1/btWuX7E0hIiIiIiIiIkrrjAUNz6Ph6nthMB9z9erVUlhYKBaLRdIVUkkEa3/++SdXESSqB8cLkXEcL0TGcbwQmcMxQ5Q54wVREwKpNm3aiNUavXMUK6XC4GC1bdtWMgVenKn4AiVKRRwvRMZxvBAZx/FCZA7HDFFmjJdYFVIaNjonIiIiIiIiIqKEYyhFREREREREREQJx1AqQ7lcLrntttvUVyKKjeOFyDiOFyLjOF6IzOGYIcq+8cJG50RERERERERElHCslCIiIiIiIiIiooRjKEVERERERERERAnHUIqIiIiIiIiIiBKOoVSGevLJJ6Vjx46Sk5MjBxxwgEyfPj3Zm0SUVPfee6/sv//+UlhYKOXl5XLyySfL4sWLQ65TXV0tY8aMkWbNmklBQYGcdtppsm7duqRtM1GquO+++8RiscjYsWOD53G8EIX666+/5JxzzlFjIjc3V/bee2+ZOXNm8HK0cb311luldevW6vJBgwbJb7/9ltRtJkoGr9crt9xyi3Tq1EmNhS5dushdd92lxoiG44Wy1ZQpU+SEE06QNm3aqPdeEyZMCLncyNjYvHmznH322VJUVCQlJSUyevRo2bFjh6QqhlIZ6K233pJrrrlGdeKfNWuW7LPPPjJ48GBZv359sjeNKGm+/fZb9QF62rRpMmnSJHG73XLMMcdIZWVl8DpXX321fPTRR/LOO++o669evVpOPfXUpG43UbLNmDFDnn32WenTp0/I+RwvRHW2bNkiBx98sDgcDvn0009lwYIF8tBDD0lpaWnwOg888IA89thj8swzz8hPP/0k+fn56v0ZAl6ibHL//ffL008/LU888YQsXLhQ/R/j4/HHHw9eh+OFslVlZaX6/I4ik0iMjA0EUvPnz1efeT7++GMVdF188cWSsrD6HmWWAQMG+MeMGRP8v9fr9bdp08Z/7733JnW7iFLJ+vXr8ec4/7fffqv+v3XrVr/D4fC/8847wessXLhQXWfq1KlJ3FKi5Nm+fbu/W7du/kmTJvkPO+ww/1VXXaXO53ghCnXDDTf4//a3v0W93Ofz+Vu1auV/8MEHg+dhHLlcLv8bb7yRoK0kSg1Dhw71jxo1KuS8U0891X/22Wer7zleiALwvur999/f9T9jY2PBggXqdjNmzAhe59NPP/VbLBb/X3/95U9FrJTKMLW1tfLzzz+rMj6N1WpV/586dWpSt40olVRUVKivZWVl6ivGDaqn9GOne/fu0r59e44dylqoLhw6dGjIuACOF6JQH374ofTv31+GDRumpoj369dPnn/++eDlK1askLVr14aMmeLiYtVigWOGss1BBx0kX331lSxZskT9f86cOfL999/LkCFD1P85XogiMzI28BVT9vA7SYPrIxNAZVUqsid7Ayi+Nm7cqOZpt2zZMuR8/H/RokVJ2y6iVOLz+VRvHEy16N27tzoPP+CdTqf6IR4+dnAZUbZ588031RRwTN8Lx/FCFGr58uVqOhLaJ/zzn/9U4+bKK69U4+T8888PjotI7884Zijb3HjjjbJt2zb1xwybzaY+u4wbN05NOQKOF6LIjIwNfMUfR/Tsdrv6Q3yqjh+GUkSUldUfv/76q/qrHBHt7s8//5SrrrpK9SLAghlEVP8fO/BX6XvuuUf9H5VS+D2Dnh8IpYiozttvvy3jx4+X119/XXr16iWzZ89WfyxEY2eOF6Lsw+l7GaZ58+bqLw7hKyDh/61atUradhGlissvv1w1/Js8ebK0bds2eD7GB6a/bt26NeT6HDuUjTA9D4tj7LvvvuqvazihmTkaa+J7/EWO44WoDlZB6tmzZ8h5PXr0kJUrV6rvtXHB92dEItddd52qljrzzDPVKpXnnnuuWjwDKyUDxwtRZEbGBr6GL3Dm8XjUinypOn4YSmUYlInvt99+ap62/q93+P/AgQOTum1EyYRegQik3n//ffn666/VMsR6GDdYNUk/dhYvXqw+UHDsULY56qijZN68eeqv19oJVSCYWqF9z/FCVAfTwTEG9NAvp0OHDup7/M7BhwH9mMH0JfT34JihbLNz507V30YPf1THZxbgeCGKzMjYwFf80RB/YNTgsw/GF3pPpSJO38tA6GeA0ld8aBgwYIA88sgjamnJkSNHJnvTiJI6ZQ9l4h988IEUFhYG51SjOWBubq76Onr0aDV+MOe6qKhIrrjiCvWD/cADD0z25hMlFMaI1m9NgyWHmzVrFjyf44WoDqo80LwZ0/fOOOMMmT59ujz33HPqBBaLRU1Puvvuu6Vbt27qg8Utt9yipiudfPLJyd58ooQ64YQTVA8pLI6B6Xu//PKLPPzwwzJq1Ch1OccLZbMdO3bI0qVLQ5qb4w+CeL+FMVPf2ECV7rHHHisXXXSRmkKOhWnwh3lUJuJ6KSnZy/9R03j88cf97du39zudTv+AAQP806ZNS/YmESUVftxFOr300kvB61RVVfkvu+wyf2lpqT8vL89/yimn+NesWZPU7SZKFYcddpj/qquuCv6f44Uo1EcffeTv3bu3Wpq7e/fu/ueeey7kcizlfcstt/hbtmyprnPUUUf5Fy9enLTtJUqWbdu2qd8n+KySk5Pj79y5s/+mm27y19TUBK/D8ULZavLkyRE/s5x//vmGx8amTZv8I0aM8BcUFPiLior8I0eO9G/fvt2fqiz4J9nBGBERERERERERZRf2lCIiIiIiIiIiooRjKEVERERERERERAnHUIqIiIiIiIiIiBKOoRQRERERERERESUcQykiIiIiIiIiIko4hlJERERERERERJRwDKWIiIiIiIiIiCjhGEoREREREREREVHCMZQiIiIiaoQLLrhATj755GRvBhEREVHaYShFREREFIXFYol5uv322+XRRx+Vl19+OSnb9/zzz8s+++wjBQUFUlJSIv369ZN77703eDkDMyIiIkpl9mRvABEREVGqWrNmTfD7t956S2699VZZvHhx8DyEQTglw4svvihjx46Vxx57TA477DCpqamRuXPnyq+//pqU7SEiIiIyi5VSRERERFG0atUqeCouLlbVUfrzEEiFVyMdfvjhcsUVV6jAqLS0VFq2bKkqmiorK2XkyJFSWFgoXbt2lU8//TTksRAmDRkyRN0nbnPuuefKxo0bo27bhx9+KGeccYaMHj1a3V+vXr1kxIgRMm7cOHU5qrheeeUV+eCDD4KVXd9884267M8//1S3RXVVWVmZnHTSSfL7778H71vbpzvuuENatGghRUVFcskll0htbW3wOv/73/9k7733ltzcXGnWrJkMGjRI7SMRERGRUQyliIiIiOIMYVDz5s1l+vTpKqC69NJLZdiwYXLQQQfJrFmz5JhjjlGh086dO9X1t27dKkceeaSafjdz5kz57LPPZN26dSo4igah2LRp0+SPP/6IePm1116rbn/ssceqii+c8Phut1sGDx6swrHvvvtOfvjhBxWE4Xr60Omrr76ShQsXqiDrjTfekPfee0+FVID7QgA2atSo4HVOPfVU8fv9cT+WRERElLksfr57ICIiIqoX+kah+gkBkh6qinDehAkTgpVSXq9XBT6A71FlhdDm1VdfVeetXbtWWrduLVOnTpUDDzxQ7r77bnX9zz//PHi/q1atknbt2qnpgnvuuedu24NgCPeJYAqXDxw4UI477jg5/fTTxWq1Rtw2eO2119TjIUxC9RQgjELVFK6HwAy3++ijj1RFVV5enrrOM888I9ddd51UVFTI7NmzZb/99lPVVR06dGiCo01ERETZgJVSRERERHHWp0+f4Pc2m01Nb8NUNw2m58H69evV1zlz5sjkyZODPapw6t69u7ps2bJlER9DC7XmzZsnV111lXg8Hjn//PNVxZPP54u6bXispUuXqkop7bEwha+6ujrksdBAXQukAKHXjh07VFCFy4466ii1T6gAw/TELVu2NOqYERERUfZho3MiIiKiOHM4HCH/R0WS/jytQkkLjxD2nHDCCXL//fdHDJ9i6d27tzpddtllqu/TIYccIt9++60cccQREa+Px0KV0/jx43e7DP2jjEDQNmnSJPnxxx/liy++kMcff1xuuukm+emnn6RTp06G7oOIiIiIoRQRERFRku27777y7rvvSseOHcVub/jbs549e6qvWsNxp9Oppg+GPxZWEiwvL1cNzGNVVFVVValG5oBpgqiqwpRCLVg7+OCD1QmrEmIa3/vvvy/XXHNNg7efiIiIsgun7xEREREl2ZgxY2Tz5s2qefiMGTPUNDr0l8JqfeGhkgbN0++66y7VqBzNzhEanXfeearaCVPtACHX3LlzVV8qrOSHJudnn322asKOFffQx2rFihWqUfmVV16p+lhp0GcKK/stWLBAJk6cKLfddptcfvnlql8VKqLuuece1ZR95cqVqgn6hg0bpEePHgk7ZkRERJT+GEoRERERJVmbNm1UuIQACo3G0asJTdXRfFxrWh5u0KBBKohCTyc0Oj/ttNMkJydHrZqHHlZw0UUXyV577SX9+/dXYRUeA32ipkyZIu3bt1eN0hEkIXxCTyl95RR6RnXr1k0OPfRQGT58uJx44oly++23q8twPdwHGqvjsW+++WZ56KGHZMiQIQk6YkRERJQJuPoeEREREYWItGofERERUbyxUoqIiIiIiIiIiBKOoRQRERERERERESUcp+8REREREREREVHCsVKKiIiIiIiIiIgSjqEUERERERERERElHEMpIiIiIiIiIiJKOIZSRERERERERESUcAyliIiIiIiIiIgo4RhKERERERERERFRwjGUIiIiIiIiIiKihGMoRURERERERERECcdQioiIiIiIiIiIJNH+H9HUdjWEmj1XAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# --- 1. Generate Sample Data (Replace with your actual data) ---\n", - "# Let's imagine a time series of 100 steps\n", - "time_steps = np.arange(100)\n", - "\n", - "# Actual values (optional, for context)\n", - "actual_values = pd.Series(np.sin(time_steps / 10) * 10 + np.random.normal(0, 1, 100), index=time_steps)\n", - "\n", - "# Quantile predictions from your LSTLM\n", - "# For demonstration, we'll create some plausible quantile forecasts\n", - "# In a real scenario, these would be the output of your model\n", - "data = {}\n", - "data['q_0.05'] = actual_values - np.abs(np.random.normal(0, 3, 100)) - 2\n", - "data['q_0.25'] = actual_values - np.abs(np.random.normal(0, 1.5, 100)) - 1\n", - "data['q_0.50'] = actual_values + np.random.normal(0, 0.5, 100) # Median forecast\n", - "data['q_0.75'] = actual_values + np.abs(np.random.normal(0, 1.5, 100)) + 1\n", - "data['q_0.95'] = actual_values + np.abs(np.random.normal(0, 3, 100)) + 2\n", - "\n", - "# Ensure the quantiles are ordered correctly (lower < median < upper)\n", - "data['q_0.05'] = np.minimum(data['q_0.05'], data['q_0.25'])\n", - "data['q_0.25'] = np.minimum(data['q_0.25'], data['q_0.50'])\n", - "data['q_0.95'] = np.maximum(data['q_0.95'], data['q_0.75'])\n", - "data['q_0.75'] = np.maximum(data['q_0.75'], data['q_0.50'])\n", - "\n", - "\n", - "predictions_df = pd.DataFrame(data, index=time_steps)\n", - "\n", - "# --- 2. Select Quantiles for Plotting ---\n", - "median_quantile_col = 'q_0.50' # Your median quantile column name\n", - "\n", - "# For the range, choose two quantiles. E.g., 0.05 and 0.95 for a 90% interval\n", - "lower_quantile_col = 'q_0.05'\n", - "upper_quantile_col = 'q_0.95'\n", - "# Or, for a 50% interval (interquartile range):\n", - "# lower_quantile_col = 'q_0.25'\n", - "# upper_quantile_col = 'q_0.75'\n", - "\n", - "# Extract the series\n", - "median_forecast = predictions_df[median_quantile_col]\n", - "lower_bound = predictions_df[lower_quantile_col]\n", - "upper_bound = predictions_df[upper_quantile_col]\n", - "\n", - "# --- 3. Create the Plot ---\n", - "plt.figure(figsize=(12, 6))\n", - "\n", - "# Plot actual values (if you have them)\n", - "plt.plot(actual_values.index, actual_values, label='Actual Values', color='black', linestyle=':')\n", - "\n", - "# Plot the median forecast as a line\n", - "plt.plot(median_forecast.index, median_forecast, label=f'Median Forecast ({median_quantile_col})', color='blue', linewidth=2)\n", - "\n", - "# Plot the prediction interval as a shaded range\n", - "# The 'alpha' parameter controls the transparency of the fill\n", - "fill_alpha = 0.3 # You can adjust this value (0.0 to 1.0)\n", - "plt.fill_between(median_forecast.index, lower_bound, upper_bound,\n", - " color='skyblue', alpha=fill_alpha,\n", - " label=f'Prediction Interval ({lower_quantile_col}-{upper_quantile_col})')\n", - "\n", - "# --- 4. Customize and Show Plot ---\n", - "plt.title('Time Series Forecast with Median and Prediction Interval')\n", - "plt.xlabel('Time Steps')\n", - "plt.ylabel('Value')\n", - "plt.legend()\n", - "plt.grid(True, linestyle='--', alpha=0.7)\n", - "plt.tight_layout() # Adjusts plot to prevent labels from overlapping\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "line": { - "color": "rgba(0,0,0,0.7)", - "width": 2 - }, - "marker": { - "size": 4 - }, - "mode": "lines+markers", - "name": "Sample Sine Wave Data - Historical Data", - "type": "scatter", - "x": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99 - ], - "y": { - "bdata": "XeR+np/X5z8HfDucXE/pPxxHFHRyqgdAMFTVMoD1FECwCYbu91cMQG+Z4eKuxRFAmV5TDs4HIECkyOSgkV8eQKOXXByd4BlAbH1c5FFLIUCYNWly2uAeQMRKlx1NbSBAcy8y/d1dI0C3EZ2QCRAbQLuDvAyIER1Azqb8ZlZDIkB0in1p9vMgQLvNnnCqxiRAViXxxLzAIEABP1l90GAdQCjjsJg4lSZASMCqWjyWIEAG2t79XF8gQClMSbCbRxVAHLfeM5LAF0CB475au5oYQIQWtqadbQtANrVqL3FZE0DLaL4vZZcDQCDOvnJ8R/8/6hjKu8dG4D9Ie7pCxY0JQFQ/OR3dU+O/CEFYd+tPCcBl3KZiPyX1vx5r6XA8WxXAQkqTSJhyEMAt2numyXkgwHIJpWDCOCDAAy6Mu1hUGsDIiGV1X9cZwL3Il5nvsx/AWyKGLEnHIcCWvnhpBDojwBdcLB+1dyfA5FfsZ8u1JcAmVJTwd0ElwEF/urm80yDArqN7xXbkIsBER1gWLPAowJ0/Z7nLNCLAbQ7RE+qrI8BlHIz3KbMjwFs6mULinh3A/KfiOn65GMAoP0NjSaIWwCqHb181SR7Ac0XEXPjhF8C63N+ntJgQwGKFRZUeNALAoF6k4XMaDMB/P4xPCM0AwL3ymP5U7APAKq94z8sE+r9QrXzNARMDQMKMr2sDvhBANEaF6yYPCEDG5cb3FjcWQAMaDpMx7xVAb+/9uVFEE0Bvwtd7pXIcQDrQ8ZeIMSNAB8wuUCGIH0AEQU2/4bMlQO3s6qjXOhRAME3o78c5JUASfpDSmZ4jQJJpXqHI3SJAHEbrogM/JEC/bJDkQAgcQCAr92POICNANvdMKRl4JECaGsklkD8nQC4vSZgWfSBAEsAcJD9VHUA9aqsoz+0cQFqX+1ckbyFACF09QcR9HECGHkoj1zcUQKD2txTVHhdAvl7dUzQREUD+imrrZ5MSQDrMtBso0PI/c4lMcf4Y6D97TiiIPsnVv2KDTEsDkwfAlvKy3Q/J9L91gRgispsCwFizE7bIQQ3AtuW/Tn61E8A=", - "dtype": "f8" - } - }, - { - "fill": "toself", - "fillcolor": "rgba(0,100,200,0.3)", - "hoverinfo": "skip", - "line": { - "color": "rgba(255,255,255,0)" - }, - "name": "Sample Sine Wave Data - Prediction Interval (Q1-Q9)", - "showlegend": true, - "type": "scatter", - "x": [ - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 128, - 127, - 126, - 125, - 124, - 123, - 122, - 121, - 120, - 119, - 118, - 117, - 116, - 115, - 114, - 113, - 112, - 111, - 110, - 109, - 108, - 107, - 106, - 105, - 104, - 103, - 102, - 101, - 100, - 99 - ], - "y": [ - -2.634925008841142, - -2.3479090086336987, - -2.0377682438699054, - -1.9884586163079452, - -1.6636742371319753, - -1.1134190209079584, - 0.11081013201596601, - 0.4049203264743535, - 0.6619432679418251, - 0.6732683657321221, - -0.31521765002242574, - -0.4300766337592181, - -0.566027975325583, - 0.445669463457687, - 0.08846253773600754, - -0.0485000752892617, - -0.36484426311677876, - -1.2435171991250469, - -0.9460644744035775, - -0.808772853355924, - -0.6031460885648201, - -1.1873863701735097, - -0.546041817657315, - -1.231145208541352, - -0.8426638720459696, - 0.4270446092044242, - 0.18271568452504994, - 0.220947156051996, - 0.6537685379631482, - 0.8353596278221778, - -10.964640372177822, - -10.946231462036852, - -11.179052843948003, - -11.01728431547495, - -10.572955390795576, - -11.64266387204597, - -11.83114520854135, - -10.946041817657315, - -11.387386370173509, - -10.60314608856482, - -10.608772853355925, - -10.546064474403579, - -10.643517199125046, - -9.564844263116779, - -9.048500075289262, - -8.711537462263994, - -8.154330536542313, - -8.96602797532558, - -8.630076633759217, - -8.315217650022426, - -7.126731634267879, - -6.9380567320581745, - -6.995079673525646, - -7.089189867984033, - -8.113419020907958, - -8.463674237131976, - -8.588458616307946, - -8.437768243869906, - -8.547909008633699, - -8.634925008841142 - ] - }, - { - "line": { - "color": "rgba(255,0,0,0.8)", - "width": 2.5 - }, - "mode": "lines", - "name": "Sample Sine Wave Data - Median Forecast (Q5)", - "type": "scatter", - "x": [ - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128 - ], - "y": { - "bdata": "dooRyCmKFsB+qb6oqMoVwF3LvYR58xTADCsNsmEnFcB+UbjRM0EUwBQtph0kdBLANjWkYNzpC8BbDly7UlwKwMB16Xy9GgnAgDHRrFjQCcCI32dqyEIRwHt6uWjMHhLAvWA3o2kQE8AOY5M/q9UOwFmcL60DPxHAOOL0AKoxEsB1R28iANwTwIjSZV8pxhfATBVZU/j7FsBA0wWNyNUWwIhi1CCfaRbActjUnEgmGcBxJeFi8vsWwOZykIfkHxrAxG7J4Hz4GMC2ImbRtEoUwAZlYJRMqxXA9z8n1IzqFcDQYEyzvZUUwCMF8hUxQhTA", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "legend": { - "orientation": "h", - "x": 1, - "xanchor": "right", - "y": 1.02, - "yanchor": "bottom" - }, - "margin": { - "b": 50, - "l": 50, - "r": 50, - "t": 80 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "font": { - "color": "#333", - "family": "Arial", - "size": 18 - }, - "text": "Timeseries Forecast: Sample Sine Wave Data", - "x": 0.5 - }, - "xaxis": { - "title": { - "text": "Time Step" - } - }, - "yaxis": { - "title": { - "text": "Value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import plotly.graph_objects as go\n", - "import numpy as np\n", - "import pandas as pd # Included for the sample data generation\n", - "\n", - "def plot_forecast_plotly_with_interval(timeseries, quantile_predictions, timeseries_name,\n", - " idx_lower_quantile=0,\n", - " idx_median_quantile=4,\n", - " idx_upper_quantile=8,\n", - " interval_opacity=0.3):\n", - " \"\"\"\n", - " Creates an interactive Plotly figure to visualize time series forecasts\n", - " with a median line and a shaded prediction interval.\n", - "\n", - " Args:\n", - " timeseries (array-like): The historical time series data.\n", - " quantile_predictions (np.ndarray): A 2D NumPy array of quantile forecasts.\n", - " Shape: (num_forecast_steps, num_quantiles).\n", - " Assumed to have 9 quantiles unless indices are changed.\n", - " timeseries_name (str): Name of the time series for titles and legend.\n", - " idx_lower_quantile (int): Column index in quantile_predictions for the lower bound of the interval.\n", - " Defaults to 0 (e.g., 0.05 quantile for 9 quantiles).\n", - " idx_median_quantile (int): Column index in quantile_predictions for the median forecast.\n", - " Defaults to 4 (e.g., 0.5 quantile for 9 quantiles).\n", - " idx_upper_quantile (int): Column index in quantile_predictions for the upper bound of the interval.\n", - " Defaults to 8 (e.g., 0.95 quantile for 9 quantiles).\n", - " interval_opacity (float): Opacity for the shaded prediction interval (0.0 to 1.0).\n", - " Defaults to 0.3.\n", - " Returns:\n", - " plotly.graph_objects.Figure: The Plotly figure object.\n", - " \"\"\"\n", - " if not isinstance(quantile_predictions, np.ndarray):\n", - " quantile_predictions = np.array(quantile_predictions)\n", - "\n", - " if quantile_predictions.ndim != 2:\n", - " raise ValueError(\"quantile_predictions must be a 2D array.\")\n", - " \n", - " num_quantiles = quantile_predictions.shape[1]\n", - " if not (0 <= idx_lower_quantile < num_quantiles and \\\n", - " 0 <= idx_median_quantile < num_quantiles and \\\n", - " 0 <= idx_upper_quantile < num_quantiles):\n", - " raise ValueError(f\"Quantile indices are out of bounds for {num_quantiles} available quantiles.\")\n", - " if not idx_lower_quantile < idx_median_quantile < idx_upper_quantile:\n", - " print(\"Warning: Quantile indices are not ordered as lower < median < upper. \"\n", - " \"The plot might look unusual.\")\n", - "\n", - "\n", - " fig = go.Figure()\n", - " x_hist = list(range(len(timeseries)))\n", - " num_forecast_steps = quantile_predictions.shape[0]\n", - "\n", - " # Historical data trace\n", - " fig.add_trace(go.Scatter(\n", - " x=x_hist,\n", - " y=timeseries,\n", - " mode='lines+markers',\n", - " name=f\"{timeseries_name} - Historical Data\",\n", - " line=dict(color='rgba(0,0,0,0.7)', width=2), # Dark gray for historical\n", - " marker=dict(size=4)\n", - " ))\n", - "\n", - " # Define x-axis for predictions\n", - " # Predictions typically start at the last point of historical data or one step after.\n", - " # This matches the original logic: connecting to the last historical point.\n", - " start_x_pred = len(timeseries) -1\n", - " if start_x_pred < 0: # Handle case where timeseries might be empty or very short\n", - " start_x_pred = 0\n", - " \n", - " x_pred = list(range(start_x_pred, start_x_pred + num_forecast_steps))\n", - " \n", - " # Ensure x_pred aligns with quantile_predictions length\n", - " if len(x_pred) != num_forecast_steps:\n", - " # If historical data is shorter than one step, predictions start from 0\n", - " if len(timeseries) == 0:\n", - " x_pred = list(range(num_forecast_steps))\n", - " else: # Fallback if lengths don't match for other reasons, adjust x_pred\n", - " x_pred = list(range(x_hist[-1] if x_hist else 0, (x_hist[-1] if x_hist else 0) + num_forecast_steps))\n", - "\n", - "\n", - " # Extract specific quantile series\n", - " lower_bound_series = quantile_predictions[:, idx_lower_quantile]\n", - " median_forecast_series = quantile_predictions[:, idx_median_quantile]\n", - " upper_bound_series = quantile_predictions[:, idx_upper_quantile]\n", - "\n", - " # --- Prediction Interval (Shaded Area) ---\n", - " # Plot the upper bound, then the lower bound in reverse, then fill to self\n", - " # This creates the shaded region.\n", - " # Ensure x_pred, upper_bound_series, and lower_bound_series are compatible for concatenation\n", - " # Convert to list for concatenation if they are numpy arrays\n", - " x_pred_list = list(x_pred)\n", - " \n", - " fig.add_trace(go.Scatter(\n", - " x=x_pred_list + x_pred_list[::-1], # x, then x reversed\n", - " y=list(upper_bound_series) + list(lower_bound_series[::-1]), # upper, then lower reversed\n", - " fill='toself',\n", - " fillcolor=f'rgba(0,100,200,{interval_opacity})', # Sky blue with specified opacity\n", - " line=dict(color='rgba(255,255,255,0)'), # No border line for the fill area\n", - " hoverinfo=\"skip\", # Optional: skip hover labels for the fill shape itself\n", - " showlegend=True,\n", - " name=f\"{timeseries_name} - Prediction Interval (Q{idx_lower_quantile+1}-Q{idx_upper_quantile+1})\"\n", - " ))\n", - "\n", - " # --- Median Forecast Line ---\n", - " fig.add_trace(go.Scatter(\n", - " x=x_pred,\n", - " y=median_forecast_series,\n", - " mode='lines',\n", - " name=f\"{timeseries_name} - Median Forecast (Q{idx_median_quantile+1})\",\n", - " line=dict(color='rgba(255,0,0,0.8)', width=2.5), # Red, slightly thicker for median\n", - " ))\n", - "\n", - " fig.update_layout(\n", - " title=dict(text=f\"Timeseries Forecast: {timeseries_name}\", x=0.5, font=dict(size=18, family=\"Arial\", color=\"#333\")),\n", - " xaxis_title=\"Time Step\",\n", - " yaxis_title=\"Value\",\n", - " hovermode='x unified',\n", - " legend=dict(\n", - " orientation=\"h\",\n", - " yanchor=\"bottom\",\n", - " y=1.02,\n", - " xanchor=\"right\",\n", - " x=1\n", - " ),\n", - " margin=dict(l=50, r=50, t=80, b=50) # Adjust margins\n", - " )\n", - " return fig\n", - "\n", - "if __name__ == '__main__':\n", - " # --- Generate Sample Data (Replace with your actual data) ---\n", - " np.random.seed(42)\n", - " series_length = 100\n", - " forecast_horizon = 30\n", - "\n", - " # Historical time series\n", - " time_hist = np.arange(series_length)\n", - " historical_data = pd.Series(np.sin(time_hist / 10) * 10 + np.random.normal(0, 1.5, series_length))\n", - "\n", - " # Quantile predictions (9 quantiles for the forecast horizon)\n", - " # For demonstration, create plausible quantile forecasts\n", - " # These would come from your LSTLM model\n", - " num_quantiles = 9\n", - " predictions_array = np.zeros((forecast_horizon, num_quantiles))\n", - " \n", - " # Simulate a base forecast trend\n", - " last_hist_val = historical_data.iloc[-1]\n", - " base_forecast = last_hist_val + np.cumsum(np.random.normal(0, 0.5, forecast_horizon)) \\\n", - " + np.sin(np.arange(forecast_horizon)/5) * 2\n", - "\n", - "\n", - " # Generate quantiles around the base forecast\n", - " # q_levels = [0.05, 0.1, 0.2, 0.25, 0.5, 0.75, 0.8, 0.9, 0.95] # Example quantile levels\n", - " # For simplicity, let's assume indices 0, 4, 8 are 0.05, 0.5, 0.95\n", - " \n", - " predictions_array[:, 4] = base_forecast # Median (index 4)\n", - "\n", - " # Spread for other quantiles, increasing with distance from median and over time\n", - " for i in range(forecast_horizon):\n", - " spread_factor = 1.0 + (i / forecast_horizon) # Increasing uncertainty over time\n", - " predictions_array[i, 0] = base_forecast[i] - 3.0 * spread_factor # 0.05 quantile (index 0)\n", - " predictions_array[i, 1] = base_forecast[i] - 2.0 * spread_factor\n", - " predictions_array[i, 2] = base_forecast[i] - 1.0 * spread_factor\n", - " predictions_array[i, 3] = base_forecast[i] - 0.5 * spread_factor\n", - " # predictions_array[i, 4] is median\n", - " predictions_array[i, 5] = base_forecast[i] + 0.5 * spread_factor\n", - " predictions_array[i, 6] = base_forecast[i] + 1.0 * spread_factor\n", - " predictions_array[i, 7] = base_forecast[i] + 2.0 * spread_factor\n", - " predictions_array[i, 8] = base_forecast[i] + 3.0 * spread_factor # 0.95 quantile (index 8)\n", - " \n", - " # Ensure quantiles are sorted within each time step (monotonicity)\n", - " for q_idx in range(num_quantiles -1):\n", - " if predictions_array[i, q_idx] > predictions_array[i, q_idx+1]:\n", - " predictions_array[i, q_idx+1] = predictions_array[i, q_idx] + np.random.uniform(0.01, 0.1) # Ensure increasing\n", - "\n", - " # --- Use the function ---\n", - " fig = plot_forecast_plotly_with_interval(\n", - " timeseries=historical_data,\n", - " quantile_predictions=predictions_array,\n", - " timeseries_name=\"Sample Sine Wave Data\"\n", - " )\n", - " # To display in a script/notebook, you might need:\n", - " # fig.show()\n", - "\n", - " # If you're in an environment that doesn't automatically render Plotly,\n", - " # you might need to install `kaleido` to save as an image or use `fig.to_html()`\n", - " try:\n", - " fig.show() # This usually works in notebooks or IDEs with Plotly support\n", - " except Exception as e:\n", - " print(f\"Could not show figure directly: {e}\")\n", - " print(\"Try saving to HTML: fig.to_html('forecast_plot.html')\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting nbformat\n", - " Downloading nbformat-5.10.4-py3-none-any.whl.metadata (3.6 kB)\n", - "Collecting fastjsonschema>=2.15 (from nbformat)\n", - " Downloading fastjsonschema-2.21.1-py3-none-any.whl.metadata (2.2 kB)\n", - "Collecting jsonschema>=2.6 (from nbformat)\n", - " Downloading jsonschema-4.24.0-py3-none-any.whl.metadata (7.8 kB)\n", - "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in ./.conda/lib/python3.11/site-packages (from nbformat) (5.8.1)\n", - "Requirement already satisfied: traitlets>=5.1 in ./.conda/lib/python3.11/site-packages (from nbformat) (5.14.3)\n", - "Collecting attrs>=22.2.0 (from jsonschema>=2.6->nbformat)\n", - " Using cached attrs-25.3.0-py3-none-any.whl.metadata (10 kB)\n", - "Collecting jsonschema-specifications>=2023.03.6 (from jsonschema>=2.6->nbformat)\n", - " Downloading jsonschema_specifications-2025.4.1-py3-none-any.whl.metadata (2.9 kB)\n", - "Collecting referencing>=0.28.4 (from jsonschema>=2.6->nbformat)\n", - " Downloading referencing-0.36.2-py3-none-any.whl.metadata (2.8 kB)\n", - "Collecting rpds-py>=0.7.1 (from jsonschema>=2.6->nbformat)\n", - " Downloading rpds_py-0.25.1-cp311-cp311-macosx_11_0_arm64.whl.metadata (4.1 kB)\n", - "Requirement already satisfied: platformdirs>=2.5 in ./.conda/lib/python3.11/site-packages (from jupyter-core!=5.0.*,>=4.12->nbformat) (4.3.8)\n", - "Requirement already satisfied: typing-extensions>=4.4.0 in ./.conda/lib/python3.11/site-packages (from referencing>=0.28.4->jsonschema>=2.6->nbformat) (4.14.0)\n", - "Downloading nbformat-5.10.4-py3-none-any.whl (78 kB)\n", - "Downloading fastjsonschema-2.21.1-py3-none-any.whl (23 kB)\n", - "Downloading jsonschema-4.24.0-py3-none-any.whl (88 kB)\n", - "Using cached attrs-25.3.0-py3-none-any.whl (63 kB)\n", - "Downloading jsonschema_specifications-2025.4.1-py3-none-any.whl (18 kB)\n", - "Downloading referencing-0.36.2-py3-none-any.whl (26 kB)\n", - "Downloading rpds_py-0.25.1-cp311-cp311-macosx_11_0_arm64.whl (359 kB)\n", - "Installing collected packages: fastjsonschema, rpds-py, attrs, referencing, jsonschema-specifications, jsonschema, nbformat\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7/7\u001b[0m [nbformat]\n", - "\u001b[1A\u001b[2KSuccessfully installed attrs-25.3.0 fastjsonschema-2.21.1 jsonschema-4.24.0 jsonschema-specifications-2025.4.1 nbformat-5.10.4 referencing-0.36.2 rpds-py-0.25.1\n" - ] - } - ], - "source": [ - "!pip install nbformat" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.11" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -}