#!/bin/python import random import subprocess import time import sys import re from urllib import urlopen from worker import Worker from math import log import elementtree.ElementTree statenames=['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FL', 'GA', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY'] htmlfmt = "%s: %s" ttyfmt = "%-10s: %8s" def fullrecalc(fmt=ttyfmt): global probs probs=intradelist(statenames) return montehyp(probs, [], [], fmt) baseurl = "http://www.intrade.com/jsp/XML/MarketData/ContractBookXML.jsp?timestamp=0&depth=0" COUNT = 40 def intradelist(statelist=statenames): xprobs = {} contracts = rids.keys() for i in range(0, len(contracts), COUNT): if not i: time.sleep(3) url = baseurl for st in contracts[i:i+COUNT]: url = url + "&id=%s" % st #print url #print len(rids) data = urlopen(url).read() tree = elementtree.ElementTree.fromstring(data) for contract in tree.findall('contractInfo'): conid = contract.attrib['conID'] price = float(contract.attrib['lstTrdPrc']) xprobs[rids[conid]] = price #print xprobs probs = {} for st in statelist: dprob = xprobs[st, 'DEM'] rprob = xprobs[st, 'REP'] if dprob or rprob: prob = dprob * 1.0 / (rprob + dprob) else: prob = 0.5 probs[st] = prob return probs def montehyp(realprobs, obamastates, mccainstates, fmt): dwins=0 rwins=0 ties=0 errors=0 probs=dict(realprobs) stateslist=list(statenames) stateslist.sort() obamastates=list(set(obamastates)) mccainstates=list(set(mccainstates)) nonstates=[] for i in obamastates+mccainstates: if not (i in name): nonstates.append(i) if nonstates: return "The following are not states."+str(nonstates) if(set(obamastates).intersection(set(mccainstates))): return "Duplicate states in lists." for i in list(set(obamastates)): probs[i]=1 for i in list(set(mccainstates)): probs[i]=0 ev=[0.0 for i in xrange(539)] for i in xrange(539): ev[i]=0.0 ev[0]=1.0 for j in stateslist: # temp=list(ev) for i in xrange(538,-1,-1): if votes[j]<=i: ev[i]=probs[j]*ev[i-votes[j]]+(1-probs[j])*ev[i] else: ev[i]*=1-probs[j] pdem=100.0*sum(ev[270:]) prep=100.0*sum(ev[:269]) ptie=100.0*ev[269] return record(pdem, prep, ptie, fmt) def display(n): if n == 0: return "0% (inf)" if n == 100: return "100% (inf)" if n > 99.99: ndig = round(log(100-n, 10)) return "100%% (%d)" % -ndig if n < .01: ndig = round(log(n, 10)) return "0%% (%d)" % -ndig return "%.2f%%" % n def record(pdem, prep, ptie, fmt): log=open("odds.log", 'a') print >>log, time.time(), str(round(pdem,1)), str(round(prep, 1)), str(round(ptie, 1)) log.close() dstring=fmt % ("Obama", display(pdem)) rstring=fmt % ("McCain", display(prep)) tstring=fmt % ("Tie", display(ptie)) #"Obama: "+display(pdem)+"" #rstring="McCain: "+display(prep)+"" #tstring="Tie: "+display(ptie)+"" if pdem>prep: if pdem>ptie: if prep>ptie: return dstring+"\n"+rstring+"\n"+tstring else: return dstring+"\n"+tstring+"\n"+rstring else: return tstring+"\n"+dstring+"\n"+rstring else: if prep>ptie: if pdem>ptie: return rstring+"\n"+dstring+"\n"+tstring else: return rstring+"\n"+tstring+"\n"+dstring else: return tstring+"\n"+rstring+"\n"+dstring votes = {} votes['AL'] = 9 votes['AK'] = 3 votes['AZ'] = 10 votes['AR'] = 6 votes['CA'] = 55 votes['CO'] = 9 votes['CT'] = 7 votes['DE'] = 3 votes['DC'] = 3 votes['FL'] = 27 votes['GA'] = 15 votes['HI'] = 4 votes['ID'] = 4 votes['IL'] = 21 votes['IN'] = 11 votes['IA'] = 7 votes['KS'] = 6 votes['KY'] = 8 votes['LA'] = 9 votes['ME'] = 4 votes['MD'] = 10 votes['MA'] = 12 votes['MI'] = 17 votes['MN'] = 10 votes['MS'] = 6 votes['MO'] = 11 votes['MT'] = 3 votes['NE'] = 5 votes['NV'] = 5 votes['NH'] = 4 votes['NJ'] = 15 votes['NM'] = 5 votes['NY'] = 31 votes['NC'] = 15 votes['ND'] = 3 votes['OH'] = 20 votes['OK'] = 7 votes['OR'] = 7 votes['PA'] = 21 votes['RI'] = 4 votes['SC'] = 8 votes['SD'] = 3 votes['TN'] = 11 votes['TX'] = 34 votes['UT'] = 5 votes['VT'] = 3 votes['VA'] = 13 votes['WA'] = 11 votes['WV'] = 5 votes['WI'] = 10 votes['WY'] = 3 name = {} name['AL'] = "ALABAMA" name['AK'] = "ALASKA" name['AZ'] = "ARIZONA" name['AR'] = "ARKANSAS" name['CA'] = "CALIFORNIA" name['CO'] = "COLORADO" name['CT'] = "CONNECTICUT" name['DE'] = "DELAWARE" name['DC'] = "DISTRICTOFCOLUMBIA" name['FL'] = "FLORIDA" name['GA'] = "GEORGIA" name['HI'] = "HAWAII" name['ID'] = "IDAHO" name['IL'] = "ILLINOIS" name['IN'] = "INDIANA" name['IA'] = "IOWA" name['KS'] = "KANSAS" name['KY'] = "KENTUCKY" name['LA'] = "LOUISIANA" name['ME'] = "MAINE" name['MD'] = "MARYLAND" name['MA'] = "MASSACHUSETTS" name['MI'] = "MICHIGAN" name['MN'] = "MINNESOTA" name['MS'] = "MISSISSIPPI" name['MO'] = "MISSOURI" name['MT'] = "MONTANA" name['NE'] = "NEBRASKA" name['NV'] = "NEVADA" name['NH'] = "NEWHAMPSHIRE" name['NJ'] = "NEWJERSEY" name['NM'] = "NEWMEXICO" name['NY'] = "NEWYORK" name['NC'] = "NTH.CAROLINA" name['ND'] = "NTH.DAKOTA" name['OH'] = "OHIO" name['OK'] = "OKLAHOMA" name['OR'] = "OREGON" name['PA'] = "PENNSYLVANIA" name['RI'] = "RHODEISLAND" name['SC'] = "STH.CAROLINA" name['SD'] = "STH.DAKOTA" name['TN'] = "TENNESSEE" name['TX'] = "TEXAS" name['UT'] = "UTAH" name['VT'] = "VERMONT" name['VA'] = "VIRGINIA" name['WA'] = "WASHINGTON" name['WV'] = "WESTVIRGINIA" name['WI'] = "WISCONSIN" name['WY'] = "WYOMING" shortname = {} for k, v in name.items(): shortname[v] = k #tre = re.compile("\\bLast Trade : .*?([0-9.]+)") #ure = re.compile("([A-Z.]+)\.([A-Z]+) http://.*conDetailID=([0-9]+$)") #ids = {} #rids = {} #for line in open("intradeurls.txt"): # m = ure.match(line) # if not m: continue # state, party, url = m.group(1,2,3) # if party not in ('REP', 'DEM'): continue # ids[state, party] = url # rids[url] = (shortname[state], party) #import pprint #print "ids =",; pprint.pprint(ids) #print "rids =",; pprint.pprint(rids) #print #raise SystemExit ids = {('ALABAMA', 'DEM'): '416468', ('ALABAMA', 'REP'): '416469', ('ALASKA', 'DEM'): '416471', ('ALASKA', 'REP'): '416472', ('ARIZONA', 'DEM'): '416484', ('ARIZONA', 'REP'): '416485', ('ARKANSAS', 'DEM'): '416491', ('ARKANSAS', 'REP'): '416493', ('CALIFORNIA', 'DEM'): '416498', ('CALIFORNIA', 'REP'): '416500', ('COLORADO', 'DEM'): '416505', ('COLORADO', 'REP'): '416506', ('CONNECTICUT', 'DEM'): '416508', ('CONNECTICUT', 'REP'): '416509', ('DELAWARE', 'DEM'): '416511', ('DELAWARE', 'REP'): '416512', ('DISTRICTOFCOLUMBIA', 'DEM'): '416623', ('DISTRICTOFCOLUMBIA', 'REP'): '416624', ('FLORIDA', 'DEM'): '417861', ('FLORIDA', 'REP'): '417866', ('GEORGIA', 'DEM'): '416514', ('GEORGIA', 'REP'): '416515', ('HAWAII', 'DEM'): '416520', ('HAWAII', 'REP'): '416521', ('IDAHO', 'DEM'): '416523', ('IDAHO', 'REP'): '416524', ('ILLINOIS', 'DEM'): '416532', ('ILLINOIS', 'REP'): '416537', ('INDIANA', 'DEM'): '416542', ('INDIANA', 'REP'): '416543', ('IOWA', 'DEM'): '416545', ('IOWA', 'REP'): '416546', ('KANSAS', 'DEM'): '416554', ('KANSAS', 'REP'): '416555', ('KENTUCKY', 'DEM'): '416557', ('KENTUCKY', 'REP'): '416558', ('LOUISIANA', 'DEM'): '416560', ('LOUISIANA', 'REP'): '416561', ('MAINE', 'DEM'): '416569', ('MAINE', 'REP'): '416570', ('MARYLAND', 'DEM'): '416584', ('MARYLAND', 'REP'): '416585', ('MASSACHUSETTS', 'DEM'): '416593', ('MASSACHUSETTS', 'REP'): '416594', ('MICHIGAN', 'DEM'): '416599', ('MICHIGAN', 'REP'): '416600', ('MINNESOTA', 'DEM'): '416602', ('MINNESOTA', 'REP'): '416603', ('MISSISSIPPI', 'DEM'): '416612', ('MISSISSIPPI', 'REP'): '416614', ('MISSOURI', 'DEM'): '416619', ('MISSOURI', 'REP'): '416621', ('MONTANA', 'DEM'): '416487', ('MONTANA', 'REP'): '416488', ('NEBRASKA', 'DEM'): '416490', ('NEBRASKA', 'REP'): '416492', ('NEVADA', 'DEM'): '416496', ('NEVADA', 'REP'): '416497', ('NEWHAMPSHIRE', 'DEM'): '416502', ('NEWHAMPSHIRE', 'REP'): '416503', ('NEWJERSEY', 'DEM'): '416516', ('NEWJERSEY', 'REP'): '416518', ('NEWMEXICO', 'DEM'): '416526', ('NEWMEXICO', 'REP'): '416527', ('NEWYORK', 'DEM'): '416529', ('NEWYORK', 'REP'): '416530', ('NTH.CAROLINA', 'DEM'): '416534', ('NTH.CAROLINA', 'REP'): '416535', ('NTH.DAKOTA', 'DEM'): '416539', ('NTH.DAKOTA', 'REP'): '416540', ('OHIO', 'DEM'): '416548', ('OHIO', 'REP'): '416549', ('OKLAHOMA', 'DEM'): '416551', ('OKLAHOMA', 'REP'): '416552', ('OREGON', 'DEM'): '416590', ('OREGON', 'REP'): '416591', ('PENNSYLVANIA', 'DEM'): '416595', ('PENNSYLVANIA', 'REP'): '416597', ('RHODEISLAND', 'DEM'): '416605', ('RHODEISLAND', 'REP'): '416606', ('STH.CAROLINA', 'DEM'): '416608', ('STH.CAROLINA', 'REP'): '416609', ('STH.DAKOTA', 'DEM'): '416611', ('STH.DAKOTA', 'REP'): '416613', ('TENNESSEE', 'DEM'): '416617', ('TENNESSEE', 'REP'): '416618', ('TEXAS', 'DEM'): '416632', ('TEXAS', 'REP'): '416634', ('UTAH', 'DEM'): '416636', ('UTAH', 'REP'): '416637', ('VERMONT', 'DEM'): '416639', ('VERMONT', 'REP'): '416640', ('VIRGINIA', 'DEM'): '416642', ('VIRGINIA', 'REP'): '416643', ('WASHINGTON', 'DEM'): '416645', ('WASHINGTON', 'REP'): '416646', ('WESTVIRGINIA', 'DEM'): '416648', ('WESTVIRGINIA', 'REP'): '416649', ('WISCONSIN', 'DEM'): '416653', ('WISCONSIN', 'REP'): '416651', ('WYOMING', 'DEM'): '416654', ('WYOMING', 'REP'): '416655'} rids ={'416468': ('AL', 'DEM'), '416469': ('AL', 'REP'), '416471': ('AK', 'DEM'), '416472': ('AK', 'REP'), '416484': ('AZ', 'DEM'), '416485': ('AZ', 'REP'), '416487': ('MT', 'DEM'), '416488': ('MT', 'REP'), '416490': ('NE', 'DEM'), '416491': ('AR', 'DEM'), '416492': ('NE', 'REP'), '416493': ('AR', 'REP'), '416496': ('NV', 'DEM'), '416497': ('NV', 'REP'), '416498': ('CA', 'DEM'), '416500': ('CA', 'REP'), '416502': ('NH', 'DEM'), '416503': ('NH', 'REP'), '416505': ('CO', 'DEM'), '416506': ('CO', 'REP'), '416508': ('CT', 'DEM'), '416509': ('CT', 'REP'), '416511': ('DE', 'DEM'), '416512': ('DE', 'REP'), '416514': ('GA', 'DEM'), '416515': ('GA', 'REP'), '416516': ('NJ', 'DEM'), '416518': ('NJ', 'REP'), '416520': ('HI', 'DEM'), '416521': ('HI', 'REP'), '416523': ('ID', 'DEM'), '416524': ('ID', 'REP'), '416526': ('NM', 'DEM'), '416527': ('NM', 'REP'), '416529': ('NY', 'DEM'), '416530': ('NY', 'REP'), '416532': ('IL', 'DEM'), '416534': ('NC', 'DEM'), '416535': ('NC', 'REP'), '416537': ('IL', 'REP'), '416539': ('ND', 'DEM'), '416540': ('ND', 'REP'), '416542': ('IN', 'DEM'), '416543': ('IN', 'REP'), '416545': ('IA', 'DEM'), '416546': ('IA', 'REP'), '416548': ('OH', 'DEM'), '416549': ('OH', 'REP'), '416551': ('OK', 'DEM'), '416552': ('OK', 'REP'), '416554': ('KS', 'DEM'), '416555': ('KS', 'REP'), '416557': ('KY', 'DEM'), '416558': ('KY', 'REP'), '416560': ('LA', 'DEM'), '416561': ('LA', 'REP'), '416569': ('ME', 'DEM'), '416570': ('ME', 'REP'), '416584': ('MD', 'DEM'), '416585': ('MD', 'REP'), '416590': ('OR', 'DEM'), '416591': ('OR', 'REP'), '416593': ('MA', 'DEM'), '416594': ('MA', 'REP'), '416595': ('PA', 'DEM'), '416597': ('PA', 'REP'), '416599': ('MI', 'DEM'), '416600': ('MI', 'REP'), '416602': ('MN', 'DEM'), '416603': ('MN', 'REP'), '416605': ('RI', 'DEM'), '416606': ('RI', 'REP'), '416608': ('SC', 'DEM'), '416609': ('SC', 'REP'), '416611': ('SD', 'DEM'), '416612': ('MS', 'DEM'), '416613': ('SD', 'REP'), '416614': ('MS', 'REP'), '416617': ('TN', 'DEM'), '416618': ('TN', 'REP'), '416619': ('MO', 'DEM'), '416621': ('MO', 'REP'), '416623': ('DC', 'DEM'), '416624': ('DC', 'REP'), '416632': ('TX', 'DEM'), '416634': ('TX', 'REP'), '416636': ('UT', 'DEM'), '416637': ('UT', 'REP'), '416639': ('VT', 'DEM'), '416640': ('VT', 'REP'), '416642': ('VA', 'DEM'), '416643': ('VA', 'REP'), '416645': ('WA', 'DEM'), '416646': ('WA', 'REP'), '416648': ('WV', 'DEM'), '416649': ('WV', 'REP'), '416651': ('WI', 'REP'), '416653': ('WI', 'DEM'), '416654': ('WY', 'DEM'), '416655': ('WY', 'REP'), '417861': ('FL', 'DEM'), '417866': ('FL', 'REP')} def calls(d=.02): o = m = 0 so = set() sm = set() for k, v in probs.items(): if v > 1-d: o += votes[k]; so.add(k) elif v <= d: m += votes[k]; sm.add(k) return (o, set(so), m, set(sm)) if __name__ == '__main__': print time.asctime() print fullrecalc() print print "Prob Obama McCain" csm = set(); cso = set() for k in reversed((.5, .2, .15, .1, .05, .02, .01,.005,.002,.001)): o, so, m, sm = calls(k) if o or m: k = 100 * k if k >= 1: sk = "%3d" % k else: sk = "%3.1f" % k print "%s%% %5d %6d" % (sk, o, m) if so - cso: print "\t Obama:", " ".join(sorted(so - cso)) cso |= so if sm - csm: print "\tMcCain:", " ".join(sorted(sm - csm)) csm |= sm