{
"metadata": {
"name": "Getting Data"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"XML"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Simple example from http://software-carpentry.org/3_0/xml.html\n",
"\n",
" \n",
" \n",
" 87.97\n",
" \n",
"\n",
"XML files are best viewed as trees"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Very common structured data format, supporting hierarchical, nested data with metadata."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Recommended libraries:\n",
"\n",
"- `lxml` (Performance)\n",
"- `untangle` (Simplicity)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`$ pip install untangle`"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"untangle"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Example data is an XML file with information about outages on escalators and elevators in the New York subway system"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"xml_file = \"nyct_ene.xml\""
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import untangle"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"doc = untangle.parse(xml_file)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"doc.get_elements()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 4,
"text": [
"[Element(name = NYCOutages, attributes = {}, cdata = )]"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"doc."
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (, line 1)",
"output_type": "pyerr",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m doc.\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"outages = doc.NYCOutages.outage"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"len(outages)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 7,
"text": [
"38"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"outage = outages[5]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"outage.get_elements()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 9,
"text": [
"[Element(name = station, attributes = {}, cdata = 181 ST STATION),\n",
" Element(name = borough, attributes = {}, cdata = MN),\n",
" Element(name = trainno, attributes = {}, cdata = 1),\n",
" Element(name = equipment, attributes = {}, cdata = EL110),\n",
" Element(name = equipmenttype, attributes = {}, cdata = EL),\n",
" Element(name = serving, attributes = {}, cdata = LOWER MEZZANINE TO UPPER MEZZANINE),\n",
" Element(name = ADA, attributes = {}, cdata = N),\n",
" Element(name = outagedate, attributes = {}, cdata = 12/27/2012 8:07:00 AM),\n",
" Element(name = estimatedreturntoservice, attributes = {}, cdata = 12/29/2012 12:00:00 AM),\n",
" Element(name = reason, attributes = {}, cdata = REPAIR),\n",
" Element(name = isupcomingoutage, attributes = {}, cdata = N),\n",
" Element(name = ismaintenanceoutage, attributes = {}, cdata = N)]"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"outage.estimatedreturntoservice.cdata"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 10,
"text": [
"u'12/29/2012 12:00:00 AM'"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##CSV"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Means a file where data just have some sort of separator"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Example, small sample of http://a841-dotweb01.nyc.gov/datafeeds/ParkingReg/signs.CSV (88 MB)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%bash\n",
"head thousand_signs.csv"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"B,P-004958,1,0000 , ,Curb Line\r\n",
"B,P-004958,2,0009 , ,Property Line\r\n",
"B,P-004958,3,0030 , ,NIGHT REGULATION (MOON & STARS SYMBOLS) NO PARKING (SANITATION BROOM SYMBOL) MIDNIGHT TO 3AM TUES & FRI <--> (SUPERSEDED BY SP-841C) \r\n",
"B,P-004958,4,0030 , ,1 HOUR PARKING 9AM-7PM EXCEPT SUNDAY \r\n",
"B,P-004958,5,0208 , ,NIGHT REGULATION (MOON & STARS SYMBOLS) NO PARKING (SANITATION BROOM SYMBOL) MIDNIGHT TO 3AM TUES & FRI <--> (SUPERSEDED BY SP-841C) \r\n",
"B,P-004958,6,0208 , ,1 HOUR PARKING 9AM-7PM EXCEPT SUNDAY \r\n",
"B,P-004958,7,0218 , ,Property Line\r\n",
"B,P-004958,8,0232 , ,Curb Line\r\n",
"B,P-009318,1,0000 , ,Curb Line\r\n",
"B,P-009318,2,0014 , ,Building Line\r\n"
]
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Builtin module `csv`\n",
"\n",
"Primary documentation: http://docs.python.org/2.7/library/csv.html"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Simple reading\n",
"\n",
"f = open(\"thousand_signs.csv\", \"r\")\n",
"for _ in range(3):\n",
" print(repr(f.readline()))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"'B,P-004958,1,0000 , ,Curb Line\\r\\n'\n",
"'B,P-004958,2,0009 , ,Property Line\\r\\n'\n",
"'B,P-004958,3,0030 , ,NIGHT REGULATION (MOON & STARS SYMBOLS) NO PARKING (SANITATION BROOM SYMBOL) MIDNIGHT TO 3AM TUES & FRI <--> (SUPERSEDED BY SP-841C) \\r\\n'\n"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import csv"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Using a CSV reader\n",
"\n",
"f.seek(0)\n",
"\n",
"reader = csv.reader(f)\n",
"reader"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 14,
"text": [
"<_csv.reader at 0x1084d54b0>"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for _ in range(3):\n",
" print(repr(reader.next()))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['B', 'P-004958', '1', '0000 ', ' ', 'Curb Line']\n",
"['B', 'P-004958', '2', '0009 ', ' ', 'Property Line']\n",
"['B', 'P-004958', '3', '0030 ', ' ', 'NIGHT REGULATION (MOON & STARS SYMBOLS) NO PARKING (SANITATION BROOM SYMBOL) MIDNIGHT TO 3AM TUES & FRI <--> (SUPERSEDED BY SP-841C) ']\n"
]
}
],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f.close()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Rows are split in to lists based on the seperator on the fly"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Dialects"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There's no clear standard for the which characters are used for separation of columns and rows.\n",
"\n",
"The specific setting of formatting is called a **dialect**\n",
"\n",
"The default in `csv` is to use `,` for columns and `\\r\\n` for rows."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"csv.list_dialects()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 17,
"text": [
"['excel-tab', 'excel']"
]
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`excel-tab` uses `\\t` for column separations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we want to separate fields which internally uses `,`, we could for example use `;`\n",
"as a separator."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%bash\n",
"head example.csv"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"chapter; pages with footnotes; pages with references\n",
"1; 5,6; 1,2,4,5\n",
"2; 8; 7,8,9\n",
"3; 11,12; 10,12,13,14\n",
"4; 16,19; 16,17,20"
]
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"csv.register_dialect(\"semicolon\", delimiter=\";\", skipinitialspace=True)\n",
"csv.list_dialects()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 19,
"text": [
"['excel-tab', 'excel', 'semicolon']"
]
}
],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = open(\"example.csv\", \"r\")\n",
"\n",
"reader = csv.reader(f, \"semicolon\")\n",
"\n",
"for line in reader:\n",
" print(line)\n",
"\n",
"f.close()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['chapter', 'pages with footnotes', 'pages with references']\n",
"['1', '5,6', '1,2,4,5']\n",
"['2', '8', '7,8,9']\n",
"['3', '11,12', '10,12,13,14']\n",
"['4', '16,19', '16,17,20']\n"
]
}
],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Automatically detecting dialect"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sniffer = csv.Sniffer()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`csv.Sniffer` analyzes text for patterns, to find the dialect"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = open(\"example.csv\", \"r\")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sample = f.read()\n",
"\n",
"dialect = sniffer.sniff(sample)\n",
"\n",
"f.seek(0)\n",
"reader = csv.reader(f, dialect)\n",
"for line in reader:\n",
" print(line)\n",
"\n",
"f.seek(0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['chapter', 'pages with footnotes', 'pages with references']\n",
"['1', '5,6', '1,2,4,5']\n",
"['2', '8', '7,8,9']\n",
"['3', '11,12', '10,12,13,14']\n",
"['4', '16,19', '16,17,20']\n"
]
}
],
"prompt_number": 23
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`csv` can be very large, reading all of it to find the dialect can be time\n",
"consuming and not necessary"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sample = f.read(7) # Read 7 bytes\n",
"\n",
"print(repr(sample))\n",
"print(\"\")\n",
"\n",
"f.seek(0)\n",
"\n",
"dialect = sniffer.sniff(sample)\n",
"\n",
"reader = csv.reader(f, dialect)\n",
"for line in reader:\n",
" print(line)\n",
"\n",
"f.seek(0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"'chapter'\n",
"\n",
"['chap', 'er; pages wi', 'h foo', 'no', 'es; pages wi', 'h references']\n",
"['1; 5,6; 1,2,4,5']\n",
"['2; 8; 7,8,9']\n",
"['3; 11,12; 10,12,13,14']\n",
"['4; 16,19; 16,17,20']\n"
]
}
],
"prompt_number": 24
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Undersampling can of course yield erronous dialects"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sample = f.read(80)\n",
"\n",
"print(repr(sample))\n",
"print(\"\")\n",
"\n",
"f.seek(0)\n",
"\n",
"dialect = sniffer.sniff(sample)\n",
"\n",
"reader = csv.reader(f, dialect)\n",
"for line in reader:\n",
" print(line)\n",
"\n",
"f.seek(0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"'chapter; pages with footnotes; pages with references\\n1; 5,6; 1,2,4,5\\n2; 8; 7,8,9'\n",
"\n",
"['chapter', 'pages with footnotes', 'pages with references']\n",
"['1', '5,6', '1,2,4,5']\n",
"['2', '8', '7,8,9']\n",
"['3', '11,12', '10,12,13,14']\n",
"['4', '16,19', '16,17,20']\n"
]
}
],
"prompt_number": 25
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For larger files, around 1024 bytes is quite good, you want to have a few lines in the samples"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dialect.delimiter, dialect.lineterminator, dialect.skipinitialspace"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 26,
"text": [
"(';', '\\r\\n', True)"
]
}
],
"prompt_number": 26
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sniffer.has_header(sample)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 27,
"text": [
"True"
]
}
],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f.close()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 28
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = open(\"thousand_signs.csv\", \"r\")\n",
"sample = f.read(100)\n",
"f.close\n",
"\n",
"sniffer.has_header(sample)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 29,
"text": [
"False"
]
}
],
"prompt_number": 29
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## JSON"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Builtin module `json`\n",
"\n",
"JavaScript Object Notation, human readable serialization of data.\n",
"\n",
"Mostly known from sending data between server and client in web applications\n",
"\n",
"In Python nomenclature, one can say it consists of lists and dictionaries,\n",
"which can be populated by strings, integers and floats"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%bash\n",
"# Example from wikipeda page on JSON\n",
"cat example.json"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"{\n",
" \"firstName\": \"John\",\n",
" \"lastName\": \"Smith\",\n",
" \"age\": 25,\n",
" \"address\": {\n",
" \"streetAddress\": \"21 2nd Street\",\n",
" \"city\": \"New York\",\n",
" \"state\": \"NY\",\n",
" \"postalCode\": \"10021\"\n",
" },\n",
" \"phoneNumber\": [\n",
" {\n",
" \"type\": \"home\",\n",
" \"number\": \"212 555-1234\"\n",
" },\n",
" {\n",
" \"type\": \"fax\",\n",
" \"number\": \"646 555-4567\"\n",
" }\n",
" ]\n",
"}"
]
}
],
"prompt_number": 30
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import json"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 31
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = open(\"example.json\", \"r\")\n",
"\n",
"json_data = json.load(f)\n",
"\n",
"f.close()\n",
"\n",
"json_data"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 32,
"text": [
"{u'address': {u'city': u'New York',\n",
" u'postalCode': u'10021',\n",
" u'state': u'NY',\n",
" u'streetAddress': u'21 2nd Street'},\n",
" u'age': 25,\n",
" u'firstName': u'John',\n",
" u'lastName': u'Smith',\n",
" u'phoneNumber': [{u'number': u'212 555-1234', u'type': u'home'},\n",
" {u'number': u'646 555-4567', u'type': u'fax'}]}"
]
}
],
"prompt_number": 32
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## YAML"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Package `pyyaml`, install by `pip install pyyaml`"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Databases"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Drivers for popular none-SQL databases:\n",
"\n",
"- pycouchdb\n",
"- pymongo"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Web services "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A common way to make data available is in the form of a web service.\n",
"\n",
"To get data one sends a `GET` command to a server, which interprets\n",
"the `URI` used to send the `GET` command, and sends back what one\n",
"asked for."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Python comes with several http libraries, but the recommendation is to install the package `requests`\n",
"\n",
"( `pip install requests` )\n",
"\n",
"Documentation on http://docs.python-requests.org/"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import requests"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 33
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"r = requests.get(\"http://ws.spotify.com/search/1/track.json\", params={\"q\": \"kaizers orchestra\"})"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"r.url"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 35,
"text": [
"u'http://ws.spotify.com/search/1/track.json?q=kaizers+orchestra'"
]
}
],
"prompt_number": 35
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"r.status_code"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 36,
"text": [
"200"
]
}
],
"prompt_number": 36
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"r.text[:2000]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 37,
"text": [
"u'{\"info\": {\"num_results\": 417, \"limit\": 100, \"offset\": 0, \"query\": \"kaizers orchestra\", \"type\": \"track\", \"page\": 1}, \"tracks\": [{\"album\": {\"released\": \"2012\", \"href\": \"spotify:album:5AN6A9IR1g1xRgY0RoKOsT\", \"name\": \"Hjerteknuser\", \"availability\": {\"territories\": \"NO\"}}, \"name\": \"Hjerteknuser\", \"popularity\": \"0.66621\", \"external-ids\": [{\"type\": \"isrc\", \"id\": \"NOHDL1002070\"}], \"length\": 199.407, \"href\": \"spotify:track:6dKWi7apHjn2W7Ojncv4Wu\", \"artists\": [{\"href\": \"spotify:artist:1s1DnVoBDfp3jxjjew8cBR\", \"name\": \"Kaizers Orchestra\"}], \"track-number\": \"1\"}, {\"album\": {\"released\": \"2012\", \"href\": \"spotify:album:2oZ0PnxiH9LaoUAFzlPSGK\", \"name\": \"Siste dans\", \"availability\": {\"territories\": \"NO\"}}, \"name\": \"Siste dans\", \"popularity\": \"0.64841\", \"external-ids\": [{\"type\": \"isrc\", \"id\": \"NOHDL1202060\"}], \"length\": 217.891, \"href\": \"spotify:track:0z26fQRDfSwxxuyKYrjZn3\", \"artists\": [{\"href\": \"spotify:artist:1s1DnVoBDfp3jxjjew8cBR\", \"name\": \"Kaizers Orchestra\"}], \"track-number\": \"1\"}, {\"album\": {\"released\": \"2010\", \"href\": \"spotify:album:6jbtJwRmuezfOSXyJy3tRZ\", \"name\": \"Violeta Violeta Volume I\", \"availability\": {\"territories\": \"NO\"}}, \"name\": \"Hjerteknuser\", \"popularity\": \"0.63483\", \"external-ids\": [{\"type\": \"isrc\", \"id\": \"NOHDL1002070\"}], \"length\": 200.322, \"href\": \"spotify:track:3NThq9BqYtKYBfsHIogjM6\", \"artists\": [{\"href\": \"spotify:artist:1s1DnVoBDfp3jxjjew8cBR\", \"name\": \"Kaizers Orchestra\"}], \"track-number\": \"7\"}, {\"album\": {\"released\": \"2012\", \"href\": \"spotify:album:5E9Kg0KC7H0CWOVongiKRe\", \"name\": \"Violeta Violeta Volume III\", \"availability\": {\"territories\": \"NO\"}}, \"name\": \"Begravelsespolka\", \"popularity\": \"0.61493\", \"external-ids\": [{\"type\": \"isrc\", \"id\": \"NOHDL1202020\"}], \"length\": 426.58, \"href\": \"spotify:track:4k2VAoUhJx7lxMscgY8USe\", \"artists\": [{\"href\": \"spotify:artist:1s1DnVoBDfp3jxjjew8cBR\", \"name\": \"Kaizers Orchestra\"}], \"track-number\": \"1\"}, {\"album\": {\"released\": \"2012\", \"href\": \"spotify:album:0hoeWFBKo9kGoKMhKOuKRY\", \"name\": \"V\\\\u00e5re Demoner\", \"availabilit'"
]
}
],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"json_data = r.json()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 38
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"len(json_data[\"tracks\"])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 39,
"text": [
"100"
]
}
],
"prompt_number": 39
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"json_data[\"tracks\"][1]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 40,
"text": [
"{u'album': {u'availability': {u'territories': u'NO'},\n",
" u'href': u'spotify:album:2oZ0PnxiH9LaoUAFzlPSGK',\n",
" u'name': u'Siste dans',\n",
" u'released': u'2012'},\n",
" u'artists': [{u'href': u'spotify:artist:1s1DnVoBDfp3jxjjew8cBR',\n",
" u'name': u'Kaizers Orchestra'}],\n",
" u'external-ids': [{u'id': u'NOHDL1202060', u'type': u'isrc'}],\n",
" u'href': u'spotify:track:0z26fQRDfSwxxuyKYrjZn3',\n",
" u'length': 217.891,\n",
" u'name': u'Siste dans',\n",
" u'popularity': u'0.64841',\n",
" u'track-number': u'1'}"
]
}
],
"prompt_number": 40
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"r.headers"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 41,
"text": [
"{'access-control-allow-origin': '*',\n",
" 'age': '10058',\n",
" 'content-length': '58592',\n",
" 'content-type': 'application/json; charset=utf-8',\n",
" 'date': 'Tue, 22 Jan 2013 12:17:59 GMT',\n",
" 'expires': 'Wed, 23 Jan 2013 09:30:21 GMT',\n",
" 'last-modified': 'Mon, 21 Jan 2013 23:35:15 GMT',\n",
" 'server': 'lighttpd smisk/1.1.6',\n",
" 'vary': 'Accept-Charset',\n",
" 'via': '1.1 varnish',\n",
" 'x-varnish': '766974840 766737315'}"
]
}
],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"logo = requests.get(\"http://www.scilifelab.se/images/logo_header.png\")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 42
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"logo.headers"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 43,
"text": [
"{'accept-ranges': 'bytes',\n",
" 'connection': 'close',\n",
" 'content-length': '14922',\n",
" 'content-type': 'image/png',\n",
" 'date': 'Tue, 22 Jan 2013 12:13:37 GMT',\n",
" 'etag': '\"172816a-3a4a-4aab46ed30140\"',\n",
" 'last-modified': 'Wed, 17 Aug 2011 14:37:17 GMT',\n",
" 'server': 'Apache/2.2.3 (CentOS)'}"
]
}
],
"prompt_number": 43
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"logo.content[:100]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 44,
"text": [
"'\\x89PNG\\r\\n\\x1a\\n\\x00\\x00\\x00\\rIHDR\\x00\\x00\\x00\\xfa\\x00\\x00\\x00P\\x08\\x06\\x00\\x00\\x000kh\\xb5\\x00\\x00 \\x00IDATx\\x9c\\xed\\x9dw\\\\TW\\xf6\\xc0\\xcf\\xbd\\xefMo\\x94\\x01\\xa4\\t(\\xa2\\x82X@\\x8d1Q\\x83-\\xd1\\x98\\xc4$\\x0b\\xeb\\xc6\\x18uctw\\x13\\xb3\\xae\\xeeoM4e\\xdcMq\\x93\\x8dIL\\xaf\\x9ah'"
]
}
],
"prompt_number": 44
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from IPython.core.display import Image"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 45
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Image(logo.content)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"png": "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\n",
"prompt_number": 46,
"text": [
""
]
}
],
"prompt_number": 46
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Task\n",
"\n",
"Make a module and script which fetches the XML formatted for the status of escalators in\n",
"the NYC subway system at http://www.grandcentral.org/developers/data/nyct/nyct_ene.xml,\n",
"calculate the fraction of those which have the reason \"Repair\", and prints this fraction.\n",
"\n",
"(Information about the data can be found at http://www.grandcentral.org/developers/download.html)\n",
"\n",
"The script should use the module, and should be installable by `python setup.py install`\n",
"\n",
" [lastname]/\n",
" [lastname]/\n",
" __init__.py\n",
" scripts/\n",
" getting_data.py\n",
" README.md\n",
" setup.py\n",
"\n",
"In `setup.py`, add the scripts to the call of the `setup` function.\n",
"For details, see http://peak.telecommunity.com/DevCenter/setuptools#basic-use\n",
"\n",
"This means that after `python setup.py install` has been run, it should be possible to simple type\n",
" \n",
" $ getting_data.py\n",
"\n",
"in the terminal and get the desired output."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 46
}
],
"metadata": {}
}
]
}