{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":84493,"databundleVersionId":9871156,"sourceType":"competition"}],"dockerImageVersionId":30822,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nimport polars as pl\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom matplotlib import pyplot as plt\nfrom matplotlib.ticker import MaxNLocator, FormatStrFormatter, PercentFormatter\n\nimport os, gc\nfrom tqdm.auto import tqdm\nimport pickle # module to serialize and deserialize objects\nimport re # for Regular expression operations \n\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models\nfrom tensorflow.keras.optimizers import Adam\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data  import Dataset, DataLoader\nfrom pytorch_lightning import (LightningDataModule, LightningModule, Trainer)\nfrom pytorch_lightning.callbacks import EarlyStopping, ModelCheckpoint, Timer\n\nfrom sklearn.metrics import r2_score\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import VotingRegressor\n\nimport lightgbm as lgb\nfrom lightgbm import LGBMRegressor\n\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\n\nimport warnings\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None\n\nimport kaggle_evaluation.jane_street_inference_server","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:47:06.680242Z","iopub.execute_input":"2024-12-24T00:47:06.680527Z","iopub.status.idle":"2024-12-24T00:47:24.479617Z","shell.execute_reply.started":"2024-12-24T00:47:06.680499Z","shell.execute_reply":"2024-12-24T00:47:24.478718Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"gridColor = 'lightgrey'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:47:24.480623Z","iopub.execute_input":"2024-12-24T00:47:24.481277Z","iopub.status.idle":"2024-12-24T00:47:24.484500Z","shell.execute_reply.started":"2024-12-24T00:47:24.481244Z","shell.execute_reply":"2024-12-24T00:47:24.483800Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\npath = \"/kaggle/input/jane-street-real-time-market-data-forecasting\"\nsamples = []\n\n# Load a data from each file:\nr = range(2)\nfor i in r:\n    file_path = f\"{path}/train.parquet/partition_id={i}/part-0.parquet\"\n    part = pd.read_parquet(file_path)\n    samples.append(part)\n    \ndata = pd.concat(samples, ignore_index=True) # Concatenate all samples into one DataFrame if needed\n\ndata.round(1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:47:24.485881Z","iopub.execute_input":"2024-12-24T00:47:24.486073Z","iopub.status.idle":"2024-12-24T00:47:33.929687Z","shell.execute_reply.started":"2024-12-24T00:47:24.486056Z","shell.execute_reply":"2024-12-24T00:47:33.928904Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"time_data =data[['date_id', 'time_id']]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:47:33.930904Z","iopub.execute_input":"2024-12-24T00:47:33.931178Z","iopub.status.idle":"2024-12-24T00:47:33.950873Z","shell.execute_reply.started":"2024-12-24T00:47:33.931158Z","shell.execute_reply":"2024-12-24T00:47:33.950257Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data = data.interpolate(method='linear', limit_direction='both')\ndata","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:47:33.951591Z","iopub.execute_input":"2024-12-24T00:47:33.951841Z","iopub.status.idle":"2024-12-24T00:47:50.403689Z","shell.execute_reply.started":"2024-12-24T00:47:33.951822Z","shell.execute_reply":"2024-12-24T00:47:50.402785Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#行の表示数の上限を撤廃\npd.set_option('display.max_rows', None)\n\n#列の表示数の上限を撤廃\npd.set_option('display.max_columns', None)\ndata.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:47:50.404525Z","iopub.execute_input":"2024-12-24T00:47:50.404814Z","iopub.status.idle":"2024-12-24T00:47:50.868897Z","shell.execute_reply.started":"2024-12-24T00:47:50.404793Z","shell.execute_reply":"2024-12-24T00:47:50.868162Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define features and target\nskip_features = [21, 26, 27, 31]\nfeatures = [f'feature_{i:02}' for i in range(79) if i not in skip_features] + [f'responder_{i}' for i in range(9)]\n# features.remove('responder_6')  # Exclude target from features\nfeature_test = [f'feature_{i:02}' for i in range(79)]\ntarget = 'responder_6'\n\n# Handle missing values (fill with median as an example)\n# data[features] = data[features].fillna(data[features].median())\n# data[target] = data[target].fillna(0)\n\n# Normalize features\nscaler = StandardScaler()\ndata[features] = scaler.fit_transform(data[features])\ndata = data[features]\n\ndata = data.join(time_data)\n\n# Prepare time-series input (grouped by date_id and time_id)\nsequences = []\nlabels = []","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:47:50.869636Z","iopub.execute_input":"2024-12-24T00:47:50.869863Z","iopub.status.idle":"2024-12-24T00:48:00.493362Z","shell.execute_reply.started":"2024-12-24T00:47:50.869844Z","shell.execute_reply":"2024-12-24T00:48:00.492682Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# データ・カラムの確認用\ndisplay(data.head())\ndisplay(data.columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:48:00.495050Z","iopub.execute_input":"2024-12-24T00:48:00.495280Z","iopub.status.idle":"2024-12-24T00:48:00.545721Z","shell.execute_reply.started":"2024-12-24T00:48:00.495259Z","shell.execute_reply":"2024-12-24T00:48:00.545084Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(data.columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:48:00.546573Z","iopub.execute_input":"2024-12-24T00:48:00.546769Z","iopub.status.idle":"2024-12-24T00:48:00.551243Z","shell.execute_reply.started":"2024-12-24T00:48:00.546753Z","shell.execute_reply":"2024-12-24T00:48:00.550430Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"group_cols = ['date_id', 'time_id']\nfor _, group in data.groupby(group_cols):\n    if len(group) > 10:  # Ensure sufficient sequence length\n        sequences.append(group[features].values[:10])  # Truncate or pad to 10 steps\n        labels.append(group[target].values[:10])\n\nsequences = np.array(sequences)\nlabels = np.array(labels)\nsequences\n# Train-test split\nX_train, X_val, y_train, y_val = train_test_split(sequences, labels, train_size=0.8, test_size=0.2, random_state=42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:48:00.551953Z","iopub.execute_input":"2024-12-24T00:48:00.552143Z","iopub.status.idle":"2024-12-24T00:49:57.750584Z","shell.execute_reply.started":"2024-12-24T00:48:00.552127Z","shell.execute_reply":"2024-12-24T00:49:57.749888Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"X_train shape: {}\".format(X_train.shape))\nprint(\"X_val shape: {}\".format(X_val.shape))\nprint(\"y_train shape: {}\".format(y_train.shape))\nprint(\"y_val shape: {}\".format(y_val.shape))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:49:57.751318Z","iopub.execute_input":"2024-12-24T00:49:57.751524Z","iopub.status.idle":"2024-12-24T00:49:57.756657Z","shell.execute_reply.started":"2024-12-24T00:49:57.751506Z","shell.execute_reply":"2024-12-24T00:49:57.756011Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.sequence import pad_sequences\nimport numpy as np\nimport pandas as pd\nimport pyarrow as pa\n\n# パラメータ\ntime_steps = 10\nfeature_dim = 84  # モデルの期待する特徴量数\n\n# def predict(test_parquet, lags_parquet):\n    # # test.parquet と lags.parquet を読み込み\n    # test_data = pd.read_parquet(test_parquet)\n    # lags_data = pd.read_parquet(lags_parquet)  # 未使用だが将来的な拡張のため\n\n    # test_data = test_data.set_columns(test_data.schema.get_filed_index('date_id'),\n    #                                  'date_id',\n    #                                  test_data.column('date_id').cast(pa.int32()))\n    # lags_data = lags_data.set_columns(lags_data.schema.get_filed_index('date_id'),\n    #                                  'date_id',\n    #                                  lags_data.column('date_id').cast(pa.int32()))\n    \n    # # 必要な前処理を実施\n    # features = [f'feature_{i:02}' for i in range(feature_dim) if f'feature_{i:02}' in test_data.columns]\n    # test_data = test_data[features]\n\n    # # 特徴量数をモデルに合わせる\n    # if len(features) > feature_dim:\n    #     # 余分な列を削除\n    #     test_data = test_data[features[:feature_dim]]\n    # elif len(features) < feature_dim:\n    #     # 不足分を補填\n    #     missing_features = feature_dim - len(features)\n    #     for i in range(len(features), feature_dim):\n    #         test_data[f'feature_{i:02}'] = 0\n\n    # # 欠損値を含む行を削除\n    # test_data = test_data.dropna()\n\n    # # シーケンス化\n    # test_sequences = []\n    # for i in range(0, len(test_data), time_steps):\n    #     sequence = test_data.iloc[i:i + time_steps].values\n    #     if len(sequence) < time_steps:\n    #         # time_steps に満たない場合はパディング\n    #         sequence = pad_sequences([sequence], maxlen=time_steps, dtype='float32', padding='post')[0]\n    #     test_sequences.append(sequence)\n\n    # # 配列に変換\n    # test_sequences = np.array(test_sequences)\n\n    # # モデルで予測\n    # predictions = model.predict(test_sequences)\n    # return predictions\n\ndef predict(test: pl.DataFrame, lags: pl.DataFrame | None) -> pl.DataFrame | pd.DataFrame:\n    \"\"\"Make a prediction.\"\"\"\n    # All the responders from the previous day are passed in at time_id == 0. We save them in a global variable for access at every time_id.\n    # Use them as extra features, if you like.\n    global lags_\n    if lags is not None:\n        lags_ = lags\n\n    # Replace this section with your own predictions\n    predictions = test.select(\n        'row_id',\n        pl.lit(0.0).alias('responder_6'),\n    )\n\n    if isinstance(predictions, pl.DataFrame):\n        assert predictions.columns == ['row_id', 'responder_6']\n    elif isinstance(predictions, pd.DataFrame):\n        assert (predictions.columns == ['row_id', 'responder_6']).all()\n    else:\n        raise TypeError('The predict function must return a DataFrame')\n    # Confirm has as many rows as the test data.\n    assert len(predictions) == len(test)\n\n    return predictions\n\n\n# モデル定義関数\nfrom tensorflow.keras import layers, models\n\ndef create_transformer_model(input_shape):\n    inputs = layers.Input(shape=(input_shape[0], input_shape[1]))\n    print(\"Expected Model Input Shape:\", inputs.shape)\n\n    x = layers.MultiHeadAttention(num_heads=4, key_dim=64)(inputs, inputs)\n    x = layers.LayerNormalization(epsilon=1e-6)(x)\n    x = layers.Dropout(0.1)(x)\n\n    x = layers.Conv1D(filters=64, kernel_size=1, activation='relu')(x)\n    x = layers.GlobalAveragePooling1D()(x)\n    x = layers.Dense(64, activation='relu')(x)\n    x = layers.Dropout(0.1)(x)\n    outputs = layers.Dense(10, activation='linear')(x)\n\n    model = models.Model(inputs, outputs)\n    model.compile(optimizer='adam', loss='mse', metrics=['mae'])\n    return model\n\n# モデル構築例\n# 入力形状は (time_steps, feature_dim) にする必要がある\ninput_shape = (time_steps, feature_dim)\nmodel = create_transformer_model(input_shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:49:57.757380Z","iopub.execute_input":"2024-12-24T00:49:57.757577Z","iopub.status.idle":"2024-12-24T00:49:58.079613Z","shell.execute_reply.started":"2024-12-24T00:49:57.757559Z","shell.execute_reply":"2024-12-24T00:49:58.078967Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create and train model\nmodel.fit(\n    X_train, y_train,\n    validation_data=(X_val, y_val),\n    epochs=10,\n    batch_size=64\n)\n\n# Predict on validation data\npredictions = model.predict(X_val)\nglobal predictions","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T00:49:58.080388Z","iopub.execute_input":"2024-12-24T00:49:58.080700Z","iopub.status.idle":"2024-12-24T00:51:28.912262Z","shell.execute_reply.started":"2024-12-24T00:49:58.080678Z","shell.execute_reply":"2024-12-24T00:51:28.911550Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Inference server setup\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    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T01:00:58.536079Z","iopub.execute_input":"2024-12-24T01:00:58.536371Z","iopub.status.idle":"2024-12-24T01:00:58.806096Z","shell.execute_reply.started":"2024-12-24T01:00:58.536349Z","shell.execute_reply":"2024-12-24T01:00:58.805391Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-24T01:00:46.709425Z","iopub.execute_input":"2024-12-24T01:00:46.709770Z","iopub.status.idle":"2024-12-24T01:00:46.732300Z","shell.execute_reply.started":"2024-12-24T01:00:46.709745Z","shell.execute_reply":"2024-12-24T01:00:46.731512Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}