Files
PHANTOM/experiments/data_export.ipynb
Daniel Rosel f4da5289bd Improve automation, relinted webapp to tab alignment
and introduced basic EDA in a jupyter notebook of kafka export (nonmodular yet)
2025-11-02 21:34:18 +01:00

518 lines
52 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 79,
"id": "62eafcd9-5462-4063-8873-0e7fb9add907",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from kafka import KafkaConsumer\n",
"import pandas as pd\n",
"import json\n",
"import numpy as np\n",
"import os\n",
"from dotenv import load_dotenv\n",
"import matplotlib.pyplot as plt\n",
"load_dotenv()"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "4af65cb4-e8cf-4877-b2db-13ac19f3838f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 141 entries, 0 to 140\n",
"Data columns (total 10 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 sessionId 141 non-null object \n",
" 1 eventType 141 non-null object \n",
" 2 ts 141 non-null int64 \n",
" 3 targetEl 14 non-null object \n",
" 4 targetUrl 1 non-null object \n",
" 5 metadata_path 141 non-null object \n",
" 6 metadata_referrer 6 non-null object \n",
" 7 metadata_x 14 non-null float64\n",
" 8 metadata_y 14 non-null float64\n",
" 9 metadata_scrollY 121 non-null float64\n",
"dtypes: float64(3), int64(1), object(6)\n",
"memory usage: 11.1+ KB\n"
]
}
],
"source": [
"KAFKA_PORT=os.getenv(\"KAFKA_PORT\", 9092)\n",
"topic = \"user-interactions\"\n",
"consumer = KafkaConsumer(\n",
" topic, \n",
" enable_auto_commit=True,\n",
" value_deserializer=lambda x: json.loads(x.decode('utf-8')),\n",
" auto_offset_reset='earliest',\n",
" bootstrap_servers=['localhost:9092'])\n",
"messages=consumer.poll(timeout_ms=1000,max_records=10000)\n",
"df = []\n",
"for m in messages.values():\n",
" for i in m:\n",
" df.append(i.value)\n",
"df = pd.DataFrame(df)\n",
"# explode metadata col json\n",
"df = df.join(pd.json_normalize(df.pop(\"metadata\"), sep=\".\").add_prefix(\"metadata_\"))\n",
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "f6819a1c-32ab-49c7-845b-5df7bf60f561",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sessionId</th>\n",
" <th>eventType</th>\n",
" <th>ts</th>\n",
" <th>targetEl</th>\n",
" <th>targetUrl</th>\n",
" <th>metadata_path</th>\n",
" <th>metadata_referrer</th>\n",
" <th>metadata_x</th>\n",
" <th>metadata_y</th>\n",
" <th>metadata_scrollY</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1761225843899-qaiwwwyj2o</td>\n",
" <td>pageview</td>\n",
" <td>1761226211163</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td></td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1761225843899-qaiwwwyj2o</td>\n",
" <td>click</td>\n",
" <td>1761226218090</td>\n",
" <td>MAIN</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td>NaN</td>\n",
" <td>815.0</td>\n",
" <td>331.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1761225843899-qaiwwwyj2o</td>\n",
" <td>click</td>\n",
" <td>1761226220890</td>\n",
" <td>MAIN</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td>NaN</td>\n",
" <td>1129.0</td>\n",
" <td>605.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1761225843899-qaiwwwyj2o</td>\n",
" <td>click</td>\n",
" <td>1761226225801</td>\n",
" <td>DIV</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td>NaN</td>\n",
" <td>532.0</td>\n",
" <td>545.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1761225843899-qaiwwwyj2o</td>\n",
" <td>click</td>\n",
" <td>1761226229364</td>\n",
" <td>DIV</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td>NaN</td>\n",
" <td>481.0</td>\n",
" <td>399.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1761227236286-e7mphcvw6t</td>\n",
" <td>pageview</td>\n",
" <td>1761227236426</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td></td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1761227236286-e7mphcvw6t</td>\n",
" <td>click</td>\n",
" <td>1761227239328</td>\n",
" <td>DIV</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td>NaN</td>\n",
" <td>202.0</td>\n",
" <td>351.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1761227236286-e7mphcvw6t</td>\n",
" <td>click</td>\n",
" <td>1761227244783</td>\n",
" <td>A</td>\n",
" <td>https://vercel.com/new?utm_source=create-next-...</td>\n",
" <td>/</td>\n",
" <td>NaN</td>\n",
" <td>377.0</td>\n",
" <td>723.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>1761828056433-0gz7aboz86h</td>\n",
" <td>pageview</td>\n",
" <td>1761828261783</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td></td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1761828056433-0gz7aboz86h</td>\n",
" <td>click</td>\n",
" <td>1761828266484</td>\n",
" <td>H1</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td>NaN</td>\n",
" <td>527.0</td>\n",
" <td>169.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1761828056433-0gz7aboz86h</td>\n",
" <td>scroll</td>\n",
" <td>1761828270314</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>51.666668</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>1761828056433-0gz7aboz86h</td>\n",
" <td>scroll</td>\n",
" <td>1761828270328</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>50.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>1761828056433-0gz7aboz86h</td>\n",
" <td>scroll</td>\n",
" <td>1761828270336</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>/</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>49.166668</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sessionId eventType ts targetEl \\\n",
"0 1761225843899-qaiwwwyj2o pageview 1761226211163 NaN \n",
"1 1761225843899-qaiwwwyj2o click 1761226218090 MAIN \n",
"2 1761225843899-qaiwwwyj2o click 1761226220890 MAIN \n",
"3 1761225843899-qaiwwwyj2o click 1761226225801 DIV \n",
"4 1761225843899-qaiwwwyj2o click 1761226229364 DIV \n",
"5 1761227236286-e7mphcvw6t pageview 1761227236426 NaN \n",
"6 1761227236286-e7mphcvw6t click 1761227239328 DIV \n",
"7 1761227236286-e7mphcvw6t click 1761227244783 A \n",
"8 1761828056433-0gz7aboz86h pageview 1761828261783 NaN \n",
"9 1761828056433-0gz7aboz86h click 1761828266484 H1 \n",
"10 1761828056433-0gz7aboz86h scroll 1761828270314 NaN \n",
"11 1761828056433-0gz7aboz86h scroll 1761828270328 NaN \n",
"12 1761828056433-0gz7aboz86h scroll 1761828270336 NaN \n",
"\n",
" targetUrl metadata_path \\\n",
"0 NaN / \n",
"1 NaN / \n",
"2 NaN / \n",
"3 NaN / \n",
"4 NaN / \n",
"5 NaN / \n",
"6 NaN / \n",
"7 https://vercel.com/new?utm_source=create-next-... / \n",
"8 NaN / \n",
"9 NaN / \n",
"10 NaN / \n",
"11 NaN / \n",
"12 NaN / \n",
"\n",
" metadata_referrer metadata_x metadata_y metadata_scrollY \n",
"0 NaN NaN NaN \n",
"1 NaN 815.0 331.0 NaN \n",
"2 NaN 1129.0 605.0 NaN \n",
"3 NaN 532.0 545.0 NaN \n",
"4 NaN 481.0 399.0 NaN \n",
"5 NaN NaN NaN \n",
"6 NaN 202.0 351.0 NaN \n",
"7 NaN 377.0 723.0 NaN \n",
"8 NaN NaN NaN \n",
"9 NaN 527.0 169.0 NaN \n",
"10 NaN NaN NaN 51.666668 \n",
"11 NaN NaN NaN 50.000000 \n",
"12 NaN NaN NaN 49.166668 "
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.groupby('sessionId').head()"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "380eca5f-8304-4fb2-be32-e8bcfd312085",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['1761225843899-qaiwwwyj2o',\n",
" '1761828056433-0gz7aboz86h',\n",
" '1761227236286-e7mphcvw6t']"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sessions = list(set(df['sessionId'])); sessions"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f4ae6f81-dcb8-44be-aee7-30dbc3a6bae1",
"metadata": {},
"outputs": [],
"source": [
"# map sessions to experiments"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "050d90a4-20a9-47f5-b998-c31178a54cb3",
"metadata": {},
"outputs": [],
"source": [
"def build_transition_porba_matrix(df : pd.DataFrame):\n",
" df = df.dropna(subset=['eventType'])\n",
" events = list(df['eventType'])\n",
" event_types = list(set(events))\n",
" vocab = len(event_types)\n",
" M = np.zeros((vocab,vocab))\n",
" for eid in range(len(events)-1):\n",
" event, event_n = events[eid], events[eid+1]\n",
" M[event_types.index(event)][event_types.index(event_n)] += 1\n",
" fig, ax = plt.subplots()\n",
" im = ax.imshow(M)\n",
" ax.set_xticks(range(vocab), labels=event_types,\n",
" rotation=45, ha=\"right\", rotation_mode=\"anchor\")\n",
" ax.set_yticks(range(vocab), labels=event_types)\n",
" plt.show()\n",
" return M/len(events)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "ef1dab40-ac2b-44b9-b955-9f2bfdb79e62",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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/37169fPue6+ffv0xBNPqFu3btq5c6f69++vUaNGldr+3r171blzZz3++OP65ptvtHjxYq1bt06DBw+WJPXq1UubN2/W3r17nevs3r1b33zzjXr27Pm7Yx4/frzmz5+vmTNnavfu3XrppZfUu3dvpaenS5LCwsKUlpYmSbIsS19++aVq1qypdevWSZLS09N1880367bbbvvD5+X06dPKz88v9QMAqPhsVhkOJoaHh+vIkSPavXu3bDabJGnkyJFasWKFvvvuu4uW37p1q9q0aaOCggJVr15dI0eOVEpKir799lvnMqNHj1ZcXJyOHTummjVr6vnnn5e7u7v+9a9/OZdZt26dwsLCdOLECXl5eally5Z6/PHHFRsbK+ncXuratWu1adMmSef2SPPy8rRs2TKdPn1afn5+WrNmje655x7nNp9//nmdPHlSSUlJWrlypfr06aOcnBzt2rVLnTt3Vvfu3eXl5aUJEybo73//u06ePKnExMQ/fG7++c9/6rXXXrvo/ruejZO7h9eVPsVAuVJr1kZXDwG4Js5axUrTch0/flw1atS45LJl3iO9++67nRGVpHvuuUdZWVkqKSnR119/rUceeUSBgYHy8fFRWFiYJOnAgQOSpB9++EFt2rQptb22bduWur1z507NmzdP1atXd/5ERETI4XBo3759ks7tlSYlJUk6twe5cOFC9erV63fHu2fPHp08eVKdOnUqtc358+c792o7dOiggoICbd++Xenp6QoLC1N4eLhzLzU9PV3h4eGXfF6io6N1/Phx5092dvYVPJsAgPLuqp1sdOrUKUVERCgiIkKJiYmqXbu2Dhw4oIiICJ05c+aKt1NYWKj+/fvrxRdfvOh3gYGBkqQePXooKipK27ZtU1FRkbKzs9W9e/c/3J4kpaSk6Oabby71O09PT0lSzZo11aJFC6WlpWnjxo3q1KmT7rvvPnXv3l2ZmZnKyspy/lHwRzw9PZ3bAwBUHmUO6VdffVXq9qZNm3T77bcrIyNDOTk5mjBhggICAiSdm9q9UOPGjfXJJ5+Uum/Lli2lbv/5z3/Wd999d8njkQ0bNlRYWJgSExNVVFSkTp06qU6dOr+7bLNmzeTp6akDBw5cMoZhYWFKTU3V5s2bFRcXJz8/PzVt2lRxcXGqX7++GjVq9IfrAgAqrzJP7R44cEAvv/yyfvjhBy1cuFDx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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0.6 0. ]\n",
" [0.2 0. ]]\n"
]
},
{
"data": {
"image/png": "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w666rsPhUO/evTVmzBjXZREREapVq5YmT57suqxNmzY6ffq0EhMTXestWLBArVq1UlpamsLCwrR582bVq1fvqv+f7OxsZWdnu77PzMxUaGiooryeko+j2I3edHgKZ667J8At9MXBLe4eAfksM8up26v9rJMnTyooKOiay3rEFmndunXVtGlT1a5dW61bt9bHH3+s48eP68iRIzp48KCaNm16zfXDw8PzfL9z505FRETkuSwiIkI7d+684Rn9/PwUFBSU5wsAUPh5REi9vb2VlJSkf/7zn6pZs6YmTJig6tWr65dffvlD65coUSKfJwQAFFUeEVLp4q7WiIgIDRkyRJs3b5avr6+SkpJ09913a8WKFdd1XTVq1FBycnKey5KTk1WzZs2bOTIAoAjwcfcAf8S3336rFStW6JFHHlHZsmX17bff6ujRo6pRo4beeustRUdHq2zZsmrZsqWysrKUnJysnj17/ub1vfHGG2rTpo3q16+vZs2aacmSJUpISNDy5ctv4a0CABQGHhHSoKAgffXVVxo7dqwyMzN11113afTo0WrZsqUk6dy5cxozZoz69u2rkJAQPfPMM9e8vlatWmncuHF699131atXL4WFhWnatGmKioq6BbcGAFCYeMRRu54oMzNTwcHBHLVbVHDUbpHCUbuFX6E7ahcAgIKKkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYMHH3QMUVsYYSdIFk+PmSXBLmFx3T4BbKDPL6e4RkM8yT128jy89l18LIc0nWVlZkqS1Zon0+/cDAA9yezV3T4BbJSsrS8HBwddcxmH+SG5x3ZxOpw4ePKjAwEA5HA53j3NLZGZmKjQ0VPv371dQUJC7x0E+4r4uWori/W2MUVZWlipU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zDN5Li9WrJgk6cKFC3ruuefk7e2tevXqsTV6g/itQZJ06tQpnT171vW90+l0nVRh9erVatCggT777DM9/vjj7hoRN8hc9kmJl85Q88ILL+jJJ5/UmDFjdOrUKVWsWFEDBgxQw4YNtXjxYr355ptXXA9PsgXfpft6y5Yt2r9/v/z8/FSmTBmdPHnyimU3bdqk0aNHKycnR+3bt+foXAs8MiBJqlu3ro4dO6bJkydLuvikeSmkixYt0uzZs/XUU09xejAPdOl+zM7OlpeXl+vJ9v7779fGjRtdZ62pUKGC+vfvr7CwMB0+fDhPgFHwmf//iMOFCxfqscce0+TJkxUUFKSGDRtqxIgRWrduXZ779B//+IeWL1+uU6dOuXHqwoEP9obL1KlTFR0drd69e+v555+Xt7e3pk+frsmTJ2vdunW655573D0ibtCMGTM0YcIEjRs3TtWrV1dISIgk6Z577tF9993nOmeuJB07dkylSpVyRZfTPXqOxMREtW7dWuPHj9ejjz6qihUrSpJat26tNWvWqFu3bgoICNBPP/2kuXPnau3atapTp46bp/Z8vOABl86dOyswMFBdu3bVnDlz5O/vL29vb61cuZKIephLAbz0Ore/v7/+9Kc/6cknn1STJk3UokULdenSRQMHDtSsWbP03XffKTw8XE6n0xVZTkDvWc6dO6cZM2aoT58+evnll3XmzBnt2bNHixcvVpcuXSRd3J2bmpqqqlWrKjk5WbVr13bz1IUDIYWLl5eXWrdurYiICP3rX/+Sw+FQWFiY7rjjDnePhutweQDPnDmjkiVLqm3btmrbtq0WLVqkr776Sr1799by5ctVrlw5paSkaMOGDQoPD7/iLEfwHMYYpaamqly5csrIyNDgwYP1ww8/KCUlRX5+furZs6e6deumCxcuyMfHJ8/ZqWCHXbtAIXJ5RN977z0lJSXp9OnTuuOOOzRt2jSVLFlSkrRr1y6NGDFCx44dU2JioqKiorRy5Up3jo6bYObMmYqOjlaxYsXUtGlTtWrVSs8//7x69eqlbdu26csvv+TI63xASIFCqH///poyZYoGDx6sSpUqqX379qpfv76WLFmiEiVKyNvbW2fPntWJEyc0f/58vfLKKzzBFhI//vijDhw4oObNm7v+sOrRo4eysrI0efJk+fn5uXvEQodHDlDIpKSkKDExUbNnz1bTpk31+eefy+FwqF27dnk+WMDPz0/ly5dXz549JUk5OTmu9xfCc9WsWdP1VpaUlBTNmjVLn376qdauXUtE8wkvggCFTHp6uk6cOKGmTZu6Tg83cuRIRUdHKysry3WE7q9fAyWihcv333+vt99+WwsWLNCaNWv05z//2d0jFVqEFPBgV3tlplq1aqpcubIGDhyodu3aafTo0erataskae/evZo3b542btx4q0fFLVazZk298sor+uKLL1S3bl13j1OoEVLAQ13+Hs9Ro0bp22+/df3s9ttv16hRo9SlSxfXWx/OnTungQMHys/PTw0aNHDLzLh1AgIC1KRJE4WGhrp7lEKPg40AD3T50bmpqalq06aN0tLSlJSUpHr16mn79u1q3769SpcurfDwcFWsWFELFy7UsWPHtGnTJhUrVoz3iQI3CSEFPFj//v31zTffyMfHR9988438/Py0bNkyNW7cWFu3btWMGTO0YsUKhYaGKjQ0VBMmTJCPj4/rvYQA7BFSwEN98sknrhMrVK5cWampqYqLi9OqVauUlJSkxo0bKzc31/WpLZd2AxNR4OZivw7gofbu3asWLVro3nvvVZkyZdSoUSNNmDBBjRs31mOPPaatW7fK29tb3t7erogaY4gocJMRUsBDeXt7a+PGja6PRjPGqFKlSurQoYMyMjL08MMPa8eOHfLy8nItwwnogZuPkAIF3KUI/lrLli0VEhKiIUOGKDMz0xXJu+66S126dFGzZs3Url07ZWRkcFARkI94dAEF2OVH1n733Xf67rvvtHnzZklS48aN1axZMy1fvlxvvvmm9u3bp9TUVL333nvy8vJS586ddfToUe3atcudNwEo9HixBCigjDGuiA4aNEhz5syRl5eXfvnlFw0aNEh9+/bVsGHDNHz4cH3++ee6++67VblyZfn7+2vJkiVKTU1V8eLFOWMRkM84ahco4IYNG6b3339f8+bNU3h4uGJjYzVhwgTFxsYqLi5OTqdTp0+f1ldffaVSpUqpcePG8vLy0uuvv66VK1fqiy++UNmyZd19M4BCiy1SoADbtWuX1q9frylTpujBBx/UokWLNHPmTD3//PMaMWKEvLy8NGDAAAUGBuqxxx6TJK1du1Zz585VfHy8Vq1aRUSBfEZIgQLk12cbKl26tJ544glFRUXp66+/Vvfu3TVs2DB1795dXl5eiouL06lTpzRq1CjX21pycnJ07tw5rV27VrVq1XLXTQGKDHbtAgXE5RHdu3evAgICFBIS4vroq549e+rEiRP6+OOP5e/vr379+mnjxo26cOGCVq9eneetLefOnZO/v79bbgdQ1HDULlAAXH5gUb9+/fTEE0+oXr16atGihT744ANJ0o4dO2SMkb+/v3JycrRr1y69/vrrWrNmjRwOh4wxrk+DIaLArcOuXcDNLt8SnTt3rmbMmKFJkybpxIkT2rFjh3r37i1fX1/FxMSoZcuWyszM1L/+9S8ZY/TII49IyvtJMABuLXbtAgXE6tWrFR8fr5o1a6pPnz6SpKysLE2fPl39+vXT1KlT5e3trYULF+qOO+7QiBEj5OPjo9zcXHl7e7t5eqDoIqRAAXD48GE98MADOnLkiGJiYjRgwADXzzIyMvTSSy8pNDRU48eP1/nz5+Xr6yuJE9ADBQGvkQIFQLly5ZSQkKCyZcsqISHBdfYiSSpVqpRKly6tPXv2SJIropKIKFAAEFKggKhTp44SEhKUm5ursWPHasuWLZIu7t7duXOnQkND3TsggKti1y5QwGzevFkdO3ZURkaGwsPD5evrq9TUVK1fv16+vr4cWAQUMGyRAgVM/fr19dlnnykgIEAnT55U8+bNtWnTJvn6+ionJ4eIAgUMIQUKoD//+c9KSEjQ+fPntWnTJu3du1eSOAE9UACxaxcowDZv3qzo6Gj96U9/0uDBg3XPPfe4eyQAv8IWKVCA1a9fX++//74OHTqk4OBgd48D4CrYIgU8AOfOBQouQgoAgAV27QIAYIGQAgBggZACAGCBkAIAYIGQAgBggZACAGCBkAIAYOH/ACgqpK2ecwwwAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0.03007519 0.01503759 0.0075188 ]\n",
" [0.02255639 0.0075188 0. ]\n",
" [0.0075188 0. 0.90225564]]\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0.33333333 0. ]\n",
" [0.33333333 0. ]]\n"
]
}
],
"source": [
"def explore_session(session_id : str):\n",
" subset = df.where(df['sessionId'] == session_id)\n",
" matrix = build_transition_porba_matrix(subset)\n",
" return matrix\n",
"for session in sessions:\n",
" print(explore_session(session))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e68f9004-82f5-4826-aece-e3dc6e15a18f",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "4d278c2d-406e-4dc0-b219-5f7b236e852b",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python (PHANTOM)",
"language": "python",
"name": "phantom"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}