{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "*This notebook contains material from [CBE40455-2020](https://jckantor.github.io/CBE40455-2020);\n", "content is available [on Github](https://github.com/jckantor/CBE40455-2020.git).*\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [3.4 Modeling Events](https://jckantor.github.io/CBE40455-2020/03.04-Modeling-Events.html) | [Contents](toc.html) | [3.6 Simulating Queuing Systems](https://jckantor.github.io/CBE40455-2020/03.06-Queuing-Systems-and-Poisson-Processes.html) >

\"Open

\"Download\"" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 1, "link": "[3.5 Assignment](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5-Assignment)", "section": "3.5 Assignment" } }, "source": [ "# 3.5 Assignment\n", "\n", "(to be submitted Thursday, Sept. 3rd)." ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[3.5.1 Problem Statement ](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.1-Problem-Statement)", "section": "3.5.1 Problem Statement " } }, "source": [ "## 3.5.1 Problem Statement \n", "\n", "The facility has expanded to an average of 100 hours of machine cleaning time are required during the 16 hour overnight shift. The company would like to settle on a single cleaning model rather than servicing five different models. \n", "\n", "a. Modify the above model to determine the the model (A, B, C, D, or E) and number of devices required to meet the service requirement.\n", "\n", "b. Modify the above model to include a second process that writes the number of charging stations in use at every minute to a second data log. Prepare a plot and histogram of charging station usage." ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[3.5.2 Solution](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2-Solution)", "section": "3.5.2 Solution" } }, "source": [ "## 3.5.2 Solution" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.5.2.1 Preliminaries](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.1-Preliminaries)", "section": "3.5.2.1 Preliminaries" } }, "source": [ "### 3.5.2.1 Preliminaries" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.1.1 Installation, Import, and Setup](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.1.1-Installation,-Import,-and-Setup)", "section": "3.5.2.1.1 Installation, Import, and Setup" } }, "source": [ "#### 3.5.2.1.1 Installation, Import, and Setup" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.1.1 Installation, Import, and Setup](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.1.1-Installation,-Import,-and-Setup)", "section": "3.5.2.1.1 Installation, Import, and Setup" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: simpy in /Users/jeff/opt/anaconda3/lib/python3.7/site-packages (4.0.1)\n" ] } ], "source": [ "# necessary installations\n", "!pip install simpy\n", "\n", "# import section\n", "import simpy \n", "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.1.2 Data section](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.1.2-Data-section)", "section": "3.5.2.1.2 Data section" } }, "source": [ "#### 3.5.2.1.2 Data section" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.1.2 Data section](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.1.2-Data-section)", "section": "3.5.2.1.2 Data section" } }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idcharge_timeclean_time
0A1.02.5
1B0.51.5
2C0.82.0
3D1.43.5
4E0.51.2
\n", "
" ], "text/plain": [ " id charge_time clean_time\n", "0 A 1.0 2.5\n", "1 B 0.5 1.5\n", "2 C 0.8 2.0\n", "3 D 1.4 3.5\n", "4 E 0.5 1.2" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# data section\n", "\n", "roomba_data = [\n", " [\"A\", 1.0, 2.5],\n", " [\"B\", 0.5, 1.5],\n", " [\"C\", 0.8, 2.0],\n", " [\"D\", 1.4, 3.5],\n", " [\"E\", 0.5, 1.2],\n", "]\n", "\n", "roomba_df = pd.DataFrame(roomba_data, columns=[\"id\", \"charge_time\", \"clean_time\"])\n", "display(roomba_df)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.1.3 Key performance indictors](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.1.3-Key-performance-indictors)", "section": "3.5.2.1.3 Key performance indictors" } }, "source": [ "#### 3.5.2.1.3 Key performance indictors" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.1.3 Key performance indictors](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.1.3-Key-performance-indictors)", "section": "3.5.2.1.3 Key performance indictors" } }, "outputs": [], "source": [ "def kpi(df):\n", " df[\"time\"] = df[\"end\"] - df[\"begin\"]\n", " return pd.pivot_table(df, index=[\"event\"], values=\"time\", aggfunc={\"time\":np.sum} )" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.1.4 Gantt charts](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.1.4-Gantt-charts)", "section": "3.5.2.1.4 Gantt charts" } }, "source": [ "#### 3.5.2.1.4 Gantt charts" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.1.4 Gantt charts](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.1.4-Gantt-charts)", "section": "3.5.2.1.4 Gantt charts" } }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "from matplotlib.lines import Line2D\n", "\n", "def gantt(df, lw=10):\n", " \n", " # create sorted lists of the unique ids and events appearing in the data log\n", " ids = sorted(list(set(df[\"id\"])))\n", " events = sorted(list(set(df[\"event\"])))\n", " \n", " # create list of unique colors for each event\n", " colors = [f\"C{i}\" for i in range(len(events))]\n", " \n", " # create plot window\n", " fig, ax = plt.subplots(1, 1, figsize=(12, 3))\n", " \n", " # for each event and id, find entries in the data log and plot the begin and end points\n", " for i, event in enumerate(events):\n", " for j, id in enumerate(ids): \n", " for k in df[(df[\"id\"]==id) & (df[\"event\"]==event)].index:\n", " ax.plot([df[\"begin\"][k], df[\"end\"][k]], [j,j], \n", " colors[i], solid_capstyle=\"butt\", lw=lw)\n", " \n", " # create legend\n", " lines = [Line2D([0], [0], lw=lw, color=colors[i]) for i in range(len(events))]\n", " ax.legend(lines, events, bbox_to_anchor=(0.0, 1.1), loc=\"lower left\")\n", " \n", " # annotate the axes\n", " ax.set_yticks(range(len(ids)))\n", " ax.set_yticklabels(ids)\n", " ax.grid(True)\n", " ax.set_xlabel(\"Time\")\n", " ax.set_title(\"Gannt Chart\")\n", " for sp in ['top', 'bottom', 'right', 'left']:\n", " ax.spines[sp].set_visible(False)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.5.2.2 Which model of Roomba is preferred?](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.2-Which-model-of-Roomba-is-preferred?)", "section": "3.5.2.2 Which model of Roomba is preferred?" } }, "source": [ "### 3.5.2.2 Which model of Roomba is preferred?" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.2.1 Model](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.2.1-Model)", "section": "3.5.2.2.1 Model" } }, "source": [ "#### 3.5.2.2.1 Model" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.2.1 Model](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.2.1-Model)", "section": "3.5.2.2.1 Model" } }, "outputs": [], "source": [ "import random\n", "\n", "five_min = 5.0/60.0\n", "ten_min = 10.0/60.0\n", "twenty_min = 20.0/60.0\n", "thirty_min = 30.0/60.0\n", "\n", "def roomba_model(id, charge_time, clean_time, reserve=0.1):\n", " soc = 1.0 # state of charge\n", " sow = 0.0 # state of waste\n", " while True:\n", " if soc > reserve and sow < 1.0:\n", " tic = env.now\n", " yield simpy.AnyOf(env, [env.timeout((soc - reserve) * clean_time), \n", " env.timeout((1.0 - sow)*random.uniform(ten_min, thirty_min))])\n", " toc = env.now\n", " soc = max(0.0, soc - (toc - tic)/clean_time)\n", " sow = min(1.0, sow + (toc - tic)/twenty_min)\n", " data_log.append([id, \"cleaning\", tic, toc])\n", " if sow >= 1.0 - 0.001:\n", " with waste_stations.request() as request:\n", " yield request\n", " tic = env.now\n", " yield env.timeout(five_min)\n", " toc = env.now\n", " sow = 0.0\n", " data_log.append([id, \"waste disposal\", tic, toc])\n", " if soc <= reserve+ 0.001:\n", " with chargers.request() as request:\n", " yield request\n", " tic = env.now\n", " yield env.timeout((1 - soc)*charge_time)\n", " toc = env.now\n", " soc = min(1.0, soc + (toc - tic)/charge_time)\n", " data_log.append([id, \"charging\", tic, toc])\n", " " ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.2.2 Simulation](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.2.2-Simulation)", "section": "3.5.2.2.2 Simulation" } }, "source": [ "#### 3.5.2.2.2 Simulation\n", "\n", "Our strategy will be to determine, first, which model can provide 100 hours of cleaning with the fewest units. For this determination we will use an equal number of charging and waste stations. " ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.2.2 Simulation](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.2.2-Simulation)", "section": "3.5.2.2.2 Simulation" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model A\n" ] }, { "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", "
time
event
charging36.000000
cleaning99.893153
waste disposal21.833333
\n", "
" ], "text/plain": [ " time\n", "event \n", "charging 36.000000\n", "cleaning 99.893153\n", "waste disposal 21.833333" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Model B\n" ] }, { "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", "
time
event
charging31.500000
cleaning104.283599
waste disposal22.916667
\n", "
" ], "text/plain": [ " time\n", "event \n", "charging 31.500000\n", "cleaning 104.283599\n", "waste disposal 22.916667" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Model C\n" ] }, { "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", "
time
event
charging35.999747
cleaning100.389862
waste disposal22.083333
\n", "
" ], "text/plain": [ " time\n", "event \n", "charging 35.999747\n", "cleaning 100.389862\n", "waste disposal 22.083333" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Model D\n" ] }, { "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", "
time
event
charging37.800000
cleaning99.179123
waste disposal21.250000
\n", "
" ], "text/plain": [ " time\n", "event \n", "charging 37.800000\n", "cleaning 99.179123\n", "waste disposal 21.250000" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Model E\n" ] }, { "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", "
time
event
charging40.049716
cleaning97.295496
waste disposal21.666667
\n", "
" ], "text/plain": [ " time\n", "event \n", "charging 40.049716\n", "cleaning 97.295496\n", "waste disposal 21.666667" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "N = 10\n", "\n", "for r in roomba_df.index:\n", " \n", " data_log = []\n", "\n", " env = simpy.Environment()\n", " chargers = simpy.Resource(env, capacity=N)\n", " waste_stations = simpy.Resource(env, capacity=N)\n", " for k in range(N):\n", " env.process(roomba_model(roomba_df[\"id\"][r] + str(k), roomba_df[\"charge_time\"][r], roomba_df[\"clean_time\"][r]))\n", " env.run(until=16)\n", "\n", " df = pd.DataFrame(data_log, columns=[\"id\", \"event\", \"begin\", \"end\"])\n", " print(\"Model \", roomba_df[\"id\"][r])\n", " display(kpi(df))\n", " #gantt(df)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.2.2 Simulation](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.2.2-Simulation)", "section": "3.5.2.2.2 Simulation" } }, "source": [ "Both models B and C can meet the 100 specification with 10 units, but model B has a clear advantage. So will continue the analysis with model B. Next determine the minimum number of charging and waste stations while still meeting the 100 hour requirement." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.2.2 Simulation](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.2.2-Simulation)", "section": "3.5.2.2.2 Simulation" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.5.2.3 Charging station analysis](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.3-Charging-station-analysis)", "section": "3.5.2.3 Charging station analysis" } }, "source": [ "### 3.5.2.3 Charging station analysis" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.3.1 Modell](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.3.1-Modell)", "section": "3.5.2.3.1 Modell" } }, "source": [ "#### 3.5.2.3.1 Modell" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.3.1 Modell](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.3.1-Modell)", "section": "3.5.2.3.1 Modell" } }, "outputs": [], "source": [ "import random\n", "\n", "five_min = 5.0/60.0\n", "ten_min = 10.0/60.0\n", "twenty_min = 20.0/60.0\n", "thirty_min = 30.0/60.0\n", "\n", "def roomba_model(id, charge_time, clean_time, reserve=0.1):\n", " soc = 1.0 # state of charge\n", " sow = 0.0 # state of waste\n", " while True:\n", " if soc > reserve and sow < 1.0:\n", " tic = env.now\n", " yield simpy.AnyOf(env, [env.timeout((soc - reserve) * clean_time), \n", " env.timeout((1.0 - sow)*random.uniform(ten_min, thirty_min))])\n", " toc = env.now\n", " soc = max(0.0, soc - (toc - tic)/clean_time)\n", " sow = min(1.0, sow + (toc - tic)/twenty_min)\n", " data_log.append([id, \"cleaning\", tic, toc])\n", " if sow >= 1.0 - 0.001:\n", " with waste_stations.request() as request:\n", " yield request\n", " tic = env.now\n", " yield env.timeout(five_min)\n", " toc = env.now\n", " sow = 0.0\n", " data_log.append([id, \"waste disposal\", tic, toc])\n", " if soc <= reserve+ 0.001:\n", " with chargers.request() as request:\n", " yield request\n", " tic = env.now\n", " charger_log.append([chargers.count, tic])\n", " yield env.timeout((1 - soc)*charge_time)\n", " toc = env.now\n", " soc = min(1.0, soc + (toc - tic)/charge_time)\n", " data_log.append([id, \"charging\", tic, toc])\n", " charger_log.append([chargers.count, toc])\n", " " ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.3.1 Modell](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.3.1-Modell)", "section": "3.5.2.3.1 Modell" } }, "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", "
time
event
charging18.180000
cleaning50.115622
waste disposal10.916667
\n", "
" ], "text/plain": [ " time\n", "event \n", "charging 18.180000\n", "cleaning 50.115622\n", "waste disposal 10.916667" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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119Pbnr+jjvuGDpq1KjcgoKCzL179yZI0l//+tee+fn5ozMzM3OmTJky8uDBg/GS9PDDD5/fVPP3v//9CyXpzTffTLr44otHZ2dn54wdO3Z0SUlJYoTaDQAA4KkuFXQLCwtr33777WRJ2rx5c9JXX30Vf/LkSVu/fn3yxIkTayTpiSee+Pyjjz4qr6ioKHv77bdT3n333Z5VVVXxf/zjH/vu2LGjbPv27VsfeeSRfVOmTPnqqquuOvLwww/vqaio2Jqbm3tyzpw5w5csWbKrrKys/LHHHttz5513DmtZw4IFCwYXFBTUVlZWll133XVH9u3b173lMs8//3y/K6+8srqiomJreXl52be//e1jknT8+PG48ePHf1VZWVl22WWX1SxYsGCwJN1+++3pjzzyyJ7t27dvzc3NPX7//fcPlqSnnnrqgo8++mjr9u3bty5fvvwzScrPzz/x3nvvVZSXl2998MEHPy8qKkqLXMcBAAC806WC7uWXX36stLT0vMOHD8clJia68ePH1/7lL39J2rBhQ8rkyZNrJWnFihX9cnJysnNycnJ27NjRo6SkpEf//v3rExMTG2688cYRK1as6JOcnNzQcuzq6uq4TZs2JV9//fUjR48enXPXXXcNP3DgQLeWy73zzjsps2fPPiRJs2bNqu7Vq1d9y2UuueSSr1auXJl63333Dd64cWPPvn37NkhSXFyc5syZc1iSZs+efWjjxo3Jhw4diq+pqYm/5ppraiXp7/7u7w698847yZKUlZV1/LrrrktfsmRJv27dujlJOnz4cPz3vve9kRkZGblFRUVDt2/f3qFjjAEAAGJVlwq6iYmJbujQoSeXLFmSOmHChNrvfOc7tevWrUv57LPPEseOHXuioqKi++LFiweuX79++/bt27dOnjy5+sSJE3HdunXT5s2by2fOnPnlmjVr+hQWFma0HLu+vl4pKSl1FRUVW5v+fPLJJ2XtqXPatGm1b7311rYhQ4acmj17dvrixYv7t7acmZ11nDfffHPHj3/844Mffvhh0tixY7NPnz6t+++/f8ikSZNqduzYUbZ69erKU6dOdal9AAAAdB1dLuQUFBTUPv300wMLCwtrrrrqqpoVK1YMyMnJORYXF6cvv/wyvmfPng39+vWr3717d0JxcXFvqXG29vDhw/E33nhj9TPPPLO7oqIiSZKSk5Prjx49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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data_log = []\n", "charger_log = [[0, 0]]\n", "\n", "env = simpy.Environment()\n", "chargers = simpy.Resource(env, capacity=5)\n", "waste_stations = simpy.Resource(env, capacity=2)\n", "for r in roomba_df.index:\n", " env.process(roomba_model(roomba_df[\"id\"][r], roomba_df[\"charge_time\"][r], roomba_df[\"clean_time\"][r]))\n", "env.run(until=16)\n", "\n", "df = pd.DataFrame(data_log, columns=[\"id\", \"event\", \"begin\", \"end\"])\n", "display(kpi(df))\n", "gantt(df)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.3.1 Modell](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.3.1-Modell)", "section": "3.5.2.3.1 Modell" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "charger_df = pd.DataFrame(charger_log, columns=[\"count\", \"time\"])\n", "plt.step(charger_df[\"time\"], charger_df[\"count\"], where='post')" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.3.1 Modell](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.3.1-Modell)", "section": "3.5.2.3.1 Modell" } }, "outputs": [ { "data": { "text/plain": [ "(array([11., 0., 22., 0., 0., 14., 0., 6., 0., 3.]),\n", " array([0. , 0.4, 0.8, 1.2, 1.6, 2. , 2.4, 2.8, 3.2, 3.6, 4. ]),\n", " )" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAMJUlEQVR4nO3db4wcBRnH8d8PWtQIEbCX2kD11BCSaqTUS63BkCpiCjUUIzElEYuB1ChEiCbm5IWor/pGNP6JpgKhKiCEP1IpqE0hISZavWKBQkUqOWJJ4Q6IgNFoCo8vdg4u27vb2d3ZmX30+0kuN7szd/NkevPt3tzunSNCAIB8jmp6AABAbwg4ACRFwAEgKQIOAEkRcABIalGdO1uyZEmMjo7WuUsASG/Pnj3PRcRI+/21Bnx0dFQTExN17hIA0rP91Fz3cwkFAJIi4ACQFAEHgKQIOAAkRcABICkCDgBJEXAASIqAA0BSBBwAkqr1lZjozuj4jkb2O7llfSP7BdAdHoEDQFIEHACSIuAAkBQBB4CkCDgAJEXAASApAg4ASRFwAEiKgANAUgQcAJIi4ACQFAEHgKQIOAAkRcABIKmOAbe93Pb9th+z/ajtK4r7T7S90/YTxfsTBj8uAGBGmUfghyV9OSJWSFoj6TLbKySNS9oVEadI2lXcBgDUpGPAI+JQRDxYLL8sab+kkyRtkLSt2GybpPMHNSQA4EhdXQO3PSrpdEm7JS2NiEPFqmckLa10MgDAgkoH3Paxkm6XdGVEvDR7XUSEpJjn4zbbnrA9MT093dewAIDXlQq47cVqxfvGiLijuPtZ28uK9cskTc31sRGxNSLGImJsZGSkipkBACr3LBRLuk7S/oi4Ztaq7ZI2FcubJN1V/XgAgPmU+av0Z0i6SNIjtvcW910laYukW21fIukpSZ8azIgAgLl0DHhE/FaS51l9VrXjAADK4pWYAJAUAQeApAg4ACRFwAEgKQIOAEkRcABIioADQFIEHACSIuAAkBQBB4CkCDgAJEXAASApAg4ASRFwAEiKgANAUgQcAJIi4ACQFAEHgKQIOAAkRcABICkCDgBJEXAASIqAA0BSBBwAkiLgAJAUAQeApAg4ACRFwAEgKQIOAEkRcABIioADQFIEHACSIuAAkBQBB4CkCDgAJEXAASApAg4ASRFwAEiqY8BtX297yva+Wfd93fbTtvcWb+cOdkwAQLsyj8BvkLRujvu/HREri7d7qh0LANBJx4BHxAOSXqhhFgBAF/q5Bn657YeLSywnVDYRAKCUXgP+Q0nvlrRS0iFJ35pvQ9ubbU/Ynpienu5xdwCAdj0FPCKejYhXIuJVST+WtHqBbbdGxFhEjI2MjPQ6JwCgTU8Bt71s1s1PSNo337YAgMFY1GkD2zdLWitpie2Dkq6WtNb2SkkhaVLS5wY4IwBgDh0DHhEXznH3dQOYBQDQBV6JCQBJEXAASIqAA0BSBBwAkur4Q0zg/8Ho+I7G9j25ZX1j+0ZuPAIHgKQIOAAkRcABICkCDgBJEXAASIqAA0BSBBwAkiLgAJAUAQeApAg4ACRFwAEgKQIOAEkRcABIioADQFIEHACSIuAAkBQBB4CkCDgAJEXAASApAg4ASRFwAEiKgANAUgQcAJIi4ACQFAEHgKQIOAAkRcABIKlFTQ9Q1uj4jsb2PbllfWP7BoD58AgcAJIi4ACQFAEHgKQIOAAkRcABICkCDgBJdQy47ettT9neN+u+E23vtP1E8f6EwY4JAGhX5hH4DZLWtd03LmlXRJwiaVdxGwBQo44Bj4gHJL3QdvcGSduK5W2Szq94LgBAB71eA18aEYeK5WckLZ1vQ9ubbU/Ynpienu5xdwCAdn3/EDMiQlIssH5rRIxFxNjIyEi/uwMAFHoN+LO2l0lS8X6qupEAAGX0GvDtkjYVy5sk3VXNOACAsso8jfBmSb+TdKrtg7YvkbRF0tm2n5D00eI2AKBGHX+dbERcOM+qsyqeBQDQBV6JCQBJEXAASIqAA0BSBBwAkiLgAJAUAQeApAg4ACRFwAEgKQIOAEkRcABIioADQFIEHACSIuAAkBQBB4CkCDgAJEXAASApAg4ASRFwAEiKgANAUgQcAJIi4ACQFAEHgKQIOAAkRcABICkCDgBJEXAASIqAA0BSBBwAkiLgAJAUAQeApAg4ACS1qOkBADRjdHxHY/ue3LK+sX3/L+EROAAkRcABICkCDgBJEXAASIqAA0BSBBwAkurraYS2JyW9LOkVSYcjYqyKoQAAnVXxPPAPR8RzFXweAEAXuIQCAEn1G/CQ9Bvbe2xvnmsD25ttT9iemJ6e7nN3AIAZ/Qb8QxGxStI5ki6zfWb7BhGxNSLGImJsZGSkz90BAGb0FfCIeLp4PyXpTkmrqxgKANBZzwG3/Wbbx80sS/qYpH1VDQYAWFg/z0JZKulO2zOf56aI+FUlUwEAOuo54BHxpKTTKpwFANAFnkYIAEkRcABIioADQFIEHACSIuAAkBQBB4CkCDgAJEXAASApAg4ASRFwAEiKgANAUgQcAJIi4ACQVBV/1BgAUhgd39HYvie3rK/8c/IIHACSIuAAkBQBB4CkCDgAJEXAASApAg4ASRFwAEiKgANAUgQcAJIi4ACQFAEHgKQIOAAkRcABICkCDgBJEXAASIqAA0BSBBwAkiLgAJAUAQeApAg4ACRFwAEgKQIOAEkRcABIioADQFJ9Bdz2OtuP2z5ge7yqoQAAnfUccNtHS/qBpHMkrZB0oe0VVQ0GAFhYP4/AV0s6EBFPRsR/JP1c0oZqxgIAdOKI6O0D7QskrYuIS4vbF0n6QERc3rbdZkmbi5unSnq8x1mXSHqux48dJObqDnN1h7m6M6xzSf3N9o6IGGm/c1F/83QWEVslbe3389ieiIixCkaqFHN1h7m6w1zdGda5pMHM1s8llKclLZ91++TiPgBADfoJ+B8lnWL7nbaPkbRR0vZqxgIAdNLzJZSIOGz7ckm/lnS0pOsj4tHKJjtS35dhBoS5usNc3WGu7gzrXNIAZuv5h5gAgGbxSkwASIqAA0BSQxfwTi/Pt/0G27cU63fbHh2SuS62PW17b/F2aQ0zXW97yva+edbb9neLmR+2vWrQM5Wca63tF2cdq6/VNNdy2/fbfsz2o7avmGOb2o9ZyblqP2a232j7D7YfKub6xhzb1H4+lpyr9vNx1r6Ptv0n23fPsa7a4xURQ/Om1g9D/yrpXZKOkfSQpBVt23xB0o+K5Y2SbhmSuS6W9P2aj9eZklZJ2jfP+nMl3SvJktZI2j0kc62VdHcDX1/LJK0qlo+T9Jc5/h1rP2Yl56r9mBXH4NhiebGk3ZLWtG3TxPlYZq7az8dZ+/6SpJvm+veq+ngN2yPwMi/P3yBpW7F8m6SzbHsI5qpdRDwg6YUFNtkg6SfR8ntJx9teNgRzNSIiDkXEg8Xyy5L2SzqpbbPaj1nJuWpXHIN/FDcXF2/tz3qo/XwsOVcjbJ8sab2ka+fZpNLjNWwBP0nS32bdPqgjv5Bf2yYiDkt6UdJbh2AuSfpk8W33bbaXz7G+bmXnbsIHi2+B77X9nrp3Xnzrerpaj95ma/SYLTCX1MAxKy4H7JU0JWlnRMx7vGo8H8vMJTVzPn5H0lckvTrP+kqP17AFPLNfShqNiPdJ2qnX/5fFkR5U63c7nCbpe5J+UefObR8r6XZJV0bES3XueyEd5mrkmEXEKxGxUq1XWq+2/d469ttJiblqPx9tf1zSVETsGfS+ZgxbwMu8PP+1bWwvkvQWSc83PVdEPB8R/y5uXivp/QOeqYyh/HUHEfHSzLfAEXGPpMW2l9Sxb9uL1YrkjRFxxxybNHLMOs3V5DEr9vl3SfdLWte2qonzseNcDZ2PZ0g6z/akWpdZP2L7Z23bVHq8hi3gZV6ev13SpmL5Akn3RfETgSbnartOep5a1zGbtl3SZ4pnVqyR9GJEHGp6KNtvm7nuZ3u1Wl+HAz/pi31eJ2l/RFwzz2a1H7MyczVxzGyP2D6+WH6TpLMl/blts9rPxzJzNXE+RsRXI+LkiBhVqxH3RcSn2zar9HgN/LcRdiPmeXm+7W9KmoiI7Wp9of/U9gG1flC2cUjm+qLt8yQdLua6eNBz2b5ZrWcnLLF9UNLVav1ARxHxI0n3qPWsigOS/inps4OeqeRcF0j6vO3Dkv4laWMN/wlLrUdIF0l6pLh+KklXSXr7rNmaOGZl5mrimC2TtM2tP95ylKRbI+Lups/HknPVfj7OZ5DHi5fSA0BSw3YJBQBQEgEHgKQIOAAkRcABICkCDgBJEXAASIqAA0BS/wVOExq0Ftg1pQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.hist(charger_df[\"count\"])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "nbpages": { "level": 4, "link": "[3.5.2.3.1 Modell](https://jckantor.github.io/CBE40455-2020/03.05-Assignment.html#3.5.2.3.1-Modell)", "section": "3.5.2.3.1 Modell" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [3.4 Modeling Events](https://jckantor.github.io/CBE40455-2020/03.04-Modeling-Events.html) | [Contents](toc.html) | [3.6 Simulating Queuing Systems](https://jckantor.github.io/CBE40455-2020/03.06-Queuing-Systems-and-Poisson-Processes.html) >

\"Open

\"Download\"" ] } ], "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.7.4" } }, "nbformat": 4, "nbformat_minor": 4 }