From 00ae1d8b8fc7d75fdd38f0ca446eedde937e13e6 Mon Sep 17 00:00:00 2001 From: wassname Date: Tue, 22 Nov 2022 15:07:42 +0800 Subject: [PATCH] misc --- mjc_notes.md | 17 ++ models/DeepTIMe.py | 9 +- scratch-single-stocks.ipynb | 556 ++++++++++++++++++++++++++++++++++++ scratch-single.ipynb | 38 +-- 4 files changed, 599 insertions(+), 21 deletions(-) create mode 100644 scratch-single-stocks.ipynb diff --git a/mjc_notes.md b/mjc_notes.md index c0fe558..be810b0 100644 --- a/mjc_notes.md +++ b/mjc_notes.md @@ -46,3 +46,20 @@ python -m experiments.forecast --config_path=storage/experiments/Stocks/96S/repe make build-all path=experiments/configs/Stocks ./run.sh ``` + +# So how does deeptime work? + +original: +- inr(coords) +- RR + +My mods (I added past other variables): +- inr(concat([x, coords])) +- RR + +Where INR is one of [mlp, lstm, lstm2, transformer, transforme2, inceptioncausal] + +TODO: +- M2S mode +- add other INR's +- add None as learner diff --git a/models/DeepTIMe.py b/models/DeepTIMe.py index 327f371..115d759 100644 --- a/models/DeepTIMe.py +++ b/models/DeepTIMe.py @@ -36,18 +36,23 @@ class DeepTIMe(nn.Module): def forward(self, x: Tensor, x_time: Tensor, y_time: Tensor) -> Tensor: tgt_horizon_len = y_time.shape[1] batch_size, lookback_len, _ = x.shape + + # relative coordinates are the same for each batch, so we make them once and repeat them coords = self.get_coords(lookback_len, tgt_horizon_len).to(x.device) - if y_time.shape[-1] != 0: + if y_time.shape[-1] != 0: # if y_time is not empty of features time = torch.cat([x_time, y_time], dim=1) coords = repeat(coords, '1 t 1 -> b t 1', b=time.shape[0]) coords = torch.cat([coords, time], dim=-1) time_reprs = self.inr(coords) else: - time_reprs = repeat(self.inr(coords), '1 t d -> b t d', b=batch_size) + a = self.inr(coords) + time_reprs = repeat(a, '1 t d -> b t d', b=batch_size) + print(coords.shape, a.shape, batch_size, time_reprs.shape) lookback_reprs = time_reprs[:, :-tgt_horizon_len] horizon_reprs = time_reprs[:, -tgt_horizon_len:] + w, b = self.adaptive_weights(lookback_reprs, x) preds = self.forecast(horizon_reprs, w, b) return preds diff --git a/scratch-single-stocks.ipynb b/scratch-single-stocks.ipynb new file mode 100644 index 0000000..7b0469e --- /dev/null +++ b/scratch-single-stocks.ipynb @@ -0,0 +1,556 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b1e031e3", + "metadata": {}, + "source": [ + "- [x] try just one predictor\n", + " - [ ] multi input, single output\n", + "- [x] comparem ulti\n", + "- losses:\n", + " - try logp? nah\n", + " - mae?\n", + "- [x] make my own csv with 5m data (maybe 10k rows)\n", + "- [ ] backtest?" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "8f9ebcf0", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T02:31:36.717738Z", + "start_time": "2022-11-22T02:31:36.708540Z" + } + }, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.simplefilter(\"ignore\")\n", + "\n", + "# autoreload import your package\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4e09086b", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T02:31:38.523459Z", + "start_time": "2022-11-22T02:31:36.718873Z" + }, + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "import os\n", + "from os.path import join\n", + "import math\n", + "import logging\n", + "from typing import Callable, Optional, Union, Dict, Tuple\n", + "\n", + "from matplotlib import pyplot as plt\n", + "from pathlib import Path\n", + "import matplotlib.colors as mcolors\n", + "\n", + "import gin\n", + "from fire import Fire\n", + "import numpy as np\n", + "import torch\n", + "from torch.utils.data import DataLoader\n", + "from torch import optim\n", + "from torch import nn\n", + "\n", + "from experiments.base import Experiment\n", + "from data.datasets import ForecastDataset\n", + "from models import get_model\n", + "from utils.checkpoint import Checkpoint\n", + "from utils.ops import default_device, to_tensor\n", + "from utils.losses import get_loss_fn\n", + "from utils.metrics import calc_metrics\n", + "\n", + "from experiments.forecast import get_data\n", + "gin.enter_interactive_mode()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66d7f095", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-19T23:55:34.939075Z", + "start_time": "2022-11-19T23:55:34.820277Z" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "d4df5270", + "metadata": {}, + "source": [ + "# auto" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "04499bef", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T02:31:38.542165Z", + "start_time": "2022-11-22T02:31:38.525217Z" + } + }, + "outputs": [], + "source": [ + "\n", + "\n", + "def plot(model_name=\"deeptime\", save_path=Path(\"storage/experiments/Exchange/96M/repeat=0\"), i=200, title=None, plot=True):\n", + "\n", + " gin.clear_config()\n", + " gin.parse_config(open(save_path/\"config.gin\"))\n", + "\n", + " train_set, train_loader = get_data(flag='train', batch_size=2)\n", + "\n", + " model = get_model(model_name,\n", + " dim_size=train_set.data_x.shape[1],\n", + " datetime_feats=train_set.timestamps.shape[-1]).to(default_device())\n", + " model.load_state_dict(torch.load(save_path/'model.pth'))\n", + " model = model.eval()\n", + "\n", + "\n", + " b = train_set[i]\n", + " b = [bb[None, :] for bb in b]\n", + " x, y, x_time, y_time = map(to_tensor, b)\n", + " with torch.no_grad():\n", + " forecast = model(x, x_time, y_time)\n", + "\n", + " if title is None:\n", + " title = str(save_path).split('/')[-3:]\n", + " title = \"-\".join(title)\n", + " \n", + " colors = list(mcolors.BASE_COLORS.keys())\n", + " l = x.shape[1]\n", + " forecast2 = forecast[0].detach().cpu().numpy()\n", + " x2 = x[0].cpu()\n", + " y2 = y[0].cpu()\n", + " l2 = y.shape[1]\n", + " i_past = list(range(l))\n", + " i_future = list(range(l, l+l2))\n", + " \n", + " if plot:\n", + " plt.title(title)\n", + " for i in range(x.shape[-1]):\n", + " plt.plot(i_past, x2[:, i], c=colors[i])\n", + " for i in range(x.shape[-1]):\n", + " plt.plot(i_future, y2[:, i], c=colors[i])\n", + " for i in range(x.shape[-1]):\n", + " plt.plot(i_future, forecast2[:, i], c=colors[i], linestyle='--')\n", + " return x2, y2, forecast2, i_past, i_future\n" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "768530be", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T02:39:04.239175Z", + "start_time": "2022-11-22T02:39:04.167600Z" + } + }, + "outputs": [], + "source": [ + "\n", + "\n", + "def plot_multi(save_paths=[Path(\"storage/experiments/Exchange/96M/repeat=0\")], i=200, title=None, plot=True):\n", + " for j in range(len(save_paths)):\n", + " save_path = save_paths[j]\n", + "\n", + " gin.clear_config()\n", + " gin.parse_config(open(save_path/\"config.gin\"))\n", + " model_name = gin.query_parameter(\"instance.model_type\")\n", + "\n", + " train_set, train_loader = get_data(flag='test', batch_size=3)\n", + "\n", + " model = get_model(model_name,\n", + " dim_size=train_set.data_x.shape[1],\n", + " datetime_feats=train_set.timestamps.shape[-1]).to(default_device())\n", + " model.load_state_dict(torch.load(save_path/'model.pth'))\n", + " model = model.eval()\n", + "\n", + "\n", + " b = train_set[i]\n", + " b = [bb[None, :] for bb in b]\n", + " \n", + " b = next(iter(train_loader))\n", + " print([s.shape for s in b])\n", + " \n", + " x, y, x_time, y_time = map(to_tensor, b)\n", + "# print(b)\n", + " with torch.no_grad():\n", + " forecast = model(x, x_time, y_time)\n", + " \n", + " colors = list(mcolors.BASE_COLORS.keys())\n", + " l = x.shape[1]\n", + " forecast2 = forecast[0].detach().cpu().numpy()\n", + " x2 = x[0].cpu()\n", + " y2 = y[0].cpu()\n", + " l2 = y.shape[1]\n", + " i_past = list(range(l))\n", + " i_future = list(range(l, l+l2))\n", + "\n", + " if plot:\n", + " plt.plot(i_past, x2[:, 0], c=colors[0], label=f\"past\")\n", + " plt.plot(i_future, y2[:, 0], c=colors[0], label=\"future true\", alpha=0.3)\n", + " \n", + " mtitle = str(save_path).split('/')[-2:-1]\n", + " mtitle = \"-\".join(mtitle)\n", + " plt.plot(i_future, forecast2[:, 0], c=colors[j], linestyle='--', label=f\"{mtitle}\")\n", + " plt.legend()\n", + " plt.title(title)\n", + " return x2, y2, forecast2, i_past, i_future\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "739ee5e3", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T02:39:04.324202Z", + "start_time": "2022-11-22T02:39:04.306581Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Path('storage/experiments/Stocks/96M/repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96S/repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96Splus/repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96Splusshort/repeat=0/_SUCCESS'), Path('storage/experiments/Stocks/96Sshort/repeat=0/_SUCCESS')]\n" + ] + } + ], + "source": [ + "# list the models we have run...\n", + "m=sorted(Path(\"storage/experiments/Stocks\").glob(\"**/_SUCCESS\"))\n", + "print(m)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "bca39ab0", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T07:05:16.231276Z", + "start_time": "2022-11-22T07:05:15.779822Z" + } + }, + "outputs": [ + { + "ename": "IndexError", + "evalue": "only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices\n In call to configurable 'ForecastDataset' ()\n In call to configurable 'get_data' ()", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn [42], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m mm \u001b[38;5;129;01min\u001b[39;00m m:\n\u001b[0;32m----> 2\u001b[0m \u001b[43mplot_multi\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43msave_paths\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mmm\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparent\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m160\u001b[39;49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 8\u001b[0m plt\u001b[38;5;241m.\u001b[39mshow()\n\u001b[1;32m 9\u001b[0m \u001b[38;5;241m1\u001b[39m\n", + "Cell \u001b[0;32mIn [39], line 9\u001b[0m, in \u001b[0;36mplot_multi\u001b[0;34m(save_paths, i, title, plot)\u001b[0m\n\u001b[1;32m 6\u001b[0m gin\u001b[38;5;241m.\u001b[39mparse_config(\u001b[38;5;28mopen\u001b[39m(save_path\u001b[38;5;241m/\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mconfig.gin\u001b[39m\u001b[38;5;124m\"\u001b[39m))\n\u001b[1;32m 7\u001b[0m model_name \u001b[38;5;241m=\u001b[39m gin\u001b[38;5;241m.\u001b[39mquery_parameter(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124minstance.model_type\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m----> 9\u001b[0m train_set, train_loader \u001b[38;5;241m=\u001b[39m \u001b[43mget_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43mflag\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtest\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m3\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 11\u001b[0m model \u001b[38;5;241m=\u001b[39m get_model(model_name,\n\u001b[1;32m 12\u001b[0m dim_size\u001b[38;5;241m=\u001b[39mtrain_set\u001b[38;5;241m.\u001b[39mdata_x\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m],\n\u001b[1;32m 13\u001b[0m datetime_feats\u001b[38;5;241m=\u001b[39mtrain_set\u001b[38;5;241m.\u001b[39mtimestamps\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m])\u001b[38;5;241m.\u001b[39mto(default_device())\n\u001b[1;32m 14\u001b[0m model\u001b[38;5;241m.\u001b[39mload_state_dict(torch\u001b[38;5;241m.\u001b[39mload(save_path\u001b[38;5;241m/\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmodel.pth\u001b[39m\u001b[38;5;124m'\u001b[39m))\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/config.py:1605\u001b[0m, in \u001b[0;36m_make_gin_wrapper..gin_wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 1603\u001b[0m scope_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m in scope \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(scope_str) \u001b[38;5;28;01mif\u001b[39;00m scope_str \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 1604\u001b[0m err_str \u001b[38;5;241m=\u001b[39m err_str\u001b[38;5;241m.\u001b[39mformat(name, fn_or_cls, scope_info)\n\u001b[0;32m-> 1605\u001b[0m \u001b[43mutils\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maugment_exception_message_and_reraise\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merr_str\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/utils.py:41\u001b[0m, in \u001b[0;36maugment_exception_message_and_reraise\u001b[0;34m(exception, message)\u001b[0m\n\u001b[1;32m 39\u001b[0m proxy \u001b[38;5;241m=\u001b[39m ExceptionProxy()\n\u001b[1;32m 40\u001b[0m ExceptionProxy\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtype\u001b[39m(exception)\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m\n\u001b[0;32m---> 41\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m proxy\u001b[38;5;241m.\u001b[39mwith_traceback(exception\u001b[38;5;241m.\u001b[39m__traceback__) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28mNone\u001b[39m\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/config.py:1582\u001b[0m, in \u001b[0;36m_make_gin_wrapper..gin_wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 1579\u001b[0m new_kwargs\u001b[38;5;241m.\u001b[39mupdate(kwargs)\n\u001b[1;32m 1581\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1582\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mnew_args\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mnew_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1583\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[38;5;66;03m# pylint: disable=broad-except\u001b[39;00m\n\u001b[1;32m 1584\u001b[0m err_str \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/investing/DeepTime/experiments/forecast.py:115\u001b[0m, in \u001b[0;36mget_data\u001b[0;34m(flag, batch_size)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mno such flag \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mflag\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 115\u001b[0m dataset \u001b[38;5;241m=\u001b[39m \u001b[43mForecastDataset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mflag\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 116\u001b[0m data_loader \u001b[38;5;241m=\u001b[39m DataLoader(dataset,\n\u001b[1;32m 117\u001b[0m batch_size\u001b[38;5;241m=\u001b[39mbatch_size,\n\u001b[1;32m 118\u001b[0m shuffle\u001b[38;5;241m=\u001b[39mshuffle,\n\u001b[1;32m 119\u001b[0m drop_last\u001b[38;5;241m=\u001b[39mdrop_last)\n\u001b[1;32m 120\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m dataset, data_loader\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/config.py:1605\u001b[0m, in \u001b[0;36m_make_gin_wrapper..gin_wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 1603\u001b[0m scope_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m in scope \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(scope_str) \u001b[38;5;28;01mif\u001b[39;00m scope_str \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 1604\u001b[0m err_str \u001b[38;5;241m=\u001b[39m err_str\u001b[38;5;241m.\u001b[39mformat(name, fn_or_cls, scope_info)\n\u001b[0;32m-> 1605\u001b[0m \u001b[43mutils\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maugment_exception_message_and_reraise\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merr_str\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/utils.py:41\u001b[0m, in \u001b[0;36maugment_exception_message_and_reraise\u001b[0;34m(exception, message)\u001b[0m\n\u001b[1;32m 39\u001b[0m proxy \u001b[38;5;241m=\u001b[39m ExceptionProxy()\n\u001b[1;32m 40\u001b[0m ExceptionProxy\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtype\u001b[39m(exception)\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m\n\u001b[0;32m---> 41\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m proxy\u001b[38;5;241m.\u001b[39mwith_traceback(exception\u001b[38;5;241m.\u001b[39m__traceback__) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28mNone\u001b[39m\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/config.py:1582\u001b[0m, in \u001b[0;36m_make_gin_wrapper..gin_wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 1579\u001b[0m new_kwargs\u001b[38;5;241m.\u001b[39mupdate(kwargs)\n\u001b[1;32m 1581\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1582\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mnew_args\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mnew_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1583\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[38;5;66;03m# pylint: disable=broad-except\u001b[39;00m\n\u001b[1;32m 1584\u001b[0m err_str \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/investing/DeepTime/data/datasets.py:71\u001b[0m, in \u001b[0;36mForecastDataset.__init__\u001b[0;34m(self, flag, horizon_len, scale, cross_learn, data_path, root_path, features, target, lookback_len, lookback_aux_len, lookback_mult, time_features, normalise_time_features)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimestamps \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_time \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m---> 71\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_time_samples \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 72\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mload_data()\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/investing/DeepTime/data/datasets.py:105\u001b[0m, in \u001b[0;36mForecastDataset.load_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 103\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata_x \u001b[38;5;241m=\u001b[39m data[border1:border2] \n\u001b[1;32m 104\u001b[0m \u001b[38;5;66;03m# y is just the col we predict\u001b[39;00m\n\u001b[0;32m--> 105\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata_y \u001b[38;5;241m=\u001b[39m \u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[43mborder1\u001b[49m\u001b[43m:\u001b[49m\u001b[43mborder2\u001b[49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtarget\u001b[49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 106\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimestamps \u001b[38;5;241m=\u001b[39m get_time_features(pd\u001b[38;5;241m.\u001b[39mto_datetime(df_raw\u001b[38;5;241m.\u001b[39mdate[border1:border2]\u001b[38;5;241m.\u001b[39mvalues),\n\u001b[1;32m 107\u001b[0m normalise\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnormalise_time_features,\n\u001b[1;32m 108\u001b[0m features\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtime_features)\n\u001b[1;32m 109\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_time \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata_x)\n", + "\u001b[0;31mIndexError\u001b[0m: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices\n In call to configurable 'ForecastDataset' ()\n In call to configurable 'get_data' ()" + ] + } + ], + "source": [ + "for mm in m:\n", + " plot_multi(\n", + " save_paths=[\n", + " mm.parent\n", + " ],\n", + " i=160\n", + " )\n", + " plt.show()\n", + "1" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "b8843217", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T07:05:18.277499Z", + "start_time": "2022-11-22T07:05:18.146297Z" + } + }, + "outputs": [ + { + "ename": "IndexError", + "evalue": "only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices\n In call to configurable 'ForecastDataset' ()\n In call to configurable 'get_data' ()", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn [43], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mplot_multi\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[43msave_paths\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43mPath\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstorage/experiments/Stocks/96S/repeat=0\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mPath\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstorage/experiments/Stocks/96Splus/repeat=0\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m60\u001b[39;49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 8\u001b[0m \u001b[38;5;241m1\u001b[39m\n", + "Cell \u001b[0;32mIn [39], line 9\u001b[0m, in \u001b[0;36mplot_multi\u001b[0;34m(save_paths, i, title, plot)\u001b[0m\n\u001b[1;32m 6\u001b[0m gin\u001b[38;5;241m.\u001b[39mparse_config(\u001b[38;5;28mopen\u001b[39m(save_path\u001b[38;5;241m/\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mconfig.gin\u001b[39m\u001b[38;5;124m\"\u001b[39m))\n\u001b[1;32m 7\u001b[0m model_name \u001b[38;5;241m=\u001b[39m gin\u001b[38;5;241m.\u001b[39mquery_parameter(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124minstance.model_type\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m----> 9\u001b[0m train_set, train_loader \u001b[38;5;241m=\u001b[39m \u001b[43mget_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43mflag\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtest\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m3\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 11\u001b[0m model \u001b[38;5;241m=\u001b[39m get_model(model_name,\n\u001b[1;32m 12\u001b[0m dim_size\u001b[38;5;241m=\u001b[39mtrain_set\u001b[38;5;241m.\u001b[39mdata_x\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m],\n\u001b[1;32m 13\u001b[0m datetime_feats\u001b[38;5;241m=\u001b[39mtrain_set\u001b[38;5;241m.\u001b[39mtimestamps\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m])\u001b[38;5;241m.\u001b[39mto(default_device())\n\u001b[1;32m 14\u001b[0m model\u001b[38;5;241m.\u001b[39mload_state_dict(torch\u001b[38;5;241m.\u001b[39mload(save_path\u001b[38;5;241m/\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmodel.pth\u001b[39m\u001b[38;5;124m'\u001b[39m))\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/config.py:1605\u001b[0m, in \u001b[0;36m_make_gin_wrapper..gin_wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 1603\u001b[0m scope_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m in scope \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(scope_str) \u001b[38;5;28;01mif\u001b[39;00m scope_str \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 1604\u001b[0m err_str \u001b[38;5;241m=\u001b[39m err_str\u001b[38;5;241m.\u001b[39mformat(name, fn_or_cls, scope_info)\n\u001b[0;32m-> 1605\u001b[0m \u001b[43mutils\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maugment_exception_message_and_reraise\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merr_str\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/utils.py:41\u001b[0m, in \u001b[0;36maugment_exception_message_and_reraise\u001b[0;34m(exception, message)\u001b[0m\n\u001b[1;32m 39\u001b[0m proxy \u001b[38;5;241m=\u001b[39m ExceptionProxy()\n\u001b[1;32m 40\u001b[0m ExceptionProxy\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtype\u001b[39m(exception)\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m\n\u001b[0;32m---> 41\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m proxy\u001b[38;5;241m.\u001b[39mwith_traceback(exception\u001b[38;5;241m.\u001b[39m__traceback__) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28mNone\u001b[39m\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/config.py:1582\u001b[0m, in \u001b[0;36m_make_gin_wrapper..gin_wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 1579\u001b[0m new_kwargs\u001b[38;5;241m.\u001b[39mupdate(kwargs)\n\u001b[1;32m 1581\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1582\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mnew_args\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mnew_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1583\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[38;5;66;03m# pylint: disable=broad-except\u001b[39;00m\n\u001b[1;32m 1584\u001b[0m err_str \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/investing/DeepTime/experiments/forecast.py:115\u001b[0m, in \u001b[0;36mget_data\u001b[0;34m(flag, batch_size)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mno such flag \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mflag\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 115\u001b[0m dataset \u001b[38;5;241m=\u001b[39m \u001b[43mForecastDataset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mflag\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 116\u001b[0m data_loader \u001b[38;5;241m=\u001b[39m DataLoader(dataset,\n\u001b[1;32m 117\u001b[0m batch_size\u001b[38;5;241m=\u001b[39mbatch_size,\n\u001b[1;32m 118\u001b[0m shuffle\u001b[38;5;241m=\u001b[39mshuffle,\n\u001b[1;32m 119\u001b[0m drop_last\u001b[38;5;241m=\u001b[39mdrop_last)\n\u001b[1;32m 120\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m dataset, data_loader\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/config.py:1605\u001b[0m, in \u001b[0;36m_make_gin_wrapper..gin_wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 1603\u001b[0m scope_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m in scope \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(scope_str) \u001b[38;5;28;01mif\u001b[39;00m scope_str \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 1604\u001b[0m err_str \u001b[38;5;241m=\u001b[39m err_str\u001b[38;5;241m.\u001b[39mformat(name, fn_or_cls, scope_info)\n\u001b[0;32m-> 1605\u001b[0m \u001b[43mutils\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maugment_exception_message_and_reraise\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merr_str\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/utils.py:41\u001b[0m, in \u001b[0;36maugment_exception_message_and_reraise\u001b[0;34m(exception, message)\u001b[0m\n\u001b[1;32m 39\u001b[0m proxy \u001b[38;5;241m=\u001b[39m ExceptionProxy()\n\u001b[1;32m 40\u001b[0m ExceptionProxy\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtype\u001b[39m(exception)\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m\n\u001b[0;32m---> 41\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m proxy\u001b[38;5;241m.\u001b[39mwith_traceback(exception\u001b[38;5;241m.\u001b[39m__traceback__) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28mNone\u001b[39m\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/gin/config.py:1582\u001b[0m, in \u001b[0;36m_make_gin_wrapper..gin_wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 1579\u001b[0m new_kwargs\u001b[38;5;241m.\u001b[39mupdate(kwargs)\n\u001b[1;32m 1581\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1582\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mnew_args\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mnew_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1583\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[38;5;66;03m# pylint: disable=broad-except\u001b[39;00m\n\u001b[1;32m 1584\u001b[0m err_str \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/investing/DeepTime/data/datasets.py:71\u001b[0m, in \u001b[0;36mForecastDataset.__init__\u001b[0;34m(self, flag, horizon_len, scale, cross_learn, data_path, root_path, features, target, lookback_len, lookback_aux_len, lookback_mult, time_features, normalise_time_features)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimestamps \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_time \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m---> 71\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_time_samples \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 72\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mload_data()\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/investing/DeepTime/data/datasets.py:105\u001b[0m, in \u001b[0;36mForecastDataset.load_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 103\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata_x \u001b[38;5;241m=\u001b[39m data[border1:border2] \n\u001b[1;32m 104\u001b[0m \u001b[38;5;66;03m# y is just the col we predict\u001b[39;00m\n\u001b[0;32m--> 105\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata_y \u001b[38;5;241m=\u001b[39m \u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[43mborder1\u001b[49m\u001b[43m:\u001b[49m\u001b[43mborder2\u001b[49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtarget\u001b[49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 106\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimestamps \u001b[38;5;241m=\u001b[39m get_time_features(pd\u001b[38;5;241m.\u001b[39mto_datetime(df_raw\u001b[38;5;241m.\u001b[39mdate[border1:border2]\u001b[38;5;241m.\u001b[39mvalues),\n\u001b[1;32m 107\u001b[0m normalise\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnormalise_time_features,\n\u001b[1;32m 108\u001b[0m features\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtime_features)\n\u001b[1;32m 109\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_time \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata_x)\n", + "\u001b[0;31mIndexError\u001b[0m: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices\n In call to configurable 'ForecastDataset' ()\n In call to configurable 'get_data' ()" + ] + } + ], + "source": [ + "plot_multi(\n", + " save_paths=[\n", + " Path(\"storage/experiments/Stocks/96S/repeat=0\"),\n", + " Path(\"storage/experiments/Stocks/96Splus/repeat=0\"),\n", + " ],\n", + " i=60\n", + " )\n", + "1" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "d39ba7c5", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T02:36:49.885952Z", + "start_time": "2022-11-22T02:36:49.217176Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([1, 54, 1]) torch.Size([1, 54, 256]) 3 torch.Size([3, 54, 256])\n", + "receptive field [690 378 242]=[138 18 2]*[[ 1 1 1]\n", + " [ 1 2 4]\n", + " [ 1 4 16]\n", + " [ 1 6 36]\n", + " [ 1 8 64]]\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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4ovnnVu1atW8hJzr/b28rHqOv8d2blwpKSncd999PPzww+fdr3r16vmOoajoZ6yU8vGBN9+EF1+Ee++FTz+1Ep233oIPPoBRo2DMGGs0lohIQbvcRMMuwcHBxMfHuz4nJyefV4tRpkwZMs/p8BMcHMy2bdvc9m3atIkyZcrk+n1XXXUVn3/+OTVr1szzKC6n03ne9+cku0ktPj6eihUruuI6N4YdO3ZQt27dPN2zuNDPVylXvjzMmQPx8XDDDda+tDR46imoWNGq4REREUvHjh2ZNWsW//vf/9i6dSt333033udkazVr1mTp0qUkJCRw7Ngx13Xr169n5syZ7N69m3Hjxp2X8FzIkCFDSExMpG/fvqxbt469e/eyZMkSBg4cmGMSU7NmTVJSUli6dCl//PEHqampOd6/bt26hIeH89RTT7F7926+/vprXnnlFbdznnjiCVatWsXQoUPZtGkTu3fv5ssvvyz2nYyV4AhgdTL+5htr9fLWra19yclw333WqKvYWHvjExEpDkaPHk379u258cYb6d69O7169aJOnTpu57zyyivExsYSHh5OixYtAIiJiWHMmDE8/vjjtG7dmhMnTtC/f/+Lfl9YWBgrV64kMzOTzp0706RJE4YNG0ZQUJCreelc7dq14/7776dPnz4EBwe7dVo+V5kyZfjoo4/YuXMnTZs25cUXX+TZZ591O6dp06asWLGCn3/+meuuu44WLVowduxYwsLCLhq/nRzm3EbBUiA5OZnAwECSkpIIyF61UtysWwd33mklPNmaNLH66kRG2heXiJQsaWlp7Nu3j1q1ahXb0TZSvOT2N5Of32/V4MgFtW4Nu3bBF1/AX020bN0KDRtaQ8s1K7KIiBRnSnAkVzffDEeOwMSJZ1cuj421FvT817/Aw2f6FhGREkoJjuTJiBFWn5wHHzy7/MO0aRAYCC+8YHd0IiIi7pTgSJ5lDy3/4w/o3h0cDmvE1ejRVo3OggV2RygiImJRgiP5FhRkJTO7d8NfAwQ4cgR69ICmTa2+OyIiInZSgiOXrE4d+OknWLwYspc82boVIiKsZCc52d74RESk9FKCI5ctJsaaKPCVV852RF6wAK64Ah5/3OqvIyIiUpSU4EiBefRROH4cBg60lnjIyICXX4ZKleCTT+yOTkREShMlOFKgnE5rLauDB+H66619SUnQp481UeDu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njyZ19dpCyU4IgXs00/h6qut8vTp8PTTtoYjUixlZtqz5dXrr7/OM888Q7Vq1YiPj2fdunV5ui77vGnTpuXrumwzZszA6XSycuVKpk6dyvHjx+nYsSMtWrRg/fr1LF68mMOHD3Pbbbdd8Pp27doxadIkAgICiI+PJz4+nscee8x1fOLEiTRr1oyNGzcyZsyYPMW0d+9eunTpQu/evdmyZQsff/wxP/zwA0OHDs3XsxW1oq1vEyklVq60Vhz/5Rd46imoXl21OSLZMjNh4UJ7vrtbN/D2vvh5gYGBVKhQAW9v7wuukZiT7MWog4KC8nVdtnr16vHSSy+5Pj/77LO0aNGC559/3rXvgw8+IDw8nJ9//pn69eu7Xe90OgkMDMThcFzw+zt27MiIESNcnw8cOHDRmCZMmEC/fv0YNmyYK8Y33niD9u3bM2XKlGI7Q7USHJFC4OVlrThevTr8+Sfcc4+1nMMNN9gdmYgUZy1btnT7vHnzZr777jvKly9/3rl79+49L8G5mFatWuU7ps2bN7NlyxZmz57t2meMISsri3379hEZGZnvexYFJTgihcTf31pxvE4da3HObt1g40ZrGLlIaebtbf3/wa7vvhxeXl6cu4Rjenp6gV1Xrlw5t88pKSn06NGDF1988bxzq1atmpeQc72/l5fVU+XvsZ0bV0pKCvfddx8PP/zweferXr16vmMoKkpwRApRaCisWWMNG8/IgDZtYM8eCAuzOzIRe11uomGX4OBg4uPjXZ+Tk5PZt2+f2zllypQh85wOP8HBwWzbts1t36ZNmyhTpkyu33fVVVfx+eefU7NmzTyP4nI6ned9f06ym9Ti4+OpWLGiK65zY9ixYwd169bN0z2LC3UyFilkjRtb/Q0cDjh1Cpo310SAIiVVx44dmTVrFv/73//YunUrd999N97nZGs1a9Zk6dKlJCQkcOzYMdd169evZ+bMmezevZtx48adl/BcyJAhQ0hMTKRv376sW7eOvXv3smTJEgYOHJhjElOzZk1SUlJYunQpf/zxB6mpqTnev27duoSHh/PUU0+xe/duvv76a1555RW3c5544glWrVrF0KFD2bRpE7t37+bLL78s9p2MleCIFIEbboD337fKR4/CP/5hbzwicmlGjx5N+/btufHGG+nevTu9evWiTp06bue88sorxMbGEh4eTosWLQCIiYlhzJgxPP7447Ru3ZoTJ07Qv3//i35fWFgYK1euJDMzk86dO9OkSROGDRtGUFCQq3npXO3ateP++++nT58+BAcHu3VaPleZMmX46KOP2LlzJ02bNuXFF1/k2WefdTunadOmrFixgp9//pnrrruOFi1aMHbsWMKKeVW0w5zbKFgKJCcnExgYSFJSEgEBAXaHI6XIkCHw1ltW+bHH4OWX7Y1HpLClpaWxb98+atWqVWxH20jxktvfTH5+v1WDI1KE3nwTsgdJTJwIX35pbzwiIp5KCY5IEfvhB/irLx+33gq//WZvPCIinkgJjkgR8/OD1autUSTp6dC6tTodi4gUNCU4IjZo0ABmzLDKR49CdLS98YiIeBolOCI26dcP7r/fKv/wAzz+uL3xiIh4EiU4IjaaMsWaBBCsEVVffWVvPCIinkIJjojNVq2CoCCr/M9/qtOxiEhBUIIjYjM/PyvJye503KaNtayDiIhcOiU4IsVAZOTZTsdHjkCPHvbGIyJS0inBESkm+vWDAQOs8uLFZxMeEZHp06cTlN2WXcieeuopmjdvXiTfVZiU4IgUI++/D+HhVnnQIDh0yN54REq7EydOMGzYMGrUqEHZsmVp164d69atczsnLi6Om266icDAQMqVK0fr1q3Zv3+/6/jmzZu56aabCAkJwc/Pj5o1a9KnTx+OHDlS1I9ju6JMnpTgiBQjXl6wYsXZ/jjt29sdkUjpdu+99xIbG8usWbPYunUrnTt3plOnThw8eBCAvXv3cu211xIREcHy5cvZsmULY8aMca2hdPToUaKjo6lUqRJLliwhLi6OadOmERYWxsmTJ+18tCJljCGjqDsXmlIoKSnJACYpKcnuUEQuaPJkY8DaHnrI7mhELt2pU6fMjh07zKlTp+wOJd9SU1ONt7e3WbBggdv+q666yjz55JPGGGP69Olj7rzzzhzvMXfuXOPj42PS09NzPOe7774zgFmwYIFp0qSJ8fX1NW3btjVbt251nTNt2jQTGBjo+nz33Xebnj17ut3nkUceMe3bt3d9/vTTT03jxo2Nn5+fqVSpkomOjjYpKSmu72zdurXx9/c3gYGBpl27dubXX381xhgzbtw406xZMzNz5kxTo0YNExAQYPr06WOSk5Nd905LSzMPPfSQCQ4ONr6+vuaaa64xa9euPe+ZFi5caK666ipTpkwZM23aNAO4bdOmTTvvfeT2N5Of32/V4IgUQ0OHwnXXWeXJk62JAEU8zckzJ3Pc0jLS8nzuqfRTeTo3vzIyMsjMzDxvReuyZcvyww8/kJWVxddff039+vWJiYkhJCSEtm3bMm/ePNe5oaGhZGRkMHfuXIwxuX7fyJEjeeWVV1i3bh3BwcH06NGD9PT0fMcNEB8fT9++ffnXv/5FXFwcy5cv55ZbbnHVpPTq1Yv27duzZcsWVq9ezeDBg3E4HK7r9+7dy7x581iwYAELFixgxYoVvPDCC67jjz/+OJ9//jkzZszgp59+om7dusTExJCYmOgWx6hRo3jhhReIi4vjhhtuYMSIETRq1Ij4+Hji4+Pp06fPJT1fXvgU2p1F5LJ88w0EB0NKCnTrZo2uOue/syIlWvkJ5XM81q1eN76+42vX55CJIaSmp17w3PY12rN8wHLX55qv1+SP1D/OO8+Myz3BOFeFChWIiopi/PjxREZGUqVKFT766CNWr15N3bp1OXLkCCkpKbzwwgs8++yzvPjiiyxevJhbbrmF7777jvbt23P11Vfzf//3f9xxxx3cf//9tGnTho4dO9K/f3+qVKni9n3jxo3jhhtuAGDGjBlUq1aNuXPnctttt+UrbrASnIyMDG655RZq1KgBQJMmTQBITEwkKSmJG2+8kTp16gAQGRnpdn1WVhbTp0+nQoUKANx1110sXbqU5557jpMnTzJlyhSmT59O165dAXj33XeJjY3l/fffZ+TIka77PPPMM65nAihfvjw+Pj6Ehobm+5nySzU4IsWUnx98/dd/30+cgL/+OyIiRWjWrFkYY7jyyivx9fXljTfeoG/fvnh5eZGVlQVAz549GT58OM2bN2fUqFHceOONTJ061XWP5557joSEBKZOnUqjRo2YOnUqERERbN261e27oqKiXOVKlSrRoEED4uLiLinuZs2aER0dTZMmTbj11lt59913OXbsmOveAwYMICYmhh49evD6668THx/vdn3NmjVdyQ1A1apVXZ2i9+7dS3p6Otdcc43reJkyZWjTps158bZq1eqS4i8IqsERKcauvx4efBDeeguWL7eWdnjgAbujEikYKaNTcjzm7eXt9vnIYzmPOPJyuP9b/ddHfr2suP6uTp06rFixgpMnT5KcnEzVqlXp06cPtWvXpnLlyvj4+NCwYUO3ayIjI/nhnHblK664gltv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9n6Tk5NZs2aN3m8ujDEMHTqUuXPnsmzZMmrVquV2vGXLlpQpU8btve7atYv9+/frveZDVlYWp0+f1vu8RNHR0WzdupVNmza5tlatWtGvXz9XWe/18qSkpLB3716qVq1auv5O7e7l7CnmzJljfH19zfTp082OHTvM4MGDTVBQkElISLA7tBLhxIkTZuPGjWbjxo0GMK+++qrZuHGj+e2334wxxrzwwgsmKCjIfPnll2bLli2mZ8+eplatWubUqVM2R158PfDAAyYwMNAsX77cxMfHu7bU1FTXOffff7+pXr26WbZsmVm/fr2JiooyUVFRNkZdvI0aNcqsWLHC7Nu3z2zZssWMGjXKOBwO88033xhj9D4Lyt9HURmj95pfI0aMMMuXLzf79u0zK1euNJ06dTKVK1c2R44cMcaUnvepBKcATZ482VSvXt04nU7Tpk0b8+OPP9odUonx3XffGeC87e677zbGWEPFx4wZY6pUqWJ8fX1NdHS02bVrl71BF3MXep+AmTZtmuucU6dOmQcffNBUrFjR+Pv7m5tvvtnEx8fbF3Qx969//cvUqFHDOJ1OExwcbKKjo13JjTF6nwXl3ARH7zV/+vTpY6pWrWqcTqe58sorTZ8+fcyePXtcx0vL+3QYY4w9dUciIiIihUN9cERERMTjKMERERERj6MER0RERDyOEhwRERHxOEpwRERExOMowRERERGPowRHREREPI4SHBEREfE4SnBERETE4yjBEREREY+jBEdEREQ8jhIcERER8Tj/D6d9ofrlv+JHAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_multi(\n", + " save_paths=[\n", + " Path(\"storage/experiments/Stocks/96Sshort/repeat=0\"),\n", + " Path(\"storage/experiments/Stocks/96Splusshort/repeat=0\"),\n", + " ], i=60)\n", + "1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9af56ddc", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T02:31:41.691079Z", + "start_time": "2022-11-22T02:31:41.691072Z" + } + }, + "outputs": [], + "source": [ + "# plot(\"deeptime\", Path(\"storage/experiments/Exchange/96S/repeat=0\"));" + ] + }, + { + "cell_type": "markdown", + "id": "69e00093", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-20T00:57:32.922740Z", + "start_time": "2022-11-20T00:57:32.919738Z" + } + }, + "source": [ + "# multi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f59232cc", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T02:31:41.691700Z", + "start_time": "2022-11-22T02:31:41.691693Z" + } + }, + "outputs": [], + "source": [ + "\n", + "\n", + "def plot_multiM(save_paths=[Path(\"storage/experiments/Exchange/96M/repeat=0\")], i=200, title=None, plot=True):\n", + " for j in range(len(save_paths)):\n", + " save_path = save_paths[j]\n", + "\n", + " gin.clear_config()\n", + " gin.parse_config(open(save_path/\"config.gin\"))\n", + " model_name = gin.query_parameter(\"instance.model_type\")\n", + " train_set, train_loader = get_data(flag='train', batch_size=2)\n", + "\n", + " model = get_model(model_name,\n", + " dim_size=train_set.data_x.shape[1],\n", + " datetime_feats=train_set.timestamps.shape[-1]).to(default_device())\n", + " model.load_state_dict(torch.load(save_path/'model.pth'))\n", + " model = model.eval()\n", + "\n", + "\n", + " b = train_set[i]\n", + " b = [bb[None, :] for bb in b]\n", + " x, y, x_time, y_time = map(to_tensor, b)\n", + " with torch.no_grad():\n", + " forecast = model(x, x_time, y_time)\n", + "\n", + " \n", + " colors = list(mcolors.BASE_COLORS.keys())\n", + " l = x.shape[1]\n", + " forecast2 = forecast[0].detach().cpu().numpy()\n", + " x2 = x[0].cpu()\n", + " y2 = y[0].cpu()\n", + " l2 = y.shape[1]\n", + " i_past = list(range(l))\n", + " i_future = list(range(l, l+l2))\n", + "\n", + " linestyles = [ '--', '-.', '-', ':']\n", + " if plot:\n", + " ls = linestyles[j]\n", + " print(ls)\n", + " if j==0:\n", + " \n", + " \n", + " for k in range(x.shape[-1]):\n", + " plt.plot(i_past, x2[:, k], c=colors[k], label=f\"var {k}\")\n", + " for k in range(x.shape[-1]):\n", + " plt.plot(i_future, y2[:, k], c=colors[k], alpha=0.3)\n", + " \n", + " mtitle = str(save_path).split('/')[-2:-1]\n", + " mtitle = \"-\".join(mtitle)\n", + " for k in range(x.shape[-1]):\n", + " plt.plot(i_future, forecast2[:, k], c=colors[k], linestyle=ls, label=f\"{mtitle}\" if k==0 else None)\n", + " plt.legend()\n", + " plt.title(title)\n", + " return x2, y2, forecast2, i_past, i_future\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1d152b2", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-22T02:31:41.692264Z", + "start_time": "2022-11-22T02:31:41.692258Z" + } + }, + "outputs": [], + "source": [ + "plot_multiM([Path(\"storage/experiments/Stocks/96M/repeat=0\")]);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba05f2b0", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6877ee38", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "main_language": "python", + "notebook_metadata_filter": "-all" + }, + "kernelspec": { + "display_name": "deeptime", + "language": "python", + "name": "deeptime" + }, + "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.8.13" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scratch-single.ipynb b/scratch-single.ipynb index 2a37ffa..c482d3e 100644 --- a/scratch-single.ipynb +++ b/scratch-single.ipynb @@ -6,8 +6,8 @@ "id": "4e09086b", "metadata": { "ExecuteTime": { - "end_time": "2022-11-20T05:05:01.730258Z", - "start_time": "2022-11-20T05:05:00.558925Z" + "end_time": "2022-11-20T10:31:28.624566Z", + "start_time": "2022-11-20T10:31:27.336916Z" }, "lines_to_next_cell": 0 }, @@ -71,8 +71,8 @@ "id": "04499bef", "metadata": { "ExecuteTime": { - "end_time": "2022-11-20T05:05:01.737023Z", - "start_time": "2022-11-20T05:05:01.731574Z" + "end_time": "2022-11-20T10:31:28.634463Z", + "start_time": "2022-11-20T10:31:28.626256Z" } }, "outputs": [], @@ -125,12 +125,12 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 3, "id": "768530be", "metadata": { "ExecuteTime": { - "end_time": "2022-11-20T06:52:29.098202Z", - "start_time": "2022-11-20T06:52:29.093424Z" + "end_time": "2022-11-20T10:31:28.667218Z", + "start_time": "2022-11-20T10:31:28.635969Z" } }, "outputs": [], @@ -184,7 +184,7 @@ { "cell_type": "code", "execution_count": null, - "id": "739ee5e3", + "id": "f6da82f9", "metadata": { "ExecuteTime": { "end_time": "2022-11-20T06:50:03.264769Z", @@ -196,12 +196,12 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 4, "id": "b8843217", "metadata": { "ExecuteTime": { - "end_time": "2022-11-20T06:52:29.508811Z", - "start_time": "2022-11-20T06:52:29.353139Z" + "end_time": "2022-11-20T10:31:32.788856Z", + "start_time": "2022-11-20T10:31:28.668594Z" } }, "outputs": [ @@ -221,7 +221,7 @@ "1" ] }, - "execution_count": 35, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, @@ -249,12 +249,12 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 5, "id": "d39ba7c5", "metadata": { "ExecuteTime": { - "end_time": "2022-11-20T06:52:41.798916Z", - "start_time": "2022-11-20T06:52:41.260013Z" + "end_time": "2022-11-20T10:31:33.408193Z", + "start_time": "2022-11-20T10:31:32.789874Z" } }, "outputs": [ @@ -275,7 +275,7 @@ "1" ] }, - "execution_count": 36, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, @@ -301,12 +301,12 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 6, "id": "9af56ddc", "metadata": { "ExecuteTime": { - "end_time": "2022-11-20T06:28:51.826377Z", - "start_time": "2022-11-20T06:28:51.721432Z" + "end_time": "2022-11-20T10:31:33.539388Z", + "start_time": "2022-11-20T10:31:33.409217Z" } }, "outputs": [