{ "metadata": { "name": "", "signature": "sha256:5800cfa19d60459dcdc34639edc800c20ecf200f7b1fbf08c6999a6c79cc2b6e" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Using MySQL Weather History Database on Amazon EC2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook shows some example queries using the weather history database set up as described in the complementary notebook [weather_mysqlconfig](http://nbviewer.ipython.org/github/bricof/weather_history/blob/master/weather_mysqlconfig.ipynb). The MySQLdb library is used to manage the interaction with the database. See [this blog post](http://briancoffey.ca/blogpost5.html) for more context." ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Configuration: Libaries, Keys, Convenience Methods" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas as pd\n", "import numpy as np\n", "import MySQLdb as mdb" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "AWSAccessKeyId, AWSSecretKey = ( line.strip().split('=')[1] for line in open('/Users/brian/rootkey.csv','r') )\n", "sshKeyName, instancePass, mysqlPass, myIP = ( line.strip().split('=')[1] for line in open('/Users/brian/passwords.csv','r') )" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "def sqlCall(cmd):\n", " con = mdb.connect( host = 'ec2-54-91-115-227.compute-1.amazonaws.com', \n", " passwd = mysqlPass, \n", " user = 'weatherdbuser', \n", " db='weather' );\n", " cur = con.cursor()\n", " cur.execute(cmd)\n", " field_names = [i[0] for i in cur.description]\n", " output = []\n", " for i in range(cur.rowcount):\n", " output.append(cur.fetchone())\n", " con.close()\n", " df = pd.DataFrame(output)\n", " try:\n", " df.columns = field_names\n", " except:\n", " pass\n", " return df" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quick Views of the Tables in the Database" ] }, { "cell_type": "code", "collapsed": false, "input": [ "cmd = \"SELECT * FROM country LIMIT 5\"\n", "cmd += \";\"\n", "sqlCall(cmd)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FIPS_IDcountry_name
0 AA ARUBA
1 AC ANTIGUA AND BARBUDA
2 AF AFGHANISTAN
3 AG ALGERIA
4 AI ASCENSION ISLAND
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ " FIPS_ID country_name\n", "0 AA ARUBA\n", "1 AC ANTIGUA AND BARBUDA\n", "2 AF AFGHANISTAN\n", "3 AG ALGERIA\n", "4 AI ASCENSION ISLAND" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "cmd = \"SELECT * FROM station LIMIT 5\"\n", "cmd += \";\"\n", "sqlCall(cmd)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
USAFWBANstation_nameCTRYFIPS_IDSTcallidlatlonelev
0 000000 99999 NYGGBUKTA GREENLAND- STA GL GL 73483 21567 30
1 000010 99999 JAN HAYEN NO NO 70983 -7700 229
2 000020 99999 ISFJORD RADIO SPITZBERGEN NO NO 78067 13633 79
3 000030 99999 BJORNOYA BARENTS SEA NO NO 74467 19283 290
4 000040 99999 VAROO NO NO 70367 31100 119
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ " USAF WBAN station_name CTRY FIPS_ID ST callid lat \\\n", "0 000000 99999 NYGGBUKTA GREENLAND- STA GL GL 73483 \n", "1 000010 99999 JAN HAYEN NO NO 70983 \n", "2 000020 99999 ISFJORD RADIO SPITZBERGEN NO NO 78067 \n", "3 000030 99999 BJORNOYA BARENTS SEA NO NO 74467 \n", "4 000040 99999 VAROO NO NO 70367 \n", "\n", " lon elev \n", "0 21567 30 \n", "1 -7700 229 \n", "2 13633 79 \n", "3 19283 290 \n", "4 31100 119 " ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "cmd = \"SELECT * FROM observation LIMIT 5\"\n", "cmd += \";\"\n", "sqlCall(cmd)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
STNYMDSTNWBANyearmonthdaytempdewpslpstpvisibwdspmxspdgustmaxtempmintempprcpsndpFRSHTT
0 00820920090309 008209 99999 2009 3 9 782 710 99999 99999 9999 13 19 9999 806 716 0 9999 000000
1 00820920090310 008209 99999 2009 3 10 678 656 99999 99999 9999 12 41 9999 806 554 0 9999 000000
2 00820920090311 008209 99999 2009 3 11 681 646 99999 99999 9999 13 29 9999 824 554 0 9999 000000
3 00820920090312 008209 99999 2009 3 12 666 639 99999 99999 9999 12 41 9999 806 572 0 9999 000000
4 00820920090313 008209 99999 2009 3 13 669 622 99999 99999 9999 13 41 9999 806 554 0 9999 000000
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ " STNYMD STN WBAN year month day temp dewp slp stp \\\n", "0 00820920090309 008209 99999 2009 3 9 782 710 99999 99999 \n", "1 00820920090310 008209 99999 2009 3 10 678 656 99999 99999 \n", "2 00820920090311 008209 99999 2009 3 11 681 646 99999 99999 \n", "3 00820920090312 008209 99999 2009 3 12 666 639 99999 99999 \n", "4 00820920090313 008209 99999 2009 3 13 669 622 99999 99999 \n", "\n", " visib wdsp mxspd gust maxtemp mintemp prcp sndp FRSHTT \n", "0 9999 13 19 9999 806 716 0 9999 000000 \n", "1 9999 12 41 9999 806 554 0 9999 000000 \n", "2 9999 13 29 9999 824 554 0 9999 000000 \n", "3 9999 12 41 9999 806 572 0 9999 000000 \n", "4 9999 13 41 9999 806 554 0 9999 000000 " ] } ], "prompt_number": 6 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Selecting a Subset of Stations for Further Analysis and Visualization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The database contains weather data for more than 9000 sites. For initial exploration and visualization, we will select a subset of these stations. In particular, the following cells ([7] through [11]) select the longest-running record (ie. the one with the most observations) from each country, breaking ties randomly." ] }, { "cell_type": "code", "collapsed": false, "input": [ "cmd = \"SELECT USAF, FIPS_ID, obs.numYears \"\n", "cmd += \"FROM station \"\n", "cmd += \"JOIN (SELECT STN, COUNT(DISTINCT year) as numYears \"\n", "cmd += \"FROM observation \"\n", "cmd += \"GROUP BY STN) as obs \"\n", "cmd += \"ON station.USAF = obs.STN \"\n", "cmd += \";\"\n", "r = sqlCall(cmd)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "r.head()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
USAFFIPS_IDnumYears
0 010010 NO 41
1 010013 NO 3
2 010014 NO 24
3 010015 NO 23
4 010016 NO 5
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ " USAF FIPS_ID numYears\n", "0 010010 NO 41\n", "1 010013 NO 3\n", "2 010014 NO 24\n", "3 010015 NO 23\n", "4 010016 NO 5" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "idx = r.groupby(['FIPS_ID'])['numYears'].transform(max) == r['numYears']\n", "longestPerCountry = r[idx].sort('FIPS_ID')\n", "longestPerCountry.tail()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
USAFFIPS_IDnumYears
11161 679750 ZI 44
11128 677750 ZI 44
11167 679910 ZI 44
11124 677650 ZI 44
11143 678670 ZI 44
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ " USAF FIPS_ID numYears\n", "11161 679750 ZI 44\n", "11128 677750 ZI 44\n", "11167 679910 ZI 44\n", "11124 677650 ZI 44\n", "11143 678670 ZI 44" ] } ], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "fn = lambda obj: obj.loc[np.random.choice(obj.index, 1, True),:]\n", "selectedSites = longestPerCountry.groupby('FIPS_ID', as_index=False).apply(fn)\n", "selectedSites.tail()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
USAFFIPS_IDnumYears
2557819 414363 YM 22
2563391 131500 YU 31
25710227 601400 YY 3
25811106 676650 ZA 37
25911167 679910 ZI 44
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ " USAF FIPS_ID numYears\n", "255 7819 414363 YM 22\n", "256 3391 131500 YU 31\n", "257 10227 601400 YY 3\n", "258 11106 676650 ZA 37\n", "259 11167 679910 ZI 44" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "selectedSitesList = selectedSites['USAF'].tolist()\n", "selectedSitesList[:10]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "['035963',\n", " '789820',\n", " '788620',\n", " '411960',\n", " '409480',\n", " '603900',\n", " '375750',\n", " '136150',\n", " '377890',\n", " '664220']" ] } ], "prompt_number": 11 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Collecting Site Description Details for these Sites" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following collects the ID, station name, country name, latitude, longitude and elevation for each of the stations on the given site list." ] }, { "cell_type": "code", "collapsed": false, "input": [ "slist = str(selectedSitesList)[1:-1]\n", "slist[:100]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "\"'035963', '789820', '788620', '411960', '409480', '603900', '375750', '136150', '377890', '664220', \"" ] } ], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "cmd = \"SELECT s.USAF, s.station_name, c.country_name, \"\n", "cmd += \"(s.lat / 1000) as lat, (s.lon / 1000) as lon, (s.elev / 10) as elev \"\n", "cmd += \"FROM station s \"\n", "cmd += \"JOIN country c ON s.FIPS_ID = c.FIPS_ID \"\n", "cmd += \"WHERE s.USAF IN (\" + slist + \");\"" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "sites = sqlCall(cmd)\n", "sites[['lat','lon','elev']] = sites[['lat','lon','elev']].astype(float)\n", "sites.head()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
USAFstation_namecountry_namelatlonelev
0 010620 HOPEN SVALBARD 76.500 25.067 10
1 013840 OSLO/GARDERMOEN NORWAY 60.200 11.083 204
2 026800 HOBURG SWEDEN 56.917 18.150 39
3 029740 HELSINKI-VANTAA FINLAND 60.317 24.967 56
4 031350 PRESTWICK(CIV/NAVY) UNITED KINGDOM 55.500 -4.583 20
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ " USAF station_name country_name lat lon elev\n", "0 010620 HOPEN SVALBARD 76.500 25.067 10\n", "1 013840 OSLO/GARDERMOEN NORWAY 60.200 11.083 204\n", "2 026800 HOBURG SWEDEN 56.917 18.150 39\n", "3 029740 HELSINKI-VANTAA FINLAND 60.317 24.967 56\n", "4 031350 PRESTWICK(CIV/NAVY) UNITED KINGDOM 55.500 -4.583 20" ] } ], "prompt_number": 14 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Collecting Monthly Average, Minimum and Maximum Temperatures for these Sites" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The weather observations in the database are recorded on a daily basis. For our purposes, we are only interested in the monthly average, minimum and maximum temperatures, and only for the site list described above." ] }, { "cell_type": "code", "collapsed": false, "input": [ "siteTemps = []\n", "for site in selectedSitesList:\n", " cmd = \"SELECT STN, year, month, AVG(temp), MAX(maxtemp), MIN(mintemp) \"\n", " cmd += \"FROM observation \"\n", " cmd += \"WHERE STN = '\" + site + \"' \" \n", " cmd += \"GROUP BY year, month \"\n", " cmd += \";\"\n", " siteTemps.append(sqlCall(cmd))\n", "siteTemps[0].head(10)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
STNyearmonthAVG(temp)MAX(maxtemp)MIN(mintemp)
0 035963 1945 1 330.0323 473 174
1 035963 1945 2 453.7500 603 313
2 035963 1945 3 466.0000 644 313
3 035963 1945 4 489.9333 734 324
4 035963 1945 5 545.1667 793 324
5 035963 1945 6 592.4333 783 453
6 035963 1945 7 590.0000 703 484
7 035963 1951 6 590.1200 763 441
8 035963 1951 7 624.9032 784 453
9 035963 1951 8 610.3548 734 473
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ " STN year month AVG(temp) MAX(maxtemp) MIN(mintemp)\n", "0 035963 1945 1 330.0323 473 174\n", "1 035963 1945 2 453.7500 603 313\n", "2 035963 1945 3 466.0000 644 313\n", "3 035963 1945 4 489.9333 734 324\n", "4 035963 1945 5 545.1667 793 324\n", "5 035963 1945 6 592.4333 783 453\n", "6 035963 1945 7 590.0000 703 484\n", "7 035963 1951 6 590.1200 763 441\n", "8 035963 1951 7 624.9032 784 453\n", "9 035963 1951 8 610.3548 734 473" ] } ], "prompt_number": 24 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Initial graphing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following graph shows the distribution of selected sites by latitude and longitude (note that the rough shape of Africa is visible in the center of the graph). " ] }, { "cell_type": "code", "collapsed": false, "input": [ "sites.plot(x='lon',y='lat',kind='scatter')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nGdJnfgAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following graph shows an example scatter plot of monthly average temperatures (over many years) for a single site." ] }, { "cell_type": "code", "collapsed": false, "input": [ "grapher = siteTemps[0]\n", "grapher[['year']] = grapher[['year']].astype(int)\n", "grapher[['month']] = grapher[['month']].astype(int)\n", "grapher[['t']] = grapher[['AVG(temp)']].astype(float) / 10\n", "grapher.groupby('year')\n", "grapher.plot(x='month',y='t',kind='scatter')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 49, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nbg/mCuC1UcnvgD5vezCb4fM2JmCMX90MTsDmO8GbObEq+i+mA7dFph+VldX09v4thVlWKyvv8Va/\niY+tE4hJyP2K8cTeBywh3ye9hLg2NQn5dw/xxD916pRhlY1Wb283A/dDcGXhCf38GSm7EzBFUgVc\nipvHT/T8J8mFkzLx7+xWTX5F8v7oud0JhMDGBExRVFaeRl9fFYXzyCsqeujtfTnJsFIlm80WTKG9\n2usMKpFxuGnAhesEjqEaz+5l5sRGOiZgjYApCpF6+u9s1Qp8BtWO5IIy3lRUTEV1PrAtKpmDSDt9\nfQcSjCqdLIFciQi5XzG+MYHhlI1dyL97CDP+M888HWgDXoFbONYWlYUnxN//WMTeCIjILhF5RES2\nisgvo7J6EWkTkR0islFE6uKOw5xaNptl4cJFLFt2I9ls1nPtPQxcrBRqgjEz2Pjx46JnH8MNDheW\n+ZE7PxcuXBTD+ZlesXcHicgzuFXGHQVltwEHVPU2EVkOTFbVFQPeZ91BRZTNZmlquoKurvMByGQe\nZ/36f/fWbywyGfgI/dcJ3I3qH73Ub5I1ZcpsOjpuoLC7r77+Zg4e3OmlfssNNXyl2h00MKAm3OUg\n0Z/vK1Ic5gRWrryZrq4qcvn+u7qqWLny5lO9bdgqKhS4i1wqY7grKjPlYMaMs4ZVNlpr194ZNQAu\nFXln563HB7nN2BSjEVDgJyLyaxG5Kiqbpqr7ouf7AH+7W5SI0PoVd+/eSz7f/wzgi1GZH5lMJf27\nf3qiMv9C+90PFGL8ixY1AH8HnI0bF/i7qCw8If7+x6IY6wTepqrPi8grgDYRebzwL1VVRWTIS8KW\nlhZmzpwJQF1dHXPmzGH+/PlA/j+qVI+3bdtWUvGc6ri+fgIdHY+R9xj19ROOH421/urqCo4ezd1p\nACymujp/DZL0v9+Ox3Z8xx134RLGrcLlDvoyd9xxF9ddd52X+hcs+DM2bfoEPT1fAaCqajsLFtxI\nTtL//iSP29vbj2/Tmvu+HBFVLdoD+BywFHgcODMqmw48PsRr1RTPqlWrFCYprIsek3TVqlXe6q+q\nOiOqV6PHOq2qOsNb/SZZIlMG/f+KTPFW/4YNGzSTecXx8zOTeYVu2LDBW/3lJPruHPb3cqzdQSIy\nXlxmKUTkNGAhsJ3cJqdOM+Bvs1kzKvfe+01cd81XokdPVOZHbW3NsMpMmNx3z3ZgUfTYnruY82Lt\n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\n0S2GZz5LAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 49 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Exporting Processed Data for D3 Visualization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The sites and temperature data is exported to text files as follows. It is then used in the D3 visualization shown in the blog post [here](http://briancoffey.ca/blogpost5.html)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sites.to_csv('sites.csv',sep='\\t',index=False)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "for i in range(len(selectedSitesList)):\n", " siteTemps[i].to_csv('sitesTemps' + str(i) + '.csv',sep='\\t',index=False)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 27 } ], "metadata": {} } ] }