{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":46105,"databundleVersionId":5087314,"sourceType":"competition"},{"sourceId":120208086,"sourceType":"kernelVersion"}],"dockerImageVersionId":30804,"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,"execution":{"iopub.status.busy":"2024-12-12T17:49:35.731168Z","iopub.execute_input":"2024-12-12T17:49:35.731627Z","iopub.status.idle":"2024-12-12T17:53:17.079298Z","shell.execute_reply.started":"2024-12-12T17:49:35.731588Z","shell.execute_reply":"2024-12-12T17:53:17.077915Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd \nimport numpy as np \nimport matplotlib.pyplot as plt\nimport seaborn as sns ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:17.081714Z","iopub.execute_input":"2024-12-12T17:53:17.082168Z","iopub.status.idle":"2024-12-12T17:53:17.088081Z","shell.execute_reply.started":"2024-12-12T17:53:17.082124Z","shell.execute_reply":"2024-12-12T17:53:17.086890Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ROWS_PER_FRAME = 543  # number of landmarks per frame\n\ndef load_relevant_data_subset(pq_path):\n    data_columns = ['x', 'y', 'z']\n    data = pd.read_parquet(pq_path, columns=data_columns)\n    n_frames = int(len(data) / ROWS_PER_FRAME)\n    data = data.values.reshape(n_frames, ROWS_PER_FRAME, len(data_columns))\n    return data.astype(np.float32)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:17.089640Z","iopub.execute_input":"2024-12-12T17:53:17.090000Z","iopub.status.idle":"2024-12-12T17:53:17.103309Z","shell.execute_reply.started":"2024-12-12T17:53:17.089968Z","shell.execute_reply":"2024-12-12T17:53:17.102073Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install tflite-runtime\n\nimport tflite_runtime.interpreter as tflite\ndef run_model(model_path):\n    \n    \n    interpreter = tflite.Interpreter(model_path)\n\n    found_signatures = list(interpreter.get_signature_list().keys())\n\n    if REQUIRED_SIGNATURE not in found_signatures:\n        raise KernelEvalException('Required input signature not found.')\n\n    prediction_fn = interpreter.get_signature_runner(\"serving_default\")\n    output = prediction_fn(inputs=frames)\n    sign = np.argmax(output[\"outputs\"])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:17.104988Z","iopub.execute_input":"2024-12-12T17:53:17.105465Z","iopub.status.idle":"2024-12-12T17:53:29.384546Z","shell.execute_reply.started":"2024-12-12T17:53:17.105412Z","shell.execute_reply":"2024-12-12T17:53:29.383295Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm.notebook import tqdm\n\nplt.style.use(\"seaborn-colorblind\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:29.388786Z","iopub.execute_input":"2024-12-12T17:53:29.389242Z","iopub.status.idle":"2024-12-12T17:53:29.404461Z","shell.execute_reply.started":"2024-12-12T17:53:29.389204Z","shell.execute_reply":"2024-12-12T17:53:29.403267Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!ls ../input/asl-signs/ -GFlash --color","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:29.405990Z","iopub.execute_input":"2024-12-12T17:53:29.406998Z","iopub.status.idle":"2024-12-12T17:53:30.506565Z","shell.execute_reply.started":"2024-12-12T17:53:29.406958Z","shell.execute_reply":"2024-12-12T17:53:30.504973Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"BASE_DIR='../input/asl-signs/'\ntrain = pd.read_csv(f'{BASE_DIR}/train.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:30.508428Z","iopub.execute_input":"2024-12-12T17:53:30.508836Z","iopub.status.idle":"2024-12-12T17:53:30.760316Z","shell.execute_reply.started":"2024-12-12T17:53:30.508798Z","shell.execute_reply":"2024-12-12T17:53:30.759315Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:30.761505Z","iopub.execute_input":"2024-12-12T17:53:30.761878Z","iopub.status.idle":"2024-12-12T17:53:30.770296Z","shell.execute_reply.started":"2024-12-12T17:53:30.761845Z","shell.execute_reply":"2024-12-12T17:53:30.769037Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:30.771703Z","iopub.execute_input":"2024-12-12T17:53:30.772043Z","iopub.status.idle":"2024-12-12T17:53:30.796967Z","shell.execute_reply.started":"2024-12-12T17:53:30.772011Z","shell.execute_reply":"2024-12-12T17:53:30.795844Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['sign'].value_counts()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:30.798868Z","iopub.execute_input":"2024-12-12T17:53:30.799317Z","iopub.status.idle":"2024-12-12T17:53:30.821000Z","shell.execute_reply.started":"2024-12-12T17:53:30.799269Z","shell.execute_reply":"2024-12-12T17:53:30.819800Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pip install black\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:30.822448Z","iopub.execute_input":"2024-12-12T17:53:30.822921Z","iopub.status.idle":"2024-12-12T17:53:41.902790Z","shell.execute_reply.started":"2024-12-12T17:53:30.822875Z","shell.execute_reply":"2024-12-12T17:53:41.901315Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install blackcellmagic\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:53:41.904453Z","iopub.execute_input":"2024-12-12T17:53:41.904856Z","iopub.status.idle":"2024-12-12T17:54:11.348386Z","shell.execute_reply.started":"2024-12-12T17:53:41.904818Z","shell.execute_reply":"2024-12-12T17:54:11.346952Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%load_ext blackcellmagic\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:11.350346Z","iopub.execute_input":"2024-12-12T17:54:11.350898Z","iopub.status.idle":"2024-12-12T17:54:11.467996Z","shell.execute_reply.started":"2024-12-12T17:54:11.350832Z","shell.execute_reply":"2024-12-12T17:54:11.466937Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['sign'].value_counts().head(20).sort_values(ascending=True).plot(kind='barh',figsize=(10,5),title='top 20')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:11.471269Z","iopub.execute_input":"2024-12-12T17:54:11.471666Z","iopub.status.idle":"2024-12-12T17:54:11.928385Z","shell.execute_reply.started":"2024-12-12T17:54:11.471629Z","shell.execute_reply":"2024-12-12T17:54:11.927095Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['sign'].value_counts().tail(20).sort_values(ascending=True).plot(kind='barh',figsize=(10,5),title='bottom 20')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:11.930285Z","iopub.execute_input":"2024-12-12T17:54:11.930785Z","iopub.status.idle":"2024-12-12T17:54:12.336855Z","shell.execute_reply.started":"2024-12-12T17:54:11.930732Z","shell.execute_reply":"2024-12-12T17:54:12.335649Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(8, 8))\ntrain[\"sign\"].value_counts().head(50).sort_values(ascending=True).plot(\n    kind=\"barh\", ax=ax, title=\"Top 50 Signs in Training Dataset\"\n)\nax.set_xlabel(\"Number of Training Examples\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:12.338522Z","iopub.execute_input":"2024-12-12T17:54:12.339013Z","iopub.status.idle":"2024-12-12T17:54:12.922210Z","shell.execute_reply.started":"2024-12-12T17:54:12.338962Z","shell.execute_reply":"2024-12-12T17:54:12.920887Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.query('sign == \"listen\"')['path'].value_counts()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:12.923656Z","iopub.execute_input":"2024-12-12T17:54:12.924071Z","iopub.status.idle":"2024-12-12T17:54:12.947771Z","shell.execute_reply.started":"2024-12-12T17:54:12.924035Z","shell.execute_reply":"2024-12-12T17:54:12.946552Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['path'].value_counts()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:12.949132Z","iopub.execute_input":"2024-12-12T17:54:12.949479Z","iopub.status.idle":"2024-12-12T17:54:13.041086Z","shell.execute_reply.started":"2024-12-12T17:54:12.949438Z","shell.execute_reply":"2024-12-12T17:54:13.039675Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:13.042379Z","iopub.execute_input":"2024-12-12T17:54:13.042744Z","iopub.status.idle":"2024-12-12T17:54:13.056256Z","shell.execute_reply.started":"2024-12-12T17:54:13.042712Z","shell.execute_reply":"2024-12-12T17:54:13.055023Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"example_fn = train.query('sign == \"listen\"')[\"path\"].values[0]\n\nexample_landmark = pd.read_parquet(f\"{BASE_DIR}/{example_fn}\")\nexample_landmark.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:13.057753Z","iopub.execute_input":"2024-12-12T17:54:13.058156Z","iopub.status.idle":"2024-12-12T17:54:13.246535Z","shell.execute_reply.started":"2024-12-12T17:54:13.058118Z","shell.execute_reply":"2024-12-12T17:54:13.245388Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unique_types=example_landmark['type'].nunique()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:13.248045Z","iopub.execute_input":"2024-12-12T17:54:13.248482Z","iopub.status.idle":"2024-12-12T17:54:13.256865Z","shell.execute_reply.started":"2024-12-12T17:54:13.248433Z","shell.execute_reply":"2024-12-12T17:54:13.255656Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unique_frame = example_landmark['frame'].value_counts()\nprint(f\"the file has {unique_frame}-unique frame and {unique_types} unique type \")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:13.258411Z","iopub.execute_input":"2024-12-12T17:54:13.258889Z","iopub.status.idle":"2024-12-12T17:54:13.278329Z","shell.execute_reply.started":"2024-12-12T17:54:13.258837Z","shell.execute_reply":"2024-12-12T17:54:13.277211Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"example_landmark['type'].unique()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:54:13.279688Z","iopub.execute_input":"2024-12-12T17:54:13.280081Z","iopub.status.idle":"2024-12-12T17:54:13.295933Z","shell.execute_reply.started":"2024-12-12T17:54:13.280047Z","shell.execute_reply":"2024-12-12T17:54:13.294800Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"example_fn = train.query('sign == \"listen\"')[\"path\"].values[0]\n\nexample_landmark = pd.read_parquet(f\"{BASE_DIR}/{example_fn}\")\nexample_landmark.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T17:59:04.939977Z","iopub.execute_input":"2024-12-12T17:59:04.940409Z","iopub.status.idle":"2024-12-12T17:59:04.972358Z","shell.execute_reply.started":"2024-12-12T17:59:04.940371Z","shell.execute_reply":"2024-12-12T17:59:04.971172Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unique_frames = example_landmark[\"frame\"].nunique()\nunique_types = example_landmark[\"type\"].nunique()\ntypes_in_video = example_landmark[\"type\"].unique()\nprint(\n    f\"The file has {unique_frames} unique frames and {unique_types} unique types: {types_in_video}\"\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:00:40.672182Z","iopub.execute_input":"2024-12-12T18:00:40.672737Z","iopub.status.idle":"2024-12-12T18:00:40.683952Z","shell.execute_reply.started":"2024-12-12T18:00:40.672687Z","shell.execute_reply":"2024-12-12T18:00:40.682548Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"listen_files = train.query('sign == \"listen\"')[\"path\"].values\nfor i, f in enumerate(listen_files):\n    example_landmark = pd.read_parquet(f\"{BASE_DIR}/{f}\")\n    unique_frames = example_landmark[\"frame\"].nunique()\n    unique_types = example_landmark[\"type\"].nunique()\n    types_in_video = example_landmark[\"type\"].unique()\n    print(\n        f\"The file has {unique_frames} unique frames and {unique_types} unique types: {types_in_video}\"\n    )\n    if i == 20:\n        break","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:01:21.110764Z","iopub.execute_input":"2024-12-12T18:01:21.111321Z","iopub.status.idle":"2024-12-12T18:01:21.801536Z","shell.execute_reply.started":"2024-12-12T18:01:21.111272Z","shell.execute_reply":"2024-12-12T18:01:21.800225Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:04:07.114791Z","iopub.execute_input":"2024-12-12T18:04:07.115217Z","iopub.status.idle":"2024-12-12T18:04:07.129403Z","shell.execute_reply.started":"2024-12-12T18:04:07.115183Z","shell.execute_reply":"2024-12-12T18:04:07.128226Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"N_PARQUETS_TO_READ = 100_000  # So we don't have to load all 95k\n\ncombined_meta = {}\nfor i, d in tqdm(train.iterrows(), total=len(train)):\n    file_path = d[\"path\"]\n    example_landmark = pd.read_parquet(f\"{BASE_DIR}/{file_path}\")\n    # Get the number of landmarks with x,y,z data per type\n    meta = (\n        example_landmark.dropna(subset=[\"x\", \"y\", \"z\"])[\"type\"].value_counts().to_dict()\n    )\n    meta[\"frames\"] = example_landmark[\"frame\"].nunique()\n    xyz_meta = (\n        example_landmark.agg(\n            {\n                \"x\": [\"min\", \"max\", \"mean\"],\n                \"y\": [\"min\", \"max\", \"mean\"],\n                \"z\": [\"min\", \"max\", \"mean\"],\n            }\n        )\n        .unstack()\n        .to_dict()\n    )\n\n    for key in xyz_meta.keys():\n        new_key = key[0] + \"_\" + key[1]\n        meta[new_key] = xyz_meta[key]\n    combined_meta[file_path] = meta\n    if i >= N_PARQUETS_TO_READ:\n        break","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:33:03.641348Z","iopub.execute_input":"2024-12-12T18:33:03.641849Z","iopub.status.idle":"2024-12-12T19:36:11.528071Z","shell.execute_reply.started":"2024-12-12T18:33:03.641795Z","shell.execute_reply":"2024-12-12T19:36:11.523793Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_with_meta = train.merge(\n    pd.DataFrame(combined_meta).T.reset_index().rename(columns={\"index\": \"path\"}),\n    how=\"left\",\n)\ntrain_with_meta.to_parquet(\"train_with_meta.parquet\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:36:18.403874Z","iopub.execute_input":"2024-12-12T19:36:18.404274Z","iopub.status.idle":"2024-12-12T19:36:21.396113Z","shell.execute_reply.started":"2024-12-12T19:36:18.404238Z","shell.execute_reply":"2024-12-12T19:36:21.395003Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_with_meta[[\"face\", \"pose\", \"left_hand\", \"right_hand\"]].sum().sort_values().plot(\n    kind=\"barh\", title=\"Sum of Rows by Landmark Type\"\n)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:36:21.666048Z","iopub.execute_input":"2024-12-12T19:36:21.666370Z","iopub.status.idle":"2024-12-12T19:36:21.893648Z","shell.execute_reply.started":"2024-12-12T19:36:21.666339Z","shell.execute_reply":"2024-12-12T19:36:21.892514Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# checking to see if the number of landmarks for this type is zero\n(\n    train_with_meta.query(\"index < 1000\").fillna(0)[\n        [\"face\", \"pose\", \"left_hand\", \"right_hand\"]\n    ]\n    > 0\n).mean().plot(kind=\"barh\", title=\"Rate of Frame/Keypoints with Data\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:36:21.895002Z","iopub.execute_input":"2024-12-12T19:36:21.895337Z","iopub.status.idle":"2024-12-12T19:36:22.163166Z","shell.execute_reply.started":"2024-12-12T19:36:21.895304Z","shell.execute_reply":"2024-12-12T19:36:22.161887Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_with_meta[[\"face\", \"pose\", \"left_hand\", \"right_hand\"]].sum().sort_values().plot(\n    kind=\"barh\", title=\"Sum of Rows by Landmark Type\"\n)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:36:22.164482Z","iopub.execute_input":"2024-12-12T19:36:22.164865Z","iopub.status.idle":"2024-12-12T19:36:22.395069Z","shell.execute_reply.started":"2024-12-12T19:36:22.164829Z","shell.execute_reply":"2024-12-12T19:36:22.393848Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"(\n    train_with_meta.query(\"index < 1000\").fillna(0)[\n        [\"face\", \"pose\", \"left_hand\", \"right_hand\"]\n    ]\n    > 0\n).mean().plot(kind=\"barh\", title=\"Rate of Frame/Keypoints with Data\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:36:46.658789Z","iopub.execute_input":"2024-12-12T19:36:46.659260Z","iopub.status.idle":"2024-12-12T19:36:46.903064Z","shell.execute_reply.started":"2024-12-12T19:36:46.659219Z","shell.execute_reply":"2024-12-12T19:36:46.901829Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"example_fn = train_with_meta.dropna().query('sign == \"shhh\"')[\"path\"].values[0]\nexample_landmark = pd.read_parquet(f\"{BASE_DIR}/{example_fn}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:36:22.396462Z","iopub.execute_input":"2024-12-12T19:36:22.397321Z","iopub.status.idle":"2024-12-12T19:36:22.448156Z","shell.execute_reply.started":"2024-12-12T19:36:22.397276Z","shell.execute_reply":"2024-12-12T19:36:22.446138Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"example_landmark.query(\"frame == 25\")[\"type\"].value_counts()  # Middle of the video","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:36:57.793188Z","iopub.execute_input":"2024-12-12T19:36:57.793654Z","iopub.status.idle":"2024-12-12T19:36:57.811519Z","shell.execute_reply.started":"2024-12-12T19:36:57.793612Z","shell.execute_reply":"2024-12-12T19:36:57.810215Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"example_landmark[\"no_xyz\"] = example_landmark[\"x\"].isna()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:37:21.082911Z","iopub.execute_input":"2024-12-12T19:37:21.083332Z","iopub.status.idle":"2024-12-12T19:37:21.090337Z","shell.execute_reply.started":"2024-12-12T19:37:21.083292Z","shell.execute_reply":"2024-12-12T19:37:21.088888Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"example_landmark.groupby(\"frame\")[\"no_xyz\"].sum().plot(\n    title=\"missing xyz per frame\", kind=\"bar\"\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:37:13.882696Z","iopub.execute_input":"2024-12-12T19:37:13.883216Z","iopub.status.idle":"2024-12-12T19:37:14.299999Z","shell.execute_reply.started":"2024-12-12T19:37:13.883179Z","shell.execute_reply":"2024-12-12T19:37:14.298774Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import plotly.express as px\n\nexample_frame = example_landmark.query(\"frame == 17\")\npx.scatter_3d(example_frame, x=\"x\", y=\"y\", z=\"z\", color=\"type\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:37:53.981334Z","iopub.execute_input":"2024-12-12T19:37:53.981793Z","iopub.status.idle":"2024-12-12T19:37:54.062508Z","shell.execute_reply.started":"2024-12-12T19:37:53.981755Z","shell.execute_reply":"2024-12-12T19:37:54.061375Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}