In [16]:
import numpy as np
import openpyxl
import dateutil
import datetime
import pickle
import pystan
import seaborn as sns
from hashlib import md5
%matplotlib inline

In [ ]:
# %load model.stan
data {
  int<lower=0> NPartidos;
  int<lower=0> NSondeos;
  int<lower=0> NEmpresas;
  int<lower=0> NDates;
  real<lower=0> sondeos[NSondeos, NPartidos];
  int empresa[NSondeos];
  vector[NSondeos] sigmaSondeo;
  int date[NSondeos];
  vector<lower=0>[NPartidos] alpha;
}
parameters {
  real<lower=0.01> sigma[NPartidos];
  simplex[NPartidos] theta[NDates];
  real house_free[NEmpresas-1,NPartidos];
}

transformed parameters {
  real house[NEmpresas,NPartidos];
  for (i in 1:NPartidos) {
    for(k in 1:(NEmpresas-1)) {
      house[k,i] <- house_free[k,i];
    }
    house[NEmpresas,i] <- -sum(house_free[:,i]);
  }
}

model {
  sigma ~ normal(0, 0.05);

  for (i in 1:NDates) {
    theta[i] ~ dirichlet(alpha);
  }

  for (i in 2:NDates) {
    theta[i] ~ normal(theta[i-1], sigma);
  }

  for (i in 1:NPartidos) {
    for (j in 1:NEmpresas) {
      house[j,i] ~ normal(0, 0.05);
    }
  }

  for (i in 1:NSondeos) {
    for (j in 1:NPartidos) {
      if (empresa[i] == 11)        
        sondeos[i,j] ~ normal(theta[date[i],j], sigmaSondeo[i]);
      else
        sondeos[i,j] ~ normal(theta[date[i],j] + house[empresa[i],j], sigmaSondeo[i]);
    }
  }

}

In [4]:
def stan_cache(model_code, model_name=None, **kwargs):
    """Use just as you would `stan`"""
    code_hash = md5(model_code.encode('ascii')).hexdigest()
    if model_name is None:
        cache_fn = 'cached-model-{}.pkl'.format(code_hash)
    else:
        cache_fn = 'cached-{}-{}.pkl'.format(model_name, code_hash)
    try:
        sm = pickle.load(open(cache_fn, 'rb'))
    except:
        sm = pystan.StanModel(model_code=model_code)
        with open(cache_fn, 'wb') as f:
            pickle.dump(sm, f)
    else:
        print("Using cached StanModel")
    return sm.sampling(**kwargs)

def toenglish(s):
    spanish = ['ene', 'abr', 'ago', 'dic', 'de mayo de']
    english = ['jan', 'apr', 'aug', 'dec', 'may']
    for (j, month) in enumerate(spanish):
        s = s.replace(month, english[j])
    return s

def getPercentage(s):
    if (s[0] not in ['0','1','2','3','4','5','6','7','8','9']):
        return 0
    else:
        if (s.find('%') != -1):
            return float(s.split('%')[0].replace(',','.')) / 100.0
        else:
            return float(s.split('\n')[0].replace(',','.')) / 100.0

def getSigma(s):
    left = s.find('(')
    right = s.find(')')    
    if (s[left+1:right] in ['?', '-']):
        return 0.03
    else:
        return 1.0 / np.sqrt(float(s[left+1:right]))

def weeksDifference(d1, d2):
    monday1 = (d1 - datetime.timedelta(days=d1.weekday()))
    monday2 = (d2 - datetime.timedelta(days=d2.weekday()))

    return int((monday2 - monday1).days / 7)

In [42]:
wb = openpyxl.load_workbook("data/sondeos2015.xlsx")
ws = wb.active

empresas = ['GAD3', 'Encuestamos', 'GESOP', 'Metroscopia', 'Celeste-Tel',' Demoscopia Servicios', 'Simple Lógica', 'CIS', 'TNS Demoscopia', 'Invymark', 'Resultados de las elecciones']

empresaSondeoAll = []
sondeosAll = []
dateAll = []
sigmaAll = []

