{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import random" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# JNB Lab Solutions\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise 1a**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1) Read in Homicide data and drop rows that have missing data." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Date of IncidentAgeGenderRacePrimary CauseResidence CityIncident Zip Code
02017-02-26 10:48:0023.0MaleBlackMULTIPLE GUNSHOT WOUNDSChicago60623.0
\n", "
" ], "text/plain": [ " Date of Incident Age Gender Race Primary Cause \\\n", "0 2017-02-26 10:48:00 23.0 Male Black MULTIPLE GUNSHOT WOUNDS \n", "\n", " Residence City Incident Zip Code \n", "0 Chicago 60623.0 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hom=pd.read_excel('homicides.xlsx') #read data file\n", "Hom=Hom[Hom[\"Manner of Death\"]=='HOMICIDE']\n", "Hom=Hom[[\"Date of Incident\",\"Age\",\"Gender\",\"Race\",\"Primary Cause\",\"Residence City\",\"Incident Zip Code\"]]\n", "Hom=Hom.dropna()\n", "Hom.head(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "2) Extract the month and year of homicide incidents." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Date of IncidentAgeGenderRacePrimary CauseResidence CityIncident Zip Codenew_dateyearmonthday
02017-02-26 10:48:0023.0MaleBlackMULTIPLE GUNSHOT WOUNDSChicago60623.02017-02-262017226
\n", "
" ], "text/plain": [ " Date of Incident Age Gender Race Primary Cause \\\n", "0 2017-02-26 10:48:00 23.0 Male Black MULTIPLE GUNSHOT WOUNDS \n", "\n", " Residence City Incident Zip Code new_date year month day \n", "0 Chicago 60623.0 2017-02-26 2017 2 26 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from datetime import datetime\n", "Hom['new_date'] = [d.date() for d in Hom['Date of Incident']] \n", "dates=Hom['new_date'].values\n", "year=[my_str.year for my_str in dates]\n", "month=[my_str.month for my_str in dates]\n", "day=[my_str.day for my_str in dates]\n", "Hom['year'] = year\n", "Hom['month'] = month\n", "Hom['day'] = day\n", "Hom.head(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "3) Get Chicago data, select the columns [\"Age\",\"Gender\",\"Race\",\"Primary Cause\",\"Incident Zip Code\",\"year\",\"month\",\"day\"] and use integer format" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AgeGenderRacePrimary CauseIncident Zip Codeyearmonthday
023MaleBlackMULTIPLE GUNSHOT WOUNDS606232017226
\n", "
" ], "text/plain": [ " Age Gender Race Primary Cause Incident Zip Code year month \\\n", "0 23 Male Black MULTIPLE GUNSHOT WOUNDS 60623 2017 2 \n", "\n", " day \n", "0 26 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ChiHom=Hom[Hom[\"Residence City\"]=='Chicago'] #get data for just Chicago\n", "df=ChiHom[[\"Age\",\"Gender\",\"Race\",\"Primary Cause\",\"Incident Zip Code\",\"year\",\"month\",\"day\"]]\n", "df=df.dropna()\n", "df['year']=df['year'].astype(int)\n", "df['month']=df['month'].astype(int)\n", "df['day']=df['day'].astype(int)\n", "df['Age']=df['Age'].astype(int)\n", "df['Incident Zip Code']=df['Incident Zip Code'].astype(int)\n", "df=df[df[\"year\"]>2014]\n", "df.head(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "4) Get the number of Chicago homicides in July 2020." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Chicago Homicides In July 2020: 89\n" ] } ], "source": [ "july=df[df[\"month\"]==7]\n", "july20=july[july[\"year\"]==2020]\n", "print(\"Chicago Homicides In July 2020: \",len(july20))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "5) Get the number of homicides which occured on each day of July between 2015 and 2019." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0\n", "1 1\n", "2 3\n", "3 1\n", "4 4\n", "dtype: int32\n" ] } ], "source": [ "julydf=july\n", "julydf=julydf.reset_index(drop=True)\n", "julycount=pd.Series(np.arange(0,155,1))\n", "julycount[:]=0\n", "j=0\n", "for year in np.arange(2015,2020,1):\n", " for day in np.arange(1,32,1):\n", " for i in julydf.index:\n", " if julydf.loc[i,\"day\"]==day and julydf.loc[i,\"year\"]==year:\n", " julycount[j]=julycount[j]+1\n", " j=j+1\n", "print(julycount[0:5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "6) Get frequency distributions for the number of homicides in a day" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0.200000\n", "1 0.309677\n", "2 0.258065\n", "3 0.141935\n", "4 0.051613\n", "5 0.012903\n", "6 0.012903\n", "7 0.012903\n", "dtype: float64\n" ] }, { "data": { "text/plain": [ "0.2" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jm=julycount.max()\n", "julyfreq=pd.Series(np.arange(0,jm+1,1)) #create a series with index the number of homicides and value equal to the frequency\n", "julyfreq[:]=0\n", "dj=julycount\n", "for i in julycount.index:\n", " for j in np.arange(0,jm+1,1):\n", " if dj[i]==j:\n", " julyfreq[j]=julyfreq[j]+1\n", "s=julyfreq.sum()\n", "julyfreq=julyfreq/s\n", "print(julyfreq)\n", "julyfreq[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "7) Do a Monte Carlo simulation for monthly homicide counts in July based on 31 random draws from the respective empirical distributions." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "n = random.random()\n", "nummonths=10000\n", "numdays=31*nummonths\n", "julydaytotal=pd.Series(np.arange(0,numdays,1))\n", "julydaytotal[:]=0\n", "\n", "for i in np.arange(0,numdays,1):\n", " x=random.random()\n", " exit=0\n", " cum=0\n", " for j in julyfreq.index:\n", " if x< cum+julyfreq[j] and exit==0:\n", " julydaytotal[i]=j\n", " exit=1\n", " else:\n", " cum=cum+julyfreq[j]\n", "\n", "\n", "julymonths=pd.Series(np.arange(0,nummonths,1))\n", "julymonths[:]=0\n", "i=0\n", "for month in np.arange(0,nummonths,1):\n", " sum=0\n", " for j in np.arange(0,31,1):\n", " sum=sum+julydaytotal[i]\n", " i=i+1\n", " julymonths[month]=sum\n", " month=month+1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "8) Make a histogram for July." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, '10,000 Simulated July Homicide Counts based on 2015-2019 Data')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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TpwwhQsXtk8n//7778bb29t07tzZoV/G7zQvhxdvdN+bNWtm6tWr59D21FNPGR8fH3PhwoUsa+nTp4/9953Z46+HF0eOHGkkmW+//dbp+Ww2mzl48KBD7XXr1nU4tDFp0iQjyTzwwAMO6w8ePNhIcjjcfv3h2nnz5hlJZsaMGVnuU1BQkEPNI0aMMDabzcTHxzv0a926tcO4X7p0yZQqVcrcf//9Dv3S0tJM3bp1sz1EX716dRMQEJBln79uMzAw0NSuXdthfC5cuGDKli1rGjdubG/r06ePy8NBrl4Lkoy/v79JTk62tyUmJppChQqZmJgYe1tmhxc/+eQTI8lprHIiKCgo03H28fExly5dcrleamqquXbtmunfv7+pX7++vX3ixIlGkjl//nymzxkTE2MKFSpktm/f7nI/Mg5RrV692kgy7733nkO/119/PUeHF3P7uq9du7ZJTU2199u2bVumn/nZefHFF40k8+mnn9rbTp48aSQ5/E4zZBxK++tpJn+V1eHFXbt2mUGDBpnly5eb//3vf2b27NkmNDTUuLm5mS+//DLXtRtjTHJysgkNDTUVKlRw+DzKGPuEhASndSIjI03VqlVdbi+r7+b4+Hinw5jGGPPVV18ZScbT0zPberM7TD59+nQjySxZssTl8rS0NHPt2jUzfvx44+fn5/DdmdPDi5m9J3LitpzpypDVdGdOpkJzun5unudGarrrrrv0448/6ssvv9To0aPtVz727t3b4X+NWbn+6qXQ0FBJUocOHZzaf/7552y3l1NHjhzRo48+qoCAALm5ucnDw0PNmjWTJO3fvz/b9VeuXCmbzaaePXs6zPQEBASobt269kMvcXFxunLlih577DGH9Rs3buwwzW+lQYMGKT4+Xlu2bJH052GU+fPnq0+fPllemZihcOHC2r59u8tH4cKFHfquX79eNWrUcDohvG/fvjLGOF1l1b59e4dDG1m9HiRlOWO1evVqeXt7Ox1eys6GDRtUs2ZN1a1b16H90Ucfdfh569atOnfunPr06ePwGkhPT1fbtm21fft2p0NWeXXw4EH9+uuv6tWrl8P4FCtWTF27dtU333yT48N512vRooWKFy9u/9nf319ly5bN0futXr168vT01BNPPKH//ve/uZ4tyWyck5OTHa6q+/jjj9WkSRMVK1ZM7u7u8vDw0KxZsxzeq3fddZck6eGHH9ZHH33k8vSIlStXqlatWqpXr57D76xNmzYOh0w3bNggSU7v2+tfA5nJ7eu+Q4cOcnNzs/+cMZuT28+8mTNn6vXXX9fQoUP14IMPOi2/0e+g69WvX1+TJk1Sp06dFBERoccff1xbt25VuXLlNHz4cHu/9PR0h/FOS0tzub0rV66oS5cu+vnnn/Xxxx+7/DzKrM681F+3bl01bdpUb7/9tj7++GOdP39eW7duVVRUlNzc3PLlMKur78H169erVatW8vX1tX//vPLKKzp79qzTaROZycl7Iiduy9Dl5+cn6c8rKq537tw52Ww2lShRIl/W9/Pz05UrV1x+AJ87d06lSpVy2G5m25Tk0DczHh4eatOmjV5//XWtWbNGJ06cUPPmzbVy5cocnbd0/XN4enpm2p7VIdjcuHjxoiIiIvTtt9/qtdde08aNG7V9+3YtW7ZM0p9T8dn57bffZIyRv7+/PDw8HB7ffPONzpw5I+n/f2cBAQFO23DVZoUHH3xQwcHB9vPV5s6dq0uXLuX40GKhQoXUsGFDl4/rP6TOnj3r8ry/wMBA+/K/ys3rQVKWr4nTp08rMDAw1x+cZ8+ezdHvK+MQcrdu3ZxeA2+++aaMMfb3kisVK1bU6dOncxTMMsYps7FMT0/P8SXu18v4fPkrLy+vHL0PKleurHXr1qls2bJ65plnVLlyZVWuXFnvvfdejp47q3HO2Odly5bp4YcfVvny5bVgwQLFxcVp+/bt6tevn8Pvv2nTpvr000+Vmpqq3r1764477lCtWrX04Ycf2vv89ttv+u6775x+X8WLF5cxxuF96+7u7jQ2OX3P5vZ1f/3zZBzuysnvIMOcOXP05JNP6oknntDbb7/tsKxkyZKy2Ww3/HmfEyVKlFDHjh313Xff2esfP368w3i7uiIyJSVFnTt31tdff60VK1aoUaNGDsuz+x7Ma/0Z4eXhhx9WyZIl1aJFC3Xp0kX16tVT+fLl87TNv8oIzhm/+23btikyMlLSn+d1btmyRdu3b9eLL74oKWe/85y+J3LCPVe9/yYqV66swoULa+/evU7L9u7dqypVqsjb2ztf1s84l2vv3r0OL9rExESdOXPG4TLe2rVrZ7pNSTm+5Pev/Pz8NHjwYG3cuFHff/+90wmK+SVjf1NSUhzaMz40s7J+/Xr9+uuv2rhxo312S1KuLocvXbq0bDabNm/e7HQ+gPT/H5oZHxSJiYlOfRITEzO9/01WbmTfpT9D0zPPPKPRo0frnXfe0bRp09SyZUtVq1Yt17Vkx8/Pz+X9dn799VdJf47jzVKmTBl9/fXXSk9Pz1Xw8vPzy/T39VcZtb///vu65557XG7L398/0+dp06aN1q5dq88//1yPPPJItjVJynQsCxUqpJIlS0r68/Vx/WtDyvnrI7ciIiIUERGhtLQ07dixQ++//74GDx4sf3//bPcrq3HO2OcFCxYoJCRES5YscZjNcLWPDz74oB588EGlpKTom2++UUxMjB599FEFBwcrPDxcpUuXVuHChTV79myX9WT8Tv38/JSamqqzZ886BCJX9bpi9et+zpw5GjBggPr06aMPPvjAadYn4/5XmX3eFy5cWJUqVcq3ejJmdzLqeOKJJxyOalz/mZlxa4cNGzbos88+U8uWLZ22+dfvtho1atjbU1NTdeDAAfXo0SNPtZYtW1arVq3SqVOnlJiYqKCgIBUuXFjTpk1zupAlt4wx+vzzz1W0aFE1bNhQ0p/3GfPw8NDKlSsdvvf/epFbdnLznsjObTnT5e7urvvvv1/Lli1zuALq+PHj2rBhg9M9Rm5k/bZt28rb29vpCraMqwX/es+Szp0768CBA/r222/tbampqVqwYIEaNWpkT+auXLt2zeX/OKT/PzyX1fo3KiOsXH+i44oVK7JdN+NFev0b/9///rdT38z+x9mxY0cZY3Ty5EmXMz4ZHxD33HOPvL29tXDhQof1t27dmufDpTey7xkGDBggT09PPfbYYzp48KDLk3vzQ8uWLfXDDz843YBx3rx5stlsatGixU15Xklq166drly5kuv73LRo0UL79u3Tnj17HNqvv/igSZMmKlGihH744YdMZ/4yZuRc6d+/vwICAjR8+PBMrxTOmH2tVq2aypcvr0WLFjkcrrh06ZKWLl1qv6JR+vP1cerUKYeLOa5evao1a9bkahz+KiczL25ubmrUqJF9BtXVTTevl9k4Fy9eXA0aNJD05/vV09PT4cslMTExyyu1vLy81KxZM7355puSpN27d0v68337008/yc/Pz+XvK+O9lfG6vP59e/1rIDNWvu7nzp2rAQMGqGfPnpo5c2amh9k6d+6s9evXO1wReOHCBS1btkwPPPCA3N3zZ87j999/18qVK+03MJX+/C5w9fko/f8M1/r167V06VK1adPG5XYbNWqkcuXKOb2fP/nkE128eDHb79HslC1bVnXq1JGvr68++OADXbp06YY/F8eNG6cffvhBgwYNso+FzWaTu7u7w+HkP/74Q/Pnz3daP7MZ57y8JzLzt5vpWr16tS5dumQPQz/88IM++eQTSX+en5LxQThu3Djddddd6tixo0aOHKkrV67olVdeUenSpTV06FCHbTZv3lybNm1y+HDN6fqlSpXSSy+9pJdfflmlSpVSZGSktm/frrFjx2rAgAEO/0Po16+fpk6dqoceekgTJkxQ2bJlNW3aNB08eFDr1q3Lcr+TkpIUHByshx56SK1atVKFChV08eJFbdy4Ue+9955CQ0Nv+E2QlYCAALVq1UoxMTEqWbKkgoKC9NVXX9m/pLLSuHFjlSxZUlFRURozZow8PDy0cOFCpw9/6f//d/Xmm2+qXbt2cnNzU506ddSkSRM98cQTevzxx7Vjxw41bdpURYsWVUJCgr7++mvVrl1bTz31lEqWLKlhw4bptdde04ABA/TQQw/pxIkTGjt2bK4OL/71zXUj+56hRIkS6t27t6ZPn66goKAcX0GXW9HR0Zo3b546dOig8ePHKygoSF988YWmTZump556SlWrVr0pzytJPXr00Jw5cxQVFaWDBw+qRYsWSk9P17fffqvQ0NBMZ2EGDx6s2bNnq0OHDvab/S5cuFAHDhxw6FesWDG9//776tOnj86dO6du3bqpbNmyOn36tPbs2aPTp09r+vTpmdbn6+urzz77TB07dlT9+vX17LPPKjw8XJ6enjp8+LAWLFigPXv2qEuXLipUqJDeeustPfbYY+rYsaOefPJJpaSk6O2339b58+c1YcIE+3a7d++uV155RY888oheeOEFXblyRZMnT870PJqcyHgfvPfee+rTp488PDxUrVo1LVy4UOvXr1eHDh1UsWJFXblyxT6L1KpVq2y3GxgYqAceeEBjx45VuXLltGDBAsXGxurNN9+0f3Z27NhRy5Yt09NPP61u3brpxIkTevXVV1WuXDmHO/a/8sor+uWXX9SyZUvdcccdOn/+vN577z2H8zUHDx6spUuXqmnTpoqOjladOnWUnp6u48ePa+3atRo6dKgaNWqkyMhINW3aVMOHD9elS5fUsGFDbdmyxeUXoytWve4//vhj9e/fX/Xq1dOTTz6p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Bx+oYsWKmjRpkiQpNDRUO3bs0MSJE9W1a1d7P5vNpoCAAEv2AQAAICcKbKbr6tWr2rlzpyIjIx3aIyMjtXXrVpfrxMXFOfVv06aNduzYoWvXrtnbLl68qKCgIN1xxx3q2LGjdu/enWUtKSkpSk5OdngAAADkpwILXWfOnFFaWpr8/f0d2v39/ZWYmOhyncTERJf9U1NTdebMGUlS9erVNXfuXK1YsUIffvihvL291aRJEx0+fDjTWmJiYuTr62t/VKhQ4Qb3DgAAwFGBn0hvs9kcfjbGOLVl1/+v7ffcc4969uypunXrKiIiQh999JGqVq2q999/P9Ntjho1SklJSfbHiRMn8ro7AAAALhXYOV2lS5eWm5ub06zWqVOnnGazMgQEBLjs7+7uLj8/P5frFCpUSHfddVeWM11eXl7y8vLK5R4AAADkXIHNdHl6eiosLEyxsbEO7bGxsWrcuLHLdcLDw536r127Vg0bNpSHh4fLdYwxio+PV7ly5fKncAAAgDwo0MOLQ4YM0cyZMzV79mzt379f0dHROn78uKKioiT9edivd+/e9v5RUVH6+eefNWTIEO3fv1+zZ8/WrFmzNGzYMHufcePGac2aNTpy5Iji4+PVv39/xcfH27cJAABQEAr0lhHdu3fX2bNnNX78eCUkJKhWrVpatWqVgoKCJEkJCQkO9+wKCQnRqlWrFB0dralTpyowMFCTJ092uF3E+fPn9cQTTygxMVG+vr6qX7++/ve//+nuu++2fP8AAAAy2EzGmeiwS05Olq+vr5KSkuTj41PQ5QC3tH/FHiroEnItunXVgi4BwE1wq39/F/jViwAAAP8EhC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsUeOiaNm2aQkJC5O3trbCwMG3evDnL/ps2bVJYWJi8vb1VqVIlffDBB5n2Xbx4sWw2mzp16pTPVQMAAOROgYauJUuWaPDgwXrxxRe1e/duRUREqF27djp+/LjL/kePHlX79u0VERGh3bt3a/To0Xr++ee1dOlSp74///yzhg0bpoiIiJu9GwAAANkq0ND17rvvqn///howYIBCQ0M1adIkVahQQdOnT3fZ/4MPPlDFihU1adIkhYaGasCAAerXr58mTpzo0C8tLU2PPfaYxo0bp0qVKlmxKwAAAFkqsNB19epV7dy5U5GRkQ7tkZGR2rp1q8t14uLinPq3adNGO3bs0LVr1+xt48ePV5kyZdS/f/8c1ZKSkqLk5GSHBwAAQH4qsNB15swZpaWlyd/f36Hd399fiYmJLtdJTEx02T81NVVnzpyRJG3ZskWzZs3SjBkzclxLTEyMfH197Y8KFSrkcm8AAACyVuAn0ttsNoefjTFObdn1z2i/cOGCevbsqRkzZqh06dI5rmHUqFFKSkqyP06cOJGLPQAAAMiee0E9cenSpeXm5uY0q3Xq1Cmn2awMAQEBLvu7u7vLz89P+/bt07Fjx3T//ffbl6enp0uS3N3ddfDgQVWuXNlpu15eXvLy8rrRXQIAAMhUgc10eXp6KiwsTLGxsQ7tsbGxaty4sct1wsPDnfqvXbtWDRs2lIeHh6pXr669e/cqPj7e/njggQfUokULxcfHc9gQAAAUmAKb6ZKkIUOGqFevXmrYsKHCw8P1n//8R8ePH1dUVJSkPw/7nTx5UvPmzZMkRUVFacqUKRoyZIgGDhyouLg4zZo1Sx9++KEkydvbW7Vq1XJ4jhIlSkiSUzsAAICVCjR0de/eXWfPntX48eOVkJCgWrVqadWqVQoKCpIkJSQkONyzKyQkRKtWrVJ0dLSmTp2qwMBATZ48WV27di2oXQAAAMgRm8k4Ex12ycnJ8vX1VVJSknx8fAq6HOCW9q/YQwVdQq5Ft65a0CUAuAlu9e/vAr96EQAA4J+A0AUAAGABQhcAAIAFCF0AAAAWIHQBAABYgNAFAABgAUIXAACABQhdAAAAFiB0AQAAWIDQBQAAYAFCFwAAgAUIXQAAABZwL+gCAMBq/JFuAAWBmS4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAC/MFr4Bbyd/xDzACAnGGmCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwALueVnp0qVLmjBhgr766iudOnVK6enpDsuPHDmSL8UBAADcLvIUugYMGKBNmzapV69eKleunGw2W37XBQAAcFvJU+havXq1vvjiCzVp0iS/6wEAALgt5emcrpIlS6pUqVL5XQsAAMBtK0+h69VXX9Urr7yiy5cv53c9AAAAt6U8HV5855139NNPP8nf31/BwcHy8PBwWL5r1658KQ4AAOB2kafQ1alTp3wrYNq0aXr77beVkJCgmjVratKkSYqIiMi0/6ZNmzRkyBDt27dPgYGBGj58uKKiouzLly1bpjfeeEM//vijrl27pjvvvFNDhw5Vr1698q1mAACA3MpT6BozZky+PPmSJUs0ePBgTZs2TU2aNNG///1vtWvXTj/88IMqVqzo1P/o0aNq3769Bg4cqAULFmjLli16+umnVaZMGXXt2lWSVKpUKb344ouqXr26PD09tXLlSj3++OMqW7as2rRpky91AwAA5JbNGGPyuvLOnTu1f/9+2Ww21ahRQ/Xr18/V+o0aNVKDBg00ffp0e1toaKg6deqkmJgYp/4jRozQihUrtH//fntbVFSU9uzZo7i4uEyfp0GDBurQoYNeffXVHNWVnJwsX19fJSUlycfHJxd7BNyYf8UeKugScIuKbl21oEsAbnm3+vd3nk6kP3XqlO677z7dddddev755/Xss88qLCxMLVu21OnTp3O0jatXr2rnzp2KjIx0aI+MjNTWrVtdrhMXF+fUv02bNtqxY4euXbvm1N8Yo6+++koHDx5U06ZNc7h3AAAA+S9Poeu5555TcnKy9u3bp3Pnzun333/X999/r+TkZD3//PM52saZM2eUlpYmf39/h3Z/f38lJia6XCcxMdFl/9TUVJ05c8belpSUpGLFisnT01MdOnTQ+++/r9atW2daS0pKipKTkx0eAAAA+SlP53R9+eWXWrdunUJDQ+1tNWrU0NSpU51morJz/d3sjTFZ3uHeVf/r24sXL674+HhdvHhRX331lYYMGaJKlSqpefPmLrcZExOjcePG5apuAACA3MhT6EpPT3e6TYQkeXh4OP0dxsyULl1abm5uTrNap06dcprNyhAQEOCyv7u7u/z8/OxthQoVUpUqVSRJ9erV0/79+xUTE5Np6Bo1apSGDBli/zk5OVkVKlTI0X4AAADkRJ4OL953330aNGiQfv31V3vbyZMnFR0drZYtW+ZoG56engoLC1NsbKxDe2xsrBo3buxynfDwcKf+a9euVcOGDV2GwAzGGKWkpGS63MvLSz4+Pg4PAACA/JSn0DVlyhRduHBBwcHBqly5sqpUqaKQkBBduHBB77//fo63M2TIEM2cOVOzZ8/W/v37FR0drePHj9vvuzVq1Cj17t3b3j8qKko///yzhgwZov3792v27NmaNWuWhg0bZu8TExOj2NhYHTlyRAcOHNC7776refPmqWfPnnnZVQAAgHyRp8OLFSpU0K5duxQbG6sDBw7IGKMaNWqoVatWudpO9+7ddfbsWY0fP14JCQmqVauWVq1apaCgIElSQkKCjh8/bu8fEhKiVatWKTo6WlOnTlVgYKAmT55sv0eXJF26dElPP/20fvnlFxUuXFjVq1fXggUL1L1797zsKgAAQL64oft03a5u9ft84PbFfbqQGe7TBWTvVv/+zvFM1+TJk/XEE0/I29tbkydPzrJvTm8bAQAA8E+R45mukJAQ7dixQ35+fgoJCcl8gzabjhw5km8FFoRbPSnj9sVMFzLDTBeQvVv9+zvHM11Hjx51+W8AAABkL09XL44fP16XL192av/jjz80fvz4Gy4KAADgdpOn0DVu3DhdvHjRqf3y5cvc2R0AAMCFPIWuzP5Uz549e1SqVKkbLgoAAOB2k6v7dJUsWVI2m002m01Vq1Z1CF5paWm6ePGi/camAAAA+H+5Cl2TJk2SMUb9+vXTuHHj5Ovra1/m6emp4OBghYeH53uRAAAAf3e5Cl19+vRRamqqJKlVq1a64447bkpRAAAAt5tcn9Pl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AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQuAE5vNpk8//bSgy8izY8eOyWazKT4+Pkf9+/btq06dOmXZp3nz5ho8ePAN1wbgn4vQBfwD5CRU5Ke5c+eqRIkSLpdZEegqVKighIQE1apVK0f933vvPc2dO/em1pRh9+7deuihh+Tv7y9vb29VrVpVAwcO1KFDhyx5/gwbN26UzWbT+fPnLX1e4J+M0AXgtuPm5qaAgAC5u7vnqL+vr2+mITE/rVy5Uvfcc49SUlK0cOFC7d+/X/Pnz5evr69efvnlm/78AAoWoQv4hwkODtakSZMc2urVq6exY8e67H/ffffp2WefdWg7e/asvLy8tH79+huuZ+/evbrvvvtUuHBh+fn56YknntDFixftyzNm6d544w35+/urRIkSGjdunFJTU/XCCy+oVKlSuuOOOzR79mz7Oq4OL+7bt08dOnSQj4+PihcvroiICP30008Oz5Hh0qVL6t27t4oVK6Zy5crpnXfecar76tWrGj58uMqXL6+iRYuqUaNG2rhxY6b7efnyZT3++ONq3769VqxYoVatWikkJESNGjXSxIkT9e9//9ved9OmTbr77rvl5eWlcuXKaeTIkUpNTbUvz8nv0GazaebMmercubOKFCmiO++8UytWrLCPT4sWLSRJJUuWlM1mU9++fTOtHUD+IHQByNKAAQO0aNEipaSk2NsWLlyowMBA+xd3Xl2+fFlt27ZVyZIltX37dn388cdat26dU8hbv369fv31V/3vf//Tu+++q7Fjx6pjx44qWbKkvv32W0VFRSkqKkonTpxw+TwnT55U06ZN5e3trfXr12vnzp3q16+fQ5D5qxdeeEEbNmzQ8uXLtXbtWm3cuFE7d+506PP4449ry5YtWrx4sb777js99NBDatu2rQ4fPuxym2vWrNGZM2c0fPhwl8szZtpOnjyp9u3b66677tKePXs0ffp0zZo1S6+99lpWQ+nSuHHj9PDDD+u7775T+/bt9dhjj+ncuXOqUKGCli5dKkk6ePCgEhIS9N577+V6+wByh9AFIEtdu3aVzWbTZ599Zm+bM2eO+vbtK5vNlul6SUlJKlasmNPjrxYuXKg//vhD8+bNU61atXTfffdpypQpmj9/vn777Td7v1KlSmny5MmqVq2a+vXrp2rVquny5csaPXq07rzzTo0aNUqenp7asmWLy1qmTp0qX19fLV68WA0bNlTVqlX1+OOPq1q1ak59L168qFmzZmnixIlq3bq1ateurf/+979KS0uz9/npp5/04Ycf6uOPP1ZERIQqV66sYcOG6d5779WcOXNc1pARxqpXr57pmEnStGnTVKFCBU2ZMkXVq1dXp06dNG7cOL3zzjtKT0/Pct3r9e3bVz169FCVKlX0xhtv6NKlS9q2bZvc3NxUqlQpSVLZsmUVEBAgX1/fXG0bQO7l7IQHAP9YXl5e6tmzp2bPnq2HH35Y8fHx2rNnT7YnwxcvXly7du1yar/zzjvt/96/f7/q1q2rokWL2tuaNGmi9PR0HTx4UP7+/pKkmjVrqlCh//8/or+/v8NJ8m5ubvLz89OpU6dc1hIfH6+IiAh5eHhku78//fSTrl69qvDwcHtbqVKlHALarl27ZIxR1apVHdZNSUmRn5+fy+0aY7J9bunPMQkPD3cItE2aNNHFixf1yy+/qGLFijnajiTVqVPH/u+iRYuqePHimY4RgJuP0AX8wxQqVMgpAFy7di3LdQYMGKB69erpl19+0ezZs9WyZUsFBQVl+zxVqlTJso8xJtPZsr+2Xx+WbDaby7bMZoIKFy6cZR3X15Sd9PR0ubm5aefOnXJzc3NYdv1sXoaMgHbgwAGHQOfq+a8fk4yaMtpz+jvMzRgBuPk4vAj8w5QpU0YJCQn2n5OTk3X06NEs16ldu7YaNmyoGTNmaNGiRerXr1++1FKjRg3Fx8fr0qVL9rYtW7aoUKFCTrNIN6JOnTravHlztuFSkqpUqSIPDw9988039rbff//d4ZYO9evXV1pamk6dOqUqVao4PAICAlxuNzIyUqVLl9Zbb73lcnnGrRtq1KihrVu3OoSqrVu3qnjx4ipfvrykvP0Or+fp6SlJDodNAdxchC7gH+a+++7T/PnztXnzZn3//ffq06eP02yNKwMGDNCECROUlpamzp0750stjz32mLy9vdWnTx99//332rBhg5577jn16tXLfmgxPzz77LNKTk7WI488oh07dujw4cOaP3++Dh486NS3WLFi6t+/v1544QV99dVX+v7779W3b1+Hw5tVq1bVY489pt69e2vZsmU6evSotm/frjfffFOrVq1yWUPRokU1c+ZMffHFF3rggQe0bt06HTt2TDt27NDw4cMVFRUlSXr66ad14sQJPffcczpw4IA+++wzjRkzRkOGDLHXkNff4V8FBQXJZrNp5cqVOn36tMMVowBuDkIX8A+Qnp5uv2fVqFGj1LRpU3Xs2FHt27dXp06dVLly5Wy30aNHD7m7u+vRRx+Vt7d3vtRVpEgRrVmzRufOndNdd92lbt26qWXLlpoyZUq+bD+Dn5+f1q9fr4sXL6pZs2YKCwvTjBkzMj3H6+2331bTpk31wAMPqFWrVrr33nsVFhbm0GfOnDnq3bu3hg4dqmrVqumBBx7Qt99+qwoVKmRax4MPPqitW7fKw8NDjz76qKpXr64ePXooKSnJfnVi+fLltWrVKm3btk1169ZVVFSU+vfvr5deesm+nbz+Dv+qfPnyGjdunEaOHCl/f3+nK0YB5D+byenZnQD+ttq2basqVarcUJg5ceKEgoODtX37djVo0CAfqwOAfwZmuoDb2O+//64vvvhCGzduVKtWrfK0jWvXrun48eMaMWKE7rnnHgIXAOQRVy8Ct7F+/fpp+/btGjp0qB588ME8bWPLli1q0aKFqlatqk8++SSfKwSAfw4OLwIAAFiAw4sAAAAWIHQBAABYgNAFAABgAUIXAACABQhdAAAAFiB0AQAAWIDQBQAAYAFCFwAAgAUIXQAAABb4PzmbGHlLJ94dAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "#Make Histogram\n", "fig, ax = plt.subplots()\n", "n,bins,patches = ax.hist(julymonths, bins=10,density=1,alpha=.5)\n", "plt.xlabel(\"July Homicide Count\")\n", "plt.ylabel(\"Proportion\")\n", "plt.title(\"10,000 Simulated July Homicide Counts based on 2015-2019 Data\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise 1b**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "b) Find the empirical p-value of getting at least 108 homicides (the number in July 2020.)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Probaility that a random draw of 31 days from July 2015-2020 distibution results in 85 or more homicides: 0.0\n" ] } ], "source": [ "julycount=julymonths[julymonths>=108]\n", "pjuly=len(julycount)/10000\n", "print(\"Probaility that a random draw of 31 days from July 2015-2020 distibution results in 85 or more homicides:\",pjuly)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise 2**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "a) Make a histogram of the difference July homicide count - May homicide count" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "maydf=df[df[\"month\"]==5]\n", "maydf=maydf.reset_index(drop=True)\n", "maycount=pd.Series(np.arange(0,155,1))\n", "maycount[:]=0\n", "j=0\n", "for year in np.arange(2015,2020,1):\n", " for day in np.arange(1,32,1):\n", " for i in maydf.index:\n", " if maydf.loc[i,\"day\"]==day and maydf.loc[i,\"year\"]==year:\n", " maycount[j]=maycount[j]+1\n", " j=j+1\n", "mm=maycount.max()\n", "mayfreq=pd.Series(np.arange(0,mm+1,1)) #create a series with index the number of homicides and value equal to the frequency\n", "mayfreq[:]=0\n", "dm=maycount\n", "for i in maycount.index:\n", " for j in np.arange(0,mm+1,1):\n", " if dm[i]==j:\n", " mayfreq[j]=mayfreq[j]+1\n", "s=mayfreq.sum()\n", "mayfreq=mayfreq/s\n", "n = random.random()\n", "nummonths=10000\n", "numdays=31*nummonths\n", "maydaytotal=pd.Series(np.arange(0,numdays,1))\n", "maydaytotal[:]=0\n", "\n", "for i in np.arange(0,numdays,1):\n", " x=random.random()\n", " exit=0\n", " cum=0\n", " for j in mayfreq.index:\n", " if x< cum+mayfreq[j] and exit==0:\n", " maydaytotal[i]=j\n", " exit=1\n", " else:\n", " cum=cum+mayfreq[j]\n", "\n", "\n", "maymonths=pd.Series(np.arange(0,nummonths,1))\n", "maymonths[:]=0\n", "i=0\n", "for month in np.arange(0,nummonths,1):\n", " sum=0\n", " for j in np.arange(0,31,1):\n", " sum=sum+maydaytotal[i]\n", " i=i+1\n", " maymonths[month]=sum\n", " month=month+1\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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YUREREQyYAgjIiIikgFDGBEREZEM9PoB77t372LhwoX48ccfkZWVhZKSEo3ply9frpbOEREREdVWeoWwMWPGID4+HiNGjIC9vT0UCkV194uIiIioVtMrhO3btw9RUVHo2rVrdfeHiIiI6Jmg1zlhlpaWsLKyqu6+EBERET0z9AphCxYswAcffIB79+5Vd3+IiIiIngl6HY5ctmwZLl26BFtbWzg7O8PIyEhj+smTJ6ulc0RERES1lV4hzN/fv5q7QURERPRs0SuEhYWFVXc/iIiIiJ4peoWwUidOnEBqaioUCgVcXV3RsWPH6uoXERERUa2mVwjLysrC0KFDERcXh/r160MIgdzcXPj4+GDHjh1o0KBBdfeTiIiIqFbR6+rId955B3l5eThz5gxu3bqFv//+G7///jvy8vIwadKk6u4jERERUa2j156w/fv34+DBg3BxcZHKXF1dsWrVKvj5+VVb54iIiIhqK732hJWUlGjdlgIAjIyMtH5HkoiIiIi06RXCunfvjsmTJ+PmzZtS2Y0bNxASEoIePXpUW+eIiIiIaiu9QtjKlStx+/ZtODs7o2nTpmjWrBnUajVu376NFStWVHcfiYiIiGodvc4Jc3R0xMmTJxEbG4tz585BCAFXV1f07NmzuvtHREREVCs91n3CfH194evrW119ISIiInpmVDqELV++HG+99RZUKhWWL19ebl3epoKIiIiofAohhKhMRbVajaSkJFhbW0OtVpe9QIUCly9frrYO1lR5eXmwsLBAbm4uzM3N5e4OPUM+jb0gdxeohgrxbSF3F4hqvJq0/a70nrC0tDSdfxMRERFR1el1deT8+fNx7949rfJ///0X8+fPf+xOEREREdV2eoWwefPm4c6dO1rl9+7dw7x58x67U0RERES1nV4hTAgBhUKhVX7q1ClYWVk9dqeIiIiIarsq3aLC0tISCoUCCoUCLVq00AhixcXFuHPnDoKDg6u9k0RERES1TZVC2GeffQYhBEaPHo158+bBwsJCmmZsbAxnZ2d4eHhUeyeJiIiIapsqHY4MCgrC8OHDERERgcGDByMoKEh6DBs2TK8Atnr1aqjVaqhUKri5ueHIkSPl1o+Pj4ebmxtUKhWaNGmCtWvXakxfv349vLy8YGlpCUtLS/Ts2RO//vrrY7dLREREVJ2qfE6YoaEhxo8fj+Li4sduPDIyElOmTMHs2bORnJwMLy8v9OnTB+np6Trrp6WloW/fvvDy8kJycjJmzZqFSZMmYefOnVKduLg4DBs2DIcPH0ZiYiIaN24MPz8/3LhxQ+92iYiIiKpbpW/W+jAfHx9MnjwZ/v7+j9V4ly5d0KlTJ6xZs0Yqc3Fxgb+/P8LDw7XqT58+HXv37kVqaqpUFhwcjFOnTiExMVFnG8XFxbC0tMTKlSsxcuRIvdrVpSbd7I2eLbxZK5WFN2slqlhN2n7r9duR48ePx9SpU3H9+nW4ubnB1NRUY3q7du0qXEZBQQFOnDiBGTNmaJT7+fkhISFB5zyJiYnw8/PTKOvVqxc2btyIwsJCGBkZac1z7949FBYWSldt6tMuAOTn5yM/P196npeXV/4AiYiIiMqhVwgLDAwEoPkbkQqFQrp1RWUOVWZnZ6O4uBi2trYa5ba2tsjMzNQ5T2Zmps76RUVFyM7Ohr29vdY8M2bMQKNGjdCzZ0+92wWA8PBw3gONiIiIqo1eIaw6f7bo0fuNlXUPsvLq6yoHgMWLF2P79u2Ii4uDSqV6rHZnzpyJ0NBQ6XleXh4cHR3LrE9ERERUHr1CmJOT02M3bGNjAwMDA629T1lZWVp7qUrZ2dnprG9oaAhra2uN8qVLl+Ljjz/GwYMHNQ6P6tMuACiVSiiVykqNjYiIiKgiet0xHwAuXbqEd955Bz179oSvry8mTZqES5cuVXp+Y2NjuLm5ITY2VqM8NjYWnp6eOufx8PDQqh8TEwN3d3eN88GWLFmCBQsWYP/+/XB3d3/sdomIiIiqm14h7MCBA3B1dcWvv/6Kdu3aoU2bNjh27Bhat26tFW7KExoaig0bNiAiIgKpqakICQlBenq6dNf9mTNnSlc0Ag+uhLx69SpCQ0ORmpqKiIgIbNy4EdOmTZPqLF68GHPmzEFERAScnZ2RmZmJzMxMjd+6rKhdIiIioidNr8ORM2bMQEhICBYuXKhVPn36dPj6+lZqOYGBgcjJycH8+fORkZGBNm3aIDo6WjrcmZGRoXHvLrVajejoaISEhGDVqlVwcHDA8uXLERAQINVZvXo1CgoKMGTIEI22wsLCMHfu3Eq1S0RERPSk6XWfMJVKhdOnT6N58+Ya5RcuXEC7du1w//79autgTVWT7jNCzxbeJ4zKwvuEEVWsJm2/9Toc2aBBA6SkpGiVp6SkoGHDho/bJyIiIqJaT6/DkWPHjsVbb72Fy5cvw9PTEwqFAj///DMWLVqEqVOnVncfiYiIiGodvULY+++/j3r16mHZsmWYOXMmAMDBwQFz587VuIErEREREemmVwhTKBQICQlBSEgIbt++DQCoV69etXaMiIiIqDbTK4SVysrKwvnz56FQKNCyZUs0aNCguvpFREREVKvpdWJ+Xl4eRowYAQcHB3h7e+Oll16Cg4MDhg8fjtzc3OruIxEREVGto1cIGzNmDI4dO4aoqCj8888/yM3NxQ8//ICkpCSMHTu2uvtIREREVOvodTgyKioKBw4cwIsvviiV9erVC+vXr0fv3r2rrXNEREREtZVee8Ksra1hYWGhVW5hYQFLS8vH7hQRERFRbadXCJszZw5CQ0ORkZEhlWVmZuLdd9/F+++/X22dIyIiIqqt9DocuWbNGvzxxx9wcnJC48aNAQDp6elQKpX466+/8Pnnn0t1T548WT09JSIiIqpF9Aph/v7+1dwNIiIiomeLXiEsLCysuvtBRERE9Ex5rJu1njhxAqmpqVAoFHB1dUXHjh2rq19EREREtZpeISwrKwtDhw5FXFwc6tevDyEEcnNz4ePjgx07dvDO+UREREQV0OvqyHfeeQd5eXk4c+YMbt26hb///hu///478vLy+APeRERERJWg156w/fv34+DBg3BxcZHKXF1dsWrVKvj5+VVb54iIiIhqK732hJWUlMDIyEir3MjICCUlJY/dKSIiIqLaTq8Q1r17d0yePBk3b96Uym7cuIGQkBD06NGj2jpHREREVFvpFcJWrlyJ27dvw9nZGU2bNkWzZs2gVqtx+/ZtrFixorr7SERERFTr6HVOmKOjI06ePInY2FicO3cOQgi4urqiZ8+e1d0/IiIiolqpyiGsqKgIKpUKKSkp8PX1ha+v75PoFxEREVGtVuXDkYaGhnByckJxcfGT6A8RERHRM0Gvc8LmzJmDmTNn4tatW9XdHyIiIqJngl7nhC1fvhx//PEHHBwc4OTkBFNTU43pJ0+erJbOEREREdVWeoUwf39/KBQKCCGquz9EREREz4QqhbB79+7h3XffxZ49e1BYWIgePXpgxYoVsLGxeVL9IyIiIqqVqnROWFhYGDZv3ox+/fph2LBhOHjwIMaNG/ek+kZERERUa1VpT9iuXbuwceNGDB06FADw+uuvo2vXrigu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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "diff=julymonths-maymonths\n", "import matplotlib.pyplot as plt\n", "#Make Histogram\n", "fig, ax = plt.subplots()\n", "n,bins,patches = ax.hist(diff, bins=10,density=1,alpha=.5)\n", "plt.xlabel(\"Difference in Homicide Counts\")\n", "plt.ylabel(\"Proportion\")\n", "plt.title(\"Simulated Difference between the May and July Homicide Counts\")\n", "plt.savefig(\"Diff.png\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Find the probability that July will have at least n more homicides than May $(0\\le n \\le 20)$." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/plain": [ "0 0.7409\n", "1 0.7091\n", "2 0.6766\n", "3 0.6436\n", "4 0.6077\n", "5 0.5694\n", "6 0.5298\n", "7 0.4885\n", "8 0.4529\n", "9 0.4168\n", "10 0.3796\n", "11 0.3436\n", "12 0.3082\n", "13 0.2773\n", "14 0.2459\n", "15 0.2171\n", "16 0.1889\n", "17 0.1677\n", "18 0.1461\n", "19 0.1246\n", "20 0.1045\n", "dtype: float64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pdiff=pd.Series(np.arange(0,21,1))\n", "for i in pdiff.index:\n", " pdiff.loc[i]=len(diff[diff>=i])/10000\n", "pdiff" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "b) Make a plot of these probabilities" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "/* global mpl */\n", "window.mpl = {};\n", "\n", "mpl.get_websocket_type = function () {\n", " if (typeof WebSocket !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof MozWebSocket !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert(\n", " 'Your browser does not have WebSocket support. ' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.'\n", " );\n", " }\n", "};\n", "\n", "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = this.ws.binaryType !== undefined;\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById('mpl-warnings');\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent =\n", " 'This browser does not support binary websocket messages. ' +\n", " 'Performance may be slow.';\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = document.createElement('div');\n", " this.root.setAttribute('style', 'display: inline-block');\n", " this._root_extra_style(this.root);\n", "\n", " parent_element.appendChild(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message('supports_binary', { value: fig.supports_binary });\n", " fig.send_message('send_image_mode', {});\n", " if (fig.ratio !== 1) {\n", " fig.send_message('set_device_pixel_ratio', {\n", " device_pixel_ratio: fig.ratio,\n", " });\n", " }\n", " fig.send_message('refresh', {});\n", " };\n", "\n", " this.imageObj.onload = function () {\n", " if (fig.image_mode === 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function () {\n", " fig.ws.close();\n", " };\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "};\n", "\n", "mpl.figure.prototype._init_header = function () {\n", " var titlebar = document.createElement('div');\n", " titlebar.classList =\n", " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", " var titletext = document.createElement('div');\n", " titletext.classList = 'ui-dialog-title';\n", " titletext.setAttribute(\n", " 'style',\n", " 'width: 100%; text-align: center; padding: 3px;'\n", " );\n", " titlebar.appendChild(titletext);\n", " this.root.appendChild(titlebar);\n", " this.header = titletext;\n", "};\n", "\n", "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", "\n", "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", "\n", "mpl.figure.prototype._init_canvas = function () {\n", " var fig = this;\n", "\n", " var canvas_div = (this.canvas_div = document.createElement('div'));\n", " canvas_div.setAttribute('tabindex', '0');\n", " canvas_div.setAttribute(\n", " 'style',\n", " 'border: 1px solid #ddd;' +\n", " 'box-sizing: content-box;' +\n", " 'clear: both;' +\n", " 'min-height: 1px;' +\n", " 'min-width: 1px;' +\n", " 'outline: 0;' +\n", " 'overflow: hidden;' +\n", " 'position: relative;' +\n", " 'resize: both;' +\n", " 'z-index: 2;'\n", " );\n", "\n", " function on_keyboard_event_closure(name) {\n", " return function (event) {\n", " return fig.key_event(event, name);\n", " };\n", " }\n", "\n", " canvas_div.addEventListener(\n", " 'keydown',\n", " on_keyboard_event_closure('key_press')\n", " );\n", " canvas_div.addEventListener(\n", " 'keyup',\n", " on_keyboard_event_closure('key_release')\n", " );\n", "\n", " this._canvas_extra_style(canvas_div);\n", " this.root.appendChild(canvas_div);\n", "\n", " var canvas = (this.canvas = document.createElement('canvas'));\n", " canvas.classList.add('mpl-canvas');\n", " canvas.setAttribute(\n", " 'style',\n", " 'box-sizing: content-box;' +\n", " 'pointer-events: none;' +\n", " 'position: relative;' +\n", " 'z-index: 0;'\n", " );\n", "\n", " this.context = canvas.getContext('2d');\n", "\n", " var backingStore =\n", " this.context.backingStorePixelRatio ||\n", " this.context.webkitBackingStorePixelRatio ||\n", " this.context.mozBackingStorePixelRatio ||\n", " this.context.msBackingStorePixelRatio ||\n", " this.context.oBackingStorePixelRatio ||\n", " this.context.backingStorePixelRatio ||\n", " 1;\n", "\n", " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", " 'canvas'\n", " ));\n", " rubberband_canvas.setAttribute(\n", " 'style',\n", " 'box-sizing: content-box;' +\n", " 'left: 0;' +\n", " 'pointer-events: none;' +\n", " 'position: absolute;' +\n", " 'top: 0;' +\n", " 'z-index: 1;'\n", " );\n", "\n", " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", " if (this.ResizeObserver === undefined) {\n", " if (window.ResizeObserver !== undefined) {\n", " this.ResizeObserver = window.ResizeObserver;\n", " } else {\n", " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", " this.ResizeObserver = obs.ResizeObserver;\n", " }\n", " }\n", "\n", " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", " var nentries = entries.length;\n", " for (var i = 0; i < nentries; i++) {\n", " var entry = entries[i];\n", " var width, height;\n", " if (entry.contentBoxSize) {\n", " if (entry.contentBoxSize instanceof Array) {\n", " // Chrome 84 implements new version of spec.\n", " width = entry.contentBoxSize[0].inlineSize;\n", " height = entry.contentBoxSize[0].blockSize;\n", " } else {\n", " // Firefox implements old version of spec.\n", " width = entry.contentBoxSize.inlineSize;\n", " height = entry.contentBoxSize.blockSize;\n", " }\n", " } else {\n", " // Chrome <84 implements even older version of spec.\n", " width = entry.contentRect.width;\n", " height = entry.contentRect.height;\n", " }\n", "\n", " // Keep the size of the canvas and rubber band canvas in sync with\n", " // the canvas container.\n", " if (entry.devicePixelContentBoxSize) {\n", " // Chrome 84 implements new version of spec.\n", " canvas.setAttribute(\n", " 'width',\n", " entry.devicePixelContentBoxSize[0].inlineSize\n", " );\n", " canvas.setAttribute(\n", " 'height',\n", " entry.devicePixelContentBoxSize[0].blockSize\n", " );\n", " } else {\n", " canvas.setAttribute('width', width * fig.ratio);\n", " canvas.setAttribute('height', height * fig.ratio);\n", " }\n", " /* This rescales the canvas back to display pixels, so that it\n", " * appears correct on HiDPI screens. */\n", " canvas.style.width = width + 'px';\n", " canvas.style.height = height + 'px';\n", "\n", " rubberband_canvas.setAttribute('width', width);\n", " rubberband_canvas.setAttribute('height', height);\n", "\n", " // And update the size in Python. We ignore the initial 0/0 size\n", " // that occurs as the element is placed into the DOM, which should\n", " // otherwise not happen due to the minimum size styling.\n", " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", " fig.request_resize(width, height);\n", " }\n", " }\n", " });\n", " this.resizeObserverInstance.observe(canvas_div);\n", "\n", " function on_mouse_event_closure(name) {\n", " /* User Agent sniffing is bad, but WebKit is busted:\n", " * https://bugs.webkit.org/show_bug.cgi?id=144526\n", " * https://bugs.webkit.org/show_bug.cgi?id=181818\n", " * The worst that happens here is that they get an extra browser\n", " * selection when dragging, if this check fails to catch them.\n", " */\n", " var UA = navigator.userAgent;\n", " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n", " if(isWebKit) {\n", " return function (event) {\n", " /* This prevents the web browser from automatically changing to\n", " * the text insertion cursor when the button is pressed. We\n", " * want to control all of the cursor setting manually through\n", " * the 'cursor' event from matplotlib */\n", " event.preventDefault()\n", " return fig.mouse_event(event, name);\n", " };\n", " } else {\n", " return function (event) {\n", " return fig.mouse_event(event, name);\n", " };\n", " }\n", " }\n", "\n", " canvas_div.addEventListener(\n", " 'mousedown',\n", " on_mouse_event_closure('button_press')\n", " );\n", " canvas_div.addEventListener(\n", " 'mouseup',\n", " on_mouse_event_closure('button_release')\n", " );\n", " canvas_div.addEventListener(\n", " 'dblclick',\n", " on_mouse_event_closure('dblclick')\n", " );\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " canvas_div.addEventListener(\n", " 'mousemove',\n", " on_mouse_event_closure('motion_notify')\n", " );\n", "\n", " canvas_div.addEventListener(\n", " 'mouseenter',\n", " on_mouse_event_closure('figure_enter')\n", " );\n", " canvas_div.addEventListener(\n", " 'mouseleave',\n", " on_mouse_event_closure('figure_leave')\n", " );\n", "\n", " canvas_div.addEventListener('wheel', function (event) {\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " on_mouse_event_closure('scroll')(event);\n", " });\n", "\n", " canvas_div.appendChild(canvas);\n", " canvas_div.appendChild(rubberband_canvas);\n", "\n", " this.rubberband_context = rubberband_canvas.getContext('2d');\n", " this.rubberband_context.strokeStyle = '#000000';\n", "\n", " this._resize_canvas = function (width, height, forward) {\n", " if (forward) {\n", " canvas_div.style.width = width + 'px';\n", " canvas_div.style.height = height + 'px';\n", " }\n", " };\n", "\n", " // Disable right mouse context menu.\n", " canvas_div.addEventListener('contextmenu', function (_e) {\n", " event.preventDefault();\n", " return false;\n", " });\n", "\n", " function set_focus() {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "};\n", "\n", "mpl.figure.prototype._init_toolbar = function () {\n", " var fig = this;\n", "\n", " var toolbar = document.createElement('div');\n", " toolbar.classList = 'mpl-toolbar';\n", " this.root.appendChild(toolbar);\n", "\n", " function on_click_closure(name) {\n", " return function (_event) {\n", " return fig.toolbar_button_onclick(name);\n", " };\n", " }\n", "\n", " function on_mouseover_closure(tooltip) {\n", " return function (event) {\n", " if (!event.currentTarget.disabled) {\n", " return fig.toolbar_button_onmouseover(tooltip);\n", " }\n", " };\n", " }\n", "\n", " fig.buttons = {};\n", " var buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'mpl-button-group';\n", " for (var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " /* Instead of a spacer, we start a new button group. */\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", " buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'mpl-button-group';\n", " continue;\n", " }\n", "\n", " var button = (fig.buttons[name] = document.createElement('button'));\n", " button.classList = 'mpl-widget';\n", " button.setAttribute('role', 'button');\n", " button.setAttribute('aria-disabled', 'false');\n", " button.addEventListener('click', on_click_closure(method_name));\n", " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", "\n", " var icon_img = document.createElement('img');\n", " icon_img.src = '_images/' + image + '.png';\n", " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", " icon_img.alt = tooltip;\n", " button.appendChild(icon_img);\n", "\n", " buttonGroup.appendChild(button);\n", " }\n", "\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", "\n", " var fmt_picker = document.createElement('select');\n", " fmt_picker.classList = 'mpl-widget';\n", " toolbar.appendChild(fmt_picker);\n", " this.format_dropdown = fmt_picker;\n", "\n", " for (var ind in mpl.extensions) {\n", " var fmt = mpl.extensions[ind];\n", " var option = document.createElement('option');\n", " option.selected = fmt === mpl.default_extension;\n", " option.innerHTML = fmt;\n", " fmt_picker.appendChild(option);\n", " }\n", "\n", " var status_bar = document.createElement('span');\n", " status_bar.classList = 'mpl-message';\n", " toolbar.appendChild(status_bar);\n", " this.message = status_bar;\n", "};\n", "\n", "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", " // which will in turn request a refresh of the image.\n", " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", "};\n", "\n", "mpl.figure.prototype.send_message = function (type, properties) {\n", " properties['type'] = type;\n", " properties['figure_id'] = this.id;\n", " this.ws.send(JSON.stringify(properties));\n", "};\n", "\n", "mpl.figure.prototype.send_draw_message = function () {\n", " if (!this.waiting) {\n", " this.waiting = true;\n", " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", " var format_dropdown = fig.format_dropdown;\n", " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", " fig.ondownload(fig, format);\n", "};\n", "\n", "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", " var size = msg['size'];\n", " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", " fig._resize_canvas(size[0], size[1], msg['forward']);\n", " fig.send_message('refresh', {});\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", " var x0 = msg['x0'] / fig.ratio;\n", " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", " var x1 = msg['x1'] / fig.ratio;\n", " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", " x0 = Math.floor(x0) + 0.5;\n", " y0 = Math.floor(y0) + 0.5;\n", " x1 = Math.floor(x1) + 0.5;\n", " y1 = Math.floor(y1) + 0.5;\n", " var min_x = Math.min(x0, x1);\n", " var min_y = Math.min(y0, y1);\n", " var width = Math.abs(x1 - x0);\n", " var height = Math.abs(y1 - y0);\n", "\n", " fig.rubberband_context.clearRect(\n", " 0,\n", " 0,\n", " fig.canvas.width / fig.ratio,\n", " fig.canvas.height / fig.ratio\n", " );\n", "\n", " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", "};\n", "\n", "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", " // Updates the figure title.\n", " fig.header.textContent = msg['label'];\n", "};\n", "\n", "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", " fig.canvas_div.style.cursor = msg['cursor'];\n", "};\n", "\n", "mpl.figure.prototype.handle_message = function (fig, msg) {\n", " fig.message.textContent = msg['message'];\n", "};\n", "\n", "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", " // Request the server to send over a new figure.\n", " fig.send_draw_message();\n", "};\n", "\n", "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", " fig.image_mode = msg['mode'];\n", "};\n", "\n", "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", " for (var key in msg) {\n", " if (!(key in fig.buttons)) {\n", " continue;\n", " }\n", " fig.buttons[key].disabled = !msg[key];\n", " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", " if (msg['mode'] === 'PAN') {\n", " fig.buttons['Pan'].classList.add('active');\n", " fig.buttons['Zoom'].classList.remove('active');\n", " } else if (msg['mode'] === 'ZOOM') {\n", " fig.buttons['Pan'].classList.remove('active');\n", " fig.buttons['Zoom'].classList.add('active');\n", " } else {\n", " fig.buttons['Pan'].classList.remove('active');\n", " fig.buttons['Zoom'].classList.remove('active');\n", " }\n", "};\n", "\n", "mpl.figure.prototype.updated_canvas_event = function () {\n", " // Called whenever the canvas gets updated.\n", " this.send_message('ack', {});\n", "};\n", "\n", "// A function to construct a web socket function for onmessage handling.\n", "// Called in the figure constructor.\n", "mpl.figure.prototype._make_on_message_function = function (fig) {\n", " return function socket_on_message(evt) {\n", " if (evt.data instanceof Blob) {\n", " var img = evt.data;\n", " if (img.type !== 'image/png') {\n", " /* FIXME: We get \"Resource interpreted as Image but\n", " * transferred with MIME type text/plain:\" errors on\n", " * Chrome. But how to set the MIME type? It doesn't seem\n", " * to be part of the websocket stream */\n", " img.type = 'image/png';\n", " }\n", "\n", " /* Free the memory for the previous frames */\n", " if (fig.imageObj.src) {\n", " (window.URL || window.webkitURL).revokeObjectURL(\n", " fig.imageObj.src\n", " );\n", " }\n", "\n", " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", " img\n", " );\n", " fig.updated_canvas_event();\n", " fig.waiting = false;\n", " return;\n", " } else if (\n", " typeof evt.data === 'string' &&\n", " evt.data.slice(0, 21) === 'data:image/png;base64'\n", " ) {\n", " fig.imageObj.src = evt.data;\n", " fig.updated_canvas_event();\n", " fig.waiting = false;\n", " return;\n", " }\n", "\n", " var msg = JSON.parse(evt.data);\n", " var msg_type = msg['type'];\n", "\n", " // Call the \"handle_{type}\" callback, which takes\n", " // the figure and JSON message as its only arguments.\n", " try {\n", " var callback = fig['handle_' + msg_type];\n", " } catch (e) {\n", " console.log(\n", " \"No handler for the '\" + msg_type + \"' message type: \",\n", " msg\n", " );\n", " return;\n", " }\n", "\n", " if (callback) {\n", " try {\n", " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", " callback(fig, msg);\n", " } catch (e) {\n", " console.log(\n", " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", " e,\n", " e.stack,\n", " msg\n", " );\n", " }\n", " }\n", " };\n", "};\n", "\n", "function getModifiers(event) {\n", " var mods = [];\n", " if (event.ctrlKey) {\n", " mods.push('ctrl');\n", " }\n", " if (event.altKey) {\n", " mods.push('alt');\n", " }\n", " if (event.shiftKey) {\n", " mods.push('shift');\n", " }\n", " if (event.metaKey) {\n", " mods.push('meta');\n", " }\n", " return mods;\n", "}\n", "\n", "/*\n", " * return a copy of an object with only non-object keys\n", " * we need this to avoid circular references\n", " * https://stackoverflow.com/a/24161582/3208463\n", " */\n", "function simpleKeys(original) {\n", " return Object.keys(original).reduce(function (obj, key) {\n", " if (typeof original[key] !== 'object') {\n", " obj[key] = original[key];\n", " }\n", " return obj;\n", " }, {});\n", "}\n", "\n", "mpl.figure.prototype.mouse_event = function (event, name) {\n", " if (name === 'button_press') {\n", " this.canvas.focus();\n", " this.canvas_div.focus();\n", " }\n", "\n", " // from https://stackoverflow.com/q/1114465\n", " var boundingRect = this.canvas.getBoundingClientRect();\n", " var x = (event.clientX - boundingRect.left) * this.ratio;\n", " var y = (event.clientY - boundingRect.top) * this.ratio;\n", "\n", " this.send_message(name, {\n", " x: x,\n", " y: y,\n", " button: event.button,\n", " step: event.step,\n", " modifiers: getModifiers(event),\n", " guiEvent: simpleKeys(event),\n", " });\n", "\n", " return false;\n", "};\n", "\n", "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", " // Handle any extra behaviour associated with a key event\n", "};\n", "\n", "mpl.figure.prototype.key_event = function (event, name) {\n", " // Prevent repeat events\n", " if (name === 'key_press') {\n", " if (event.key === this._key) {\n", " return;\n", " } else {\n", " this._key = event.key;\n", " }\n", " }\n", " if (name === 'key_release') {\n", " this._key = null;\n", " }\n", "\n", " var value = '';\n", " if (event.ctrlKey && event.key !== 'Control') {\n", " value += 'ctrl+';\n", " }\n", " else if (event.altKey && event.key !== 'Alt') {\n", " value += 'alt+';\n", " }\n", " else if (event.shiftKey && event.key !== 'Shift') {\n", " value += 'shift+';\n", " }\n", "\n", " value += 'k' + event.key;\n", "\n", " this._key_event_extra(event, name);\n", "\n", " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", " return false;\n", "};\n", "\n", "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", " if (name === 'download') {\n", " this.handle_save(this, null);\n", " } else {\n", " this.send_message('toolbar_button', { name: name });\n", " }\n", "};\n", "\n", "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", " this.message.textContent = tooltip;\n", "};\n", "\n", "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", "// prettier-ignore\n", "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n", "\n", "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n", "\n", "mpl.default_extension = \"png\";/* global mpl */\n", "\n", "var comm_websocket_adapter = function (comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", " // object with the appropriate methods. Currently this is a non binary\n", " // socket, so there is still some room for performance tuning.\n", " var ws = {};\n", "\n", " ws.binaryType = comm.kernel.ws.binaryType;\n", " ws.readyState = comm.kernel.ws.readyState;\n", " function updateReadyState(_event) {\n", " if (comm.kernel.ws) {\n", " ws.readyState = comm.kernel.ws.readyState;\n", " } else {\n", " ws.readyState = 3; // Closed state.\n", " }\n", " }\n", " comm.kernel.ws.addEventListener('open', updateReadyState);\n", " comm.kernel.ws.addEventListener('close', updateReadyState);\n", " comm.kernel.ws.addEventListener('error', updateReadyState);\n", "\n", " ws.close = function () {\n", " comm.close();\n", " };\n", " ws.send = function (m) {\n", " //console.log('sending', m);\n", " comm.send(m);\n", " };\n", " // Register the callback with on_msg.\n", " comm.on_msg(function (msg) {\n", " //console.log('receiving', msg['content']['data'], msg);\n", " var data = msg['content']['data'];\n", " if (data['blob'] !== undefined) {\n", " data = {\n", " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", " };\n", " }\n", " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", " ws.onmessage(data);\n", " });\n", " return ws;\n", "};\n", "\n", "mpl.mpl_figure_comm = function (comm, msg) {\n", " // This is the function which gets called when the mpl process\n", " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", "\n", " var id = msg.content.data.id;\n", " // Get hold of the div created by the display call when the Comm\n", " // socket was opened in Python.\n", " var element = document.getElementById(id);\n", " var ws_proxy = comm_websocket_adapter(comm);\n", "\n", " function ondownload(figure, _format) {\n", " window.open(figure.canvas.toDataURL());\n", " }\n", "\n", " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", "\n", " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", " // web socket which is closed, not our websocket->open comm proxy.\n", " ws_proxy.onopen();\n", "\n", " fig.parent_element = element;\n", " fig.cell_info = mpl.find_output_cell(\"
\");\n", " if (!fig.cell_info) {\n", " console.error('Failed to find cell for figure', id, fig);\n", " return;\n", " }\n", " fig.cell_info[0].output_area.element.on(\n", " 'cleared',\n", " { fig: fig },\n", " fig._remove_fig_handler\n", " );\n", "};\n", "\n", "mpl.figure.prototype.handle_close = function (fig, msg) {\n", " var width = fig.canvas.width / fig.ratio;\n", " fig.cell_info[0].output_area.element.off(\n", " 'cleared',\n", " fig._remove_fig_handler\n", " );\n", " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", "\n", " // Update the output cell to use the data from the current canvas.\n", " fig.push_to_output();\n", " var dataURL = fig.canvas.toDataURL();\n", " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", " // the notebook keyboard shortcuts fail.\n", " IPython.keyboard_manager.enable();\n", " fig.parent_element.innerHTML =\n", " '';\n", " fig.close_ws(fig, msg);\n", "};\n", "\n", "mpl.figure.prototype.close_ws = function (fig, msg) {\n", " fig.send_message('closing', msg);\n", " // fig.ws.close()\n", "};\n", "\n", "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", " // Turn the data on the canvas into data in the output cell.\n", " var width = this.canvas.width / this.ratio;\n", " var dataURL = this.canvas.toDataURL();\n", " this.cell_info[1]['text/html'] =\n", " '';\n", "};\n", "\n", "mpl.figure.prototype.updated_canvas_event = function () {\n", " // Tell IPython that the notebook contents must change.\n", " IPython.notebook.set_dirty(true);\n", " this.send_message('ack', {});\n", " var fig = this;\n", " // Wait a second, then push the new image to the DOM so\n", " // that it is saved nicely (might be nice to debounce this).\n", " setTimeout(function () {\n", " fig.push_to_output();\n", " }, 1000);\n", "};\n", "\n", "mpl.figure.prototype._init_toolbar = function () {\n", " var fig = this;\n", "\n", " var toolbar = document.createElement('div');\n", " toolbar.classList = 'btn-toolbar';\n", " this.root.appendChild(toolbar);\n", "\n", " function on_click_closure(name) {\n", " return function (_event) {\n", " return fig.toolbar_button_onclick(name);\n", " };\n", " }\n", "\n", " function on_mouseover_closure(tooltip) {\n", " return function (event) {\n", " if (!event.currentTarget.disabled) {\n", " return fig.toolbar_button_onmouseover(tooltip);\n", " }\n", " };\n", " }\n", "\n", " fig.buttons = {};\n", " var buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'btn-group';\n", " var button;\n", " for (var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " /* Instead of a spacer, we start a new button group. */\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", " buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'btn-group';\n", " continue;\n", " }\n", "\n", " button = fig.buttons[name] = document.createElement('button');\n", " button.classList = 'btn btn-default';\n", " button.href = '#';\n", " button.title = name;\n", " button.innerHTML = '';\n", " button.addEventListener('click', on_click_closure(method_name));\n", " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", " buttonGroup.appendChild(button);\n", " }\n", "\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = document.createElement('span');\n", " status_bar.classList = 'mpl-message pull-right';\n", " toolbar.appendChild(status_bar);\n", " this.message = status_bar;\n", "\n", " // Add the close button to the window.\n", " var buttongrp = document.createElement('div');\n", " buttongrp.classList = 'btn-group inline pull-right';\n", " button = document.createElement('button');\n", " button.classList = 'btn btn-mini btn-primary';\n", " button.href = '#';\n", " button.title = 'Stop Interaction';\n", " button.innerHTML = '';\n", " button.addEventListener('click', function (_evt) {\n", " fig.handle_close(fig, {});\n", " });\n", " button.addEventListener(\n", " 'mouseover',\n", " on_mouseover_closure('Stop Interaction')\n", " );\n", " buttongrp.appendChild(button);\n", " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", "};\n", "\n", "mpl.figure.prototype._remove_fig_handler = function (event) {\n", " var fig = event.data.fig;\n", " if (event.target !== this) {\n", " // Ignore bubbled events from children.\n", " return;\n", " }\n", " fig.close_ws(fig, {});\n", "};\n", "\n", "mpl.figure.prototype._root_extra_style = function (el) {\n", " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", "};\n", "\n", "mpl.figure.prototype._canvas_extra_style = function (el) {\n", " // this is important to make the div 'focusable\n", " el.setAttribute('tabindex', 0);\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " } else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "};\n", "\n", "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which === 13) {\n", " this.canvas_div.blur();\n", " // select the cell after this one\n", " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", " IPython.notebook.select(index + 1);\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", " fig.ondownload(fig, null);\n", "};\n", "\n", "mpl.find_output_cell = function (html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i = 0; i < ncells; i++) {\n", " var cell = cells[i];\n", " if (cell.cell_type === 'code') {\n", " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", " var data = cell.output_area.outputs[j];\n", " if (data.data) {\n", " // IPython >= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] === html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "};\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel !== null) {\n", " IPython.notebook.kernel.comm_manager.register_target(\n", " 'matplotlib',\n", " mpl.mpl_figure_comm\n", " );\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib notebook\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "\n", "plt.plot(pdiff, 'o-',color='k')\n", "for i in pdiff.index:\n", " plt.text(i,pdiff[i]+.01, str(pdiff[i]),color='r',size=6)\n", " plt.text(i-.2,pdiff[i]-.03, str(i),color='k',size=6)\n", " \n", "plt.xlabel(\"Number More Homicides in July than in May\")\n", "plt.ylabel(\"Estimated Probability Based on 2015-2019 Data\")\n", "xl = np.arange(21)\n", "plt.xticks(xl, xl, alpha=0.7,size=5)\n", "plt.title(\"Probability that Chicago's July Homicide Count Exceeds May Homicide Count\",size=8)\n", "plt.savefig(\"MayvsJuly.png\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "c) Based on 2015-2019 data, there is a 10% chance of 20 more homicides in July than May." ] } ], "metadata": { "celltoolbar": "Edit Metadata", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.8.8" } }, "nbformat": 4, "nbformat_minor": 2 }