#!/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