otrosPartidos = ['F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'R']

nSondeos = 302
for i in range(120):#nSondeos):
    empresa = ws['A{0}'.format(i+2)].value
    for (loop, emp) in enumerate(empresas):
        if (empresa.find(emp) != -1):
            empresaSondeo = loop

    if (empresaSondeo == 10):
        sigma = 0.0001
    else:
        sigma = getSigma(empresa)

    PP = getPercentage(ws['C{0}'.format(i+2)].value)
    PSOE = getPercentage(ws['D{0}'.format(i+2)].value)
    IU = getPercentage(ws['E{0}'.format(i+2)].value)
    PODEMOS = getPercentage(ws['P{0}'.format(i+2)].value)
    CS = getPercentage(ws['Q{0}'.format(i+2)].value)

    total = PP + PSOE + IU + PODEMOS + CS
    otros = 1.0 - total    

    tmp = ws['B{0}'.format(i+2)].value
    if (isinstance(tmp, datetime.date)):
        date = tmp
    else:
        date = dateutil.parser.parse(toenglish(ws['B{0}'.format(i+2)].value.split('-')[-1].lower()))    

    tmp = date.year + (date.month-1.0) / 12.0

    sondeo = [PP, PSOE, IU, PODEMOS, CS, otros]

    sondeosAll.append(sondeo)
    sigmaAll.append(sigma)
    
    dateAll.append(date)
    empresaSondeoAll.append(empresaSondeo+1)

    print ("{0} - {1} {8} - s={9:4.2f} : PP={2:4.2f} - PSOE={3:4.2f} - IU={4:4.2f} - PODEMOS={5:4.2f} - CS={6:4.2f} - Resto={7:4.2f}".format(i, 
        empresas[empresaSondeo], PP*100, PSOE*100, IU*100, PODEMOS*100, CS*100, otros*100, date, sigma*100))

sondeosAll = np.array(sondeosAll)

nSondeos, nPartidos = sondeosAll.shape
nEmpresas = len(empresas)

# Compute week of every poll
weekAll = []
for i in range(nSondeos):
    weekAll.append(weeksDifference(dateAll[nSondeos-1], dateAll[i]) + 1)

nDates = max(weekAll)

# Reverse all lists
sondeosAll = sondeosAll[::-1]
empresaSondeoAll.reverse()
weekAll.reverse()
sigmaAll.reverse()

dictionary = {'NPartidos': nPartidos, 'NSondeos': nSondeos, 'NEmpresas': nEmpresas, 'NDates': nDates, 'empresa': empresaSondeoAll, 'sondeos': sondeosAll, 
'date': weekAll, 'sigmaSondeo': sigmaAll, 'alpha': np.ones(nPartidos)*0.3}


0 - GAD3 2016-04-29 00:00:00 - s=3.54 : PP=29.30 - PSOE=22.60 - IU=1.30 - PODEMOS=17.00 - CS=13.90 - Resto=15.90
1 - Metroscopia 2016-04-28 00:00:00 - s=2.89 : PP=29.00 - PSOE=20.30 - IU=0.00 - PODEMOS=18.10 - CS=16.00 - Resto=16.60
2 - Invymark 2016-04-29 00:00:00 - s=2.89 : PP=28.70 - PSOE=19.40 - IU=0.00 - PODEMOS=20.70 - CS=15.40 - Resto=15.80
3 - Invymark 2016-04-15 00:00:00 - s=3.00 : PP=28.60 - PSOE=20.40 - IU=0.00 - PODEMOS=19.20 - CS=15.80 - Resto=16.00
4 - Invymark 2016-04-14 00:00:00 - s=3.24 : PP=30.70 - PSOE=21.20 - IU=0.00 - PODEMOS=21.90 - CS=14.50 - Resto=11.70
5 - TNS Demoscopia 2016-04-14 00:00:00 - s=3.16 : PP=29.40 - PSOE=22.30 - IU=0.00 - PODEMOS=17.50 - CS=15.80 - Resto=15.00
6 - CIS 2016-01-11 00:00:00 - s=2.00 : PP=28.80 - PSOE=20.50 - IU=3.70 - PODEMOS=13.20 - CS=13.30 - Resto=20.50
7 - GAD3 2016-01-21 00:00:00 - s=3.53 : PP=30.10 - PSOE=21.30 - IU=1.10 - PODEMOS=20.00 - CS=13.40 - Resto=14.10
8 - GAD3 2016-01-20 00:00:00 - s=3.16 : PP=31.40 - PSOE=23.50 - IU=1.20 - PODEMOS=19.50 - CS=11.80 - Resto=12.60
9 - Metroscopia 2016-01-17 00:00:00 - s=4.47 : PP=29.00 - PSOE=21.10 - IU=0.00 - PODEMOS=22.50 - CS=16.60 - Resto=10.80
10 - Invymark 2016-01-11 00:00:00 - s=4.47 : PP=30.80 - PSOE=20.80 - IU=0.00 - PODEMOS=21.60 - CS=12.60 - Resto=14.20
11 - Invymark 2015-12-31 00:00:00 - s=4.47 : PP=35.00 - PSOE=21.00 - IU=0.00 - PODEMOS=21.50 - CS=4.00 - Resto=18.50
12 - Resultados de las elecciones 2015-12-20 00:00:00 - s=0.01 : PP=28.72 - PSOE=22.01 - IU=3.67 - PODEMOS=20.66 - CS=13.93 - Resto=11.01
13 - GESOP 2015-12-19 00:00:00 - s=3.24 : PP=26.60 - PSOE=20.10 - IU=4.00 - PODEMOS=21.50 - CS=15.30 - Resto=12.50
14 - GESOP 2015-12-19 00:00:00 - s=3.54 : PP=26.60 - PSOE=20.80 - IU=4.40 - PODEMOS=20.10 - CS=15.50 - Resto=12.60
15 - GESOP 2015-12-18 00:00:00 - s=3.78 : PP=25.80 - PSOE=21.40 - IU=3.80 - PODEMOS=20.40 - CS=16.00 - Resto=12.60
16 - GESOP 2015-12-17 00:00:00 - s=3.78 : PP=26.20 - PSOE=21.00 - IU=3.70 - PODEMOS=20.40 - CS=15.90 - Resto=12.80
17 - GESOP 2015-12-16 00:00:00 - s=3.92 : PP=25.40 - PSOE=20.60 - IU=4.50 - PODEMOS=19.60 - CS=16.30 - Resto=13.60
18 - GESOP 2015-12-15 00:00:00 - s=3.78 : PP=25.40 - PSOE=20.90 - IU=4.80 - PODEMOS=19.00 - CS=17.20 - Resto=12.70
19 - GAD3 2015-12-14 00:00:00 - s=1.77 : PP=28.60 - PSOE=21.00 - IU=3.90 - PODEMOS=17.90 - CS=17.60 - Resto=11.00
20 - Encuestamos 2015-12-14 00:00:00 - s=2.24 : PP=26.90 - PSOE=22.80 - IU=4.00 - PODEMOS=18.60 - CS=17.00 - Resto=10.70
21 - Encuestamos 2015-12-14 00:00:00 - s=0.85 : PP=24.50 - PSOE=21.30 - IU=3.80 - PODEMOS=19.90 - CS=16.50 - Resto=14.00
22 - GESOP 2015-12-12 00:00:00 - s=3.54 : PP=25.20 - PSOE=20.80 - IU=0.00 - PODEMOS=18.40 - CS=18.00 - Resto=17.60
23 - GAD3 2015-12-11 00:00:00 - s=1.17 : PP=28.30 - PSOE=21.20 - IU=4.10 - PODEMOS=17.70 - CS=18.10 - Resto=10.60
24 - Metroscopia 2015-12-10 00:00:00 - s=1.89 : PP=25.30 - PSOE=21.00 - IU=5.00 - PODEMOS=19.10 - CS=18.20 - Resto=11.40
25 - Metroscopia 2015-12-09 00:00:00 - s=3.14 : PP=26.70 - PSOE=17.00 - IU=6.30 - PODEMOS=19.10 - CS=23.20 - Resto=7.70
26 - Encuestamos 2015-12-07 00:00:00 - s=2.36 : PP=26.70 - PSOE=24.90 - IU=4.90 - PODEMOS=16.40 - CS=16.20 - Resto=10.90
27 - Celeste-Tel 2015-12-04 00:00:00 - s=2.89 : PP=28.20 - PSOE=23.10 - IU=3.80 - PODEMOS=16.20 - CS=18.80 - Resto=9.90
28 - Metroscopia 2015-11-29 00:00:00 - s=2.89 : PP=22.70 - PSOE=22.50 - IU=5.20 - PODEMOS=17.10 - CS=22.60 - Resto=9.90
29 - Celeste-Tel 2015-11-27 00:00:00 - s=2.89 : PP=28.10 - PSOE=23.90 - IU=3.60 - PODEMOS=15.30 - CS=18.60 - Resto=10.50
30 - Encuestamos 2015-11-24 00:00:00 - s=2.36 : PP=26.60 - PSOE=25.40 - IU=6.20 - PODEMOS=16.00 - CS=15.10 - Resto=10.70
31 - Encuestamos 2015-11-26 00:00:00 - s=2.58 : PP=28.30 - PSOE=21.20 - IU=4.10 - PODEMOS=15.50 - CS=19.90 - Resto=11.00
32 - Celeste-Tel 2015-11-23 00:00:00 - s=2.89 : PP=27.50 - PSOE=23.90 - IU=3.40 - PODEMOS=15.10 - CS=18.90 - Resto=11.20
33 - Simple Lógica 2015-11-17 00:00:00 - s=2.40 : PP=26.50 - PSOE=20.40 - IU=4.50 - PODEMOS=16.90 - CS=21.90 - Resto=9.80
34 - Encuestamos 2015-11-17 00:00:00 - s=2.36 : PP=26.20 - PSOE=25.70 - IU=6.80 - PODEMOS=15.40 - CS=15.00 - Resto=10.90
35 - CIS 2015-11-16 00:00:00 - s=0.76 : PP=28.60 - PSOE=20.80 - IU=3.60 - PODEMOS=15.70 - CS=19.00 - Resto=12.30
36 - GAD3 2015-11-20 00:00:00 - s=2.89 : PP=28.50 - PSOE=22.80 - IU=4.40 - PODEMOS=15.60 - CS=16.40 - Resto=12.30
37 - TNS Demoscopia 2015-11-09 00:00:00 - s=3.16 : PP=26.30 - PSOE=19.60 - IU=4.70 - PODEMOS=15.00 - CS=20.20 - Resto=14.20
38 - TNS Demoscopia 2015-11-07 00:00:00 - s=2.36 : PP=29.00 - PSOE=22.30 - IU=5.30 - PODEMOS=13.40 - CS=18.10 - Resto=11.90
39 - GAD3 2015-11-04 00:00:00 - s=3.00 : PP=28.10 - PSOE=22.40 - IU=4.60 - PODEMOS=13.20 - CS=17.70 - Resto=14.00
40 - TNS Demoscopia 2015-11-02 00:00:00 - s=3.16 : PP=26.70 - PSOE=19.30 - IU=4.40 - PODEMOS=15.40 - CS=19.80 - Resto=14.40
41 - Metroscopia 2015-11-02 00:00:00 - s=2.67 : PP=23.50 - PSOE=21.00 - IU=6.30 - PODEMOS=17.00 - CS=22.50 - Resto=9.70
42 - Metroscopia 2015-10-26 00:00:00 - s=3.16 : PP=27.00 - PSOE=18.20 - IU=6.10 - PODEMOS=13.80 - CS=20.30 - Resto=14.60
43 - TNS Demoscopia 2015-10-26 00:00:00 - s=3.16 : PP=26.00 - PSOE=20.50 - IU=0.00 - PODEMOS=14.60 - CS=19.20 - Resto=19.70
44 - Encuestamos 2015-10-24 00:00:00 - s=2.36 : PP=23.50 - PSOE=26.30 - IU=7.70 - PODEMOS=15.40 - CS=15.20 - Resto=11.90
45 - Invymark 2015-10-19 00:00:00 - s=2.89 : PP=28.60 - PSOE=23.90 - IU=3.00 - PODEMOS=13.50 - CS=18.30 - Resto=12.70
46 - GAD3 2015-10-19 00:00:00 - s=1.96 : PP=27.70 - PSOE=21.80 - IU=5.10 - PODEMOS=14.10 - CS=17.60 - Resto=13.70
47 - TNS Demoscopia 2015-10-12 00:00:00 - s=3.16 : PP=26.90 - PSOE=21.00 - IU=4.30 - PODEMOS=14.20 - CS=17.80 - Resto=15.80
48 - CIS 2015-10-12 00:00:00 - s=2.00 : PP=29.10 - PSOE=25.30 - IU=4.70 - PODEMOS=10.80 - CS=14.70 - Resto=15.40
49 - Invymark 2015-10-05 00:00:00 - s=2.89 : PP=27.60 - PSOE=24.60 - IU=2.00 - PODEMOS=16.10 - CS=17.20 - Resto=12.50
50 - Metroscopia 2015-10-01 00:00:00 - s=2.36 : PP=23.40 - PSOE=23.50 - IU=5.60 - PODEMOS=14.10 - CS=21.50 - Resto=11.90
51 - TNS Demoscopia 2015-10-05 00:00:00 - s=3.16 : PP=27.00 - PSOE=21.90 - IU=4.50 - PODEMOS=14.80 - CS=16.50 - Resto=15.30
52 - TNS Demoscopia 2015-10-02 00:00:00 - s=3.33 : PP=33.80 - PSOE=24.80 - IU=4.20 - PODEMOS=11.20 - CS=11.70 - Resto=14.30
53 - Encuestamos 2015-09-23 00:00:00 - s=2.50 : PP=26.20 - PSOE=26.10 - IU=6.10 - PODEMOS=17.90 - CS=11.00 - Resto=12.70
54 - TNS Demoscopia 2015-09-14 00:00:00 - s=3.10 : PP=29.00 - PSOE=22.00 - IU=4.20 - PODEMOS=16.50 - CS=13.20 - Resto=15.10
55 - Metroscopia 2015-09-11 00:00:00 - s=2.36 : PP=23.40 - PSOE=24.60 - IU=5.00 - PODEMOS=18.60 - CS=16.10 - Resto=12.30
56 - Metroscopia 2015-09-11 00:00:00 - s=2.36 : PP=31.70 - PSOE=25.60 - IU=3.90 - PODEMOS=18.20 - CS=10.50 - Resto=10.10
57 - Metroscopia 2015-09-07 00:00:00 - s=3.02 : PP=31.60 - PSOE=27.10 - IU=4.50 - PODEMOS=12.10 - CS=9.90 - Resto=14.80
58 - TNS Demoscopia 2015-09-07 00:00:00 - s=3.02 : PP=28.60 - PSOE=22.50 - IU=3.90 - PODEMOS=16.00 - CS=12.70 - Resto=16.30
59 - TNS Demoscopia 2015-08-31 00:00:00 - s=2.99 : PP=28.50 - PSOE=22.80 - IU=4.20 - PODEMOS=16.20 - CS=12.30 - Resto=16.00
60 - TNS Demoscopia 2015-08-29 00:00:00 - s=3.33 : PP=32.10 - PSOE=24.90 - IU=4.40 - PODEMOS=12.10 - CS=10.40 - Resto=16.10
61 - TNS Demoscopia 2015-08-27 00:00:00 - s=3.16 : PP=28.30 - PSOE=25.90 - IU=2.60 - PODEMOS=15.40 - CS=11.30 - Resto=16.50
62 - TNS Demoscopia 2015-08-24 00:00:00 - s=3.00 : PP=27.30 - PSOE=22.60 - IU=4.50 - PODEMOS=16.30 - CS=13.20 - Resto=16.10
63 - TNS Demoscopia 2015-08-17 00:00:00 - s=3.03 : PP=27.00 - PSOE=22.90 - IU=4.50 - PODEMOS=16.50 - CS=12.90 - Resto=16.20
64 - Simple Lógica 2015-08-11 00:00:00 - s=3.13 : PP=29.90 - PSOE=21.40 - IU=5.40 - PODEMOS=16.50 - CS=17.10 - Resto=9.70
65 - TNS Demoscopia 2015-08-10 00:00:00 - s=3.04 : PP=26.40 - PSOE=22.40 - IU=4.70 - PODEMOS=16.80 - CS=13.40 - Resto=16.30
66 - TNS Demoscopia 2015-08-07 00:00:00 - s=3.02 : PP=31.40 - PSOE=27.60 - IU=4.60 - PODEMOS=11.90 - CS=9.90 - Resto=14.60
67 - Encuestamos 2015-08-23 00:00:00 - s=2.58 : PP=27.50 - PSOE=26.00 - IU=5.70 - PODEMOS=19.40 - CS=8.60 - Resto=12.80
68 - TNS Demoscopia 2015-08-03 00:00:00 - s=3.05 : PP=25.70 - PSOE=22.90 - IU=5.00 - PODEMOS=16.90 - CS=13.60 - Resto=15.90
69 - TNS Demoscopia 2015-07-23 00:00:00 - s=2.36 : PP=28.80 - PSOE=24.20 - IU=4.20 - PODEMOS=20.30 - CS=11.10 - Resto=11.40
70 - TNS Demoscopia 2015-07-27 00:00:00 - s=3.16 : PP=26.80 - PSOE=23.00 - IU=4.00 - PODEMOS=17.60 - CS=13.70 - Resto=14.90
71 - Metroscopia 2015-07-22 00:00:00 - s=3.16 : PP=23.10 - PSOE=23.50 - IU=5.60 - PODEMOS=18.10 - CS=16.00 - Resto=13.70
72 - Metroscopia 2015-07-24 00:00:00 - s=2.36 : PP=30.50 - PSOE=25.10 - IU=3.30 - PODEMOS=19.30 - CS=10.60 - Resto=11.20
73 - TNS Demoscopia 2015-07-20 00:00:00 - s=3.28 : PP=27.10 - PSOE=22.60 - IU=2.90 - PODEMOS=18.60 - CS=13.50 - Resto=15.30
74 - TNS Demoscopia 2015-07-13 00:00:00 - s=3.16 : PP=26.10 - PSOE=22.20 - IU=2.80 - PODEMOS=19.10 - CS=13.60 - Resto=16.20
75 - GAD3 2015-07-08 00:00:00 - s=3.16 : PP=29.10 - PSOE=25.50 - IU=3.60 - PODEMOS=15.00 - CS=12.10 - Resto=14.70
76 - Invymark 2015-07-06 00:00:00 - s=2.89 : PP=27.70 - PSOE=23.30 - IU=2.00 - PODEMOS=21.90 - CS=11.50 - Resto=13.60
77 - Encuestamos 2015-07-20 00:00:00 - s=2.58 : PP=26.00 - PSOE=25.40 - IU=4.10 - PODEMOS=21.10 - CS=9.20 - Resto=14.20
78 - CIS 2015-07-09 00:00:00 - s=2.01 : PP=28.20 - PSOE=24.90 - IU=3.70 - PODEMOS=15.70 - CS=11.10 - Resto=16.40
79 - Simple Lógica 2015-07-09 00:00:00 - s=3.10 : PP=26.20 - PSOE=23.10 - IU=5.40 - PODEMOS=14.90 - CS=18.40 - Resto=12.00
80 - Simple Lógica 2015-07-07 00:00:00 - s=3.02 : PP=30.70 - PSOE=27.40 - IU=4.80 - PODEMOS=13.30 - CS=10.20 - Resto=13.60
81 - Metroscopia 2015-07-02 00:00:00 - s=3.16 : PP=23.00 - PSOE=22.50 - IU=4.00 - PODEMOS=21.50 - CS=15.00 - Resto=14.00
82 - Metroscopia 2015-06-27 00:00:00 - s=3.33 : PP=31.20 - PSOE=24.40 - IU=4.40 - PODEMOS=12.50 - CS=11.60 - Resto=15.90
83 - Invymark 2015-06-22 00:00:00 - s=2.89 : PP=25.90 - PSOE=23.00 - IU=1.90 - PODEMOS=23.00 - CS=13.20 - Resto=13.00
84 - Encuestamos 2015-06-20 00:00:00 - s=2.63 : PP=25.70 - PSOE=25.20 - IU=4.30 - PODEMOS=21.40 - CS=9.80 - Resto=13.60
85 - Encuestamos 2015-06-26 00:00:00 - s=2.36 : PP=29.20 - PSOE=24.40 - IU=2.80 - PODEMOS=20.20 - CS=11.80 - Resto=11.60
86 - Encuestamos 2015-06-17 00:00:00 - s=2.36 : PP=27.00 - PSOE=26.10 - IU=4.10 - PODEMOS=20.20 - CS=10.30 - Resto=12.30
87 - TNS Demoscopia 2015-06-15 00:00:00 - s=3.16 : PP=23.80 - PSOE=22.10 - IU=4.40 - PODEMOS=19.20 - CS=15.50 - Resto=15.00
88 - TNS Demoscopia 2015-06-06 00:00:00 - s=3.33 : PP=29.70 - PSOE=24.20 - IU=4.90 - PODEMOS=12.10 - CS=11.60 - Resto=17.50
89 - TNS Demoscopia 2015-06-05 00:00:00 - s=3.02 : PP=29.60 - PSOE=26.80 - IU=4.60 - PODEMOS=13.00 - CS=10.30 - Resto=15.70
90 - Metroscopia 2015-06-02 00:00:00 - s=2.24 : PP=24.50 - PSOE=23.00 - IU=4.10 - PODEMOS=21.50 - CS=13.00 - Resto=13.90
91 - Invymark 2015-05-25 00:00:00 - s=2.89 : PP=25.40 - PSOE=22.00 - IU=2.50 - PODEMOS=21.90 - CS=15.20 - Resto=13.00
92 - Encuestamos 2015-05-15 00:00:00 - s=3.16 : PP=23.00 - PSOE=24.30 - IU=4.80 - PODEMOS=20.70 - CS=14.90 - Resto=12.30
93 - Encuestamos 2015-05-08 00:00:00 - s=3.02 : PP=28.70 - PSOE=26.20 - IU=5.10 - PODEMOS=12.70 - CS=12.00 - Resto=15.30
94 - Encuestamos 2015-04-28 00:00:00 - s=3.16 : PP=22.90 - PSOE=24.00 - IU=4.50 - PODEMOS=21.20 - CS=15.80 - Resto=11.60
95 - Encuestamos 2015-04-20 00:00:00 - s=3.33 : PP=28.60 - PSOE=23.80 - IU=6.80 - PODEMOS=12.90 - CS=12.00 - Resto=15.90
96 - Encuestamos 2015-04-22 00:00:00 - s=3.16 : PP=22.00 - PSOE=21.00 - IU=3.10 - PODEMOS=17.90 - CS=19.40 - Resto=16.60
97 - CIS 2015-04-12 00:00:00 - s=2.01 : PP=25.60 - PSOE=24.30 - IU=4.80 - PODEMOS=16.50 - CS=13.80 - Resto=15.00
98 - GESOP 2015-04-13 00:00:00 - s=3.16 : PP=23.50 - PSOE=19.10 - IU=3.70 - PODEMOS=20.10 - CS=17.70 - Resto=15.90
99 - Simple Lógica 2015-04-13 00:00:00 - s=3.07 : PP=21.30 - PSOE=21.10 - IU=4.10 - PODEMOS=21.30 - CS=20.80 - Resto=11.40
100 - Simple Lógica 2015-04-09 00:00:00 - s=3.00 : PP=26.60 - PSOE=19.70 - IU=4.40 - PODEMOS=20.90 - CS=16.60 - Resto=11.80
101 - Metroscopia 2015-04-09 00:00:00 - s=3.16 : PP=20.80 - PSOE=21.90 - IU=5.00 - PODEMOS=22.10 - CS=19.40 - Resto=10.80
102 - Metroscopia 2015-04-07 00:00:00 - s=3.02 : PP=29.50 - PSOE=26.60 - IU=5.10 - PODEMOS=12.80 - CS=12.10 - Resto=13.90
103 - Metroscopia 2015-04-02 00:00:00 - s=3.33 : PP=29.70 - PSOE=23.50 - IU=6.00 - PODEMOS=14.10 - CS=10.50 - Resto=16.20
104 - Encuestamos 2015-03-26 00:00:00 - s=3.33 : PP=23.70 - PSOE=23.60 - IU=3.80 - PODEMOS=21.70 - CS=14.70 - Resto=12.50
105 - Invymark 2015-03-23 00:00:00 - s=3.00 : PP=26.40 - PSOE=20.30 - IU=3.00 - PODEMOS=20.80 - CS=14.80 - Resto=14.70
106 - Simple Lógica 2015-03-13 00:00:00 - s=3.07 : PP=23.00 - PSOE=18.70 - IU=5.10 - PODEMOS=21.00 - CS=19.70 - Resto=12.50
107 - Simple Lógica 2015-03-09 00:00:00 - s=3.16 : PP=22.00 - PSOE=19.10 - IU=2.90 - PODEMOS=23.40 - CS=18.80 - Resto=13.80
108 - Simple Lógica 2015-03-06 00:00:00 - s=3.02 : PP=30.90 - PSOE=26.40 - IU=4.90 - PODEMOS=12.20 - CS=11.70 - Resto=13.90
109 - Metroscopia 2015-03-04 00:00:00 - s=3.16 : PP=18.60 - PSOE=20.20 - IU=5.60 - PODEMOS=22.50 - CS=18.40 - Resto=14.70
110 - Invymark 2015-02-26 00:00:00 - s=3.00 : PP=27.80 - PSOE=21.50 - IU=3.80 - PODEMOS=23.60 - CS=6.40 - Resto=16.90
111 - Invymark 2015-02-14 00:00:00 - s=3.00 : PP=29.30 - PSOE=22.80 - IU=5.50 - PODEMOS=22.50 - CS=3.30 - Resto=16.60
112 - Invymark 2015-02-12 00:00:00 - s=2.36 : PP=29.60 - PSOE=20.10 - IU=4.10 - PODEMOS=24.60 - CS=7.30 - Resto=14.30
113 - Invymark 2015-02-11 00:00:00 - s=3.16 : PP=22.50 - PSOE=19.50 - IU=3.00 - PODEMOS=24.60 - CS=13.40 - Resto=17.00
114 - Simple Lógica 2015-02-09 00:00:00 - s=3.07 : PP=26.80 - PSOE=17.80 - IU=3.40 - PODEMOS=29.60 - CS=8.50 - Resto=13.90
115 - Simple Lógica 2015-02-06 00:00:00 - s=3.02 : PP=31.90 - PSOE=24.40 - IU=4.50 - PODEMOS=18.30 - CS=6.20 - Resto=14.70
116 - Metroscopia 2015-02-04 00:00:00 - s=3.16 : PP=20.90 - PSOE=18.30 - IU=6.50 - PODEMOS=27.70 - CS=12.20 - Resto=14.40
117 - Invymark 2015-02-02 00:00:00 - s=3.00 : PP=26.10 - PSOE=20.10 - IU=4.30 - PODEMOS=26.00 - CS=3.80 - Resto=19.70
118 - CIS 2015-01-12 00:00:00 - s=2.00 : PP=27.30 - PSOE=22.20 - IU=5.20 - PODEMOS=23.90 - CS=3.10 - Resto=18.30
119 - CIS 2015-01-07 00:00:00 - s=3.16 : PP=27.10 - PSOE=21.40 - IU=4.80 - PODEMOS=26.30 - CS=5.00 - Resto=15.40
/Users/aasensio/miniconda3/lib/python3.5/site-packages/openpyxl/reader/worksheet.py:322: UserWarning: Unknown extension is not supported and will be removed
  warn(msg)

In [78]:
f = open('model.stan', 'r')
model = f.read()
f.close()

In [69]:
out = stan_cache(model, model_name='elecciones', data=dictionary, chains=4)


Using cached StanModel

In [74]:
thetaChain = out.extract('theta')['theta']
theta = np.percentile(thetaChain, [50.0, 50.0-68/2.0, 50.0+68/2], axis=0)
print(theta.shape)
houseChain = out.extract('house')['house']
house = np.percentile(houseChain, [50.0, 50.0-68/2.0, 50.0+68/2], axis=0)
print(house.shape)
sigmaChain = out.extract('sigma')['sigma']
sigma = np.percentile(sigmaChain, [50.0, 50.0-68/2.0, 50.0+68/2], axis=0)
print(sigma.shape)


(3, 69, 6)
(3, 11, 6)
(3, 6)

In [71]:
colors = ["blue", "red", "green", "violet", "orange", "yellow"]
f, ax = pl.subplots(figsize=(15,8))
for i in range(6):
    ax.plot(weekAll, sondeosAll[:,i], '.', color=sns.xkcd_rgb[colors[i]], linewidth=2)
    ax.plot(np.arange(max(weekAll))+1, theta[0,:,i], color=sns.xkcd_rgb[colors[i]], linewidth=2)
    ax.fill_between(np.arange(max(weekAll))+1, theta[1,:,i], theta[2,:,i], color=sns.xkcd_rgb[colors[i]], alpha=0.3)



In [73]:
labelsPartidos = ['PP', 'PSOE', 'IU', 'PODEMOS', 'Cs', 'Otros']
labelsEmpresas = ['GAD3', 'Encuest', 'GESOP', 'Metroscopia', 'Celeste',' Demosc. S.', 'S. Lógica', 'CIS', 'TNS Demos.', 
                  'Invymark', 'Elecciones']


f, ax = pl.subplots(ncols=3, nrows=2, figsize=(12,10))
ax = ax.flatten()
for i in range(6):
    ax[i].plot(np.arange(11), house[0,:,i])
    ax[i].fill_between(np.arange(11), house[1,:,i], house[2,:,i], alpha=0.2)
    ax[i].set_xticks(np.arange(11))
    ax[i].set_xticklabels(labelsEmpresas, rotation=90)
    ax[i].set_title(labelsPartidos[i])



In [77]:
pl.plot(sigmaChain[:,0])


Out[77]:
[<matplotlib.lines.Line2D at 0x122c3edd8>]

In [ ]: