Skip to content

Instantly share code, notes, and snippets.

@douglasgoodwin
Created June 28, 2014 00:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save douglasgoodwin/50fce9061295868d14cc to your computer and use it in GitHub Desktop.
Save douglasgoodwin/50fce9061295868d14cc to your computer and use it in GitHub Desktop.
workshop gist for nbviewer
{
"metadata": {
"name": "",
"signature": "sha256:e60fd5dd6e149c76a21fd2cb0f4d59f091ed8c2c7a6e713e79df1ef3a729d924"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 0. running this thing\n",
"\n",
" pip install ipython\n",
" \n",
"cd into the notebooks directory and type:\n",
"\n",
" ipython notebook --pylab inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## CSV?\n",
"CSV (Comma Separated Values) format is the most common import and export format for spreadsheets and databases. A CSV file contains a number of rows, each containing a number of columns separated by commas.\n",
"\n",
"In this case I copied a table from [Los Angeles County Population 1850-2010](http://www.laalmanac.com/population/po02.htm), pasted it into Excel, removed the extraneous columns, created headers and saved it as CSV. It's in our repository here: [population_lacounty.csv ](https://github.com/LACMTA/workshop_python-processing/blob/master/data/population_lacounty.csv)\n",
"\n",
"Python has a *module* that can read and write CSV format text files. First import the module, load the data file, and print it out to be sure that we have the right data. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import csv"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# This is a comment -- Python should ignore it!\n",
"\n",
"# Let's open the CSV file and stuff it into a CSV reader object\n",
"# the 'rU' *argument* tells universal newline mode\n",
"# it -should- solve cross-platform newline/linefeed problems\n",
"\n",
"infile = open(\"../data/population_lacounty.csv\", mode='rU')\n",
"myreader = csv.reader(infile)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# CSV reader object? HELP!\n",
"\n",
"help(myreader)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Help on reader object:\n",
"\n",
"class reader(__builtin__.object)\n",
" | CSV reader\n",
" | \n",
" | Reader objects are responsible for reading and parsing tabular data\n",
" | in CSV format.\n",
" | \n",
" | Methods defined here:\n",
" | \n",
" | __iter__(...)\n",
" | x.__iter__() <==> iter(x)\n",
" | \n",
" | next(...)\n",
" | x.next() -> the next value, or raise StopIteration\n",
" | \n",
" | ----------------------------------------------------------------------\n",
" | Data descriptors defined here:\n",
" | \n",
" | dialect\n",
" | \n",
" | line_num\n",
"\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# did you notice that we asked for help on the object -we- created? \n",
"# Just checking.\n",
"\n",
"# Let's iterate over myreader!\n",
"for row in myreader:\n",
" print row"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['year', 'population']\n",
"['1850', '3530']\n",
"['1860', '11333']\n",
"['1870', '15309']\n",
"['1880', '33381']\n",
"['1890', '101454']\n",
"['1900', '170298']\n",
"['1910', '504131']\n",
"['1920', '936455']\n",
"['1930', '2208492']\n",
"['1940', '2785643']\n",
"['1950', '4151687']\n",
"['1960', '6039834']\n",
"['1970', '7032075']\n",
"['1980', '7477657']\n",
"['1990', '8863164']\n",
"['2000', '9519338']\n",
"['2010', '9818605']\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# the reader is consumed as you loop over it. \n",
"# Whoa, that's inconvenient! \n",
"# Let's save it to a data structure this time.\n",
"\n",
"infile = open(\"../data/population_lacounty.csv\", mode='rU')\n",
"myreader = csv.reader(infile)\n",
"\n",
"mylist = []\n",
"blank = {'year':0, 'population':0}\n",
"for row in myreader:\n",
" mylist.append(row)\n",
"\n",
"print mylist"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[['year', 'population'], ['1850', '3530'], ['1860', '11333'], ['1870', '15309'], ['1880', '33381'], ['1890', '101454'], ['1900', '170298'], ['1910', '504131'], ['1920', '936455'], ['1930', '2208492'], ['1940', '2785643'], ['1950', '4151687'], ['1960', '6039834'], ['1970', '7032075'], ['1980', '7477657'], ['1990', '8863164'], ['2000', '9519338'], ['2010', '9818605']]\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## let's make that look better with pretty print:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from pprint import pprint\n",
"\n",
"pprint(mylist)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[['year', 'population'],\n",
" ['1850', '3530'],\n",
" ['1860', '11333'],\n",
" ['1870', '15309'],\n",
" ['1880', '33381'],\n",
" ['1890', '101454'],\n",
" ['1900', '170298'],\n",
" ['1910', '504131'],\n",
" ['1920', '936455'],\n",
" ['1930', '2208492'],\n",
" ['1940', '2785643'],\n",
" ['1950', '4151687'],\n",
" ['1960', '6039834'],\n",
" ['1970', '7032075'],\n",
" ['1980', '7477657'],\n",
" ['1990', '8863164'],\n",
" ['2000', '9519338'],\n",
" ['2010', '9818605']]\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Lists"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that looks like our CSV file with some extra brackets attached. The **[ ]** tells Python to make a *list*. \n",
"\n",
"Here is a list with five elements:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"alist = [1,2,3,4,5]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## You can loop over a list:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for each in alist:\n",
" print(each)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1\n",
"2\n",
"3\n",
"4\n",
"5\n"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Let's add donuts!"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for donut in alist:\n",
" print(\"%s donuts please!\") %(donut)\n",
"\n",
"# print a message with a couple of newlines\n",
"print(\"\\nWe have a problem with plurals here. \\nExtra Credit question: how would you fix it?\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 donuts please!\n",
"2 donuts please!\n",
"3 donuts please!\n",
"4 donuts please!\n",
"5 donuts please!\n",
"\n",
"We have a problem with plurals here. \n",
"Extra Credit question: how would you fix it?\n"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## back to our list"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pprint(mylist)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[['year', 'population'],\n",
" ['1850', '3530'],\n",
" ['1860', '11333'],\n",
" ['1870', '15309'],\n",
" ['1880', '33381'],\n",
" ['1890', '101454'],\n",
" ['1900', '170298'],\n",
" ['1910', '504131'],\n",
" ['1920', '936455'],\n",
" ['1930', '2208492'],\n",
" ['1940', '2785643'],\n",
" ['1950', '4151687'],\n",
" ['1960', '6039834'],\n",
" ['1970', '7032075'],\n",
" ['1980', '7477657'],\n",
" ['1990', '8863164'],\n",
" ['2000', '9519338'],\n",
" ['2010', '9818605']]\n"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"Here we have several lists within a list--one list for each line of the CSV document. This is enough structure to build a table and draw a plot.\n",
"\n",
"If you started your notebook with this command:\n",
"\n",
" ipython notebook --pylab inline\n",
"\n",
"you got inline charts for free from pylab. Otherwise run this:\n",
"\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## time for data massage.\n",
"\n",
"We need two lists: one for the years, another for the population counts. Like this:\n",
"\n",
" years = [1850,1860,1870, ... ]\n",
" populations = [3530, 11333, 130000, ... ]\n",
"\n",
"The easiest way to do that is by looping over the list, grabbing each value and stuffing into a new list.\n",
"\n",
"Because lists are *immutable* -- that is the order of the values in a list never changes -- we can grab values from the list *by position.* Example:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"exlist = ['Pteranodon','The Knights who Say Ni']\n",
" \n",
"print(exlist[0])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Pteranodon\n"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print(exlist[1])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The Knights who Say Ni\n"
]
}
],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Yes, we start counting at '0' in Python. This is true in most programming languages. Get used to it. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print(exlist[2])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "IndexError",
"evalue": "list index out of range",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-14-0f59d2fcfa5e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexlist\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mIndexError\u001b[0m: list index out of range"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Error! \n",
"\n",
"Get used to that too. \n",
"\n",
"In Python errors give you a [Stack Trace](http://en.wikipedia.org/wiki/Stack_trace) and you read it from the bottom up. In this example the error only has one *exception:* an IndexError. The *index* is the location of the value in a list. Our code *threw* an IndexError when it tried to access a value in the list at position 2. \n",
"\n",
"Let's append another value to the end of the list and try again:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"exlist.append(120981203987086976)\n",
"print(exlist[2])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"120981203987086976\n"
]
}
],
"prompt_number": 28
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"years = []\n",
"populations = []\n",
"for line in mylist[1:14]:\n",
" yr = int(line[0])\n",
" years.append(line[0])\n",
" populations.append(line[1])\n",
"\n",
"print (years)\n",
"print ('') # print an empty line\n",
"print (populations)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['1850', '1860', '1870', '1880', '1890', '1900', '1910', '1920', '1930', '1940', '1950', '1960', '1970']\n",
"\n",
"['3530', '11333', '15309', '33381', '101454', '170298', '504131', '936455', '2208492', '2785643', '4151687', '6039834', '7032075']\n"
]
}
],
"prompt_number": 29
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# a minimal example\n",
"\n",
"plt.plot(years, populations, marker='o')\n",
"\n",
"plt.grid()\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x11684bb10>"
]
}
],
"prompt_number": 30
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# let's add some labels\n",
"\n",
"plt.plot(years, populations, marker='o')\n",
"\n",
"plt.title('LA County Population 1850-1970')\n",
"plt.ylabel('Population count')\n",
"plt.xlabel('Year')\n",
"\n",
"\n",
"plt.grid()\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x116972910>"
]
}
],
"prompt_number": 31
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## how about thousands separators? \n",
"## now we need to learn about *functions*"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# write a formatting function that \n",
"# takes tick label and tick position\n",
"def fmtfunc(label, pos):\n",
" # don't forget to cast the label as an integer\n",
" s = '{:0,d}'.format( int(label) )\n",
" return s"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# http://nbviewer.ipython.org/github/jakevdp/2013_fall_ASTR599/blob/master/notebooks/12_AdvancedMatplotlib.ipynb\n",
"\n",
"import matplotlib.ticker as tkr\n",
"fig, ax = plt.subplots() # trick to create a single axes\n",
"\n",
"# set up the labels -first-\n",
"plt.title('LA County Population 1850-1970')\n",
"plt.ylabel('Population count')\n",
"plt.xlabel('Year')\n",
"\n",
"y_format = tkr.FuncFormatter(fmtfunc) # make formatter\n",
"ax.plot(years, populations, marker='o')\n",
"ax.yaxis.set_major_formatter(y_format) # set formatter to needed axis\n",
"\n",
"ax.grid()\n",
"\n",
"\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x116bef310>"
]
}
],
"prompt_number": 66
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"----"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Whoa, no semicolons! How does Python know how to group this funtionality? *Indentation.* As Dive Into Mark puts it:\n",
"\n",
"> Python functions have no explicit begin or end, and no curly braces to mark where the function code starts and stops. The only delimiter is a colon (:) and the indentation of the code itself.\n",
"\n",
"> [Dive Into Python](http://www.diveintopython.net/getting_to_know_python/indenting_code.html)\n",
"\n",
"And it's pretty."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introspection\n",
"\n",
"One of the most useful features of Python is *Introspection.* As the name implies, we are able to look inside Python entities. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dir(myreader)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 18,
"text": [
"['__class__',\n",
" '__delattr__',\n",
" '__doc__',\n",
" '__format__',\n",
" '__getattribute__',\n",
" '__hash__',\n",
" '__init__',\n",
" '__iter__',\n",
" '__new__',\n",
" '__reduce__',\n",
" '__reduce_ex__',\n",
" '__repr__',\n",
" '__setattr__',\n",
" '__sizeof__',\n",
" '__str__',\n",
" '__subclasshook__',\n",
" 'dialect',\n",
" 'line_num',\n",
" 'next']"
]
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\"\"\"Trying Michael Hansen's temperature trend example using Pandas\n",
"\n",
"The original example, without Pandas, is available at:\n",
"http://software-carpentry.org/2012/05/an-exercise-with-matplotlib-and-numpy/\n",
"\n",
"\"\"\"\n",
"import os\n",
"import pandas\n",
"import numpy as np\n",
"import matplotlib.pyplot as pyplot\n",
"from scipy import stats\n",
"from datetime import datetime\n",
"\n",
"#Thanks to Pandas we don't need to manually deal with all of the date\n",
"#conversion, so no event2int() or date2int()\n",
"\n",
"#We'll also use scipy.stats so that we don't need r_squared()\n",
"\n",
"def read_weather(file_name):\n",
" #Importing is simpler since Pandas handles the complexity for us\n",
" data = pandas.read_csv(file_name, index_col=0, parse_dates=True)\n",
" return data\n",
"\n",
"def temp_plot(mean_temps, min_temps=None, max_temps=None):\n",
" \n",
" year_start = datetime(2012, 1, 1)\n",
" days = np.array([(d - year_start).days + 1 for d in mean_temps.index]) \n",
"\n",
" fig = pyplot.figure()\n",
" pyplot.title('Temperatures in Bloomington 2012')\n",
" pyplot.ylabel('Mean Temperature (F)')\n",
" pyplot.xlabel('Day of Year')\n",
" \n",
" if (max_temps is None or min_temps is None):\n",
" pyplot.plot(days, mean_temps, marker='o')\n",
" else:\n",
" temp_err = np.vstack((mean_temps - min_temps,\n",
" max_temps - mean_temps))\n",
"\n",
" pyplot.errorbar(days, mean_temps, marker='o', yerr=temp_err)\n",
" pyplot.title('Temperatures in Bloomington 2012 (max/min)') \n",
" \n",
" #Use Scipy instead of calculating R^2 by hand\n",
" slope, intercept, rval, pval, stderr = stats.linregress(days, mean_temps)\n",
" ideal_temps = intercept + (slope * days)\n",
" fit_label = 'Linear fit ({0:.3f})'.format(slope)\n",
" pyplot.plot(days, ideal_temps, color='red', linestyle='--', label=fit_label)\n",
" pyplot.annotate('r^2 = {0:.3f}'.format(rval ** 2), (0.05, 0.9), xycoords='axes fraction')\n",
" pyplot.legend(loc='lower right')\n",
" \n",
" return fig\n",
"\n",
"#-------------------------------------------------- \n",
"\n",
"# Read data and extract dates, temperatures, and events\n",
"data = read_weather('data/weather.csv')\n",
"min_temps = data['Min TemperatureF']\n",
"mean_temps = data['Mean TemperatureF']\n",
"max_temps = data['Max TemperatureF']\n",
"events = data[' Events']\n",
"\n",
"if not os.path.exists('plots'):\n",
" os.mkdir('plots')\n",
"\n",
"# Plot without error bars\n",
"#In Pandas the temperatures are automatically associated with the dates, so\n",
"#we can just pass the mean_temps Series object to temp_plot\n",
"fig = temp_plot(mean_temps)\n",
"fig.savefig('plots/day_vs_temp.png')\n",
"\n",
"# Plot with error bars\n",
"fig = temp_plot(mean_temps, min_temps, max_temps)\n",
"fig.savefig('plots/day_vs_temp-all.png')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/Cellar/python/2.7.7_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/excel.py:626: UserWarning: Installed openpyxl is not supported at this time. Use >=1.6.1 and <2.0.0.\n",
" .format(openpyxl_compat.start_ver, openpyxl_compat.stop_ver))\n"
]
},
{
"ename": "IOError",
"evalue": "File data/weather.csv does not exist",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIOError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-19-1750860c2b59>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0;31m# Read data and extract dates, temperatures, and events\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 56\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mread_weather\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'data/weather.csv'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 57\u001b[0m \u001b[0mmin_temps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Min TemperatureF'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0mmean_temps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Mean TemperatureF'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-19-1750860c2b59>\u001b[0m in \u001b[0;36mread_weather\u001b[0;34m(file_name)\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mread_weather\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;31m#Importing is simpler since Pandas handles the complexity for us\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex_col\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparse_dates\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 22\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/Cellar/python/2.7.7_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.pyc\u001b[0m in \u001b[0;36mparser_f\u001b[0;34m(filepath_or_buffer, sep, dialect, compression, doublequote, escapechar, quotechar, quoting, skipinitialspace, lineterminator, header, index_col, names, prefix, skiprows, skipfooter, skip_footer, na_values, na_fvalues, true_values, false_values, delimiter, converters, dtype, usecols, engine, delim_whitespace, as_recarray, na_filter, compact_ints, use_unsigned, low_memory, buffer_lines, warn_bad_lines, error_bad_lines, keep_default_na, thousands, comment, decimal, parse_dates, keep_date_col, dayfirst, date_parser, memory_map, nrows, iterator, chunksize, verbose, encoding, squeeze, mangle_dupe_cols, tupleize_cols, infer_datetime_format)\u001b[0m\n\u001b[1;32m 441\u001b[0m infer_datetime_format=infer_datetime_format)\n\u001b[1;32m 442\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 443\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 444\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 445\u001b[0m \u001b[0mparser_f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/Cellar/python/2.7.7_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.pyc\u001b[0m in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 226\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 227\u001b[0m \u001b[0;31m# Create the parser.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 228\u001b[0;31m \u001b[0mparser\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 229\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 230\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnrows\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/Cellar/python/2.7.7_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.pyc\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'has_index_names'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'has_index_names'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 532\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 533\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 534\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 535\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_options_with_defaults\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/Cellar/python/2.7.7_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.pyc\u001b[0m in \u001b[0;36m_make_engine\u001b[0;34m(self, engine)\u001b[0m\n\u001b[1;32m 668\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mengine\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 669\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 670\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCParserWrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 671\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 672\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'python'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/Cellar/python/2.7.7_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.pyc\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, src, **kwds)\u001b[0m\n\u001b[1;32m 1030\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'allow_leading_cols'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex_col\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1031\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1032\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parser\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTextReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1033\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1034\u001b[0m \u001b[0;31m# XXX\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/Cellar/python/2.7.7_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/parser.so\u001b[0m in \u001b[0;36mpandas.parser.TextReader.__cinit__ (pandas/parser.c:3213)\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m/usr/local/Cellar/python/2.7.7_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/parser.so\u001b[0m in \u001b[0;36mpandas.parser.TextReader._setup_parser_source (pandas/parser.c:5595)\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mIOError\u001b[0m: File data/weather.csv does not exist"
]
}
],
"prompt_number": 19
},
{
"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