{ "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": {} } ] }