{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":59156,"databundleVersionId":13719397,"sourceType":"competition"}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"# **Mouse Behavior Tracking Analysis**","metadata":{}},{"cell_type":"markdown","source":"\n\n## **Pipeline Explanation**\n\nThis script performs a comprehensive analysis of mouse tracking data:\n\n1. **Data Loading**: Loads mouse behavior tracking data from parquet files\n2. **Initial Exploration**: Examines data structure, shape, and columns\n3. **Data Filtering**: Focuses on body center coordinates only\n4. **Statistical Analysis**: Provides summary statistics of coordinates\n5. **Visualization**: Creates multiple plots showing:\n   - Coordinate distributions (histograms)\n   - Spatial positions of all mice (scatter plot)\n   - Temporal movement patterns (time series)\n   - Speed calculations and visualization\n6. **Animation Creation**: Generates an animated GIF showing Mouse 1's movement trajectory over time\n\n## What This Script Does\n\nThe script analyzes multi-mouse tracking data to understand:\n- Spatial distribution patterns of mice in the environment\n- Movement characteristics and speed profiles\n- Individual mouse trajectories over time\n- Creates a visual animation of one mouse's complete movement path\n\nIt transforms raw coordinate data into meaningful insights about mouse behavior and movement dynamics.\n\n","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nimport seaborn as sns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T09:14:11.898605Z","iopub.execute_input":"2025-09-20T09:14:11.899023Z","iopub.status.idle":"2025-09-20T09:14:12.826208Z","shell.execute_reply.started":"2025-09-20T09:14:11.898993Z","shell.execute_reply":"2025-09-20T09:14:12.825127Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"names=os.listdir('/kaggle/input/MABe-mouse-behavior-detection/train_annotation')\nprint(names)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T09:14:12.827899Z","iopub.execute_input":"2025-09-20T09:14:12.828326Z","iopub.status.idle":"2025-09-20T09:14:12.834445Z","shell.execute_reply.started":"2025-09-20T09:14:12.828302Z","shell.execute_reply":"2025-09-20T09:14:12.833550Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"tracking = pd.read_parquet('/kaggle/input/MABe-mouse-behavior-detection/train_tracking/AdaptableSnail/1212811043.parquet')\n\nprint(\"Tracking data shape:\", tracking.shape)\n\nprint(\"\\nTracking columns:\")\nprint(tracking.columns.tolist())\n\nprint(\"\\nTracking head:\")\nprint(tracking.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T09:14:12.835354Z","iopub.execute_input":"2025-09-20T09:14:12.835660Z","iopub.status.idle":"2025-09-20T09:14:13.017524Z","shell.execute_reply.started":"2025-09-20T09:14:12.835632Z","shell.execute_reply":"2025-09-20T09:14:13.016860Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"bodycenter=tracking[tracking['bodypart']=='body_center']\ndisplay(bodycenter)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T09:14:13.030411Z","iopub.execute_input":"2025-09-20T09:14:13.030651Z","iopub.status.idle":"2025-09-20T09:14:13.269281Z","shell.execute_reply.started":"2025-09-20T09:14:13.030632Z","shell.execute_reply":"2025-09-20T09:14:13.268531Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Summary statistics\nprint(\"Summary statistics:\")\nprint(tracking[['x', 'y']].describe())\n\n# Plot the distribution of coordinates\nplt.figure(figsize=(12, 5))\n\nplt.subplot(1, 2, 1)\nsns.histplot(tracking['x'], bins=50)\nplt.title('Distribution of X coordinates')\n\nplt.subplot(1, 2, 2)\nsns.histplot(tracking['y'], bins=50)\nplt.title('Distribution of Y coordinates')\nplt.tight_layout()\nplt.show()\n\n# Plot positions of different mice\nplt.figure(figsize=(10, 8))\nfor mouse_id in tracking['mouse_id'].unique():\n    mouse_data = tracking[tracking['mouse_id'] == mouse_id]\n    plt.scatter(mouse_data['x'], mouse_data['y'], alpha=0.1, label=f'Mouse {mouse_id}')\n\nplt.xlabel('X coordinate')\nplt.ylabel('Y coordinate')\nplt.title('Mouse Positions')\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T09:14:13.270166Z","iopub.execute_input":"2025-09-20T09:14:13.270461Z","iopub.status.idle":"2025-09-20T09:15:51.511955Z","shell.execute_reply.started":"2025-09-20T09:14:13.270438Z","shell.execute_reply":"2025-09-20T09:15:51.510663Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Analyze movement over time for a specific mouse\nmouse_1_data = tracking[tracking['mouse_id'] == 1].sort_values('video_frame')\n\nplt.figure(figsize=(15, 5))\nplt.plot(mouse_1_data['video_frame'], mouse_1_data['x'], label='X position')\nplt.plot(mouse_1_data['video_frame'], mouse_1_data['y'], label='Y position')\nplt.xlabel('Video Frame')\nplt.ylabel('Position')\nplt.title('Mouse 1 Position Over Time')\nplt.legend()\nplt.show()\n\n# Calculate velocity (pixels per frame)\nmouse_1_data['x_velocity'] = mouse_1_data['x'].diff()\nmouse_1_data['y_velocity'] = mouse_1_data['y'].diff()\nmouse_1_data['speed'] = np.sqrt(mouse_1_data['x_velocity']**2 + mouse_1_data['y_velocity']**2)\n\nplt.figure(figsize=(12, 4))\nplt.plot(mouse_1_data['video_frame'], mouse_1_data['speed'])\nplt.xlabel('Video Frame')\nplt.ylabel('Speed (pixels/frame)')\nplt.title('Mouse 1 Speed Over Time')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-20T09:15:51.513287Z","iopub.execute_input":"2025-09-20T09:15:51.513960Z","iopub.status.idle":"2025-09-20T09:15:56.968618Z","shell.execute_reply.started":"2025-09-20T09:15:51.513926Z","shell.execute_reply":"2025-09-20T09:15:56.967823Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom matplotlib.animation import FuncAnimation\nfrom IPython.display import HTML\nimport imageio\n\n# Load data\ntracking = pd.read_parquet('/kaggle/input/MABe-mouse-behavior-detection/train_tracking/AdaptableSnail/1212811043.parquet')\n\n# Extract only Mouse 1 data\nmouse1_data = tracking[tracking['mouse_id'] == 1].sort_values('video_frame').copy()\n\n# Handle infinite values\nmouse1_data['x'] = mouse1_data['x'].replace([np.inf, -np.inf], np.nan)\nmouse1_data['y'] = mouse1_data['y'].replace([np.inf, -np.inf], np.nan)\n\n# Get coordinate ranges\nx_min, x_max = mouse1_data['x'].min(), mouse1_data['x'].max()\ny_min, y_max = mouse1_data['y'].min(), mouse1_data['y'].max()\n\n# Create animation\nfig, ax = plt.subplots(figsize=(10, 8))\nax.set_xlim(x_min - 10, x_max + 10)\nax.set_ylim(y_min - 10, y_max + 10)\nax.set_xlabel('X coordinate')\nax.set_ylabel('Y coordinate')\nax.set_title('Mouse 1 Movement Animation')\n\n# Trajectory line and current position point\nline, = ax.plot([], [], 'b-', alpha=0.5, linewidth=1)\npoint, = ax.plot([], [], 'ro', markersize=8)\n\n# Frame number display text\nframe_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)\n\ndef init():\n    line.set_data([], [])\n    point.set_data([], [])\n    frame_text.set_text('')\n    return line, point, frame_text\n\ndef update(frame):\n    # Get data up to current frame\n    current_data = mouse1_data[mouse1_data['video_frame'] <= frame]\n    \n    if len(current_data) > 0:\n        # Update trajectory\n        line.set_data(current_data['x'], current_data['y'])\n        \n        # Update current position (latest position)\n        current_pos = current_data.iloc[-1]\n        point.set_data([current_pos['x']], [current_pos['y']])\n        \n        # Update frame number\n        frame_text.set_text(f'Frame: {frame}\\nPosition: ({current_pos[\"x\"]:.1f}, {current_pos[\"y\"]:.1f})')\n    \n    return line, point, frame_text\n\n# Create animation (limit frames for lighter processing)\nframes = mouse1_data['video_frame'].unique()\nif len(frames) > 500:  # Skip frames if there are too many\n    frames = frames[::len(frames)//500]\n\nani = FuncAnimation(fig, update, frames=frames,\n                    init_func=init, blit=True, interval=50)\n\n# Save as GIF\nprint(\"Creating animation...\")\nani.save('mouse1_movement.gif', writer='pillow', fps=20, dpi=80)\nplt.close()\n\nprint(\"Animation GIF saved: mouse1_movement.gif\")\n\noutput_path=\"mouse1_movement.gif\"\n\nfrom IPython.display import Image\nImage(open(output_path, 'rb').read())","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}