Skip to content

Instantly share code, notes, and snippets.

@KFoxder
Created November 21, 2013 18:07
Show Gist options
  • Save KFoxder/7586575 to your computer and use it in GitHub Desktop.
Save KFoxder/7586575 to your computer and use it in GitHub Desktop.
Assignment4-Hopefully WOrkin
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"<h1>Assignment 4</h1>\n",
"<h4>by Kevin Fox</h4>"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"PART 1 - Analytics with SQL"
]
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"1) - How many shops are there??"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SELECT COUNT(shops.shop_id) as count <br/>\n",
"FROM shops;<br/>\n",
"<br/>\n",
"OUTPUT:<br/>\n",
"<br/><b>46426</b>\n"
]
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"2) - What is the average price over all listings? What is the average \u201cprice\u201d across all transactions?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SELECT AVG(listings.price) as avgPriceListing<br/>\n",
"FROM listings;<br/>\n",
"<br/>\n",
"OUTPUT:<br/>\n",
"Average Price over all listing = \n",
"<b>3521.7482 Cents</b><br/><br/>\n",
"SELECT AVG(price*100) as avgPriceTrans<br/>\n",
"FROM transactions;<br/>\n",
"<br/>\n",
"OUTPUT:<br/>Average Price over all transactions = \n",
"<b>2075.8080 Cents</b>\n"
]
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"3) - What is the average individual price of each listing purchased (note that the price field in the transactions table is the total price for the transaction; you need to control for quantity). How does this compare to the average listing price?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SELECT AVG((transactions.price*100)/transactions.`quantity`) as avgPriceTransAdjForQuantity<br/>\n",
"FROM transactions <br/>\n",
"SELECT AVG(listings.price) as avgPriceListing<br/>\n",
"FROM listings<br/><br/>\n",
"OUTPUT: <br/>\n",
"Average Indv. Price of each listing purchased = <b>2045.05588738 Cents</b><br/>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The average listing price is \\$35.21 while the average individual price of actual listings purchased is $20.45, which may indicate that customers are more likley to buy cheaper items more frequently than the more expensive items on Etsy. "
]
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"4) - Remove listings with a price or quantity of 0 and recompute the average price. How does this compare to the average price of each listing purchased?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SELECT AVG(listings.price) as avgPriceListing<br/>\n",
"FROM listings<br/>\n",
"WHERE listings.price <> '0' and listings.quantity <> '0'<br/>\n",
"<br/>\n",
"SELECT AVG(price*100) as avgPriceTrans<br/>\n",
"FROM transactions<br/><br/>\n",
"OUTPUT:<br/>\n",
"Average price of listings w/o Zeros = <b>3753.6990 Cents</b>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The average listing price is \\$35.21 while the average listing price accounting for listings that are priced at Zero or have a qunatity of Zero is \\$37.53, which is expected since removing lower bound elements (ie. Zeros) will increase the average price of listings."
]
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"5) - What are the 5 most expensive listings"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SELECT listing_id,user_id,price <br/>\n",
"FROM listings<br/>\n",
"ORDER BY price DESC<br/>\n",
"LIMIT 5<br/>\n",
"<br/>\n",
"SELECT listing_id,user_id, price/quantity as priceAdjustedForQuantity<br/>\n",
"FROM listings<br/>\n",
"ORDER BY priceAdjustedForQuantity DESC<br/>\n",
"LIMIT 5<br/><br/>\n",
"OUTPUT:<br/>\n",
"<table>\n",
" <tr>\n",
" <td>\n",
" <b> Listing ID</b>\n",
" </td>\n",
" <td>\n",
" <b>User ID</b>\n",
" </td>\n",
" <td>\n",
" <b>Listing Price</b>\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" 929296\n",
" </td>\n",
" <td>\n",
" 760430\n",
" </td>\n",
" <td>\n",
" 25000000\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" 825605\n",
" </td>\n",
" <td>\n",
" 168439\n",
" </td>\n",
" <td>\n",
" 3500000\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" 149300\n",
" </td>\n",
" <td>\n",
" 440712\n",
" </td>\n",
" <td>\n",
" 2000000\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" 92558\n",
" </td>\n",
" <td>\n",
" 594058\n",
" </td>\n",
" <td>\n",
" 1100000\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" 65276\n",
" </td>\n",
" <td>\n",
" 445767\n",
" </td>\n",
" <td>\n",
" 1000000\n",
" </td>\n",
" </tr>\n",
"</table>"
]
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"6) - How many listings has each user purchased? (Explain your interpretation(s))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SELECT buyer_user_id, COUNT(quantity)<br/>\n",
"from transactions<br/>\n",
"group by buyer_user_id<br/>\n",
"</br>\n",
"OUTPUT:<br/>\n",
"<table>\n",
" <tr>\n",
" <td>\n",
" <b>Buyer_user_id</b>\n",
" </td>\n",
" <td>\n",
" <b>Quantity</b>\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" 11\n",
" </td>\n",
" <td>\n",
" 1\n",
" </td>\n",
"\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" 21\n",
" </td>\n",
" <td>\n",
" 1\n",
" </td>\n",
"\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" 24\n",
" </td>\n",
" <td>\n",
" 1\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" 37\n",
" </td>\n",
" <td>\n",
" 1\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td>\n",
" 51\n",
" </td>\n",
" <td>\n",
" 1\n",
" </td>\n",
" </tr>\n",
"</table>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I grouped by the buyer_user_ids in the transactions table to get just the buyers that bought items and then counted the qunaity of items they bought in order to answer the question. "
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"EXTRA CREDIT "
]
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"7 ) - Compute the distribution of how many users purchase different numbers of listings (# listings purchased vs. # users with that many purchases). You can ignore users with 0 purchases. (Could you plot this? Hint: click export) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"<br/>\n",
"\tSELECT u.user_id , COUNT(t.transaction_id) <br/>\n",
"\tFROM users u<br/>\n",
"\tJOIN transactions t<br/>\n",
"\tON u.user_id = t.buyer_user_id<br/>\n",
"\tGROUP BY u.user_id<br/>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import collections\n",
"queryResults = open(\"query_result.csv\",\"r\")\n",
"\n",
"#Skip header\n",
"queryResults.next()\n",
"\n",
"userDist = collections.Counter()\n",
"userDistOrdered = collections.OrderedDict()\n",
"\n",
"for line in queryResults:\n",
" parts = line.split(',')\n",
" userDist[parts[1].replace('\\n','')]+= 1\n",
" if parts[1].replace('\\n','') in userDistOrdered:\n",
" userDistOrdered[parts[1].replace('\\n','')]+= 1\n",
" else:\n",
" userDistOrdered[parts[1].replace('\\n','')]= 1\n",
"\n",
"final = collections.OrderedDict(sorted(userDistOrdered.items(), key=lambda t: t[0]))\n",
"\n",
"\n",
"plt.plot(final.keys(),final.values())\n",
"plt.title(\"Distributions of User Listing Purchase\")\n",
"plt.xlabel(\"Number of Purchases\")\n",
"plt.ylabel(\"Number of Users\")\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEZCAYAAABmTgnDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtcVHX6wPHPcNFULoqXQWfEUUARRMV0bC0VU7yVpptS\n2CpW1m7ulpVZ1ram1Qput5Utd6tFQ61Qt98qeWFNkyxNKqSblKKCyNUUBVSQ2/f3x6yzIuIMODAM\nPO/Xa14OZ873nOcMMs+c71WjlFIIIYQQ1+Fk7wCEEEI0f5IshBBCWCTJQgghhEWSLIQQQlgkyUII\nIYRFkiyEEEJYJMmiBXnkkUd4+eWXbXKsrKws3N3dudyzOjQ0lNjYWJscG2Dy5MmsW7fOZse7Ufv2\n7cPf3x93d3cSEhLsHY7V3N3dyczMrHe5qKgoHnroIdsH1ESSkpLo2bOnvcNoXZRwCL169VLt2rVT\n7u7uqmPHjmrEiBHqH//4h6qurm7QsXbv3l2vMqGhoSo2Nrbe51JKqRdeeEH95je/aVDZpnL77ber\nmJiYOl/XaDTq2LFjNbY11XVFRkaq559/vsHl9+zZo/R6vQ0juj6NRqM6dOig3NzclE6nU08++aSq\nqqqy6Tma+pqEUnJn4SA0Gg1bt26luLiYrKwsFi9ezIoVK3jwwQcbdCx1nbGYlZWVNxKqQ8rKyiIw\nMLBeZTQajc3jqKqquuZ5GuNcjen777+npKSE3bt388EHH/Duu+/W+xjXei+E/UiycEDu7u5MmTKF\nDRs2EBcXR1paGgBz587lT3/6EwCnT5/mzjvvpFOnTnTu3JlRo0ahlGL27NlkZWUxZcoU3N3defXV\nV8nMzMTJyYnVq1fTq1cvxo0bx4kTJ3BycqK6utp83qNHjzJ8+HA8PT2ZNm0aZ8+eBa5dJWAwGNi9\nezeJiYlERUWxYcMG3N3dCQkJAWpWaymlePnllzEYDGi1WiIjIykuLgYwx7Z27Vp69epF165dWb58\nufk8X331FUOHDsXT0xNvb28WLlxY5/v27rvv4u/vT+fOnbnrrrvIy8sDwNfXl+PHjzNlyhQ8PDyo\nqKiw6vdwZcKt6/0GyM3N5e6776Zbt2706dOHv/3tb+ZyS5cuZcaMGcyePRtPT0/i4uIsnutKTk5O\nHD9+HIDt27cTFBSEh4cHer2e119/nYsXLzJp0iRyc3Nxd3fHw8ODvLw8li5dyuzZswHL73FpaSmR\nkZF4eXkRGBjIX/7yF6urgPr168fIkSP58ccf6/x/8umnn9b5XhQWFnL//fej0+nw8vJi+vTpNcq/\n/vrraLVaevTowXvvvWfevm3bNkJCQvD09MTHx4dly5aZXysrK+M3v/kNXbp0oVOnThiNRk6dOgVA\nUVERDz74ID169ECv1/OnP/2pxt9AaybJwoENGzYMvV7P559/DtT8Bvraa6/Rs2dPTp8+zalTp4iK\nikKj0bBu3Tp8fHzYunUrJSUlPPXUU+bj7d27l59//pn//Oc/tT6clFKsXbuWNWvWkJeXh4uLC489\n9lidsV2OZeLEiTz33HPce++9lJSUkJqaWivWNWvWEBcXR1JSEsePH+f8+fP84Q9/qHG8ffv2ceTI\nEXbv3s2LL77I4cOHAViwYAFPPPEERUVFHD9+nPDw8GvG8+mnn/Lcc8+xadMm8vLy6NWrF/feey8A\nx44dM78nxcXFuLq6Wv07uKyu97u6upopU6YQEhJCbm4uu3fv5q9//Ss7d+40l01ISGDmzJkUFRUx\na9asep/7sgcffJB33nmH4uJiDh06xJgxY2jfvj2JiYn06NGDkpISiouL6d69+zXvVOp6j5ctW0ZW\nVhYZGRl88sknrF+/3uKdzuX/P2lpaXz++ecMGTLkmvtdfZyr34vZs2dTVlZGWloap06d4sknnzTv\nm5+fT3FxMbm5ucTGxvL73/+eoqIiANzc3Fi/fj1FRUVs27aNv//972zZsgWAuLg4iouLyc7OprCw\nkLfffpt27doBpi9cbdq04dixY6SmprJz507++c9/WvP2t3iSLBxcjx49KCwsrLW9TZs25OXlkZmZ\nibOzM7feeqvFYy1dupR27drRtm3bWq9pNBrmzJlDYGAg7du356WXXmLjxo3Xrc66TCl13f3ef/99\nFi5ciMFgoEOHDkRFRREfH1/jG90LL7xA27ZtGThwIIMGDeK7774zX2d6ejqnT5+mffv2DB8+vM5z\nPPjggwwePJg2bdoQFRXFl19+SVZWlsX4rVHX+/31119z+vRpnn/+eVxcXOjduzfz5s0jPj7eXHbE\niBFMnToVgJtuuumGYjh06BDFxcV4enqa7+Ku9d5fa1td7/GmTZt47rnn8PT0RKfTsWDBAou/9yFD\nhuDl5cXUqVN56KGHmDt3rlXXcOV7cfbsWRITE/nHP/6Bp6cnLi4ujBw50ryvq6srS5YswdnZmUmT\n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\n",
"text": [
"<matplotlib.figure.Figure at 0x1060d0c10>"
]
}
],
"prompt_number": 91
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"8) - Compute the number of users with each gender."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SELECT u.gender as gender, COUNT(u.user_id) as Num_Users<br/>\n",
"FROM users u<br/>\n",
"GROUP BY u.`gender`;<br/>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"OUTPUT:<br/>\n",
"<b>\n",
"private\t52228<br/>\n",
"male\t6863<br/>\n",
"female\t36052<br/>\n",
"</b>"
]
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"9) - Among the users with purchases, compute the number of users with each gender."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SELECT u.gender as gender, COUNT(u.user_id) as Num_Users<br/>\n",
"FROM users u<br/>\n",
"JOIN transactions t<br/>\n",
"ON u.user_id = t.buyer_user_id<br/>\n",
"GROUP BY u.`gender`;<br/>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"OUTPUT : <br/>\n",
"<b>\n",
"female\t3676<br/>\n",
"male\t681<br/>\n",
"private\t5222<br/>\n",
"</b>"
]
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"10) - If you needed to combine information from two or more tables and then use Python to perform further analytics on the result, are you now prepared to do so? Explain briefly."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Yes. I am now well aware how to perform a join amongst two tables and export the results in a csv format which I could easily parse and analze using Python. "
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"PART 2 - Dealing with Data: Parsing Text and Extracting Information"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First Step is download the roster.html in order to do the analysis."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!curl http://people.stern.nyu.edu/ja1517/data/pds_2012_roster.html > roster.html\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
" % Total % Received % Xferd Average Speed Time Time Time Current\r\n",
" Dload Upload Total Spent Left Speed\r\n",
"\r",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\r",
"100 25218 100 25218 0 0 59416 0 --:--:-- --:--:-- --:--:-- 535k\r\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"1 ) Within the document, there are several student IDs (the column actually is titled E-mail). Extract these IDs from the html and print them to a file, one per line."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import re as re\n",
"\n",
"file1 = open('roster.html')\n",
"outputFile1 = open('output1.txt','a')\n",
"regex = re.compile('>[a-z]{2,3}[0-9]{3,4}<')\n",
"studentIDs = {}\n",
"\n",
"for line in file1:\n",
" four_letter_words = regex.findall(line)\n",
" for word in four_letter_words:\n",
" studentIDs[word] = 1\n",
"print \"Number of Student IDs : \",\n",
"print len(studentIDs)\n",
"print \"\"\n",
"for key in studentIDs.keys():\n",
" print key.replace('>',' ').replace('<',' ')\n",
" outputFile1.write(str(key.replace('>','').replace('<','')))\n",
" outputFile1.write(\"\\n\")\n",
"outputFile1.close()\n",
"file1.close()\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Number of Student IDs : 44\n",
"\n",
" jhr320 \n",
" kg1155 \n",
" vd511 \n",
" bct248 \n",
" jz996 \n",
" svs290 \n",
" aj1149 \n",
" arb492 \n",
" ssb405 \n",
" jh3347 \n",
" zf309 \n",
" aka300 \n",
" hnk224 \n",
" ksj222 \n",
" djs507 \n",
" kjs418 \n",
" amc723 \n",
" ll1691 \n",
" ar3109 \n",
" das607 \n",
" jc4794 \n",
" vj384 \n",
" ds3569 \n",
" jh924 \n",
" as6317 \n",
" asa384 \n",
" xyh202 \n",
" sr1927 \n",
" ss6335 \n",
" ajc591 \n",
" dhk332 \n",
" mrp295 \n",
" cp1105 \n",
" cmc616 \n",
" awl270 \n",
" zbh203 \n",
" rjz226 \n",
" srh371 \n",
" tfp211 \n",
" crg272 \n",
" sp2710 \n",
" rs2715 \n",
" aml601 \n",
" dcc327 \n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"2 ) - Constrain your search to print only those students with four letters in their last names or less. How many students were removed? "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import re as re\n",
"\n",
"file2 = open('roster.html')\n",
"outputFile2 = open('output2.txt','a')\n",
"regex2 = re.compile('[A-Z]{1,1}[a-zA-Z]{0,3}[,]{1,1}[ ]*[a-zA-Z]*[ ]*[a-zA-Z.]*')\n",
"studentNames = {}\n",
"\n",
"for line in file2:\n",
" four_letter_words = regex2.findall(line)\n",
" for word in four_letter_words:\n",
" studentNames[word] = 1\n",
" \n",
"print \"Number of Student IDs : \",\n",
"print len(studentNames)\n",
"print \"\"\n",
"for key in studentNames.keys():\n",
" print key\n",
" outputFile2.write(str(key))\n",
" outputFile2.write(\"\\n\")\n",
"print \"\"\n",
"print \"Number of students removed = \",\n",
"print len(studentIDs)-len(studentNames)\n",
"file2.close()\n",
"outputFile2.close()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Number of Student IDs : 14\n",
"\n",
"Saat, Daniel A.\n",
"Hao, Jerry\n",
"Lin, Liwen\n",
"Hill, Zelos B.\n",
"Shi, Shenglun\n",
"Kim, Hyung\n",
"Feng, Zhengyang\n",
"John, Kevin C.\n",
"Rhyu, Joseph H.\n",
"Liss, Alexander W.\n",
"Choi, Jaesik\n",
"Ho, Xias Yi\n",
"Zhu, Jianping\n",
"Kim, Dong H.\n",
"\n",
"Number of students removed = 30\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"3 - For every student in the class, in addition to extracting their student ID, extract their name. Present the results by printing out, one student per line:<br/>\n",
" first (and middle) name [tab] last name [tab] student id"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import re as re\n",
"\n",
"file3 = open('roster.html')\n",
"outputFile3 = open('output3.txt','a')\n",
"regex3 = re.compile('[A-Z]{1,1}[a-zA-Z]+[,]{1,1}[ ]*[a-zA-Z]*[ ]*[a-zA-Z.]*')\n",
"regex4 = re.compile('>[a-z]{2,3}[0-9]{3,4}<')\n",
"studentFullNames = []\n",
"\n",
"##skip first 120 lines to avoid instructor names\n",
"for x in range(0,120):\n",
" file3.readline()\n",
"\n",
"for line in file3:\n",
" result1 = regex3.findall(line)\n",
" result2 = regex4.findall(line)\n",
" for word in result1:\n",
" studentFullNames.append(word)\n",
" for word in result2:\n",
" studentFullNames.append(word.replace('>','').replace('<',''))\n",
" \n",
"\n",
"print \"First and Middle \\t Last Name \\t NetID\"\n",
"\n",
"count=0\n",
"for key in studentFullNames:\n",
" ##Check if odd, which means its a name not ID\n",
" if(count%2==0):\n",
" names = key.strip().split()\n",
" lastName = names[0].replace(',','').strip()\n",
" firstName = names[1].strip()\n",
" if(len(names)==3):\n",
" middleName = names[2].strip()\n",
" fullName = firstName+' '+middleName+'\\t'+lastName\n",
" else:\n",
" fullName = firstName+'\\t'+lastName\n",
" outputFile3.write(fullName)\n",
" print fullName,\n",
" else:\n",
" print '\\t',\n",
" outputFile3.write('\\t')\n",
" studentID = key\n",
" print key\n",
" outputFile3.write(studentID)\n",
" outputFile3.write('\\n')\n",
" \n",
" \n",
" \n",
" count+=1\n",
"print \"\"\n",
"file3.close()\n",
"outputFile3.close()\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"First and Middle \t Last Name \t NetID\n",
"Abhishek Kumar\tAiyangar \taka300\n",
"Antik Subodh\tAvasthi \tasa384\n",
"Sonal Suresh\tBathe \tssb405\n",
"Aditya\tBhandari \tarb492\n",
"Corinne M.\tCasagrande \tcmc616\n",
"Ann M.\tCedrone \tamc723\n",
"Alejandro J.\tChahin \tajc591\n",
"Jaesik\tChoi \tjc4794\n",
"David C.\tCohodes \tdcc327\n",
"Vitalii\tDoban \tvd511\n",
"Zhengyang\tFeng \tzf309\n",
"Charlotte R.\tGeorge \tcrg272\n",
"Kelly\tGoldston \tkg1155\n",
"Jerry\tHao \tjh3347\n",
"Sneha R\tHarchwani \tsrh371\n",
"Zelos B.\tHill \tzbh203\n",
"Xias Yi\tHo \txyh202\n",
"Joseph A.\tHooper \tjh924\n",
"Vamsee\tJasti \tvj384\n",
"Alex\tJoseph \taj1149\n",
"Dong H.\tKim \tdhk332\n",
"Hyung\tKim \thnk224\n",
"Abby M.\tLerner \taml601\n",
"Liwen\tLin \tll1691\n",
"Alexander W.\tLiss \tawl270\n",
"Smriti\tPandey \tsp2710\n",
"Tyler F.\tPennell \ttfp211\n",
"Michael R.\tPeres \tmrp295\n",
"Craig S.\tPerler \tcp1105\n",
"Suresh\tRangarajan \tsr1927\n",
"Ashwath\tRavichandran \tar3109\n",
"Joseph H.\tRhyu \tjhr320\n",
"Daniel A.\tSaat \tdas607\n",
"Deepa\tSaini \tds3569\n",
"Douglas J.\tSanto \tdjs507\n",
"Reshama\tShaikh \trs2715\n",
"Shenglun\tShi \tss6335\n",
"Amrish\tSingh \tas6317\n",
"Kevin C.\tJohn \tksj222\n",
"Kurt J.\tStanton \tkjs418\n",
"Brandon C.\tTikalsky \tbct248\n",
"Sebastian\tSanchez \tsvs290\n",
"Ryan J.\tZaczynski \trjz226\n",
"Jianping\tZhu \tjz996\n",
"\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"EXTRA CREDIT"
]
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"4 ) - The E-mail column seems misnamed. Create a new html document that replaces all student ids in this field with student email addresses."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import re as re\n",
"\n",
"HTML = open('roster.html')\n",
"outputHTML = open('rosterUpdated.html','a')\n",
"regex = re.compile('>[a-z]{2,3}[0-9]{3,4}<')\n",
"studentIDS = []\n",
"\n",
"\n",
"for line in HTML:\n",
" result = regex.findall(line)\n",
" if(len(result)>0):\n",
" for word in result:\n",
" word = word.strip().replace('<','').replace('>','')\n",
" email = word+'@nyu.edu'\n",
" line=line.replace(word,email)\n",
" ##print line\n",
" outputHTML.write(line)\n",
" \n",
"outputHTML.close()\n",
"HTML.close()\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment