{"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.10.14"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":84493,"databundleVersionId":9871156,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true},"papermill":{"default_parameters":{},"duration":486.853708,"end_time":"2024-11-09T21:31:59.170875","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-11-09T21:23:52.317167","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\n# Initialize a list to hold samples from each file\nsamples = []\n# Load a sample from each file\nfor i in range(10):\n    file_path = f\"/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet/partition_id={i}/part-0.parquet\"\n    chunk = pd.read_parquet(file_path)\n    \n    # Take a sample of the data (adjust sample size as needed)\n    sample_chunk = chunk.sample(n=100000, random_state=42)  # For example, 100 rows\n    samples.append(sample_chunk)\n# Concatenate all samples into one DataFrame if needed\nsample_df = pd.concat(samples, ignore_index=True)","metadata":{"papermill":{"duration":76.217815,"end_time":"2024-11-09T21:25:11.723081","exception":false,"start_time":"2024-11-09T21:23:55.505266","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:44:03.910601Z","iopub.execute_input":"2024-12-06T06:44:03.910925Z","iopub.status.idle":"2024-12-06T06:45:24.023224Z","shell.execute_reply.started":"2024-12-06T06:44:03.910886Z","shell.execute_reply":"2024-12-06T06:45:24.022476Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_df.head()","metadata":{"papermill":{"duration":0.071054,"end_time":"2024-11-09T21:25:11.801925","exception":false,"start_time":"2024-11-09T21:25:11.730871","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:45:24.024670Z","iopub.execute_input":"2024-12-06T06:45:24.024944Z","iopub.status.idle":"2024-12-06T06:45:24.051359Z","shell.execute_reply.started":"2024-12-06T06:45:24.024918Z","shell.execute_reply":"2024-12-06T06:45:24.050618Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Prepare data","metadata":{"papermill":{"duration":0.005166,"end_time":"2024-11-09T21:25:11.812706","exception":false,"start_time":"2024-11-09T21:25:11.807540","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport numpy as np","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:46:41.500014Z","iopub.execute_input":"2024-12-06T06:46:41.500350Z","iopub.status.idle":"2024-12-06T06:46:41.504752Z","shell.execute_reply.started":"2024-12-06T06:46:41.500320Z","shell.execute_reply":"2024-12-06T06:46:41.503693Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Prepare data\nfeatures = sample_df.filter(regex='^feature_')\nresponders = sample_df.filter(regex='^responder_')\nX = features.values  # Features for input\ny = responders.values  # Responders for output\n\nX = np.nan_to_num(X, nan=0.0, posinf=0.0, neginf=0.0)\ny = np.nan_to_num(y, nan=0.0, posinf=0.0, neginf=0.0)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:46:44.005264Z","iopub.execute_input":"2024-12-06T06:46:44.005596Z","iopub.status.idle":"2024-12-06T06:46:44.881162Z","shell.execute_reply.started":"2024-12-06T06:46:44.005555Z","shell.execute_reply":"2024-12-06T06:46:44.880151Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Convert to PyTorch tensors\nX = torch.tensor(X, dtype=torch.float32)\ny = torch.tensor(y, dtype=torch.float32)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:46:46.202237Z","iopub.execute_input":"2024-12-06T06:46:46.202611Z","iopub.status.idle":"2024-12-06T06:46:46.413997Z","shell.execute_reply.started":"2024-12-06T06:46:46.202548Z","shell.execute_reply":"2024-12-06T06:46:46.412864Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:48:33.214074Z","iopub.execute_input":"2024-12-06T06:48:33.214405Z","iopub.status.idle":"2024-12-06T06:48:33.251752Z","shell.execute_reply.started":"2024-12-06T06:48:33.214372Z","shell.execute_reply":"2024-12-06T06:48:33.250889Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:48:39.979279Z","iopub.execute_input":"2024-12-06T06:48:39.979636Z","iopub.status.idle":"2024-12-06T06:48:39.986785Z","shell.execute_reply.started":"2024-12-06T06:48:39.979600Z","shell.execute_reply":"2024-12-06T06:48:39.985992Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\n# from torchdiffeq import odeint  # Install torchdiffeq for solving ODEs\n\n\n# Define the Liquid Time-Constant (LTC) Cell with custom ODE solver\n\n# class LTCCell(nn.Module):\n#     def __init__(self, input_dim, hidden_dim):\n#         super().__init__()\n#         self.hidden_dim = hidden_dim\n#         self.input_weights = nn.Parameter(torch.randn(hidden_dim, input_dim))\n#         self.hidden_weights = nn.Parameter(torch.randn(hidden_dim, hidden_dim))\n#         self.bias = nn.Parameter(torch.zeros(hidden_dim))\n#         self.time_constant = nn.Parameter(torch.ones(hidden_dim))\n\n#     def forward(self, inputs, hidden_state, dt=0.1):\n#         # Corrected matrix multiplication\n#         dstate_dt = (\n#             -hidden_state + \n#             torch.tanh(\n#                 torch.matmul(self.input_weights, inputs.T).T +  # Transpose back after matrix mul\n#                 torch.matmul(hidden_state, self.hidden_weights.T) +  # Recurrent term\n#                 self.bias\n#             )\n#         ) / self.time_constant\n#         hidden_state = hidden_state + dstate_dt * dt\n#         return hidden_state\n\n# class LiquidNeuralNetwork(nn.Module):\n#     def __init__(self, input_dim, hidden_dim, output_dim):\n#         super().__init__()\n#         self.hidden_dim = hidden_dim\n#         self.ltc_cell = LTCCell(input_dim, hidden_dim)\n#         self.fc = nn.Linear(hidden_dim, output_dim)\n\n#     def forward(self, inputs):\n#         batch_size, seq_len, input_dim = inputs.shape\n#         hidden_state = torch.zeros(batch_size, self.hidden_dim, device=inputs.device)\n#         outputs = []\n#         for t in range(seq_len):\n#             hidden_state = self.ltc_cell(inputs[:, t, :], hidden_state)\n#             outputs.append(self.fc(hidden_state))\n#         return torch.stack(outputs, dim=1)\n\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:47:03.094229Z","iopub.execute_input":"2024-12-06T06:47:03.094884Z","iopub.status.idle":"2024-12-06T06:47:03.100135Z","shell.execute_reply.started":"2024-12-06T06:47:03.094852Z","shell.execute_reply":"2024-12-06T06:47:03.099002Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class LiquidTimeStep(nn.Module):\n    def __init__(self, input_size, hidden_size):\n        super(LiquidTimeStep, self).__init__()\n        self.input_size = input_size\n        self.hidden_size = hidden_size\n        self.W_in = nn.Linear(input_size, hidden_size)\n        self.W_h = nn.Linear(hidden_size, hidden_size)\n        self.tau = nn.Parameter(torch.ones(hidden_size))\n    \n    def forward(self, x, h):\n        dx = torch.tanh(self.W_in(x) + self.W_h(h))\n        h_new = h + (dx - h) / self.tau\n        return h_new\n\nclass LiquidNeuralNetwork(nn.Module):\n    def __init__(self, input_size, hidden_size, output_size):\n        super(LiquidNeuralNetwork, self).__init__()\n        self.hidden_size = hidden_size\n        self.liquid_step = LiquidTimeStep(input_size, hidden_size)\n        self.output_layer = nn.Linear(hidden_size, output_size)\n    \n    def forward(self, x):\n        batch_size, seq_len, _ = x.size()\n        h = torch.zeros(batch_size, self.hidden_size, device=x.device)\n        for t in range(seq_len):\n            h = self.liquid_step(x[:, t, :], h)\n        output = self.output_layer(h)\n        return output\n\n# Hyperparameters\ninput_size = 10  \nhidden_size = 20  \noutput_size = 1  # Output size for regression\n\n# Create the model\nmodel = LiquidNeuralNetwork(input_size, hidden_size, output_size)\n\n# Define Loss and optimizer\ncriterion = nn.MSELoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:47:03.949622Z","iopub.execute_input":"2024-12-06T06:47:03.949955Z","iopub.status.idle":"2024-12-06T06:47:05.415049Z","shell.execute_reply.started":"2024-12-06T06:47:03.949925Z","shell.execute_reply":"2024-12-06T06:47:05.414275Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Reshape input to (batch_size, seq_len, input_dim)\nX = X.unsqueeze(1)  # Adding sequence dimension for a single timestep\n\n# Model dimensions\ninput_dim = X.shape[2]  # Number of features\nhidden_dim = 64  # Number of hidden neurons\noutput_dim = y.shape[1]  # Number of responders","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:47:06.774836Z","iopub.execute_input":"2024-12-06T06:47:06.775314Z","iopub.status.idle":"2024-12-06T06:47:06.783143Z","shell.execute_reply.started":"2024-12-06T06:47:06.775282Z","shell.execute_reply":"2024-12-06T06:47:06.782296Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"input dim = {input_dim}, hidden dim = {hidden_dim}, output dim = {output_dim}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:47:07.723932Z","iopub.execute_input":"2024-12-06T06:47:07.724471Z","iopub.status.idle":"2024-12-06T06:47:07.728991Z","shell.execute_reply.started":"2024-12-06T06:47:07.724438Z","shell.execute_reply":"2024-12-06T06:47:07.728011Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Initialize Model, Loss, and Optimizer\nmodel = LiquidNeuralNetwork(input_dim, hidden_dim, output_dim)\ncriterion = nn.MSELoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n\n# Training the Model\nnum_epochs = 50\nbatch_size = 128\n\n# Splitting data into training and validation sets\ntrain_indices = np.random.choice(len(X), int(len(X) * 0.8), replace=False)\nval_indices = list(set(range(len(X))) - set(train_indices))\n\nX_train, X_val = X[train_indices], X[val_indices]\ny_train, y_val = y[train_indices], y[val_indices]\n\nfor epoch in range(num_epochs):\n    model.train()\n    for i in range(0, len(X_train), batch_size):\n        X_batch = X_train[i:i+batch_size]\n        y_batch = y_train[i:i+batch_size]\n\n        # Forward pass\n        outputs = model(X_batch)\n        loss = criterion(outputs, y_batch)  # Fixed loss calculation\n\n        # Backward pass and optimization\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n\n    # Validation\n    model.eval()\n    with torch.no_grad():\n        val_outputs = model(X_val)\n        val_loss = criterion(val_outputs, y_val)\n\n    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}, Val Loss: {val_loss.item():.4f}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:51:13.583179Z","iopub.execute_input":"2024-12-06T06:51:13.583531Z","iopub.status.idle":"2024-12-06T06:58:59.868400Z","shell.execute_reply.started":"2024-12-06T06:51:13.583496Z","shell.execute_reply":"2024-12-06T06:58:59.867021Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"torch.save(model.state_dict(), 'liquid_neural_network_v5.pth')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:59:25.415742Z","iopub.execute_input":"2024-12-06T06:59:25.416117Z","iopub.status.idle":"2024-12-06T06:59:25.421967Z","shell.execute_reply.started":"2024-12-06T06:59:25.416078Z","shell.execute_reply":"2024-12-06T06:59:25.421148Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Predict using the trained model\nmodel.eval()\npredictions = model(X_val).detach().numpy()\n\n# Display predictions for the first 5 samples\nprint(predictions[:5])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:59:26.376558Z","iopub.execute_input":"2024-12-06T06:59:26.377224Z","iopub.status.idle":"2024-12-06T06:59:26.625033Z","shell.execute_reply.started":"2024-12-06T06:59:26.377186Z","shell.execute_reply":"2024-12-06T06:59:26.624288Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(predictions[:5])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:59:27.730517Z","iopub.execute_input":"2024-12-06T06:59:27.730888Z","iopub.status.idle":"2024-12-06T06:59:27.736232Z","shell.execute_reply.started":"2024-12-06T06:59:27.730856Z","shell.execute_reply":"2024-12-06T06:59:27.735355Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import polars as pl\n\nimport kaggle_evaluation.jane_street_inference_server","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:59:30.900483Z","iopub.execute_input":"2024-12-06T06:59:30.901081Z","iopub.status.idle":"2024-12-06T06:59:31.075270Z","shell.execute_reply.started":"2024-12-06T06:59:30.901047Z","shell.execute_reply":"2024-12-06T06:59:31.074434Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df = pl.read_parquet(\"/kaggle/input/jane-street-real-time-market-data-forecasting/test.parquet\")\nprint(test_df.head())\nprint(test_df.columns)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:59:32.445527Z","iopub.execute_input":"2024-12-06T06:59:32.446320Z","iopub.status.idle":"2024-12-06T06:59:32.622676Z","shell.execute_reply.started":"2024-12-06T06:59:32.446279Z","shell.execute_reply":"2024-12-06T06:59:32.621839Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lags_df = pl.read_parquet(\"/kaggle/input/jane-street-real-time-market-data-forecasting/lags.parquet\")\nprint(lags_df.head())\nprint(lags_df.columns)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:59:34.397694Z","iopub.execute_input":"2024-12-06T06:59:34.398015Z","iopub.status.idle":"2024-12-06T06:59:34.411719Z","shell.execute_reply.started":"2024-12-06T06:59:34.397984Z","shell.execute_reply":"2024-12-06T06:59:34.410926Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Submission\n\nSee [Jane Street RMF Demo Submission](https://www.kaggle.com/code/ryanholbrook/jane-street-rmf-demo-submission) for details","metadata":{"papermill":{"duration":0.582508,"end_time":"2024-11-09T21:31:50.725745","exception":false,"start_time":"2024-11-09T21:31:50.143237","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import os\nimport polars as pl\nimport kaggle_evaluation.jane_street_inference_server","metadata":{"papermill":{"duration":1.242652,"end_time":"2024-11-09T21:31:52.552744","exception":false,"start_time":"2024-11-09T21:31:51.310092","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T06:59:38.257086Z","iopub.execute_input":"2024-12-06T06:59:38.257922Z","iopub.status.idle":"2024-12-06T06:59:38.261502Z","shell.execute_reply.started":"2024-12-06T06:59:38.257885Z","shell.execute_reply":"2024-12-06T06:59:38.260631Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def predict(test: pl.DataFrame, lags: pl.DataFrame | None) -> pl.DataFrame | pd.DataFrame:\n    \"\"\"Make predictions using the model.\"\"\"\n    global lags_\n    if lags is not None:\n        lags_ = lags\n\n    # Extract features\n    feature_columns = [col for col in test.columns if col.startswith(\"feature_\")]\n    features = test.select(feature_columns).to_numpy()\n    features = np.nan_to_num(features, nan=0.0, posinf=0.0, neginf=0.0)\n\n    # Convert to PyTorch tensor\n    features_tensor = torch.tensor(features, dtype=torch.float32)\n\n    # Reshape tensor to (batch_size, seq_len, input_dim)\n    features_tensor = features_tensor.unsqueeze(1)  # Assuming seq_len = 1\n\n    # Perform model inference\n    with torch.no_grad():\n        model_predictions = model(features_tensor)\n\n    # Extract responder_6 predictions (output dim is already 2D)\n    responder_6_predictions = model_predictions[:, 6].numpy()\n\n    # Format the output\n    predictions = test.select(\"row_id\").with_columns(\n        pl.Series(\"responder_6\", responder_6_predictions)\n    )\n    assert len(predictions) == len(test)\n    return predictions\n","metadata":{"papermill":{"duration":0.597005,"end_time":"2024-11-09T21:31:53.734091","exception":false,"start_time":"2024-11-09T21:31:53.137086","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T07:01:14.673522Z","iopub.execute_input":"2024-12-06T07:01:14.673897Z","iopub.status.idle":"2024-12-06T07:01:14.680742Z","shell.execute_reply.started":"2024-12-06T07:01:14.673864Z","shell.execute_reply":"2024-12-06T07:01:14.679729Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predict(test_df, lags_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T07:01:16.093857Z","iopub.execute_input":"2024-12-06T07:01:16.094683Z","iopub.status.idle":"2024-12-06T07:01:16.109055Z","shell.execute_reply.started":"2024-12-06T07:01:16.094648Z","shell.execute_reply":"2024-12-06T07:01:16.108289Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import kaggle_evaluation.jane_street_inference_server\n\ninference_server = kaggle_evaluation.jane_street_inference_server.JSInferenceServer(predict)\n\nif os.getenv('KAGGLE_IS_COMPETITION_RERUN'):\n    inference_server.serve()\nelse:\n    inference_server.run_local_gateway(\n        (\n            '/kaggle/input/jane-street-real-time-market-data-forecasting/test.parquet',\n            '/kaggle/input/jane-street-real-time-market-data-forecasting/lags.parquet',\n        )\n    )\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T07:01:24.348819Z","iopub.execute_input":"2024-12-06T07:01:24.349140Z","iopub.status.idle":"2024-12-06T07:01:24.510924Z","shell.execute_reply.started":"2024-12-06T07:01:24.349111Z","shell.execute_reply":"2024-12-06T07:01:24.509827Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}