From ae09e2a678cfa098bc5f1df9c5c46f945673f897 Mon Sep 17 00:00:00 2001 From: Stephanie Shishis Date: Sun, 24 May 2026 11:22:56 -0400 Subject: [PATCH 1/2] assignment-1 completed --- .../a1_sampling_and_reproducibility.ipynb | 87 +++++++++++++++++-- 1 file changed, 79 insertions(+), 8 deletions(-) diff --git a/02_activities/assignments/a1_sampling_and_reproducibility.ipynb b/02_activities/assignments/a1_sampling_and_reproducibility.ipynb index 873f5985..e264cd7d 100644 --- a/02_activities/assignments/a1_sampling_and_reproducibility.ipynb +++ b/02_activities/assignments/a1_sampling_and_reproducibility.ipynb @@ -16,7 +16,51 @@ "cell_type": "markdown", "id": "4ea73db3", "metadata": {}, - "source": [] + "source": [ + "# 1.Infect a random subset of people\n", + "Functions used: infected_indices = np.random.choice(ppl.index, size=int(len(ppl) * ATTACK_RATE), replace=False).\n", + "\n", + "Sampling procedure: Simple random sampling without replacement (Every person has an equal chance of being chosen and no person can be picked twice. This is unlike simple random sampling with replacement where the sampled unit is returned to the population.)\n", + "\n", + "Sample Size: 100 random individuals (10% attack rate).\n", + "\n", + "Sampling Frame: 1000 individuals (200 from wedding and 800 from brunch).\n", + "\n", + "Underlying Distribution: Binomial distribution. \n", + "\n", + "# 2.Primary contact tracing: randomly decide which infected people get traced\n", + "Functions used: ppl.loc[ppl['infected'], 'traced'] = np.random.rand(sum(ppl['infected'])) < TRACE_SUCCESS\n", + "\n", + "Sampling procedure: From the 100 infected individuals from above, each is given a random number between 0 and 1, if the nnumber is below 0.20 they are marked as traced. (Independent Bernoulli trial per person).\n", + "\n", + "Sample Size: Around 20 individuals, each is traced with a proabaility of 0.20 (TRACE_SUCCESS).\n", + "\n", + "Sampling Frame: 100 infected individuals from the stage above. \n", + "\n", + "Underlying Distribution: Binomial distribution. \n", + "\n", + "# 3. Secondary contact tracing based on event attendance\n", + "Functions used: events_traced = event_trace_counts[event_trace_counts >= SECONDARY_TRACE_THRESHOLD].index\n", + "\n", + "Sampling procedure: If 2 or more infected people from the same event were already traced in the stage above, everyone else infected at that event gets traced automatically. Not random as who gets traced can change after each run. \n", + "\n", + "Sample Size: Is variable, depends on the random outcomes from the two stages above.\n", + "\n", + "Sampling Frame: Infected individuals that are not traced who attend an event with more than 2 people traced in stage above. \n", + "\n", + "Underlying Distribution: No direct distribution.\n", + "\n", + "# 4. Run the simulation 1000 times\n", + "Functions used: results = [simulate_event(m) for m in range(1000)]\n", + "\n", + "Sampling procedure: The above stages are repeated 1000 times, with a new random seed state which produces a distribution of outcomes from the infections and traces. \n", + "\n", + "Sample Size: 1000 replications.\n", + "\n", + "Sampling Frame: All possible simulation outcomes. \n", + "\n", + "Underlying Distribution: Normal distribution. " + ] }, { "cell_type": "markdown", @@ -30,7 +74,11 @@ "cell_type": "markdown", "id": "4cf5d993", "metadata": {}, - "source": [] + "source": [ + "10 repetitions: The histogram looks very different each time the code is run with completely different results. I would say the results are really unstable and not very reproducible as the shapes are uneven and there were some gaps in some runs. \n", + "\n", + "100 repetitions: The histogram looks more similiar in pattern to the 1000 repetitions but still shifts significantly each time it is run and still not as reproducible. It is not as consistent as 1000 repetitions but more consistent than 10 repetitions. " + ] }, { "cell_type": "markdown", @@ -44,7 +92,18 @@ "cell_type": "markdown", "id": "77613cc3", "metadata": {}, - "source": [] + "source": [ + "One way to make the simulation reproducible is to set a random seed before running the simulation. \n", + "For example np.random.seed(123).\n", + "\n", + "Run the simulation 1000 times\n", + "\n", + "np.random.seed(123) # ADDED LINE \n", + "results = [simulate_event(m) for m in range(100)]\n", + "props_df = pd.DataFrame(results, columns=[\"Infections\", \"Traces\"])\n", + "\n", + "If you do not set a random seed, the code will generate a sequence of random numbers each time the script runs which will results in the histogram looking slightly different each time it is run. By setting a random seed, the simulation is forced to follow the excat same random number sequence each time the script is run resulting in a code that is reproducible. " + ] }, { "cell_type": "markdown", @@ -56,10 +115,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "ab8587a0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAax5JREFUeJzt3Xt8j/X/x/HnZ+d9dsKwOR+HCckhoWxLCPmKSuVMfXPoYFHkq7JUSJG+FZ0d8nVISToQXyEa5VwxhyRTtjTHMRvb3r8//Pb5+tjGNp/Lx9bjfrt9bjfX+3p/rut1fa5rlz13Xdf7YzPGGAEAAAAAAJfzcHcBAAAAAACUVIRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4ABTJz5kzZbDZt2rTJ3aVcsZ07dyouLk6//faby5e9cuVKNWvWTAEBAbLZbFq8ePEl+//555966qmn1LBhQwUGBsrPz08REREaNmyY9u7d6/L6LjR+/PjL1nc119O/f3/ZbLbLvvr37295zZJks9kUFxd3VdblDr/99pvT5+rh4aHQ0FB16tRJ69evd3d5+YqLi5PNZnPLuqOjoxUdHX3ZftWrV8/3+D116pSk/51TXXkeql69uu64444iv//1119X7dq15ePjI5vNpuPHj7usNunS597+/furevXqLl1fQR05ckSjR49W/fr1FRAQoJCQENWrV099+vTRjz/+6JaaAJQsXu4uAACutp07d+q5555TdHS0S3/JM8aoR48eqlOnjpYsWaKAgADVrVs33/4//PCD7rjjDhlj9Mgjj6hly5by8fHR7t27NWfOHN144406duyYy+q72Pjx43X33XfrzjvvtGwdhVnPM888o8GDBzumt2zZoocffljjx49XTEyMo71cuXJWlepk/fr1qly58lVZlzs9+uij6tmzp7KysrRjxw4999xziomJ0fr163XDDTe4u7xcHnzwQd1+++3uLuOyWrdurVdeeSVXu91ud0M1l7dt2zY99thjevDBB9WvXz95eXkpKCjIpeu41Ln3mWee0bBhw1y6voI4deqUbrrpJp06dUpPPvmkrr/+ep05c0Z79uzRokWLtG3bNjVq1Oiq1wWgZCF0A4CLHDp0SEePHlW3bt3Utm3bS/Y9efKkunbtKj8/P8XHxzuFu+joaA0aNEgff/yx1SVfU2rVqqVatWo5ptPT0yVJERERuummm/J935kzZ+Tn5+fyq5+XWmdJUrVqVce2tm7dWrVr11bbtm01bdo0vfvuu1e07LS0NJeHzMqVKxeLP4aUKlWqWB1DO3bskCT985//1I033njV13/hz/7VtHDhQv3yyy/65ptvnP64J0nDhw9Xdnb2Va/pzJkz8vf3v+rrBWAdbi8HUGT9+/dXYGCgdu3apQ4dOiggIEAVKlTQxIkTJUkbNmzQzTffrICAANWpU0ezZs1yen/O7ZUrVqzQgAEDVKZMGQUEBKhLly769ddfnfquWLFCXbt2VeXKleXn56fatWtr0KBBSklJyVXXrl27dP/99yssLEy+vr6qWrWq+vbtq4yMDM2cOVP33HOPJCkmJsZxy+fMmTMvua3r1q1T27ZtFRQUJLvdrlatWunLL790zI+Li3MEgVGjRslms13yKvq7776r5ORkTZo0Kd8AcffddztNL1myRC1btpTdbldQUJDatWuX6zbgnFtvd+zYofvvv18hISEKCwvTwIEDdeLECUc/m82m06dPa9asWY7PIOe22b/++ktDhw5V/fr1FRgYqPLly+vWW2/V2rVrc9WYkZGhcePGKTIyUn5+fgoNDVVMTIzi4+Mvu56iyDlmli9froEDB6pcuXKy2+3KyMjQL7/8ogEDBigiIkJ2u12VKlVSly5d9NNPP+VazvHjxzVixAjVrFlTvr6+Kl++vDp16qRdu3Y5fUYX3l6es+5Vq1ZpyJAhKlu2rEJDQ9W9e3cdOnQo1+cyYsQIhYeHy263q02bNtq8ebOqV69eoNvjjx49qqFDh6pSpUry8fFRzZo1NWbMGGVkZDj1s9lseuSRR/Thhx8qMjJSdrtd119/vb744ovCfbAXyAmKBw4ccLT997//Vdu2bRUcHCy73a7WrVtr5cqVTu/LOfa2bNmiu+++W6VLl3YEqezsbL3++utq3Lix/P39HYF0yZIlTstYsGCBWrZsqYCAAAUGBqpDhw7aunVrnuvJceedd6patWp5hqMWLVqoSZMmjmljjKZNm+aoo3Tp0rr77rtznW+MMZo0aZKqVasmPz8/NWnSREuXLi3Mx1gk+R0fBb2t/WI5jxC88sormjJlimrUqKHAwEC1bNlSGzZscFp+7969JZ3/zC5+jKMg+1+6snNvXreXp6ena/To0apRo4Z8fHxUqVIlPfzww7lue8+5rX7ZsmVq0qSJ/P39Va9ePX3wwQeX/YyOHDkiSapQoUKe8z08nH9Vvtz/BVL+j0Dk9UhBTu2LFi3SDTfcID8/Pz333HOSpD/++EMPPfSQqlSpIh8fH1WsWFF33323/vzzT8f7T548qSeeeMLpM4qNjdXp06ed1r1w4UK1aNFCISEhstvtqlmzpgYOHHjZzweAaxC6AVyRc+fOqXv37urcubM+++wzdezYUaNHj9a//vUv9evXTwMHDtSnn36qunXrqn///tq8eXOuZTzwwAPy8PDQ3LlzNXXqVP3www+Kjo52+sVq3759atmypaZPn67ly5fr2Wef1ffff6+bb75Z586dc/Tbvn27mjdvrg0bNmjcuHFaunSpJkyYoIyMDJ09e1adO3fW+PHjJUlvvvmm1q9fr/Xr16tz5875buOaNWt066236sSJE3r//fc1b948BQUFqUuXLlqwYIGk87e8Llq0SNL523XXr1+vTz/9NN9lLl++XJ6enurSpUuBPue5c+eqa9euCg4O1rx58/T+++/r2LFjio6O1rp163L1v+uuu1SnTh198skneuqppzR37lw9/vjjjvnr16+Xv7+/4/nd9evXa9q0aZLOBz5JGjt2rL788kvNmDFDNWvWVHR0tFavXu1YRmZmpjp27Kjnn39ed9xxhz799FPNnDlTrVq1UmJi4mXXcyUGDhwob29vffjhh/r444/l7e2tQ4cOKTQ0VBMnTtSyZcv05ptvysvLSy1atNDu3bsd701NTdXNN9+st99+WwMGDNDnn3+ut956S3Xq1FFSUtJl1/3ggw/K29tbc+fO1aRJk7R69WpHYMkxYMAATZ06VQMGDNBnn32mu+66S926dSvQM7Lp6emKiYnR7NmzNXz4cH355Zfq3bu3Jk2apO7du+fq/+WXX+qNN97QuHHj9Mknn6hMmTLq1q1briBZUL/88ouk/93GP2fOHLVv317BwcGaNWuWPvroI5UpU0YdOnTIM3h1795dtWvX1sKFC/XWW29JOh+ohg0bpubNm2vBggWaP3++/vGPfziFj/Hjx+v+++9X/fr19dFHH+nDDz9UamqqbrnlFu3cuTPfegcOHKjExER98803Tu27du3SDz/8oAEDBjjaBg0apNjYWN12221avHixpk2bph07dqhVq1ZOQea5557TqFGj1K5dOy1evFhDhgzRP//5T6fj6HKMMcrMzHR6ueOqqXT+XLdixQpNnTpV//nPf3T69Gl16tTJ8Ye4adOm6emnn5YkzZgxQ+vXr9czzzwjqeD739XnXmOM7rzzTr3yyivq06ePvvzySw0fPlyzZs3SrbfemusPUNu3b9eIESP0+OOP67PPPlOjRo30wAMP6Ntvv73kZ9OyZUtJUt++fbV48WJHCM9LQf4vKIotW7boySef1GOPPaZly5bprrvu0h9//KHmzZvr008/1fDhw7V06VJNnTpVISEhjseO0tLSFBUVpVmzZumxxx7T0qVLNWrUKM2cOVP/+Mc/ZIyRdP48fO+996pmzZqaP3++vvzySz377LPKzMwscs0ACskAQAHMmDHDSDIbN250tPXr189IMp988omj7dy5c6ZcuXJGktmyZYuj/ciRI8bT09MMHz481zK7devmtK7vvvvOSDIvvPBCnrVkZ2ebc+fOmQMHDhhJ5rPPPnPMu/XWW02pUqXM4cOH892WhQsXGklm1apVBdr2m266yZQvX96kpqY62jIzM02DBg1M5cqVTXZ2tjHGmP379xtJ5uWXX77sMuvVq2fCw8MLtP6srCxTsWJF07BhQ5OVleVoT01NNeXLlzetWrVytI0dO9ZIMpMmTXJaxtChQ42fn5+jVmOMCQgIMP369bvs+jMzM825c+dM27ZtnfbV7NmzjSTz7rvvXvL9BV3PxVatWmUkmYULFzraco6Zvn37Fqjus2fPmoiICPP444872seNG2ckmRUrVlzy/ZLM2LFjc6176NChTv0mTZpkJJmkpCRjjDE7duwwksyoUaOc+s2bN89Iuuxn8dZbbxlJ5qOPPnJqf+mll4wks3z5cqcaw8LCzMmTJx1tycnJxsPDw0yYMOGS68k5Xl966SVz7tw5k56ebjZv3myaN29uJJkvv/zSnD592pQpU8Z06dLF6b1ZWVnm+uuvNzfeeKOjLefYe/bZZ536fvvtt0aSGTNmTL61JCYmGi8vL/Poo486taempprw8HDTo0ePXOvJce7cORMWFmZ69uzp9N6RI0caHx8fk5KSYowxZv369UaSmTx5slO/gwcPGn9/fzNy5EhjjDHHjh0zfn5++Z6XoqKi8t2OHNWqVTOScr0u/Axyjqf9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0XpzfiG5+Bflt99+22na399fUVFRWrhwYb6/3Fy4nIJcAQkICFCLFi20aNEip/7Z2dmaM2eOKleunOu2wIJ44IEHFB4erpEjR+Z7q1/OwGx169ZVpUqVNHfuXMfAONL52x0/+eQTx4jmhZXfVSCbzZbrs/7xxx9zjZTesWNHpaenX3bk98JcbboSedX95Zdf5vp8O3bsqD179uQaeMtV2rRpI0m5Blb6+OOPCzRwUdu2bXXq1CktXrzYqX327NmO+VdL69atVapUKe3cuVPNmjXL8+Xj43PJZXTs2FGScv0R50IdOnSQl5eX9u3bl+96LmfAgAH6/vvvtW7dOn3++efq16+f0y3Vd9xxh4wx+uOPP/JcfsOGDSWdH73dz88v3/OSlapXr64ff/zRqW3Pnj2WP8KSn4LufyvOvTnH+Zw5c5zaP/nkE50+fdplPwd//vlnngPcZWVlae/evbLb7SpVqlSh/i/I+cPMxfvy888/L3BdHTt21KpVqy657++44w7t27dPoaGhee6bvP5A5Ovrq6ioKL300kuSlOvbAQBYgyvdANxu06ZNevDBB3XPPffo4MGDGjNmjCpVquR4/rFevXqqVauWnnrqKRljVKZMGX3++edasWJFrmVNmTJFN998s1q0aKGnnnpKtWvX1p9//qklS5bo7bffVlBQkBo0aCBJeueddxQUFCQ/Pz/VqFEj31t/J0yYoHbt2ikmJkZPPPGEfHx8NG3aNP3888+aN29ekb4fOiQkRJ999pnuuOMO3XDDDXrkkUfUsmVLxzPIc+bM0fbt29W9e3d5eHho0qRJ6tWrl+644w4NGjRIGRkZevnll3X8+HHHV7QVVsOGDbV69Wp9/vnnqlChgoKCglS3bl3dcccdev755zV27FhFRUVp9+7dGjdunGrUqOEUGu+//37NmDFDgwcP1u7duxUTE6Ps7Gx9//33ioyMdFzBz289rnbHHXdo5syZqlevnho1aqTNmzfr5ZdfznWLZmxsrBYsWKCuXbvqqaee0o033qgzZ85ozZo1uuOOO3J9V29hXXfddbr//vs1efJkeXp66tZbb9WOHTs0efJkhYSEXPaugL59++rNN99Uv3799Ntvv6lhw4Zat26dxo8fr06dOhX5WfSiCAwM1Ouvv65+/frp6NGjuvvuu1W+fHn99ddf2r59u/76669LhmlJuuWW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4eGKi4tzzK9evbo++eQTzZ49WzabTf3795cknThxQg899JDKly+v4OBg3Xrrrdq+fbvTspcsWaJmzZrJz89PZcuWVffu3R3rPHDggB5//HHZbDbHQFgzZ85UqVKlnJYxffp01apVSz4+Pqpbt67TlV3p/CBa7733nrp16ya73a6IiAgtWbLEMf/YsWPq1auXypUrJ39/f0VERGjGjBl5fhb9+/fXo48+qsTERNlsNlWvXt1R7yOPPKLhw4erbNmyateunSRpzZo1uvHGG+Xr66sKFSroqaeeUmZmptNn++ijjyo2NlalS5dWWFiY3nnnHZ0+fVoDBgxQUFCQatWqpaVLl+a7f26++WZ5e3tr9erVjrbVq1fr4YcfVmpqqn755Ren9piYmALvn4kTJyosLExBQUF64IEHlJ6e7jQ/KytLw4cPV6lSpRQaGqqRI0fq4i8siI6OdrpboXr16ho/frwGDhyooKAgVa1aVe+8847Te+Lj49W4cWP5+fmpWbNmWrx4sWw2m+O29sLsMwAAAKAkI3SXELNmzVJAQIC+//57TZo0SePGjdOKFSskSRs3btTtt9+uHj16KCkpSa+99pqMMercubOSk5P11VdfafPmzWrSpInatm2ro0ePSpK+/PJLde/eXZ07d9bWrVu1cuVKNWvWTNL5W5IrV66scePGKSkpSUlJSXnW9emnn2rYsGEaMWKEfv75Zw0aNEgDBgzIdYX3ueeeU48ePfTjjz+qU6dO6tWrl6OOZ555Rjt37tTSpUuVkJCg6dOn53vL+GuvvaZx48apcuXKSkpK0saNG50+Iy8vL3333Xd6++239ccff6hTp05q3ry5tm/frunTp+v999/XCy+8kOuzLVu2rH744Qc9+uijGjJkiO655x61atVKW7ZsUYcOHdSnTx+lpeX9OEJAQICaN2/utM1r1qxR27Zt1bp1a0f7wYMH9euvvyomJqZA++ejjz7S2LFj9eKLL2rTpk2qUKGCpk2b5rTuyZMn64MPPtD777+vdevW6ejRo/r000/zrPPi9zVr1kxbt27V0KFDNWTIEO3atUuSlJqaqi5duqhhw4basmWLnn/+eY0aNcrp/YXZZwAAAECJZkq4EydOGEnmxIkTueadOXPG7Ny505w5c8apffPmzUaSadp0s4mONpa+mjY9v67NmzcXeJv69etnunbt6piOiooyN998s1Of5s2bm1GjRjmmu3btavr16+eYXrlypQkODjbp6elO76tVq5Z5++23jTHGtGzZ0vTq1SvfOqpVq2ZeffVVp7YZM2aYkJAQx3SrVq3MP//5T6c+99xzj+nUqZNjWpJ5+umnHdOnTp0yNpvNLF261BhjTJcuXcyAAQPyreNir776qqlWrZpTW1RUlGncuLFT27/+9S9Tt25dk52d7Wh78803TWBgoMnKynK878LPNjMz0wQEBJg+ffo42pKSkowks379+nxr+te//mXq1KljjDFmx44dJjg42GRmZpqJEyeanj17GmOMmTVrlvH19TVpaWkF3j+DBw92mt+iRQtz/fXXO6YrVKhgJk6c6Jg+d+6cqVy5cq7jZ9iwYY7patWqmd69ezums7OzTfny5c306dONMcZMnz7dhIaGOv3cvPvuu0aS2bp1qzGm8Pssv59FAAAA4Fp1qax5Ia50lxCNGjVymq5QoYIOHz6cb//Nmzfr1KlTCg0NVWBgoOO1f/9+7du3T5K0bds2tW3b9orqSkhIUOvWrZ3aWrdu7TSo2MX1BwQEKCgoyFH/kCFDNH/+fDVu3FgjR45UfHx8kWrJuUp/YW0tW7Z0+o7o1q1b69SpU/r999/zrM3T01OhoaFq2LChoy0sLEySLvl5x8TEaM+ePTp06JBWr16tm2++WZ6enoqKinLcdr569WrddNNN8vf3L9D+yan/QhdOnzhxQklJSU5tXl5euT6HvFy4zTabTeHh4Y7t2717txo1aiQ/Pz9HnxtvvNHp/a7aZwAAAEBxx0BqJcTFo0/bbDZlZ2fn2z87O1sVKlRwes44R84z2a4aEO3CUCud/0qvi9suVX/Hjh114MABffnll/rvf/+rtm3b6uGHH9Yrr7xSqDoCAgIuW4f5/+edL2zPq7YL23L6Xurzbt26tXx8fLR69WqtWrVKUVFRks7/IeDEiRPas2ePVq1a5XjeviD7x0qX2h+X+txyuGqfAQAAAMUdV7r/ppo0aaLk5GR5eXmpdu3aTq+cZ28bNWqklStX5rsMHx8fZWVlXXI9kZGRWrdunVNbfHy8IiMLN4BcuXLl1L9/f82ZM0dTp07NNbBXUdSvX1/x8fFOgTE+Pl5BQUGqVKnSFS//Qv7+/mrRooVWr16tb7/9VtHR0ZLOX3lu1aqVZs+erd9++80xiFpB9k9kZKQ2bNjgtJ4Lp0NCQlShQgWntszMTG3evPmKtqVevXr68ccflZGR4WjbtGlTrn5W7DMAAACguCF0/03ddtttatmype688059/fXX+u233xQfH6+nn37aEaDGjh2refPmaezYsUpISNBPP/2kSZMmOZZRvXp1ffvtt/rjjz+UkpKS53qefPJJzZw5U2+99Zb27t2rKVOmaNGiRXriiScKXOuzzz6rzz77TL/88ot27NihL774otChPS9Dhw7VwYMH9eijj2rXrl367LPPNHbsWA0fPlweHq7/0YiJidH8+fN15swZNWnSxNEeFRWlf//7345gLhVs/wwbNkwffPCBPvjgA+3Zs0djx47Vjh07nNY5bNgwTZw4UZ9++ql27dqloUOH6vjx41e0HT179lR2drYeeughJSQk6Ouvv3Zcwc65Am7VPgMAAACKG24vv4S0tITLdyoG68iLzWbTV199pTFjxmjgwIH666+/FB4erjZt2jieUY6OjtbChQv1/PPPa+LEiQoODlabNm0cyxg3bpwGDRqkWrVqKSMjI9ctxpJ055136rXXXtPLL7+sxx57TDVq1NCMGTMcV3oLwsfHR6NHj9Zvv/0mf39/3XLLLZo/f/4VfwaVKlXSV199pSeffFLXX3+9ypQpowceeEBPP/30FS87LzExMRo3bpxuv/12eXn970cvKipKTz/9tNq2bStfX19JBds/9957r/bt26dRo0YpPT1dd911l4YMGaKvv/7asewRI0YoKSlJ/fv3l4eHhwYOHKhu3brpxIkTRd6O4OBgff755xoyZIgaN26shg0b6tlnn1XPnj0dz3lbtc8AANeWxMTEfP/wDlysbNmyqlq1qrvLAK46m8krKZUgJ0+eVEhIiE6cOKHg4GCneenp6dq/f79q1KjhNChUYmKi6taNVHp63l8B5Wp+fnbt3p3ASQjF1n/+8x8NGDBAJ06cKNJYAPn9LAIArl1X+/clFH/8zouS5lJZ80Jc6c5D1apVtXt3wlX7yy1/9UNxM3v2bNWsWVOVKlXS9u3bNWrUKPXo0cNlg+8BAK59KSkpSk9PU2TkHNntPEKES0tLS1BCQm+lpKTwey/+dgjd+ahatSonBCAfycnJevbZZ5WcnKwKFSronnvu0YsvvujusgAAbmC3RyooqMnlOwLA3xShG0ChjRw5UiNHjnR3GQAAAMA1j9HLAQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAi/CVYflITExUSkrKVVlX2bJlS+R3gvfv31/Hjx/X4sWL3V2KyxRkm6Kjo9W4cWNNnTpVklS9enXFxsYqNjb2qtQIAAAA4NpB6M5DYmKiIuvWVVp6+lVZn93PTwm7dxcoeNtstkvO79evn2bOnOmiyqw1c+ZMxcbG6vjx41e0nPvuu08nTpzQ0qVLHW1Lly5Vp06d9PTTT+v55593tD///POaPn26Dh06dEXrLIyNGzcqICDgqq0PAAAAwLWD0J2HlJQUpaWna05kpCLtdkvXlZCWpt4JCUpJSSlQ6E5KSnL8e8GCBXr22We1e/duR5u/v79T/3Pnzsnb29t1BV+DYmJi9MQTTygzM1NeXucP6dWrV6tKlSpatWqVU9/Vq1crJibmqtZXrly5q7o+AAAAANcOnum+hEi7XU2Cgix9FTbUh4eHO14hISGy2WyO6fT0dJUqVUofffSRoqOj5efnpzlz5ujIkSO6//77VblyZdntdjVs2FDz5s1zWm52drZeeukl1a5dW76+vqpatapefPFFx/w//vhD9957r0qXLq3Q0FB17dpVv/32m2N+VlaWhg8frlKlSik0NFQjR46UMSbf7Vi9erUGDBigEydOyGazyWazKS4uTpJ07Ngx9e3bV6VLl5bdblfHjh21d+/efJcVExOjU6dOadOmTU7Lf+qpp7Rx40alpaVJks6ePav169c7Qrcrtun06dPq27evAgMDVaFCBU2ePDlXfdWrV3fcai6dv1vhvffeU7du3WS32xUREaElS5Y4vWfJkiWKiIiQv7+/YmJiNGvWLNlsNsddAQcOHFCXLl1UunRpBQQE6LrrrtNXX32V72cEAAAAwD0I3SXQqFGj9NhjjykhIUEdOnRQenq6mjZtqi+++EI///yzHnroIfXp00fff/+94z2jR4/WSy+9pGeeeUY7d+7U3LlzFRYWJklKS0tTTEyMAgMD9e2332rdunUKDAzU7bffrrNnz0qSJk+erA8++EDvv/++1q1bp6NHj+rTTz/Nt8ZWrVpp6tSpCg4OVlJSkpKSkvTEE09IOv/c9KZNm7RkyRKtX79exhh16tRJ586dy3NZderUUcWKFR1XtVNTU7Vlyxbdc889qlWrlr777jtJ0oYNG3TmzBnFxMS4bJuefPJJrVq1Sp9++qmWL1+u1atXa/PmzZfdR88995x69OihH3/8UZ06dVKvXr109OhRSdJvv/2mu+++W3feeae2bdumQYMGacyYMU7vf/jhh5WRkaFvv/1WP/30k1566SUFBgZedr0AAAAAri5uLy+BYmNj1b17d6e2nEArSY8++qiWLVumhQsXqkWLFkpNTdVrr72mN954Q/369ZMk1apVSzfffLMkaf78+fLw8NB7773neKZ8xowZKlWqlFavXq327dtr6tSpGj16tO666y5J0ltvvaWvv/463xp9fHycrtTn2Lt3r5YsWaLvvvtOrVq1kiT95z//UZUqVbR48WLdc889eS4vOjpaq1ev1ujRo7V27VrVqVNH5cqVU1RUlFavXq127do5bjmvVauWPvjggyveplOnTun999/X7Nmz1a5dO0nSrFmzVLly5cvtIvXv31/333+/JGn8+PF6/fXX9cMPP+j222/XW2+9pbp16+rll1+WJNWtW1c///yz050HiYmJuuuuu9SwYUNJUs2aNS+7TgAAAABXH6G7BGrWrJnTdFZWliZOnKgFCxbojz/+UEZGhjIyMhyDeyUkJCgjI0Nt27bNc3mbN2/WL7/8oqCgIKf29PR07du3TydOnFBSUpJatmzpmOfl5aVmzZpd8hbzvCQkJMjLy0stWrRwtIWGhqpu3bpKSEjI930xMTGKjY3VuXPntHr1akVHR0uSoqKi9Prrr0s6f8v5rbfe6rJt2rdvn86ePevUp0yZMqpbt+5lt7NRo0aOfwcEBCgoKEiHDx+WJO3evVvNmzd36n/jjTc6TT/22GMaMmSIli9frttuu0133XWX0zIBAAAAXBsI3SXQxSNlT548Wa+++qqmTp2qhg0bKiAgQLGxsY7bqC8efO1i2dnZatq0qf7zn//kmufqQcLyC+nGmEuO3B4TE6PTp09r48aNWrVqlZ588klJ50N33759dfToUa1fv95xJd8V21TYPyhc6OLB7Ww2m7Kzsx3LvXhbL17Xgw8+qA4dOujLL7/U8uXLNWHCBE2ePFmPPvpokWsCAAAA4Ho80/03sHbtWnXt2lW9e/fW9ddfr5o1azoNTJYzYNfKlSvzfH+TJk20d+9elS9fXrVr13Z6hYSEKCQkRBUqVNCGDRsc78nMzLzss80+Pj7Kyspyaqtfv74yMzOdnjc/cuSI9uzZo8jIyHyXVatWLVWpUkVLlizRtm3bFBUVJUmqUKGCqlevrsmTJys9Pd0xiJortql27dry9vZ26nPs2DHt2bPnktt9OfXq1dPGjRud2i4cJC5HlSpVNHjwYC1atEgjRozQu+++e0XrBQAAAOB6hO6/gdq1a2vFihWKj49XQkKCBg0apOTkZMd8Pz8/jRo1SiNHjtTs2bO1b98+bdiwQe+//74kqVevXipbtqy6du2qtWvXav/+/VqzZo2GDRum33//XZI0bNgwTZw4UZ9++ql27dqloUOHXvb7t6tXr65Tp05p5cqV57+mLS1NERER6tq1q/75z39q3bp12r59u3r37q1KlSqpa9eul1xeTEyMpk2bptq1azsGgZP+d4t5zZo1HV/L5optCgwM1AMPPKAnn3xSK1eu1M8//6z+/fvLw+PKfqwGDRqkXbt2adSoUdqzZ48++ugjx3ev51wBj42N1ddff639+/dry5Yt+uabby75RwkAAAAA7sHt5ZeQ8P9fNVXc1/HMM89o//796tChg+x2ux566CHdeeedOnHihFMfLy8vPfvsszp06JAqVKigwYMHS5Lsdru+/fZbjRo1St27d1dqaqoqVaqktm3bKjg4WJI0YsQIJSUlOULnwIED1a1bN6d1XKxVq1YaPHiw7r33Xh05ckRjx45VXFycZsyYoWHDhumOO+7Q2bNn1aZNG3311VeX/b7xmJgYzZ492/E8d46oqCi999576tGjh6PNVdv08ssv69SpU/rHP/6hoKAgjRgx4pLbXBA1atTQxx9/rBEjRui1115Ty5YtNWbMGA0ZMkS+vr6Szj+n//DDD+v3339XcHCwbr/9dr366qtXtF4AAAAArmczV/JgajFw8uRJhYSE6MSJE44wlSM9PV379+9XjRo15Ofn52hPTExUZN26SktPvyo12v38lLB7t+MqLHCxF198UW+99ZYOHjzo7lIskd/PIgDg2rVlyxY1bdpUTZtuVlBQE3eXg2tcauoWbd7cVJs3b1aTJhwvKBkulTUvxJXuPFStWlUJu3crJSXlqqyvbNmyBG44mTZtmpo3b67Q0FB99913evnll/XII4+4uywAAAAAhUTozkfVqlUJwnCbvXv36oUXXtDRo0dVtWpVjRgxQqNHj3Z3WQAAAAAKidANXINeffVVntEGAAAA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AACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIu4NXR/++236tKliypWrCibzabFixc7zTfGKC4uThUrVpS/v7+io6O1Y8cO9xQLAAAAAEAhuTV0nz59Wtdff73eeOONPOdPmjRJU6ZM0RtvvKGNGzcqPDxc7dq1U2pq6lWuFAAAAACAwvNy58o7duyojh075jnPGKOpU6dqzJgx6t69uyRp1qxZCgsL09y5czVo0KCrWSoAAAAAAIXm1tB9Kfv371dycrLat2/vaPP19VVUVJTi4+PzDd0ZGRnKyMhwTJ88edLyWl0lMTFRKSkp7i4DyFPZsmVVtWpVd5cBAAAAFCvXbOhOTk6WJIWFhTm1h4WF6cCBA/m+b8KECXruuecsrc0KiYmJiqxbV2np6e4uBciT3c9PCbt3E7wBAACAQrhmQ3cOm83mNG2MydV2odGjR2v48OGO6ZMnT6pK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cFVwrOFq4njD1cKxhquJ4w1XC8fatSskJOSyfa7p0C1Jw4cPV58+fdSsWTO1bNlS77zzjhITEzV48GB3lwYAAAAAwCVd86H73nvv1ZEjRzRu3DglJSWpQYMG+uqrr1StWjV3lwYAAAAAwCVd86FbkoYOHaqhQ4e6uwxL+fr6auzYsblujQdcjWMNVxPHG64WjjVcTRxvuFo41kqGa3r0cgAAAAAAijMPdxcAAAAAAEBJRegGAAAAAMAihG4AAAAAACxC6LbItGnTVKNGDfn5+alp06Zau3btJfuvWbNGTZs2lZ+fn2rWrKm33norV59PPvlE9evXl6+vr+rXr69PP/3UqvJRzLj6eJs5c6ZsNluuV3p6upWbgWKgMMdaUlKSevbsqbp168rDw0OxsbF59uPchvy4+njj3Ib8FOZYW7Rokdq1a6dy5copODhYLVu21Ndff52rH+c25MXVxxrnteKB0G2BBQsWKDY2VmPGjNHWrVt1yy23qGPHjkpMTMyz//79+9WpUyfdcsst2rp1q/71r3/pscce0yeffOLos379et17773q06ePtm/frj59+qhHjx76/vvvr9Zm4RplxfEmScHBwUpKSnJ6+fn5XY1NwjWqsMdaRkaGypUrpzFjxuj666/Psw/nNuTHiuNN4tyG3Ap7rH377bdq166dvvrqK23evFkxMTHq0qWLtm7d6ujDuQ15seJYkzivFQsGLnfjjTeawYMHO7XVq1fPPPXUU3n2HzlypKlXr55T26BBg8xNN93kmO7Ro4e5/fbbnfp06NDB3HfffS6qGsWVFcfbjBkzTEhIiMtrRfFW2GPtQlFRUWbYsGG52jm3IT9WHG+c25CXKznWctSvX98899xzjmnObciLFcca57XigSvdLnb27Flt3rxZ7du3d2pv37694uPj83zP+vXrc/Xv0KGDNm3apHPnzl2yT37LxN+DVcebJJ06dUrVqlVT5cqVdccdd+T6qyr+XopyrBUE5zbkxarjTeLcBmeuONays7OVmpqqMmXKONo4t+FiVh1rEue14oDQ7WIpKSnKyspSWFiYU3tYWJiSk5PzfE9ycnKe/TMzM5WSknLJPvktE38PVh1v9erV08yZM7VkyRLNmzdPfn5+at26tfbu3WvNhuCaV5RjrSA4tyEvVh1vnNtwMVcca5MnT9bp06fVo0cPRxvnNlzMqmON81rx4OXuAkoqm83mNG2MydV2uf4Xtxd2mfj7cPXxdtNNN+mmm25yzG/durWaNGmi119/Xf/+979dVTaKISvOQ5zbkB9XHxuc25Cfoh5r8+bNU1xcnD777DOVL1/eJctEyebqY43zWvFA6HaxsmXLytPTM9dfrA4fPpzrL1s5wsPD8+zv5eWl0NDQS/bJb5n4e7DqeLuYh4eHmjdvzl9N/8aKcqwVBOc25MWq4+1inNtwJcfaggUL9MADD2jhwoW67bbbnOZxbsPFrDrWLsZ57drE7eUu5uPjo6ZNm2rFihVO7StWrFCrVq3yfE/Lli1z9V++fLmaNWsmb2/vS/bJb5n4e7DqeLuYMUbbtm1ThQoVXFM4ip2iHGsFwbkNebHqeLsY5zYU9VibN2+e+vfvr7lz56pz58655nNuw8WsOtYuxnntGuWO0dtKuvnz5xtvb2/z/vvvm507d5rY2FgTEBBgfvvtN2OMMU899ZTp06ePo/+vv/5q7Ha7efzxx83OnTvN+++/b7y9vc3HH3/s6PPdd98ZT09PM3HiRJOQkGAmTpxovLy8zIYNG6769uHaYsXxFhcXZ5YtW2b27dtntm7dagYMGGC8vLzM999/f9W3D9eOwh5rxhizdetWs3XrVtO0aVPTs2dPs3XrVrNjxw7HfM5tyI8VxxvnNuSlsMfa3LlzjZeXl3nzzTdNUlKS43X8+HFHH85tyIsVxxrnteKB0G2RN99801SrVs34+PiYJk2amDVr1jjm9evXz0RFRTn1X716tbnhhhuMj4+PqV69upk+fXquZS5cuNDUrVvXeHt7m3r16plPPvnE6s1AMeHq4y02NtZUrVrV+Pj4mHLlypn27dub+Pj4q7EpuMYV9liTlOtVrVo1pz6c25AfVx9vnNuQn8Ica1FRUXkea/369XNaJuc25MXVxxrnteLBZsz/j6AEAAAAAABcime6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBACiBqlevrqlTp7q7DKWlpemuu+5ScHCwbDabjh8/7u6SAAC4qgjdAAD8v/79+8tms8lms8nb21s1a9bUE088odOnT7u7tHzNnDlTpUqVytW+ceNGPfTQQ1e/oIvMmjVLa9euVXx8vJKSkhQSEuLukgAAuKq83F0AAADXkttvv10zZszQuXPntHbtWj344IM6ffq0pk+fnqvvuXPn5O3t7YYq/7f+/JQrV+4qVpK/ffv2KTIyUg0aNHB3KQAAuAVXugEAuICvr6/Cw8NVpUoV9ezZU7169dLixYslSXFxcWrcuLE++OAD1axZU76+vjLGKDExUV27dlVgYKCCg4PVo0cP/fnnn45l5rzv7bffVpUqVWS323XPPfc43WqdnZ2tcePGqXLlyvL19VXjxo21bNkyx/zffvtNNptNH330kaKjo+Xn56c5c+ZowIABOnHihOMKfVxcnKTct5cXtMYPP/xQ1atXV0hIiO677z6lpqZe8vP65JNPdN1118nX11fVq1fX5MmTHfOio6M1efJkffvtt7LZbIqOjs53OUuWLFGzZs3k5+ensmXLqnv37o55c+bMUbNmzRQUFKTw8HD17NlThw8fdsw/duyYevXqpXLlysnf318RERGaMWOGY/4ff/yhe++9V6VLl1ZoaKi6du2q3377zTF/9erVuvHGGxUQEKBSpUqpdevWOnDgwCW3GwCAgiJ0AwBwCf7+/k5XlH/55Rd99NFH+uSTT7Rt2zZJ0p133qmjR49qzZo1WrFihfbt26d7773XaTk57/v888+1bNkybdu2TQ8//LBj/muvvabJkyfrlVde0Y8//qgOHTroH//4h/bu3eu0nFGjRumxxx5TQkKC2rZtq6lTpyo4OFhJSUlKSkrSE088kWsbjDEFqnHfvn1avHixvvjiC33xxRdas2aNJk6cmO9ns3nzZvXo0UP33XeffvrpJ8XFxemZZ57RzJkzJUmLFi3SP//5T7Vs2VJJSUlatGhRnsv58ssv1b17d3Xu3Flbt27VypUr1axZM8f8s2fP6vnnn9f27du1ePFi7d+/X/3793fMf+aZZ7Rz504tXbpUCQkJmj59usqWLSvp/DPlMTExCgwM1Lfffqt169YpMDBQt99+u86ePavMzEzdeeedioqK0o8//qj169froYceks1my3e7AQAoFAMAAIwxxvTr18907drVMf3999+b0NBQ06NHD2OMMWPHjjXe3t7m8OHDjj7Lly83np6eJjEx0dG2Y8cOI8n88MMPjvd5enqagwcPOvosXbrUeHh4mKSkJGOMMRUrVjQvvviiUz3Nmzc3Q4cONcYYs3//fiPJTJ061anPjBkzTEhISK5tqVatmnn11VcLVaPdbjcnT5509HnyySdNixYt8v28evbsadq1a+fU9uSTT5r69es7pocNG2aioqLyXYYxxrRs2dL06tXrkn0u9MMPPxhJJjU11RhjTJcuXcyAAQPy7Pv++++bunXrmuzsbEdbRkaG8ff3N19//bU5cuSIkWRWr15d4PUDAFAYXOkGAOACX3zxhQIDA+Xn56eWLVuqTZs2ev311x3zq1Wr5vS8dEJCgqpUqaIqVao42urXr69SpUopISHB0Va1alVVrlzZMd2yZUtlZ2dr9+7dOnnypA4dOqTWrVs71dK6dWunZUhyugJcUAWtsXr16goKCnJMV6hQwek27ryWm1fNe/fuVVZWVoHr27Ztm9q2bZvv/K1bt6pr166qVq2agoKCHLepJyYmSpKGDBmi+fPnq3Hjxho5cqTi4+Md7928ebN++eUXBQUFKTAwUIGBgSpTpozS09O1b98+lSlTRv3791eHDh3UpUsXvfbaa0pKSipw7QAAXA6hGwCAC8TExGjbtm3avXu30tPTtWjRIpUvX94xPyAgwKm/MSbPW5Hza8+RM+/CPhf3z2sZF6+/IApa48WDwtlsNmVnZxdqucaYQtfn7++f77zTp0+rffv2CgwM1Jw5c7Rx40Z9+umnks7fdi5JHTt21IEDBxQbG6tDhw6pbdu2jtvss7Oz1bRpU23bts3ptWfPHvXs2VOSNGPGDK1fv16tWrXSggULVKdOHW3YsKHQ2wEAQF4I3QAAXCAgIEC1a9dWtWrVCjQyef369ZWYmKiDBw862nbu3KkTJ04oMjLS0ZaYmKhDhw45ptevXy8PDw/VqVNHwcHBqlixotatW+e07Pj4eKdl5MXHx+eyV5ULWmNh1a9fP8+a69SpI09PzwIvp1GjRlq5cmWe83bt2qWUlBRNnDhRt9xyi+rVq5fn1fdy5cqpf//+mjNnjqZOnap33nlHktSkSRPt3btX5cuXV+3atZ1eF3592Q033KDRo0crPj5eDRo00Ny5cwtcPwAAl0LoBgDgCtx2221q1KiRevXqpS1btuiHH35Q3759FRUV5XQruJ+fn/r166ft27dr7dq1euyxx9SjRw+Fh4dLkp588km99NJLWrBggXbv3q2nnnpK27Zt07Bhwy65/urVq+vUqVNauXKlUlJSlJaWVuQaC2vEiBFauXKlnn/+ee3Zs0ezZs3SG2+8kedgbpcyduxYzZs3T2PHjlVCQoJ++uknTZo0SdL52/J9fHz0+uuv69dff9WSJUv0/PPPO73/2Wef1WeffaZffvlFO3bs0BdffOH4Y0KvXr1UtmxZde3aVWvXrtX+/fu1Zs0aDRs2TL///rv279+v0aNHa/369Tpw4ICWL1+uPXv2XNEfIwAAuBChGwCAK2Cz2bR48WKVLl1abdq00W233aaaNWtqwYIFTv1q166t7t27q1OnTmrfvr0aNGigadOmOeY/9thjGjFihEaMGKGGDRtq2bJlWrJkiSIiIi65/latWmnw4MG69957Va5cOUdYLUqNhdWkSRN99NFHmj9/vho0aKBnn31W48aNcxpZvCCio6O1cOFCLVmyRI0bN9att96q77//XtL5K9gzZ87UwoULVb9+fU2cOFGvvPKK0/t9fHw0evRoNWrUSG3atJGnp6fmz58vSbLb7fr2229VtWpVde/eXZGRkRo4cKDOnDmj4OBg2e127dq1S3fddZfq1Kmjhx56SI888ogGDRp0RZ8NAAA5bKYoD18BAIACi4uL0+LFix1fMQYAAP4+uNINAAAAAIBFCN0AAAAAAFiE28sBAAAAALAIV7oBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsMj/AV5tFuNx3qgjAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Import necessary libraries\n", "import pandas as pd\n", @@ -131,7 +201,8 @@ " return p_wedding_infections, p_wedding_traces\n", "\n", "# Run the simulation 1000 times\n", - "results = [simulate_event(m) for m in range(1000)]\n", + "np.random.seed(123) # ADDED LINE \n", + "results = [simulate_event(m) for m in range(100)]\n", "props_df = pd.DataFrame(results, columns=[\"Infections\", \"Traces\"])\n", "\n", "# Plotting the results\n", @@ -193,7 +264,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "base", "language": "python", "name": "python3" }, @@ -207,7 +278,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.0" + "version": "3.13.9" } }, "nbformat": 4, From 412ac204decc6a51ad0db12bd33e82fa3bae3474 Mon Sep 17 00:00:00 2001 From: Stephanie Shishis Date: Fri, 29 May 2026 19:58:05 -0400 Subject: [PATCH 2/2] strongly recommended changes implemented --- .../assignments/a1_sampling_and_reproducibility.ipynb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/02_activities/assignments/a1_sampling_and_reproducibility.ipynb b/02_activities/assignments/a1_sampling_and_reproducibility.ipynb index e264cd7d..b5c257bb 100644 --- a/02_activities/assignments/a1_sampling_and_reproducibility.ipynb +++ b/02_activities/assignments/a1_sampling_and_reproducibility.ipynb @@ -17,7 +17,10 @@ "id": "4ea73db3", "metadata": {}, "source": [ - "# 1.Infect a random subset of people\n", + "# Stage 0: Setup\n", + "p.d.DataFrame\n", + "\n", + "# Stage 1: Infect a random subset of people\n", "Functions used: infected_indices = np.random.choice(ppl.index, size=int(len(ppl) * ATTACK_RATE), replace=False).\n", "\n", "Sampling procedure: Simple random sampling without replacement (Every person has an equal chance of being chosen and no person can be picked twice. This is unlike simple random sampling with replacement where the sampled unit is returned to the population.)\n", @@ -28,7 +31,7 @@ "\n", "Underlying Distribution: Binomial distribution. \n", "\n", - "# 2.Primary contact tracing: randomly decide which infected people get traced\n", + "# Stage 2: Primary contact tracing - randomly decide which infected people get traced\n", "Functions used: ppl.loc[ppl['infected'], 'traced'] = np.random.rand(sum(ppl['infected'])) < TRACE_SUCCESS\n", "\n", "Sampling procedure: From the 100 infected individuals from above, each is given a random number between 0 and 1, if the nnumber is below 0.20 they are marked as traced. (Independent Bernoulli trial per person).\n", @@ -39,7 +42,7 @@ "\n", "Underlying Distribution: Binomial distribution. \n", "\n", - "# 3. Secondary contact tracing based on event attendance\n", + "# Stage 3: Secondary contact tracing based on event attendance\n", "Functions used: events_traced = event_trace_counts[event_trace_counts >= SECONDARY_TRACE_THRESHOLD].index\n", "\n", "Sampling procedure: If 2 or more infected people from the same event were already traced in the stage above, everyone else infected at that event gets traced automatically. Not random as who gets traced can change after each run. \n", @@ -50,7 +53,7 @@ "\n", "Underlying Distribution: No direct distribution.\n", "\n", - "# 4. Run the simulation 1000 times\n", + "# Stage 4: Run the simulation 1000 times\n", "Functions used: results = [simulate_event(m) for m in range(1000)]\n", "\n", "Sampling procedure: The above stages are repeated 1000 times, with a new random seed state which produces a distribution of outcomes from the infections and traces. \n",