Created
May 7, 2013 22:15
-
-
Save eddieberklee/5536598 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "metadata": { | |
| "name": "info-stocks" | |
| }, | |
| "nbformat": 3, | |
| "nbformat_minor": 0, | |
| "worksheets": [ | |
| { | |
| "cells": [ | |
| { | |
| "cell_type": "heading", | |
| "level": 1, | |
| "metadata": {}, | |
| "source": [ | |
| "Info Stocks" | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Description:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Our project seeks to measure the effectivness of a product release by looking at slope changes in the company's stock prices with respect to product release dates." | |
| ] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 2, | |
| "metadata": {}, | |
| "source": [ | |
| "Code" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Import necessary libraries" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import urllib\n", | |
| "import re" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 3, | |
| "metadata": {}, | |
| "source": [ | |
| "Date Class" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "splits a date string into useful parts\n", | |
| "\n", | |
| "Contains method dateRange that returns a tuple of a start date and an end date within a time span that we're interested in." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "class Date:\n", | |
| " def __init__(self, date):\n", | |
| " splitDate = date.split('-')\n", | |
| "\n", | |
| " self.date = date\n", | |
| " self.m = int(splitDate[0])\n", | |
| " self.d = int(splitDate[1])\n", | |
| " self.y = int(splitDate[2])\n", | |
| "\n", | |
| " # returns (start date, end date)\n", | |
| " def dateRange(self, range): # range is in days\n", | |
| " import datetime\n", | |
| " date = datetime.date(int(self.y), int(self.m), int(self.d))\n", | |
| " \n", | |
| " difference = datetime.timedelta(days=range)\n", | |
| " beginInterval = date - difference\n", | |
| " endInterval = date + difference\n", | |
| "\n", | |
| " beginInterval = str(beginInterval.month) + '-' + str(beginInterval.day) + '-' + str(beginInterval.year)\n", | |
| " endInterval = str(endInterval.month) + '-' + str(endInterval.day) + '-' + str(endInterval.year)\n", | |
| "\n", | |
| " return (Date(beginInterval), Date(endInterval))" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "heading", | |
| "level": 3, | |
| "metadata": {}, | |
| "source": [ | |
| "Company class" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Processes the company name into appropriate symbol using Yahoo! Finance\n", | |
| "\n", | |
| "As of 4/18/2013, release_dates is *not* an automated process and has been manually inputted." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "class Company:\n", | |
| " def __init__(self, name):\n", | |
| " self.name = name\n", | |
| " self.companyToSymbol() # sets self.symbol\n", | |
| " self.releaseDates() # sets self.releaseDates\n", | |
| " def __str__(self):\n", | |
| " return str(self.__dict__.keys())\n", | |
| " def companyToSymbol(self):\n", | |
| " url = \"http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=%s&callback=YAHOO.Finance.SymbolSuggest.ssCallback\" \\\n", | |
| " % self.name\n", | |
| " u = urllib.urlopen(url)\n", | |
| " data = u.read()\n", | |
| " m = re.search('symbol\\\":\\\"[a-zA-Z]*\\\"', data)\n", | |
| " symbol = m.group(0)\n", | |
| " symbol = symbol.split(':')[1][1:-1]\n", | |
| " self.symbol = symbol\n", | |
| " return symbol\n", | |
| " def releaseDates(self):\n", | |
| " self.release_dates = {\n", | |
| " 'iBooks Author' : '1-19-2012',\n", | |
| " 'iPad (3rd gen)' : '3-16-2012',\n", | |
| " 'Apple TV (3rd gen)' : '3-16-2012',\n", | |
| " 'Mac Pro (Mid 2012)' : '6-11-2012',\n", | |
| " 'Macbook Air (Mid 2012)' : '6-11-2012',\n", | |
| " }\n", | |
| " def getData(self):\n", | |
| " productDate = Date(self.release_dates['Apple TV (3rd gen)'])\n", | |
| " dateRange = productDate.dateRange(7)\n", | |
| " startDate = dateRange[0]\n", | |
| " endDate = dateRange[1]\n", | |
| " interval = 'd'\n", | |
| " url = \"http://ichart.yahoo.com/table.csv?s=%s&a=%i&b=%i&c=%i&d=%i&e=%i&f=%i&g=%s&ignore=.csv\" \\\n", | |
| " % ( self.symbol, startDate.m-1, startDate.d, startDate.y, endDate.m-1, endDate.d, endDate.y, interval)\n", | |
| " u = urllib.urlopen(url)\n", | |
| " ulines = u.read().split(\"\\n\")\n", | |
| " start = ulines[1]\n", | |
| " end = ulines[-2]\n", | |
| " print 'Legend: ' + ulines[0]\n", | |
| " print 'Starting Date Data: ' + start\n", | |
| " print 'Ending Date Data: ' + end\n", | |
| " difference = parse_yahoo_stock(start)['Close'] - parse_yahoo_stock(end)['Close']\n", | |
| " if difference > 0:\n", | |
| " sign = '+'\n", | |
| " else:\n", | |
| " sign = '-'\n", | |
| " print sign + ' ' + str(difference)\n", | |
| " # for perDay in u.readlines():\n", | |
| " # print perDay.strip()" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "def parse_yahoo_stock(line):\n", | |
| " parts = line.split(',')\n", | |
| " parts_dict = {}\n", | |
| " # for product releases there may be a difference between diff('high', 'close')\n", | |
| " # as opposed to more steady differences for a 'normal' non-release day\n", | |
| " legends = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']\n", | |
| " floats = [0, 1, 1, 1, 1, 0, 1]\n", | |
| " for i in range(len(parts)):\n", | |
| " if i == 5:\n", | |
| " parts_dict[legends[i]] = int(parts[i])\n", | |
| " if floats[i]:\n", | |
| " parts_dict[legends[i]] = float(parts[i])\n", | |
| " else:\n", | |
| " parts_dict[legends[i]] = parts[i]\n", | |
| " return parts_dict" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [] | |
| } | |
| ], | |
| "metadata": {} | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment