{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":60095,"databundleVersionId":6542333,"isSourceIdPinned":false},{"sourceType":"datasetVersion","sourceId":15128340,"datasetId":9687513,"databundleVersionId":16016734},{"sourceType":"datasetVersion","sourceId":15128265,"datasetId":9687456,"databundleVersionId":16016657}],"dockerImageVersionId":31259,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nROOT = /kaggle/input/smartphone-decimeter-2023/sdc2023/train/2020-06-25-00-34-us-ca-mtv-sb-101/pixel4/supplemental/gnss_log.txt\n\nfor root, dirs, files in os.walk(ROOT):\n    for f in files:\n        if f == \"gnss_log.txt\":\n            print(os.path.join(root, f))\n            break\n    break","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nROOT = \"/kaggle/input/google-smartphone-decimeter-challenge/train\"\n\nfor root, dirs, files in os.walk(ROOT):\n    for f in files:\n        if f == \"gnss_log.txt\":\n            print(os.path.join(root, f))\n            break\n    break","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T13:21:04.925544Z","iopub.execute_input":"2026-01-23T13:21:04.925882Z","iopub.status.idle":"2026-01-23T13:21:04.932004Z","shell.execute_reply.started":"2026-01-23T13:21:04.925853Z","shell.execute_reply":"2026-01-23T13:21:04.930776Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nROOT =\" /kaggle/input/smartphone-decimeter-2023/sdc2023/train\"\n\nfor root, dirs, files in os.walk(ROOT):\n    for f in files:\n        if f == \"gnss_log.txt\":\n            print(os.path.join(root, f))\n            break\n    break","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T13:22:50.905793Z","iopub.execute_input":"2026-01-23T13:22:50.906196Z","iopub.status.idle":"2026-01-23T13:22:50.911536Z","shell.execute_reply.started":"2026-01-23T13:22:50.90616Z","shell.execute_reply":"2026-01-23T13:22:50.910582Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nROOT =\" /kaggle/input/smartphone-decimeter-2023/sdc2023/train\"\n\nfor root, dirs, files in os.walk(ROOT):\n    for f in files:\n        if f == \"gnss_log.txt\":\n            print(os.path.join(root, f))\n            break\n    break","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T13:23:46.159671Z","iopub.execute_input":"2026-01-23T13:23:46.160749Z","iopub.status.idle":"2026-01-23T13:23:46.166134Z","shell.execute_reply.started":"2026-01-23T13:23:46.160708Z","shell.execute_reply":"2026-01-23T13:23:46.165074Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"gnss_path = \"/kaggle/input/smartphone-decimeter-2023/sdc2023/train/2020-07-08-22-28-us-ca/pixel4/supplemental/gnss_log.txt\"  # paste your path\n\nwith open(gnss_path, \"r\") as f:\n    for i in range(30):\n        print(f.readline().strip())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:00:51.202431Z","iopub.execute_input":"2026-01-23T15:00:51.202772Z","iopub.status.idle":"2026-01-23T15:00:51.210505Z","shell.execute_reply.started":"2026-01-23T15:00:51.202744Z","shell.execute_reply":"2026-01-23T15:00:51.20945Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\nrows = []\nwith open(gnss_path, \"r\") as f:\n    for line in f:\n        if line.startswith(\"Raw\"):\n            rows.append(line.strip().split(\",\"))\n\nraw_df = pd.DataFrame(rows)\nprint(raw_df.shape)\nraw_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:01:20.059382Z","iopub.execute_input":"2026-01-23T15:01:20.060187Z","iopub.status.idle":"2026-01-23T15:01:20.60949Z","shell.execute_reply.started":"2026-01-23T15:01:20.060149Z","shell.execute_reply":"2026-01-23T15:01:20.608336Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"columns = [\n    \"RecordType\", \"utcTimeMillis\", \"TimeNanos\", \"LeapSecond\",\n    \"TimeUncertaintyNanos\", \"FullBiasNanos\", \"BiasNanos\",\n    \"BiasUncertaintyNanos\", \"DriftNanosPerSecond\",\n    \"DriftUncertaintyNanosPerSecond\", \"HardwareClockDiscontinuityCount\",\n    \"Svid\", \"TimeOffsetNanos\", \"State\", \"ReceivedSvTimeNanos\",\n    \"ReceivedSvTimeUncertaintyNanos\", \"Cn0DbHz\",\n    \"PseudorangeRateMetersPerSecond\",\n    \"PseudorangeRateUncertaintyMetersPerSecond\",\n    \"AccumulatedDeltaRangeState\", \"AccumulatedDeltaRangeMeters\",\n    \"AccumulatedDeltaRangeUncertaintyMeters\",\n    \"CarrierFrequencyHz\", \"CarrierCycles\", \"CarrierPhase\",\n    \"CarrierPhaseUncertainty\", \"MultipathIndicator\",\n    \"SnrInDb\", \"ConstellationType\", \"AgcDb\",\n    \"BasebandCn0DbHz\",\n    \"FullInterSignalBiasNanos\",\n    \"FullInterSignalBiasUncertaintyNanos\",\n    \"SatelliteInterSignalBiasNanos\",\n    \"SatelliteInterSignalBiasUncertaintyNanos\",\n    \"CodeType\", \"ChipsetElapsedRealtimeNanos\"\n]\n\nraw_df.columns = columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:01:24.261438Z","iopub.execute_input":"2026-01-23T15:01:24.261792Z","iopub.status.idle":"2026-01-23T15:01:24.268311Z","shell.execute_reply.started":"2026-01-23T15:01:24.261761Z","shell.execute_reply":"2026-01-23T15:01:24.267275Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"use_cols = [\n    \"TimeNanos\",\n    \"utcTimeMillis\",\n    \"Svid\",\n    \"ConstellationType\",\n    \"Cn0DbHz\",\n    \"BasebandCn0DbHz\",\n    \"SnrInDb\",\n    \"AgcDb\",\n    \"MultipathIndicator\",\n    \"PseudorangeRateMetersPerSecond\",\n    \"PseudorangeRateUncertaintyMetersPerSecond\",\n    \"AccumulatedDeltaRangeUncertaintyMeters\",\n    \"State\"\n]\n\ndf = raw_df[use_cols].copy()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:02:16.899415Z","iopub.execute_input":"2026-01-23T15:02:16.899752Z","iopub.status.idle":"2026-01-23T15:02:16.955384Z","shell.execute_reply.started":"2026-01-23T15:02:16.899723Z","shell.execute_reply":"2026-01-23T15:02:16.954185Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Android GNSS state bits\nSTATE_CODE_LOCK = 1 << 0\nSTATE_TOW_DECODED = 1 << 3\n\ndf[\"State\"] = df[\"State\"].astype(int)\n\nvalid_mask = (\n    (df[\"State\"] & STATE_CODE_LOCK != 0) &\n    (df[\"State\"] & STATE_TOW_DECODED != 0)\n)\n\ndf = df[valid_mask]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:02:32.385222Z","iopub.execute_input":"2026-01-23T15:02:32.386386Z","iopub.status.idle":"2026-01-23T15:02:32.422777Z","shell.execute_reply.started":"2026-01-23T15:02:32.386345Z","shell.execute_reply":"2026-01-23T15:02:32.421619Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df[\"time_sec\"] = df[\"TimeNanos\"].astype(float) * 1e-9\n\nWINDOW = 5  # seconds\ndf[\"window_id\"] = (df[\"time_sec\"] // WINDOW).astype(int)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:03:58.946389Z","iopub.execute_input":"2026-01-23T15:03:58.946732Z","iopub.status.idle":"2026-01-23T15:03:58.970275Z","shell.execute_reply.started":"2026-01-23T15:03:58.946701Z","shell.execute_reply":"2026-01-23T15:03:58.969316Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ts_df = df[[\n    \"window_id\",\n    \"time_sec\",\n    \"Svid\",\n    \"Cn0DbHz\",\n    \"BasebandCn0DbHz\",\n    \"SnrInDb\",\n    \"AgcDb\",\n    \"MultipathIndicator\",\n    \"PseudorangeRateMetersPerSecond\"\n]]\n\nts_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:07:46.424673Z","iopub.execute_input":"2026-01-23T15:07:46.425007Z","iopub.status.idle":"2026-01-23T15:07:46.449903Z","shell.execute_reply.started":"2026-01-23T15:07:46.424979Z","shell.execute_reply":"2026-01-23T15:07:46.448848Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tsfresh import extract_features\nfrom tsfresh.feature_extraction import EfficientFCParameters\nfrom tsfresh.utilities.dataframe_functions import impute\n\nfeatures = extract_features(\n    ts_df,\n    column_id=\"Svid\",\n    column_sort=\"time_sec\",\n    default_fc_parameters=EfficientFCParameters(),\n    disable_progressbar=False,\n    n_jobs=0\n)\n\nimpute(features)\n\nfeatures.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:09:59.181451Z","iopub.execute_input":"2026-01-23T15:09:59.182717Z","iopub.status.idle":"2026-01-23T15:09:59.78727Z","shell.execute_reply.started":"2026-01-23T15:09:59.182648Z","shell.execute_reply":"2026-01-23T15:09:59.7854Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ===============================\n# 1. Imports\n# ===============================\nimport pandas as pd\nfrom tsfresh import extract_features\nfrom tsfresh.feature_extraction import EfficientFCParameters\nfrom tsfresh.utilities.dataframe_functions import impute\n\n\n# ===============================\n# 2. Load and parse gnss_log.txt\n# ===============================\ngnss_path = \"/kaggle/input/smartphone-decimeter-2023/sdc2023/train/2020-06-25-00-34-us-ca-mtv-sb-101/pixel4/supplemental/gnss_log.txt\"\n\nrows = []\nwith open(gnss_path, \"r\") as f:\n    for line in f:\n        if line.startswith(\"Raw\"):\n            rows.append(line.strip().split(\",\"))\n\nraw_df = pd.DataFrame(rows)\n\n\n# ===============================\n# 3. Assign column names (37)\n# ===============================\ncolumns = [\n    \"RecordType\", \"utcTimeMillis\", \"TimeNanos\", \"LeapSecond\",\n    \"TimeUncertaintyNanos\", \"FullBiasNanos\", \"BiasNanos\",\n    \"BiasUncertaintyNanos\", \"DriftNanosPerSecond\",\n    \"DriftUncertaintyNanosPerSecond\", \"HardwareClockDiscontinuityCount\",\n    \"Svid\", \"TimeOffsetNanos\", \"State\", \"ReceivedSvTimeNanos\",\n    \"ReceivedSvTimeUncertaintyNanos\", \"Cn0DbHz\",\n    \"PseudorangeRateMetersPerSecond\",\n    \"PseudorangeRateUncertaintyMetersPerSecond\",\n    \"AccumulatedDeltaRangeState\", \"AccumulatedDeltaRangeMeters\",\n    \"AccumulatedDeltaRangeUncertaintyMeters\",\n    \"CarrierFrequencyHz\", \"CarrierCycles\", \"CarrierPhase\",\n    \"CarrierPhaseUncertainty\", \"MultipathIndicator\",\n    \"SnrInDb\", \"ConstellationType\", \"AgcDb\",\n    \"BasebandCn0DbHz\",\n    \"FullInterSignalBiasNanos\",\n    \"FullInterSignalBiasUncertaintyNanos\",\n    \"SatelliteInterSignalBiasNanos\",\n    \"SatelliteInterSignalBiasUncertaintyNanos\",\n    \"CodeType\", \"ChipsetElapsedRealtimeNanos\"\n]\n\nraw_df.columns = columns\n\n\n# ===============================\n# 4. Keep ONLY trust-relevant columns\n# ===============================\nuse_cols = [\n    \"TimeNanos\",\n    \"utcTimeMillis\",\n    \"Svid\",\n    \"ConstellationType\",\n    \"Cn0DbHz\",\n    \"BasebandCn0DbHz\",\n    \"SnrInDb\",\n    \"AgcDb\",\n    \"MultipathIndicator\",\n    \"PseudorangeRateMetersPerSecond\",\n    \"PseudorangeRateUncertaintyMetersPerSecond\",\n    \"AccumulatedDeltaRangeUncertaintyMeters\",\n    \"State\"\n]\n\ndf = raw_df[use_cols].copy()\n\n\n# ===============================\n# 5. Convert signal columns to numeric\n# ===============================\nsignal_cols = [\n    \"Cn0DbHz\",\n    \"BasebandCn0DbHz\",\n    \"SnrInDb\",\n    \"AgcDb\",\n    \"MultipathIndicator\",\n    \"PseudorangeRateMetersPerSecond\",\n    \"PseudorangeRateUncertaintyMetersPerSecond\",\n    \"AccumulatedDeltaRangeUncertaintyMeters\"\n]\n\nfor col in signal_cols:\n    df[col] = pd.to_numeric(df[col], errors=\"coerce\")\n\ndf[\"Svid\"] = df[\"Svid\"].astype(int)\ndf[\"ConstellationType\"] = df[\"ConstellationType\"].astype(int)\ndf[\"State\"] = df[\"State\"].astype(int)\n\n\n# ===============================\n# 6. Minimal validity filtering (code lock + TOW decoded)\n# ===============================\nSTATE_CODE_LOCK = 1 << 0\nSTATE_TOW_DECODED = 1 << 3\n\nvalid_mask = (\n    (df[\"State\"] & STATE_CODE_LOCK != 0) &\n    (df[\"State\"] & STATE_TOW_DECODED != 0)\n)\n\ndf = df[valid_mask]\n\n\n# ===============================\n# 7. Time normalization\n# ===============================\ndf[\"time_sec\"] = df[\"TimeNanos\"].astype(float) * 1e-9\n\n\n# ===============================\n# 8. Reshape to tsfresh LONG format\n# ===============================\nvalue_cols = [\n    \"Cn0DbHz\",\n    \"BasebandCn0DbHz\",\n    \"SnrInDb\",\n    \"AgcDb\",\n    \"MultipathIndicator\",\n    \"PseudorangeRateMetersPerSecond\"\n]\n\nts_long = df.melt(\n    id_vars=[\"Svid\", \"time_sec\"],\n    value_vars=value_cols,\n    var_name=\"kind\",\n    value_name=\"value\"\n)\n\n\n# ===============================\n# 9. tsfresh feature extraction (satellite-level)\n# ===============================\n# Drop NaNs ONLY for tsfresh compatibility\nts_long = ts_long.dropna(subset=[\"value\"])\nfeatures = extract_features(\n    ts_long,\n    column_id=\"Svid\",\n    column_sort=\"time_sec\",\n    column_kind=\"kind\",\n    column_value=\"value\",\n    default_fc_parameters=EfficientFCParameters(),\n    n_jobs=0,                     # REQUIRED for Colab stability\n    disable_progressbar=False\n)\n\n\n# ===============================\n# 10. Impute feature table\n# ===============================\nimpute(features)\n\n\n# ===============================\n# 11. Done\n# ===============================\nprint(\"Feature extraction successful!\")\nprint(features.shape)\nfeatures.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:15:19.274469Z","iopub.execute_input":"2026-01-23T15:15:19.275489Z","iopub.status.idle":"2026-01-23T15:15:44.382366Z","shell.execute_reply.started":"2026-01-23T15:15:19.275447Z","shell.execute_reply":"2026-01-23T15:15:44.381432Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\n\n# Remove columns with NaN or zero variance\nvalid_features = features.loc[:, features.var() > 0]\n\nprint(\"Original features:\", features.shape[1])\nprint(\"After variance filter:\", valid_features.shape[1])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:20:08.596554Z","iopub.execute_input":"2026-01-23T15:20:08.596902Z","iopub.status.idle":"2026-01-23T15:20:08.610739Z","shell.execute_reply.started":"2026-01-23T15:20:08.596873Z","shell.execute_reply":"2026-01-23T15:20:08.609113Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"corr = valid_features.corr().abs()\n\nupper = corr.where(\n    np.triu(np.ones(corr.shape), k=1).astype(bool)\n)\n\nto_drop = [column for column in upper.columns if any(upper[column] > 0.95)]\n\nreduced_features = valid_features.drop(columns=to_drop)\n\nprint(\"After correlation filter:\", reduced_features.shape[1])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:20:26.082135Z","iopub.execute_input":"2026-01-23T15:20:26.082505Z","iopub.status.idle":"2026-01-23T15:20:26.586848Z","shell.execute_reply.started":"2026-01-23T15:20:26.082474Z","shell.execute_reply":"2026-01-23T15:20:26.58578Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"keywords = [\n    \"variance\",\n    \"entropy\",\n    \"autocorrelation\",\n    \"mean_change\",\n    \"mean_abs_change\",\n    \"fourier_entropy\",\n    \"permutation_entropy\",\n    \"standard_deviation\"\n]\n\ntrust_features = reduced_features[\n    [c for c in reduced_features.columns if any(k in c for k in keywords)]\n]\n\nprint(\"Trust-focused features:\", trust_features.shape[1])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:20:42.162433Z","iopub.execute_input":"2026-01-23T15:20:42.162775Z","iopub.status.idle":"2026-01-23T15:20:42.172454Z","shell.execute_reply.started":"2026-01-23T15:20:42.162747Z","shell.execute_reply":"2026-01-23T15:20:42.17127Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import RobustScaler\n\nscaler = RobustScaler()\nX = scaler.fit_transform(trust_features)\n\nX.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:26:06.537629Z","iopub.execute_input":"2026-01-23T15:26:06.538009Z","iopub.status.idle":"2026-01-23T15:26:06.564539Z","shell.execute_reply.started":"2026-01-23T15:26:06.537975Z","shell.execute_reply":"2026-01-23T15:26:06.563334Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\n\ninstability_score = np.linalg.norm(X, axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:26:12.918255Z","iopub.execute_input":"2026-01-23T15:26:12.918638Z","iopub.status.idle":"2026-01-23T15:26:12.924496Z","shell.execute_reply.started":"2026-01-23T15:26:12.918606Z","shell.execute_reply":"2026-01-23T15:26:12.9231Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trust_score = 1 / (1 + instability_score)\n\n# Normalize to [0, 1]\ntrust_score = (trust_score - trust_score.min()) / (trust_score.max() - trust_score.min())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:26:29.89576Z","iopub.execute_input":"2026-01-23T15:26:29.896818Z","iopub.status.idle":"2026-01-23T15:26:29.902341Z","shell.execute_reply.started":"2026-01-23T15:26:29.896777Z","shell.execute_reply":"2026-01-23T15:26:29.900958Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trust_df = trust_features.copy()\ntrust_df[\"trust_score\"] = trust_score\n\ntrust_df[[\"trust_score\"]].describe()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:26:44.594827Z","iopub.execute_input":"2026-01-23T15:26:44.595158Z","iopub.status.idle":"2026-01-23T15:26:44.616574Z","shell.execute_reply.started":"2026-01-23T15:26:44.59513Z","shell.execute_reply":"2026-01-23T15:26:44.615383Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.hist(trust_score, bins=10)\nplt.xlabel(\"Trust score\")\nplt.ylabel(\"Satellite count\")\nplt.title(\"Satellite-level GNSS Trust Distribution\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T15:27:49.920159Z","iopub.execute_input":"2026-01-23T15:27:49.920524Z","iopub.status.idle":"2026-01-23T15:27:50.200254Z","shell.execute_reply.started":"2026-01-23T15:27:49.920494Z","shell.execute_reply":"2026-01-23T15:27:50.198863Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"\nFull project stsrts from here step by step by step  ","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\n\nfrom tsfresh import extract_features\nfrom tsfresh.feature_extraction import EfficientFCParameters\nfrom tsfresh.utilities.dataframe_functions import impute\n\nfrom sklearn.preprocessing import RobustScaler","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T16:00:29.366133Z","iopub.execute_input":"2026-01-23T16:00:29.366485Z","iopub.status.idle":"2026-01-23T16:00:29.372526Z","shell.execute_reply.started":"2026-01-23T16:00:29.366457Z","shell.execute_reply":"2026-01-23T16:00:29.371258Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"STATE_CODE_LOCK = 1 << 0\nSTATE_TOW_DECODED = 1 << 3\n\nCOLUMNS = [\n    \"RecordType\", \"utcTimeMillis\", \"TimeNanos\", \"LeapSecond\",\n    \"TimeUncertaintyNanos\", \"FullBiasNanos\", \"BiasNanos\",\n    \"BiasUncertaintyNanos\", \"DriftNanosPerSecond\",\n    \"DriftUncertaintyNanosPerSecond\", \"HardwareClockDiscontinuityCount\",\n    \"Svid\", \"TimeOffsetNanos\", \"State\", \"ReceivedSvTimeNanos\",\n    \"ReceivedSvTimeUncertaintyNanos\", \"Cn0DbHz\",\n    \"PseudorangeRateMetersPerSecond\",\n    \"PseudorangeRateUncertaintyMetersPerSecond\",\n    \"AccumulatedDeltaRangeState\", \"AccumulatedDeltaRangeMeters\",\n    \"AccumulatedDeltaRangeUncertaintyMeters\",\n    \"CarrierFrequencyHz\", \"CarrierCycles\", \"CarrierPhase\",\n    \"CarrierPhaseUncertainty\", \"MultipathIndicator\",\n    \"SnrInDb\", \"ConstellationType\", \"AgcDb\",\n    \"BasebandCn0DbHz\",\n    \"FullInterSignalBiasNanos\",\n    \"FullInterSignalBiasUncertaintyNanos\",\n    \"SatelliteInterSignalBiasNanos\",\n    \"SatelliteInterSignalBiasUncertaintyNanos\",\n    \"CodeType\", \"ChipsetElapsedRealtimeNanos\"\n]\n\nUSE_COLS = [\n    \"TimeNanos\", \"utcTimeMillis\", \"Svid\", \"ConstellationType\",\n    \"Cn0DbHz\", \"BasebandCn0DbHz\", \"SnrInDb\", \"AgcDb\",\n    \"MultipathIndicator\",\n    \"PseudorangeRateMetersPerSecond\",\n    \"PseudorangeRateUncertaintyMetersPerSecond\",\n    \"AccumulatedDeltaRangeUncertaintyMeters\",\n    \"State\"\n]\n\nSIGNAL_COLS = [\n    \"Cn0DbHz\", \"BasebandCn0DbHz\", \"SnrInDb\", \"AgcDb\",\n    \"MultipathIndicator\",\n    \"PseudorangeRateMetersPerSecond\",\n    \"PseudorangeRateUncertaintyMetersPerSecond\",\n    \"AccumulatedDeltaRangeUncertaintyMeters\"\n]\n\nVALUE_COLS = [\n    \"Cn0DbHz\",\n    \"BasebandCn0DbHz\",\n    \"SnrInDb\",\n    \"AgcDb\",\n    \"MultipathIndicator\",\n    \"PseudorangeRateMetersPerSecond\"\n]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T16:00:59.523558Z","iopub.execute_input":"2026-01-23T16:00:59.523902Z","iopub.status.idle":"2026-01-23T16:00:59.531743Z","shell.execute_reply.started":"2026-01-23T16:00:59.523873Z","shell.execute_reply":"2026-01-23T16:00:59.530377Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def extract_satellite_trust(gnss_path):\n    # --- Parse gnss_log.txt ---\n    rows = []\n    with open(gnss_path, \"r\") as f:\n        for line in f:\n            if line.startswith(\"Raw\"):\n                rows.append(line.strip().split(\",\"))\n\n    if len(rows) == 0:\n        return None\n\n    raw_df = pd.DataFrame(rows, columns=COLUMNS)\n    df = raw_df[USE_COLS].copy()\n\n    # --- Numeric conversion ---\n    for col in SIGNAL_COLS:\n        df[col] = pd.to_numeric(df[col], errors=\"coerce\")\n\n    df[\"Svid\"] = df[\"Svid\"].astype(int)\n    df[\"ConstellationType\"] = df[\"ConstellationType\"].astype(int)\n    df[\"State\"] = df[\"State\"].astype(int)\n\n    # --- Valid GNSS states ---\n    valid_mask = (\n        (df[\"State\"] & STATE_CODE_LOCK != 0) &\n        (df[\"State\"] & STATE_TOW_DECODED != 0)\n    )\n    df = df[valid_mask]\n\n    if df.empty:\n        return None\n\n    # --- Time normalization ---\n    df[\"time_sec\"] = df[\"TimeNanos\"].astype(float) * 1e-9\n\n    # --- Long format for tsfresh ---\n    ts_long = df.melt(\n        id_vars=[\"Svid\", \"time_sec\"],\n        value_vars=VALUE_COLS,\n        var_name=\"kind\",\n        value_name=\"value\"\n    ).dropna(subset=[\"value\"])\n\n    # --- Feature extraction ---\n    features = extract_features(\n        ts_long,\n        column_id=\"Svid\",\n        column_sort=\"time_sec\",\n        column_kind=\"kind\",\n        column_value=\"value\",\n        default_fc_parameters=EfficientFCParameters(),\n        n_jobs=0\n    )\n\n    impute(features)\n\n    # --- Feature reduction ---\n    valid_features = features.loc[:, features.var() > 0]\n\n    corr = valid_features.corr().abs()\n    upper = corr.where(np.triu(np.ones(corr.shape), k=1).astype(bool))\n    to_drop = [c for c in upper.columns if any(upper[c] > 0.95)]\n\n    reduced_features = valid_features.drop(columns=to_drop)\n\n    keywords = [\n        \"variance\", \"entropy\", \"autocorrelation\",\n        \"mean_change\", \"mean_abs_change\",\n        \"fourier_entropy\", \"permutation_entropy\",\n        \"standard_deviation\"\n    ]\n\n    trust_features = reduced_features[\n        [c for c in reduced_features.columns if any(k in c for k in keywords)]\n    ]\n\n    # --- Trust score ---\n    scaler = RobustScaler()\n    X = scaler.fit_transform(trust_features)\n\n    instability = np.linalg.norm(X, axis=1)\n    trust_score = 1 / (1 + instability)\n    trust_score = (trust_score - trust_score.min()) / (trust_score.max() - trust_score.min())\n\n    trust_df = trust_features.copy()\n    trust_df[\"trust_score\"] = trust_score\n    trust_df[\"Svid\"] = trust_df.index\n\n    return trust_df.reset_index(drop=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T16:01:33.335214Z","iopub.execute_input":"2026-01-23T16:01:33.336383Z","iopub.status.idle":"2026-01-23T16:01:33.350735Z","shell.execute_reply.started":"2026-01-23T16:01:33.336336Z","shell.execute_reply":"2026-01-23T16:01:33.349558Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ROOT = \"/kaggle/input/smartphone-decimeter-2023/sdc2023/train\"\n\ngnss_paths = []\n\nfor session in os.listdir(ROOT):\n    session_path = os.path.join(ROOT, session)\n    if not os.path.isdir(session_path):\n        continue\n\n    for phone in os.listdir(session_path):\n        gnss_file = os.path.join(\n            session_path, phone, \"supplemental\", \"gnss_log.txt\"\n        )\n        if os.path.exists(gnss_file):\n            gnss_paths.append({\n                \"session\": session,\n                \"phone\": phone,\n                \"path\": gnss_file\n            })\n\nprint(\"Total GNSS files found:\", len(gnss_paths))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T16:01:56.338954Z","iopub.execute_input":"2026-01-23T16:01:56.339275Z","iopub.status.idle":"2026-01-23T16:01:56.412088Z","shell.execute_reply.started":"2026-01-23T16:01:56.339247Z","shell.execute_reply":"2026-01-23T16:01:56.411033Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"all_trust_tables = []\n\nfor item in gnss_paths:\n    try:\n        trust_df = extract_satellite_trust(item[\"path\"])\n        if trust_df is None:\n            continue\n\n        trust_df[\"phone\"] = item[\"phone\"]\n        trust_df[\"session\"] = item[\"session\"]\n\n        all_trust_tables.append(trust_df)\n\n    except Exception as e:\n        print(\"Failed:\", item[\"path\"], e)\n\nglobal_trust_df = pd.concat(all_trust_tables, ignore_index=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T16:03:01.885508Z","iopub.execute_input":"2026-01-23T16:03:01.885851Z","iopub.status.idle":"2026-01-23T17:08:21.396306Z","shell.execute_reply.started":"2026-01-23T16:03:01.885822Z","shell.execute_reply":"2026-01-23T17:08:21.395058Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Final trust table shape:\", global_trust_df.shape)\nglobal_trust_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T17:20:10.652627Z","iopub.execute_input":"2026-01-23T17:20:10.652975Z","iopub.status.idle":"2026-01-23T17:20:10.683449Z","shell.execute_reply.started":"2026-01-23T17:20:10.652946Z","shell.execute_reply":"2026-01-23T17:20:10.681984Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Final feature-level imputation\ntrust_feature_cols = trust_df.columns.drop([\"trust_score\", \"Svid\", \"phone\", \"session\"], errors=\"ignore\")\n\ntrust_df[trust_feature_cols] = trust_df[trust_feature_cols].fillna(0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T17:20:06.367964Z","iopub.execute_input":"2026-01-23T17:20:06.368953Z","iopub.status.idle":"2026-01-23T17:20:06.386782Z","shell.execute_reply.started":"2026-01-23T17:20:06.368912Z","shell.execute_reply":"2026-01-23T17:20:06.385569Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trust_df.isna().sum().sort_values(ascending=False).head(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T17:21:16.096996Z","iopub.execute_input":"2026-01-23T17:21:16.097425Z","iopub.status.idle":"2026-01-23T17:21:16.108838Z","shell.execute_reply.started":"2026-01-23T17:21:16.097393Z","shell.execute_reply":"2026-01-23T17:21:16.107877Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"output_path = \"/kaggle/working/global_gnss_trust_final.parquet\"\nglobal_trust_df.to_parquet(output_path, index=False)\n\nprint(\"Saved to:\", output_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T17:25:34.023474Z","iopub.execute_input":"2026-01-23T17:25:34.02384Z","iopub.status.idle":"2026-01-23T17:25:34.076954Z","shell.execute_reply.started":"2026-01-23T17:25:34.023793Z","shell.execute_reply":"2026-01-23T17:25:34.076037Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"output_path = \"/kaggle/working/global_gnss_trust1.csv\"\nglobal_trust_df.to_csv(output_path, index=False)\n\nprint(\"Saved to:\", output_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-23T17:26:16.550491Z","iopub.execute_input":"2026-01-23T17:26:16.550854Z","iopub.status.idle":"2026-01-23T17:26:16.971961Z","shell.execute_reply.started":"2026-01-23T17:26:16.550812Z","shell.execute_reply":"2026-01-23T17:26:16.971023Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\nglobal_trust_df = pd.read_csv(\"/kaggle/input/datasets/purandeswarreddy/trustcsv/global_gnss_trust1.csv\")\n\nglobal_trust_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-11T03:44:21.828204Z","iopub.execute_input":"2026-03-11T03:44:21.828582Z","iopub.status.idle":"2026-03-11T03:44:21.93022Z","shell.execute_reply.started":"2026-03-11T03:44:21.828552Z","shell.execute_reply":"2026-03-11T03:44:21.929339Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.figure(figsize=(6,4))\nplt.hist(global_trust_df[\"trust_score\"], bins=20)\nplt.xlabel(\"Trust Score\")\nplt.ylabel(\"Satellite Count\")\nplt.title(\"Global GNSS Satellite Trust Distribution\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-11T03:44:35.299359Z","iopub.execute_input":"2026-03-11T03:44:35.29974Z","iopub.status.idle":"2026-03-11T03:44:35.582494Z","shell.execute_reply.started":"2026-03-11T03:44:35.299712Z","shell.execute_reply":"2026-03-11T03:44:35.581577Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(8,4))\n\nglobal_trust_df.boxplot(\n    column=\"trust_score\",\n    by=\"phone\",\n    grid=False,\n    rot=45\n)\n\nplt.title(\"Trust Score Distribution Across Phones\")\nplt.suptitle(\"\")\nplt.xlabel(\"Phone\")\nplt.ylabel(\"Trust Score\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-11T03:44:49.248111Z","iopub.execute_input":"2026-03-11T03:44:49.248459Z","iopub.status.idle":"2026-03-11T03:44:49.691115Z","shell.execute_reply.started":"2026-03-11T03:44:49.24843Z","shell.execute_reply":"2026-03-11T03:44:49.689986Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10,4))\n\nglobal_trust_df.boxplot(\n    column=\"trust_score\",\n    by=\"session\",\n    grid=False,\n    rot=90\n)\n\nplt.title(\"Trust Score Distribution Across Sessions\")\nplt.suptitle(\"\")\nplt.xlabel(\"Session\")\nplt.ylabel(\"Trust Score\")\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-11T03:45:00.173951Z","iopub.execute_input":"2026-03-11T03:45:00.174308Z","iopub.status.idle":"2026-03-11T03:45:01.042937Z","shell.execute_reply.started":"2026-03-11T03:45:00.174277Z","shell.execute_reply":"2026-03-11T03:45:01.042008Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =========================================\n# GRU FOR TEMPORAL GNSS TRUST (UPDATED)\n# =========================================\n\nimport numpy as np\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\nfrom sklearn.preprocessing import StandardScaler\nimport pandas as pd\n\n# Load data\ndf = pd.read_parquet(\"/kaggle/input/datasets/purandeswarreddy/parqute/global_gnss_trust.parquet\")\n\nmeta_cols = [\"trust_score\", \"Svid\", \"phone\", \"session\"]\nfeature_cols = [c for c in df.columns if c not in meta_cols]\n\nX = df[feature_cols].fillna(0).values\ny = df[\"trust_score\"].values\nsvids = df[\"Svid\"].values\n\nscaler = StandardScaler()\nX = scaler.fit_transform(X)\n\nSEQ_LEN = 5\n\ndef build_sequences(X, y, svids, seq_len):\n    X_seq, y_seq, svid_seq = [], [], []\n\n    for svid in np.unique(svids):\n        idx = np.where(svids == svid)[0]\n        for i in range(len(idx) - seq_len):\n            X_seq.append(X[idx[i:i+seq_len]])\n            y_seq.append(y[idx[i+seq_len]])\n            svid_seq.append(svid)\n\n    return np.array(X_seq), np.array(y_seq), np.array(svid_seq)\n\nX_seq, y_seq, svid_seq = build_sequences(X, y, svids, SEQ_LEN)\n\nclass TrustDataset(Dataset):\n    def __init__(self, X, y):\n        self.X = torch.tensor(X, dtype=torch.float32)\n        self.y = torch.tensor(y, dtype=torch.float32)\n\n    def __len__(self):\n        return len(self.X)\n\n    def __getitem__(self, idx):\n        return self.X[idx], self.y[idx]\n\ndataset = TrustDataset(X_seq, y_seq)\nloader = DataLoader(dataset, batch_size=64, shuffle=True)\n\nclass TrustGRU(nn.Module):\n    def __init__(self, input_dim, hidden_dim=64):\n        super().__init__()\n        self.gru = nn.GRU(input_dim, hidden_dim, batch_first=True)\n        self.fc = nn.Linear(hidden_dim, 1)\n\n    def forward(self, x):\n        _, h = self.gru(x)\n        out = self.fc(h[-1])\n        out = torch.clamp(out, 0.0, 1.0)  # <-- bounded trust\n        return out.squeeze()\n\nmodel = TrustGRU(input_dim=X_seq.shape[2])\noptimizer = torch.optim.Adam(model.parameters(), lr=1e-3)\nloss_fn = nn.MSELoss()\n\n# Train\nfor epoch in range(20):\n    total_loss = 0\n    for xb, yb in loader:\n        optimizer.zero_grad()\n        pred = model(xb)\n        loss = loss_fn(pred, yb)\n        loss.backward()\n        optimizer.step()\n        total_loss += loss.item()\n    print(f\"Epoch {epoch+1}/20 - Loss: {total_loss/len(loader):.4f}\")\n\n# Predict with SVID mapping\nmodel.eval()\nwith torch.no_grad():\n    preds = model(torch.tensor(X_seq, dtype=torch.float32)).numpy()\n\nprint(\"\\nPredicted future trust (mapped to satellites):\")\nfor svid, pred in zip(svid_seq[:10], preds[:10]):\n    print(f\"SVID {svid} → predicted future trust = {pred:.3f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-11T03:49:03.313212Z","iopub.execute_input":"2026-03-11T03:49:03.313571Z","iopub.status.idle":"2026-03-11T03:49:17.751194Z","shell.execute_reply.started":"2026-03-11T03:49:03.313543Z","shell.execute_reply":"2026-03-11T03:49:17.750211Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nmodel.eval()\nwith torch.no_grad():\n    preds = model(torch.tensor(X_seq, dtype=torch.float32)).numpy()\n\nplt.scatter(y_seq, preds, alpha=0.3)\nplt.xlabel(\"True Trust\")\nplt.ylabel(\"Predicted Trust\")\nplt.title(\"GRU Trust Prediction\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-11T03:49:36.742235Z","iopub.execute_input":"2026-03-11T03:49:36.742707Z","iopub.status.idle":"2026-03-11T03:49:36.96199Z","shell.execute_reply.started":"2026-03-11T03:49:36.742678Z","shell.execute_reply":"2026-03-11T03:49:36.961096Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\n# ===============================\n# 1. Build prediction DataFrame\n# ===============================\npred_df = pd.DataFrame({\n    \"Svid\": svid_seq,\n    \"predicted_trust\": preds\n})\n\nprint(\"Sample prediction table:\")\nprint(pred_df.head())\n\n# ===============================\n# 2. Per-satellite temporal view\n# ===============================\nprint(\"\\n--- Per-satellite trust evolution (first 10 per satellite) ---\")\nfor svid in pred_df[\"Svid\"].unique():\n    values = pred_df[pred_df[\"Svid\"] == svid][\"predicted_trust\"].values[:10]\n    print(f\"SVID {svid}: {np.round(values, 3)}\")\n\n# ===============================\n# 3. Summarized trust per satellite\n# ===============================\nsatellite_summary = (\n    pred_df\n    .groupby(\"Svid\")[\"predicted_trust\"]\n    .agg(\n        mean_predicted_trust=\"mean\",\n        min_predicted_trust=\"min\",\n        max_predicted_trust=\"max\"\n    )\n    .reset_index()\n)\n\n# ===============================\n# 4. Semantic trust labeling\n# ===============================\ndef label_trust(score):\n    if score >= 0.85:\n        return \"HIGH_TRUST\"\n    elif score >= 0.65:\n        return \"GOOD_TRUST\"\n    elif score >= 0.45:\n        return \"MODERATE_TRUST\"\n    elif score >= 0.30:\n        return \"LOW_TRUST\"\n    else:\n        return \"UNTRUSTED\"\n\nsatellite_summary[\"trust_label\"] = satellite_summary[\"mean_predicted_trust\"].apply(label_trust)\n\n# ===============================\n# 5. Final result\n# ===============================\nprint(\"\\n--- Final summarized trust per satellite ---\")\nprint(satellite_summary.sort_values(\"mean_predicted_trust\", ascending=False))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-11T03:49:52.187857Z","iopub.execute_input":"2026-03-11T03:49:52.188199Z","iopub.status.idle":"2026-03-11T03:49:52.252805Z","shell.execute_reply.started":"2026-03-11T03:49:52.188171Z","shell.execute_reply":"2026-03-11T03:49:52.251831Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# =========================================\n# EARLY WARNING SYSTEM FOR GNSS TRUST\n# =========================================\n\nimport numpy as np\nimport torch\n\n# -----------------------------\n# Parameters\n# -----------------------------\nWARNING_THRESHOLD = 0.30   # unsafe trust\nDROP_THRESHOLD = 0.15      # rapid degradation\n\nmodel.eval()\n\nwith torch.no_grad():\n    preds = model(torch.tensor(X_seq, dtype=torch.float32))\n    preds = torch.clamp(preds, 0.0, 1.0).numpy()\n\ntrue_trust = y_seq\n\n# -----------------------------\n# Early warning detection\n# -----------------------------\nwarnings = []\n\nfor i in range(len(preds)):\n    current_t = true_trust[i]\n    future_t = preds[i]\n    drop = current_t - future_t\n\n    if (future_t < WARNING_THRESHOLD) or (drop > DROP_THRESHOLD):\n        warnings.append(1)   # WARNING\n    else:\n        warnings.append(0)   # SAFE\n\nwarnings = np.array(warnings)\n\nprint(\"Total warnings detected:\", warnings.sum())\nprint(\"Warning rate:\", warnings.mean())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-11T03:50:35.213943Z","iopub.execute_input":"2026-03-11T03:50:35.214293Z","iopub.status.idle":"2026-03-11T03:50:35.253507Z","shell.execute_reply.started":"2026-03-11T03:50:35.214264Z","shell.execute_reply":"2026-03-11T03:50:35.252205Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.figure(figsize=(6,4))\nplt.scatter(true_trust, preds, c=warnings, cmap=\"coolwarm\", alpha=0.4)\nplt.xlabel(\"Current Trust\")\nplt.ylabel(\"Predicted Trust\")\nplt.title(\"Early Warning Detection (Red = Warning)\")\nplt.colorbar(label=\"Warning\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-11T03:50:52.364324Z","iopub.execute_input":"2026-03-11T03:50:52.365081Z","iopub.status.idle":"2026-03-11T03:50:52.634903Z","shell.execute_reply.started":"2026-03-11T03:50:52.365046Z","shell.execute_reply":"2026-03-11T03:50:52.633887Z"}},"outputs":[],"execution_count":null}]}