{"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":"none","dataSources":[{"sourceId":84493,"databundleVersionId":9871156,"sourceType":"competition"},{"sourceId":10319507,"sourceType":"datasetVersion","datasetId":6389030}],"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os  # Import the os module\nimport numpy as np\nimport pandas as pd\nimport polars as pl\nfrom sklearn.preprocessing import MinMaxScaler\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import GRU, Dense, Dropout, Input\nfrom tensorflow.keras.callbacks import EarlyStopping\nimport kaggle_evaluation.jane_street_inference_server\n\n# Constants\nTARGET = 'responder_6'\nFEAT_COLS = [f\"feature_{i:02d}\" for i in range(79)]\n\n# Load data in smaller chunks\ndef load_data(file_path, columns, n_rows=500000):\n    data = pl.read_parquet(file_path, n_rows=n_rows, columns=columns)\n    return data.to_pandas()\n\n# Downcast data types\ndef downcast_data(df):\n    for col in df.select_dtypes(include=['float64']).columns:\n        df[col] = pd.to_numeric(df[col], downcast='float')\n    for col in df.select_dtypes(include=['int64']).columns:\n        df[col] = pd.to_numeric(df[col], downcast='integer')\n    return df\n\n# Preprocess data\ndef preprocess_data(data):\n    scaler = MinMaxScaler()\n    features = scaler.fit_transform(data[FEAT_COLS].fillna(0))\n    target = data[TARGET].fillna(0).values\n    return features, target, scaler\n\n# Create time-series sequences\ndef create_sequences(features, target, look_back=30):  # Reduced look-back\n    X, y = [], []\n    for i in range(look_back, len(features)):\n        X.append(features[i - look_back:i])\n        y.append(target[i])\n    return np.array(X), np.array(y)\n\n# Load and preprocess training data\nfile_path = '/kaggle/input/jane-street-real-time-market-data-forecasting/train.parquet'\ndata = load_data(file_path, columns=['date_id', 'weight'] + FEAT_COLS + [TARGET], n_rows=500000)\ndata = downcast_data(data)\nfeatures, target, scaler = preprocess_data(data)\nlook_back = 30\nX, y = create_sequences(features, target, look_back)\n\n# Train-test split\nsplit_idx = int(0.8 * len(X))\nX_train, X_test = X[:split_idx], X[split_idx:]\ny_train, y_test = y[:split_idx], y[split_idx:]\n\n# Build GRU model\nmodel = Sequential([\n    Input(shape=(X_train.shape[1], X_train.shape[2])),\n    GRU(units=128, return_sequences=True),\n    Dropout(0.2),\n    GRU(units=64, return_sequences=False),\n    Dropout(0.2),\n    Dense(1)\n])\n\n# Compile and train model\nmodel.compile(optimizer='adam', loss='mean_squared_error')\nearly_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)\nmodel.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=50, batch_size=16, callbacks=[early_stopping])\n\n# Define prediction function\ndef predict(test: pl.DataFrame, lags: pl.DataFrame | None) -> pl.DataFrame:\n    feat = test[FEAT_COLS].to_pandas().fillna(0)\n    scaled_feat = scaler.transform(feat)\n    X = np.array([scaled_feat[-look_back:]])  # Use last `look_back` features for prediction\n    pred = model.predict(X).ravel()\n    predictions = test.select('row_id').with_columns(pl.Series('responder_6', pred))\n    return predictions\n\n# 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    )\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-01-03T16:06:13.258Z"}},"outputs":[],"execution_count":null}]}