Skip to content

Commit a62af98

Browse files
author
Charlotte Weaver
committed
Added Lesson 9
1 parent cecd8f0 commit a62af98

2 files changed

Lines changed: 448 additions & 0 deletions

File tree

Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 139,
6+
"metadata": {
7+
"collapsed": true
8+
},
9+
"outputs": [],
10+
"source": [
11+
"import random"
12+
]
13+
},
14+
{
15+
"cell_type": "code",
16+
"execution_count": 148,
17+
"metadata": {
18+
"collapsed": false
19+
},
20+
"outputs": [
21+
{
22+
"name": "stdout",
23+
"output_type": "stream",
24+
"text": [
25+
"{'new': True, 'level': 0, 'score': 61.38892117782677, 'sex': 'woman'}\n"
26+
]
27+
}
28+
],
29+
"source": [
30+
"def generateRandomPerson(level=0, new=True):\n",
31+
" score = 0\n",
32+
" sex = random.choice(['man', 'woman'])\n",
33+
" if sex=='man':\n",
34+
" score = random.normalvariate(50, 10) + 2.01\n",
35+
" else:\n",
36+
" score = random.normalvariate(50, 10)\n",
37+
" return {\n",
38+
" 'sex': sex,\n",
39+
" 'score': score,\n",
40+
" 'level': level,\n",
41+
" 'new': new\n",
42+
" }\n",
43+
"print generateRandomPerson()"
44+
]
45+
},
46+
{
47+
"cell_type": "code",
48+
"execution_count": 141,
49+
"metadata": {
50+
"collapsed": false
51+
},
52+
"outputs": [],
53+
"source": [
54+
"def generateStaff(levels):\n",
55+
" staff = []\n",
56+
" for idx, level in enumerate(levels):\n",
57+
" staff.append([generateRandomPerson(level=idx, new=False) for person in range(level)])\n",
58+
" return staff\n"
59+
]
60+
},
61+
{
62+
"cell_type": "code",
63+
"execution_count": 142,
64+
"metadata": {
65+
"collapsed": false
66+
},
67+
"outputs": [],
68+
"source": [
69+
"def allAreNew(staff):\n",
70+
" for level in staff:\n",
71+
" for employee in level:\n",
72+
" if not employee['new']:\n",
73+
" return False\n",
74+
" return True"
75+
]
76+
},
77+
{
78+
"cell_type": "code",
79+
"execution_count": 143,
80+
"metadata": {
81+
"collapsed": true
82+
},
83+
"outputs": [],
84+
"source": [
85+
"def quit(staff, attrition):\n",
86+
" for idx, level in enumerate(staff):\n",
87+
" for idx2, employee in enumerate(level):\n",
88+
" rn = random.random()\n",
89+
" if rn <= attrition:\n",
90+
" staff[idx][idx2] = None\n",
91+
" return staff"
92+
]
93+
},
94+
{
95+
"cell_type": "code",
96+
"execution_count": 144,
97+
"metadata": {
98+
"collapsed": false
99+
},
100+
"outputs": [],
101+
"source": [
102+
"def pickBest(level):\n",
103+
" best = None\n",
104+
" bestidx = None\n",
105+
" for idx, employee in enumerate(level):\n",
106+
" if best is None or (employee is not None and employee['score'] > best['score']):\n",
107+
" best = employee\n",
108+
" bestidx = idx\n",
109+
" return bestidx"
110+
]
111+
},
112+
{
113+
"cell_type": "code",
114+
"execution_count": 145,
115+
"metadata": {
116+
"collapsed": false
117+
},
118+
"outputs": [],
119+
"source": [
120+
"def promote(staff):\n",
121+
" for level in reversed(range(len(staff))):\n",
122+
" newlevel = []\n",
123+
" for idx, employee in enumerate(staff[level]):\n",
124+
" if employee is None:\n",
125+
" if (level > 0):\n",
126+
" bestidx = pickBest(staff[level - 1])\n",
127+
" promotedemployee = staff[level - 1][bestidx]\n",
128+
" promotedemployee['level'] = level\n",
129+
" staff[level - 1][bestidx] = None\n",
130+
" newlevel.append(promotedemployee)\n",
131+
" else:\n",
132+
" newlevel.append(generateRandomPerson())\n",
133+
" else:\n",
134+
" newlevel.append(employee)\n",
135+
" staff[level] = newlevel\n",
136+
" return staff"
137+
]
138+
},
139+
{
140+
"cell_type": "code",
141+
"execution_count": 146,
142+
"metadata": {
143+
"collapsed": false
144+
},
145+
"outputs": [],
146+
"source": [
147+
"def mfratio(level):\n",
148+
" m = 0\n",
149+
" f = 0\n",
150+
" for employee in level:\n",
151+
" if employee['sex'] == 'man':\n",
152+
" m += 1\n",
153+
" else:\n",
154+
" f += 1\n",
155+
" return m, f, m/float(m + f), f/float(m+ f)"
156+
]
157+
},
158+
{
159+
"cell_type": "code",
160+
"execution_count": 151,
161+
"metadata": {
162+
"collapsed": false
163+
},
164+
"outputs": [
165+
{
166+
"name": "stdout",
167+
"output_type": "stream",
168+
"text": [
169+
"(210, 290, 0.42, 0.58)\n",
170+
"(151, 199, 0.43142857142857144, 0.5685714285714286)\n",
171+
"(96, 104, 0.48, 0.52)\n",
172+
"(83, 67, 0.5533333333333333, 0.44666666666666666)\n",
173+
"(59, 41, 0.59, 0.41)\n",
174+
"(36, 39, 0.48, 0.52)\n",
175+
"(32, 8, 0.8, 0.2)\n",
176+
"(5, 5, 0.5, 0.5)\n"
177+
]
178+
}
179+
],
180+
"source": [
181+
"levels = [500, 350, 200, 150, 100, 75, 40, 10]\n",
182+
"attrition = 0.15\n",
183+
"staff = generateStaff(levels)\n",
184+
"# quit/promotion cycle until all employees are new\n",
185+
"while not allAreNew(staff):\n",
186+
" staff =quit(staff, attrition)\n",
187+
" staff = promote(staff)\n",
188+
"# print results\n",
189+
"for level in staff:\n",
190+
" print mfratio(level)"
191+
]
192+
},
193+
{
194+
"cell_type": "code",
195+
"execution_count": 135,
196+
"metadata": {
197+
"collapsed": false
198+
},
199+
"outputs": [
200+
{
201+
"name": "stdout",
202+
"output_type": "stream",
203+
"text": [
204+
"[{'new': True, 'level': 7, 'score': 88.12901630433419, 'sex': 'woman'}, {'new': True, 'level': 7, 'score': 78.34331335924162, 'sex': 'man'}, {'new': True, 'level': 7, 'score': 73.04051697978099, 'sex': 'woman'}, {'new': True, 'level': 7, 'score': 77.49551767908078, 'sex': 'man'}, {'new': True, 'level': 7, 'score': 71.64967624573703, 'sex': 'man'}, {'new': True, 'level': 7, 'score': 72.83227829828641, 'sex': 'woman'}, {'new': True, 'level': 7, 'score': 72.41219419646502, 'sex': 'man'}, {'new': True, 'level': 7, 'score': 73.96193729087702, 'sex': 'man'}, {'new': True, 'level': 7, 'score': 73.54940906075277, 'sex': 'woman'}, {'new': True, 'level': 7, 'score': 72.2103392854928, 'sex': 'man'}]\n"
205+
]
206+
}
207+
],
208+
"source": [
209+
"print staff[-1]"
210+
]
211+
},
212+
{
213+
"cell_type": "code",
214+
"execution_count": null,
215+
"metadata": {
216+
"collapsed": true
217+
},
218+
"outputs": [],
219+
"source": []
220+
}
221+
],
222+
"metadata": {
223+
"kernelspec": {
224+
"display_name": "Python 2",
225+
"language": "python",
226+
"name": "python2"
227+
},
228+
"language_info": {
229+
"codemirror_mode": {
230+
"name": "ipython",
231+
"version": 2
232+
},
233+
"file_extension": ".py",
234+
"mimetype": "text/x-python",
235+
"name": "python",
236+
"nbconvert_exporter": "python",
237+
"pygments_lexer": "ipython2",
238+
"version": "2.7.10"
239+
}
240+
},
241+
"nbformat": 4,
242+
"nbformat_minor": 0
243+
}

0 commit comments

Comments
 (0)