In [1]:
import numpy as np
import pandas as pd
from IPython.core.display import HTML
import matplotlib as mtp
from pylab import *

from datetime import datetime, timedelta
from StringIO import StringIO

In [16]:
import pymc as mc

In [2]:
parse = lambda x: datetime.strptime(x, '%Y%m%d %H%M')

In [3]:
april = pd.read_csv('data/round2-4.csv', names=['date', 'time', 'direction', 'index', 'source', 'destination', 'distance', 'speed'], parse_dates=[[0, 1]], date_parser=parse, header=None)
may = pd.read_csv('data/round2-5.csv', names=['date', 'time', 'direction', 'index', 'source', 'destination', 'distance', 'speed'], parse_dates=[[0, 1]], date_parser=parse, header=None)
june = pd.read_csv('data/round2-6.csv', names=['date', 'time', 'direction', 'index', 'source', 'destination', 'distance', 'speed'], parse_dates=[[0, 1]], date_parser=parse, header=None)

In [5]:
april = april.sort(['direction', 'index', 'date_time'])

In [6]:
april['time'] = april.date_time.apply(lambda x : "{:02d}{:02d}".format(x.hour, x.minute))

In [37]:
df = april[(april['direction'] == 'D') & (april['index'] == 1) & (april['time'] == '0800')]
scatter(range(30), df.speed)
plt.ylim(0, 120)
plt.xlim(0, 30)


Out[37]:
(0, 30)

In [67]:
p = mc.Uniform("p", 0, 1)

assignment = mc.Categorical("assignment", [p, 1-p], size=len(df.speed)) 

taus = 1.0/mc.Uniform("stds", 0, 100, size=2)**2
mus = mc.Uniform("mus", 0, 120, size=2)

In [69]:
taus.value


Out[69]:
array([ 0.00012317,  0.00317192])

In [49]:
@mc.deterministic 
def mu_i(assignment=assignment, mus=mus):
    return mus[assignment]

@mc.deterministic
def tau_i(assignment=assignment, taus=taus):
    return taus[assignment]

In [53]:
observations = mc.Normal("obs", mu_i, tau_i, value=df.speed, observed=True)
model = mc.Model([p, assignment, mus, taus])

In [60]:
mcmc = mc.MCMC(model)
mcmc.sample(500000)


[****************100%******************]  500000 of 500000 complete

In [61]:
mu_trace = mcmc.trace('mus')[:]
std_trace = mcmc.trace('stds')[:]
p_trace = mcmc.trace('p')[:]

In [64]:
figsize( 12.5, 9 )
subplot(311)

colors = ["#348ABD", "#A60628"]
lw = 1

plot(mu_trace[:,0], label = "trace of mu 0", c = colors[0], lw = lw)
plot(mu_trace[:,1], label = "trace of mu 1", c = colors[1], lw = lw)
plt.title( "Traces of unknowns" )
leg = plt.legend(loc = "upper right")

subplot(312)
plot(std_trace[:,0], label = "trace of standard deviation of cluster 0", c = colors[0], lw=lw)
plot(std_trace[:,1], label = "trace of standard deviation of cluster 1", c = colors[1], lw=lw)
leg = plt.legend(loc = "upper right")

subplot(313)
plot( p_trace, label = "$p$: frequency of assignment to mu 0", color = "#467821", lw = lw)
leg = plt.legend(loc = "upper right")



In [66]:
figsize( 11.0, 4 )

_i = [ 1,2,3,0]
for i in range(2):
    subplot(2, 2, _i[ 2*i ])
    plt.title("Posterior of mu %d"%i)
    plt.hist(mu_trace[:, i], color = colors[i],bins = 30, histtype="stepfilled" )
    
    subplot(2, 2, _i[ 2*i + 1])
    plt.title("Posterior of standard deviation %d"%i)
    plt.hist( std_trace[:, i], color = colors[i],  bins = 30, histtype="stepfilled"  )
    
plt.tight_layout()



In [70]:
plt.hist(p_trace, bins=30, histtype="stepfilled")


Out[70]:
(array([    2,     1,    18,    48,   105,   260,   517,   952,  1772,
        3276,  5312,  8369, 13416, 18518, 25650, 34045, 39888, 47732,
       52868, 53741, 51629, 45740, 37334, 26563, 16984,  9237,  4187,
        1398,   383,    55]),
 array([ 0.31835958,  0.33969666,  0.36103375,  0.38237084,  0.40370792,
        0.42504501,  0.4463821 ,  0.46771919,  0.48905627,  0.51039336,
        0.53173045,  0.55306753,  0.57440462,  0.59574171,  0.6170788 ,
        0.63841588,  0.65975297,  0.68109006,  0.70242714,  0.72376423,
        0.74510132,  0.76643841,  0.78777549,  0.80911258,  0.83044967,
        0.85178676,  0.87312384,  0.89446093,  0.91579802,  0.9371351 ,
        0.95847219]),
 <a list of 1 Patch objects>)

In [71]:
weekdays = pd.concat([april, may, june])
weekdays['weekday'] = weekdays['date_time'].apply(lambda x: x.weekday())
weekdays = weekdays[weekdays['weekday'] < 5]
weekdays['time'] = weekdays.date_time.apply(lambda x: "{:02d}{:02d}".format(x.hour, x.minute))

In [75]:
road_101 = weekdays[(weekdays['direction'] == 'D') & (weekdays['index'] == 1)]

In [81]:
display(HTML(road_101[100::288].to_html()))


date_time destination direction distance index source speed time weekday
100 2013-04-01 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 13.03 0820 0
388 2013-04-02 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 11.16 0820 1
676 2013-04-03 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 16.73 0820 2
964 2013-04-04 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 12.11 0820 3
1252 2013-04-05 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 20.47 0820 4
2116 2013-04-08 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 12.25 0820 0
2404 2013-04-09 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 15.63 0820 1
2692 2013-04-10 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 11.59 0820 2
717220 2013-04-11 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 44.31 0820 3
717508 2013-04-12 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 24.85 0820 4
718372 2013-04-15 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 20.18 0820 0
718660 2013-04-16 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 12.57 0820 1
718948 2013-04-17 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 17.13 0820 2
719236 2013-04-18 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 17.26 0820 3
719524 2013-04-19 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 18.21 0820 4
1443268 2013-04-22 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 19.45 0820 0
1443556 2013-04-23 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 30.27 0820 1
1443844 2013-04-24 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 45.73 0820 2
1741921 2013-04-25 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 12.75 0820 3
1742209 2013-04-26 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 21.49 0820 4
1743073 2013-04-29 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 8.40 0820 0
1743361 2013-04-30 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 15.35 0820 1
100 2013-05-01 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 82.66 0820 2
388 2013-05-02 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 27.55 0820 3
676 2013-05-03 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 65.13 0820 4
1540 2013-05-06 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 11.37 0820 0
1828 2013-05-07 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 15.63 0820 1
2116 2013-05-08 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 12.50 0820 2
2404 2013-05-09 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 16.86 0820 3
2692 2013-05-10 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 29.24 0820 4
722427 2013-05-13 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 24.15 0820 0
722715 2013-05-14 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 11.43 0820 1
723003 2013-05-15 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 12.11 0820 2
723291 2013-05-16 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 18.29 0820 3
723579 2013-05-17 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 51.17 0820 4
724443 2013-05-20 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 31.38 0820 0
1437201 2013-05-21 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 10.77 0820 1
1437489 2013-05-22 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 21.39 0820 2
1437777 2013-05-23 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 14.82 0820 3
1438065 2013-05-24 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 19.63 0820 4
1438929 2013-05-27 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 24.85 0820 0
1439217 2013-05-28 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 18.21 0820 1
1439505 2013-05-29 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 24.28 0820 2
1439793 2013-05-30 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 15.46 0820 3
1440081 2013-05-31 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 25.43 0820 4
676 2013-06-03 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 14.23 0820 0
964 2013-06-04 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 23.88 0820 1
1252 2013-06-05 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 18.69 0820 2
1540 2013-06-06 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 71.64 0820 3
1828 2013-06-07 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 15.75 0820 4
2692 2013-06-10 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 22.04 0820 0
725860 2013-06-11 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 15.63 0820 1
726148 2013-06-12 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 18.69 0820 2
726436 2013-06-13 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 23.23 0820 3
726724 2013-06-14 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 26.21 0820 4
727588 2013-06-17 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 22.04 0820 0
727876 2013-06-18 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 23.75 0820 1
728164 2013-06-19 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 10.11 0820 2
728452 2013-06-20 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 22.04 0820 3
1451620 2013-06-21 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 12.50 0820 4
1452484 2013-06-24 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 28.85 0820 0
1452772 2013-06-25 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 18.21 0820 1
1453060 2013-06-26 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 15.46 0820 2
1453348 2013-06-27 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 36.74 0820 3
1959652 2013-06-28 08:20:00 잠원IC D 1194 1 한남IC고속도로진입점 22.50 0820 4

In [497]:
n_var = 2
timepoint = 103

In [498]:
print len(road_101[100::288])


65

In [499]:
road_p = mc.Uniform("road_p", 0, 1)

road_assign = mc.Categorical("road_assign", [road_p, 1-road_p], size=road_101[0::288].shape[0])
print road_assign.value


[1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0
 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0]

In [500]:
road_p = mc.Uniform("road_p", 0, 1)

road_assign = mc.Categorical("road_assign", [road_p, 1-road_p], size=road_101[::288].shape[0])

road_taus = 1.0/mc.Uniform("road_stds", 0, 100, size=2*n_var)**2
road_mus = mc.Uniform("road_mus", 0, 120, size=2*n_var)

@mc.deterministic 
def road_mu_i(road_assign=road_assign, road_mus=road_mus):
    return np.transpose([road_mus[road_assign+i] for i in range(0,2*n_var,2)])

@mc.deterministic
def road_tau_i(road_assign=road_assign, road_taus=road_taus):
    return np.transpose([road_taus[road_assign+i] for i in range(0, 2*n_var, 2)])

#FIXME hardcoded road_101 zip
road_obs = mc.Normal("road_obs", road_mu_i, road_tau_i, value=zip(*[road_101[timepoint+i::288].speed for i in range(n_var)]), observed=True)
road_model = mc.Model([road_p, road_assign, road_mus, road_taus, road_obs])

In [501]:
road_mcmc = mc.MCMC(road_model)
%time road_mcmc.sample(500000, 400000)


[****************100%******************]  500000 of 500000 complete CPU times: user 240.92 s, sys: 0.50 s, total: 241.42 s
Wall time: 240.28 s

In [502]:
road_mu_trace = road_mcmc.trace('road_mus')[:]
road_std_trace = road_mcmc.trace('road_stds')[:]
road_p_trace = road_mcmc.trace('road_p')[:]

In [503]:
print road_mu_trace[:,3]


[ 47.53381039  46.79303455  46.79303455 ...,  28.4931774   28.4931774
  28.4931774 ]

In [504]:
figsize( 11.0, 4 )

subplot(2, 2, 1)
plt.title("Posterior of mu 0 at {}:{}".format(timepoint*5/60, timepoint*5%60))
plt.hist(road_mu_trace[:, 0],bins = 30, color = colors[0], histtype="stepfilled")
subplot(2, 2, 2)
plt.hist(road_mu_trace[:, 1],bins = 30, color = colors[0], histtype="stepfilled")
plt.title("Posterior of mu 1 at {}:{}".format(timepoint*5/60, timepoint*5%60))
subplot(2, 2, 3)
plt.title("Posterior of mu 0 at {}:{}".format((timepoint+1)*5/60, (timepoint+1)*5%60))
plt.hist(road_mu_trace[:, 2],bins = 30, color = colors[0], histtype="stepfilled")
subplot(2, 2, 4)
plt.hist(road_mu_trace[:, 3],bins = 30, color = colors[0], histtype="stepfilled")
plt.title("Posterior of mu 1 at {}:{}".format((timepoint+1)*5/60, (timepoint+1)*5%60))

plt.tight_layout()



In [505]:
print len(road_mu_trace)


100000

3개를 제출할 때, 1st model을 가정한 경우, 2nd model을 가정한 경우, 양쪽 모델을 모두 고려한 경우를 제출하는 게 좋지 않을까?


In [506]:
plt.hist(road_p_trace, bins=30, histtype="stepfilled")


Out[506]:
(array([   5,   11,   23,   50,   59,   85,  176,  315,  484,  740, 1228,
       1731, 2564, 3423, 4067, 5113, 6477, 7077, 7776, 7494, 7469, 6828,
       6074, 5980, 5542, 5572, 5807, 4810, 2490,  530]),
 array([ 0.60820707,  0.62115387,  0.63410068,  0.64704748,  0.65999429,
        0.67294109,  0.6858879 ,  0.6988347 ,  0.71178151,  0.72472831,
        0.73767512,  0.75062192,  0.76356873,  0.77651553,  0.78946234,
        0.80240914,  0.81535595,  0.82830275,  0.84124956,  0.85419636,
        0.86714317,  0.88008997,  0.89303678,  0.90598358,  0.91893039,
        0.93187719,  0.944824  ,  0.9577708 ,  0.97071761,  0.98366441,
        0.99661122]),
 <a list of 1 Patch objects>)

In [507]:
road_assign_trace = road_mcmc.trace('road_assign')

In [481]:
road_assign_trace[1]


Out[481]:
array([1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0,
       1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1])

In [484]:
road_assign_trace[:].shape


Out[484]:
(10000, 65)

In [508]:
generated_road = []

for i, j  in enumerate(road_assign_trace[:]):
    generated_road.extend(np.transpose(mc.rnormal([road_mu_trace[i][j + k] for k in range(0, 2*n_var, 2)], [1.0/road_std_trace[i][j + k] for k in range(0, 2*n_var, 2)])))

In [510]:
print generated_road[0]


[ 19.71378856  20.80689844]

음수인 결과가 나오면 안 된다. 모델을 수정해야 한다.


In [511]:
def loss_func(guessed_speed, true_speed):
    loss = np.abs(true_speed - guessed_speed)

    return np.sum(loss, 1)

In [512]:
expected_loss = lambda guess: loss_func(guess, np.array(generated_road)).mean()

In [289]:
import scipy.optimize as sop

In [513]:
%time min_res = sop.fmin(expected_loss, x0=road_101[timepoint:timepoint+n_var].speed)
print min_res


Optimization terminated successfully.
         Current function value: 12.111969
         Iterations: 38
         Function evaluations: 73
CPU times: user 104.36 s, sys: 6.54 s, total: 110.90 s
Wall time: 111.00 s
[ 17.35735816  17.31473505]

In [530]:
road_101 = weekdays[(weekdays['direction'] == 'D') & (weekdays['index'] == 10)]

answers = []
for timepoint in range(0, 288-1):
    n_var = 2
    
    road_p = mc.Uniform("road_p", 0, 1)
    
    road_assign = mc.Categorical("road_assign", [road_p, 1-road_p], size=road_101[::288].shape[0])
    
    road_taus = 1.0/mc.Uniform("road_stds", 0, 100, size=2*n_var)**2
    road_mus = mc.Uniform("road_mus", 0, 120, size=2*n_var)
    
    @mc.deterministic
    def road_mu_i(road_assign=road_assign, road_mus=road_mus):
        return np.transpose([road_mus[road_assign+i] for i in range(0,2*n_var,2)])
    
    @mc.deterministic
    def road_tau_i(road_assign=road_assign, road_taus=road_taus):
        return np.transpose([road_taus[road_assign+i] for i in range(0, 2*n_var, 2)])
    
    #FIXME hardcoded road_101 zip
    road_obs = mc.Normal("road_obs", road_mu_i, road_tau_i, value=zip(*[road_101[timepoint+i::288].speed for i in range(n_var)]), observed=True)
    road_model = mc.Model([road_p, road_assign, road_mus, road_taus, road_obs])
    
    road_mcmc = mc.MCMC(road_model)
    %time road_mcmc.sample(50000, 40000)
    
    road_mu_trace = road_mcmc.trace('road_mus')[:]
    road_std_trace = road_mcmc.trace('road_stds')[:]
    road_p_trace = road_mcmc.trace('road_p')[:]
    road_assign_trace = road_mcmc.trace('road_assign')[:]
    
    generated_road = []
    
    for i, j  in enumerate(road_assign_trace):
        generated_road.extend(np.transpose(mc.rnormal([road_mu_trace[i][j + k] for k in range(0, 2*n_var, 2)], [1.0/road_std_trace[i][j + k] for k in range(0, 2*n_var, 2)])))
    
    def loss_func(guessed_speed, true_speed):
        loss = np.abs(true_speed - guessed_speed)
    
        return np.sum(loss, 1)
    
    expected_loss = lambda guess: loss_func(guess, np.array(generated_road)).mean()    
    
    %time min_res = sop.fmin(expected_loss, x0=road_101[timepoint:timepoint+n_var].speed)
    answers.append(min_res)
    
print answers


[****************100%******************]  50000 of 50000 complete CPU times: user 23.49 s, sys: 0.06 s, total: 23.56 s
Wall time: 23.41 s
Optimization terminated successfully.
         Current function value: 5.712865
         Iterations: 41
         Function evaluations: 79
CPU times: user 13.50 s, sys: 0.62 s, total: 14.11 s
Wall time: 14.13 s
[array([ 95.38877657,  94.66492354]), array([ 94.88893395,  96.00227189]), array([ 94.63329615,  95.86018881]), array([ 95.90145292,  96.67268409]), array([ 96.63577337,  97.40231277]), array([ 98.17581106,  98.28795565]), array([ 97.61011582,  98.62526345]), array([ 98.53848853,  99.2698639 ]), array([ 100.20573768,  100.43768015]), array([ 100.5962195 ,  100.83637556]), array([ 100.62217636,  101.50286339]), array([ 101.49768405,  101.34723364]), array([ 100.98675689,  102.27944594]), array([ 102.34403412,  102.10387578]), array([ 102.00725389,  101.97356694]), array([ 101.90708408,  101.6991782 ]), array([ 102.50506872,  102.77441647]), array([ 102.01315193,  102.66646105]), array([ 102.7549174,  103.3108694]), array([ 103.79160654,  103.60207745]), array([ 102.6808631 ,  102.81173576]), array([ 102.79244875,  103.30524168]), array([ 103.34944566,  102.92624933]), array([ 102.96515877,  103.47937046]), array([ 103.51712018,  103.34746427]), array([ 103.83568169,  102.38853487]), array([ 104.34824805,  105.00971027]), array([ 104.85430682,  103.47808791]), array([ 103.4510626 ,  103.55415406]), array([ 103.00833167,  103.12615953]), array([ 103.17253056,  103.4360893 ]), array([ 103.56298816,  104.39870148]), array([ 104.22415148,  104.60638092]), array([ 105.62068033,  105.78924535]), array([ 105.82169764,  106.8074769 ]), array([ 106.52351057,  106.45662555]), array([ 104.99119346,  104.46904078]), array([ 105.93649451,  104.51448975]), array([ 103.73480018,  105.33574983]), array([ 106.26025168,  106.41716617]), array([ 106.45719621,  106.08107228]), array([ 104.90303011,  104.89170362]), array([ 104.76956338,  104.5645854 ]), array([ 105.65854376,  105.92874785]), array([ 101.56459898,  104.71823365]), array([ 104.47636434,  105.25340743]), array([ 106.47668373,  106.20177312]), array([ 105.78246039,  105.44010206]), array([ 105.72142637,  106.61896948]), array([ 106.43090387,  106.1537222 ]), array([ 105.43610352,  105.24116149]), array([ 105.97810455,  105.81617661]), array([ 105.26088871,  104.82274366]), array([ 104.88806086,  105.26466913]), array([ 106.28252932,  106.58222416]), array([ 105.47091183,  105.37251887]), array([ 105.37299625,  105.1170965 ]), array([ 106.15211373,  106.53743293]), array([ 106.1736091 ,  105.40447599]), array([ 104.3717969 ,  105.08618605]), array([ 106.12670575,  106.93849707]), array([ 106.70458482,  106.50692604]), array([ 104.88946835,  105.7976371 ]), array([ 105.94229665,  106.98578624]), array([ 106.777147  ,  106.55619808]), array([ 108.11181206,  107.97772886]), array([ 107.59409416,  107.9126498 ]), array([ 108.14199499,  107.97554893]), array([ 107.94054115,  107.82868019]), array([ 108.12933556,  106.34519328]), array([ 105.95445442,  105.75682027]), array([ 106.64683907,  105.65417339]), array([ 105.22527687,  104.15541379]), array([ 104.05617121,  104.15787001]), array([ 104.09111278,  103.20956818]), array([ 103.26352567,  101.66688389]), array([ 101.41698963,   74.22958368]), array([ 99.89725613,  99.1151167 ]), array([ 100.20478971,   99.01665221]), array([ 98.87864047,  97.73022249]), array([ 97.37826971,  96.77307496]), array([ 96.77842828,  96.22729408]), array([ 96.1600158 ,  95.16070442]), array([ 95.24556219,  94.95793781]), array([ 95.00676958,  94.00496131]), array([ 94.09878292,  93.71056324]), array([ 93.59050954,  93.92108303]), array([ 93.78609135,  93.80008463]), array([ 94.01221448,  93.27590445]), array([ 93.29245147,  94.00509399]), array([ 94.01020282,  93.65867419]), array([ 93.66602902,  94.46091422]), array([ 94.46864545,  94.52811966]), array([ 94.40736899,  94.97813292]), array([ 95.00449614,  94.8927596 ]), array([ 94.83896771,  94.94446726]), array([ 94.94458249,  94.96735787]), array([ 94.97503588,  95.31809285]), array([ 95.33545817,  95.05306749]), array([ 94.95138914,  94.93880301]), array([ 94.99832459,  94.76710754]), array([ 94.92230083,  95.7271821 ]), array([ 95.52556509,  95.35818029]), array([ 94.95403169,  94.35645091]), array([ 94.40945934,  94.11084394]), array([ 94.05184438,  94.19064633]), array([ 94.20530513,  94.59116135]), array([ 94.64383816,  94.06003239]), array([ 94.04939462,  92.87908558]), array([ 92.88267139,  92.31031756]), array([ 92.32542965,  91.85960254]), array([ 91.87222626,  90.96688715]), array([ 90.99318555,  90.31830321]), array([ 90.36499043,  89.46918438]), array([ 89.46899871,  88.81403803]), array([ 88.81612439,  88.55572072]), array([ 88.5672753 ,  88.52363895]), array([ 88.24752179,  88.23617492]), array([ 88.23463056,  88.35991966]), array([ 88.1958702 ,  87.90996989]), array([ 87.50298398,  87.44842777]), array([ 87.95502713,  87.93640459]), array([ 87.99747911,  88.05480233]), array([ 87.9039384 ,  87.25523495]), array([ 87.05617524,  87.02702656]), array([ 87.00943409,  86.82882053]), array([ 86.93357008,  86.25543197]), array([ 85.96534883,  85.79193671]), array([ 85.88573828,  85.90671482]), array([ 85.85235351,  85.72303311]), array([ 85.30055037,  85.04161047]), array([ 85.63576029,  85.64626275]), array([ 85.72310342,  85.98697237]), array([ 86.07403328,  86.22967564]), array([ 86.08553515,  86.09709655]), array([ 86.05871808,  86.34872315]), array([ 85.9750414 ,  85.92175561]), array([ 86.33443091,  86.20084016]), array([ 86.23086642,  86.42495415]), array([ 85.60206677,  84.84928872]), array([ 85.1642552 ,  85.53886338]), array([ 86.04526031,  86.1912938 ]), array([ 86.40084149,  86.54120403]), array([ 86.50431882,  86.67506251]), array([ 86.70388366,  87.05910018]), array([ 87.03456293,  87.06500309]), array([ 87.08164316,  87.87498925]), array([ 88.29070755,  88.16348921]), array([ 87.88235761,  87.96926896]), array([ 87.96480806,  88.25352975]), array([ 88.07358588,  88.01610169]), array([ 88.2215655 ,  87.84926877]), array([ 87.79473854,  87.91388153]), array([ 88.02418804,  88.03832963]), array([ 88.10753733,  88.43699832]), array([ 88.43860436,  88.49069522]), array([ 88.37785921,  88.60759729]), array([ 88.61576004,  88.80561458]), array([ 88.77071149,  88.5251532 ]), array([ 88.53209705,  89.26823011]), array([ 89.20654535,  89.08355808]), array([ 89.08252951,  88.6394536 ]), array([ 88.70791205,  88.327321  ]), array([ 88.62040353,  88.35623438]), array([ 87.76890182,  87.42612234]), array([ 87.40856546,  88.23666731]), array([ 88.28348821,  88.04186753]), array([ 88.14354557,  88.27414993]), array([ 88.24582339,  88.21861223]), array([ 88.15453921,  88.58067517]), array([ 88.56697191,  88.63819849]), array([ 88.65050602,  88.50594635]), array([ 88.52174655,  88.26693272]), array([ 88.21784012,  88.01832293]), array([ 88.03834611,  88.27692908]), array([ 88.22384625,  88.30441817]), array([ 88.49719321,  88.89471707]), array([ 88.57590841,  88.54857029]), array([ 89.09976161,  89.48011926]), array([ 89.55377926,  89.27070656]), array([ 88.96183151,  88.88910933]), array([ 88.9843794 ,  89.18929944]), array([ 89.35721979,  89.61638204]), array([ 89.37033297,  88.8015199 ]), array([ 88.93160413,  89.10019275]), array([ 89.15894184,  89.10845643]), array([ 88.80766869,  89.08971257]), array([ 88.98141894,  88.7238441 ]), array([ 88.57530217,  88.37673978]), array([ 88.68918115,  89.03692888]), array([ 88.83777711,  88.9353364 ]), array([ 88.89160335,  89.53878439]), array([ 89.42553077,  89.00238841]), array([ 89.09040462,  88.88424854]), array([ 89.16037844,  89.11172783]), array([ 89.11012158,  89.08855092]), array([ 88.92668771,  89.01660492]), array([ 89.24863752,  89.71823532]), array([ 89.94894432,  89.16476167]), array([ 88.95697562,  88.45166842]), array([ 88.62711157,  89.10634874]), array([ 89.07156691,  89.34861331]), array([ 89.28961051,  89.45718063]), array([ 89.79021575,  89.70826046]), array([ 89.52882872,  89.4506904 ]), array([ 89.39049318,  89.62662384]), array([ 89.85899454,  89.81301957]), array([ 89.91100499,  90.30758292]), array([ 90.205199 ,  90.0677158]), array([ 89.83342509,  89.60254128]), array([ 89.53124036,  88.86168417]), array([ 88.74788332,  88.69103296]), array([ 88.69425681,  88.19659139]), array([ 88.23029222,  88.77203156]), array([ 88.88980358,  89.02391083]), array([ 88.97713417,  88.38136673]), array([ 88.18907165,  87.47174571]), array([ 87.62060789,  87.87436549]), array([ 87.77373143,  87.83124179]), array([ 88.04627712,  87.79828178]), array([ 87.70640531,  87.32299515]), array([ 87.06267352,  86.92154353]), array([ 86.97090635,  86.65035226]), array([ 86.63747554,  86.84495281]), array([ 87.11083459,  87.26744645]), array([ 86.75294158,  86.79769498]), array([ 86.86613757,  86.32124094]), array([ 87.07860291,  87.48677961]), array([ 86.93096441,  85.7066001 ]), array([ 85.74803191,  86.54497856]), array([ 86.55279069,  86.77888958]), array([ 86.80296839,  86.46944929]), array([ 86.77688407,  86.6323132 ]), array([ 85.63182557,  84.63920074]), array([ 85.09888069,  84.39247812]), array([ 84.43828552,  84.4614903 ]), array([ 84.2589536,  83.7432337]), array([ 83.44972514,  82.66815822]), array([ 82.62264177,  82.01915343]), array([ 82.0039591 ,  82.27387983]), array([ 82.37488429,  82.62195937]), array([ 82.96076328,  82.25192023]), array([ 82.43552001,  82.32471195]), array([ 82.4431285 ,  82.79285666]), array([ 83.05569477,  82.95168564]), array([ 82.77351905,  82.65861618]), array([ 82.53751756,  83.22157495]), array([ 83.19399571,  83.39834577]), array([ 83.40163499,  83.89736908]), array([ 83.91972086,  84.45030419]), array([ 84.47130035,  84.076975  ]), array([ 84.29339851,  83.91531178]), array([ 83.89290983,  83.84796283]), array([ 83.89079272,  85.04126114]), array([ 84.72332819,  86.16242182]), array([ 86.09119244,  85.47474966]), array([ 85.82611567,  85.70787453]), array([ 85.71553354,  85.61099054]), array([ 84.81648456,  84.88884225]), array([ 84.98232326,  84.71385277]), array([ 85.35502981,  85.63885168]), array([ 85.6706779 ,  85.96831527]), array([ 85.90444653,  85.8275294 ]), array([ 85.91437131,  86.32871761]), array([ 84.44330762,  43.2003344 ]), array([ 85.27751195,  84.59715273]), array([ 84.72675946,  84.72633775]), array([ 83.93456297,  83.07553198]), array([ 82.80103079,  82.9430086 ]), array([ 82.98319058,  81.9858239 ]), array([ 83.32746891,  82.60382155]), array([ 81.15321621,  80.65983093]), array([ 80.61987155,  80.21213257]), array([ 80.73115301,  81.29521047]), array([ 81.08988496,  81.61125456]), array([ 81.80502086,  83.54406476]), array([ 83.82764448,  84.86100026]), array([ 84.9401727 ,  85.64387694]), array([ 85.32443824,  86.39797513]), array([ 86.31643529,  86.78578007]), array([ 87.11151933,  88.24637919]), array([ 88.08426195,  88.4549417 ]), array([ 88.67622429,  89.10801706]), array([ 89.35477689,  90.05066531]), array([ 89.46224932,  89.82532967]), array([ 89.48858364,  90.32286651]), array([ 90.95576747,  91.93288865])]

In [531]:
final_answer = [(a[1]+b[0])/2 for a, b in zip(answers, answers[1:])]
final_answer.insert(0, answers[0][0])
final_answer.append(answers[-1][1])
print final_answer


[95.388776570724914, 94.776928746490739, 95.317784019380525, 95.880820864152639, 96.654228731903359, 97.789061915495722, 97.949035737173176, 98.581875990214442, 99.7378007908423, 100.51694982631068, 100.72927595510893, 101.5002737201474, 101.16699526372454, 102.31174002845455, 102.05556483380266, 101.94032550905837, 102.10212345888584, 102.3937841975536, 102.71068922640322, 103.55123796636644, 103.14147027114549, 102.80209225331096, 103.32734366805673, 102.94570405254157, 103.49824531937895, 103.59157297987727, 103.3683914600139, 104.93200854566643, 103.46457525490423, 103.28124286275423, 103.14934504330154, 103.49953873014931, 104.31142647696883, 105.11353062692879, 105.80547149669425, 106.66549373513098, 105.723909501908, 105.20276764449562, 104.12464496464231, 105.79800075294145, 106.43718119278975, 105.49205119463781, 104.83063350213185, 105.11156457866772, 103.74667341493799, 104.59729899333431, 105.865045579742, 105.99211675583803, 105.5807642174274, 106.5249366792228, 105.79491286206738, 105.60963302001377, 105.53853266302976, 104.85540225897284, 105.77359922524387, 106.02656799506622, 105.37275756037577, 105.63460511721399, 106.35552101494787, 104.88813644689111, 105.60644590111939, 106.82154094434765, 105.69819719111277, 105.86996687682897, 106.88146661973907, 107.33400506978681, 107.78591150790422, 108.02732239445422, 107.95804504198563, 107.97900787522008, 106.14982384942195, 106.20182967116111, 105.43972512602951, 104.10579250295351, 104.12449139416594, 103.23654692331425, 101.54193675813698, 87.063419901084643, 99.65995320429964, 98.947646338474499, 97.554246101331898, 96.775751621936024, 96.193654941905407, 95.203133307505396, 94.98235369613019, 94.051872115065322, 93.650536389650171, 93.853587193727876, 93.906149556154816, 93.284177958166097, 94.007648405943854, 93.662351604042172, 94.464779834989542, 94.467744324101062, 94.991314531873627, 94.865863654961572, 94.944524876645431, 94.971196876731014, 95.326775512864586, 95.002228314164682, 94.968563803459531, 94.844704185644446, 95.626373594567383, 95.156105992505672, 94.382955123838656, 94.081344161884317, 94.197975729295507, 94.617499755584319, 94.054713505059667, 92.880878485358664, 92.317873604957867, 91.865914396264259, 90.980036351031202, 90.341646819540045, 89.469091542446805, 88.815081209042916, 88.561498006916665, 88.385580367324224, 88.235402740346643, 88.277894929052451, 87.7064769365427, 87.701727450925816, 87.966941850131235, 87.979370368345357, 87.155705095564201, 87.018230323502536, 86.881195306611431, 86.110390400822496, 85.83883749092611, 85.879534166754155, 85.511791743358643, 85.338685380957116, 85.684683085275267, 86.03050282711672, 86.157605394935359, 86.077907314548725, 86.161882271474283, 86.128093259712045, 86.215853289392868, 86.01351046051488, 85.006771959437657, 85.792061844769805, 86.296067644869638, 86.522761426406731, 86.689473082136772, 87.046831556865101, 87.073323121339001, 88.082848397766952, 88.022923409574759, 87.96703851017233, 88.16355781089726, 88.118833598792236, 87.822003655319975, 87.969034786403796, 88.072933480215468, 88.437801343602899, 88.434277214464117, 88.611678664658911, 88.788163032661885, 88.528625125206531, 89.237387732037007, 89.083043797831877, 88.673682820911495, 88.473862268637035, 88.062568098401712, 87.417343902639971, 88.260077764053065, 88.092706552456747, 88.259986659230648, 88.186575716645436, 88.573823540756649, 88.644352257826995, 88.513846451542875, 88.242386417479068, 88.028334515851824, 88.250387666404947, 88.400805691201356, 88.73531274226913, 88.824165950015455, 89.516949260762743, 89.1162690312226, 88.936744361519303, 89.273259613424784, 89.493357508387135, 88.866562015119214, 89.129567292546312, 88.958062556266242, 89.035565758605983, 88.649573135930737, 88.532960462895559, 88.937352996123963, 88.913469876352451, 89.482157583075917, 89.046396518217932, 89.022313487829535, 89.110924708245832, 89.007619313990006, 89.132621221182461, 89.833589817982102, 89.060868648690047, 88.539389997145818, 89.088957820841671, 89.319111910925315, 89.623698187615702, 89.618544589605136, 89.420591793046555, 89.742809188524291, 89.862012282250234, 90.256390961085245, 89.95057044544123, 89.566890821360502, 88.804783741926855, 88.692644887911939, 88.213441802745848, 88.830917570047589, 89.000522498479597, 88.285219192843158, 87.546176798521614, 87.824048457697927, 87.938759455201833, 87.752343549009282, 87.192834334951527, 86.946224940219111, 86.643913900247469, 86.977893696991288, 87.010194013506862, 86.831916273667559, 86.699921924935595, 87.208872012532623, 85.727316007354617, 86.548884625337777, 86.790928980037663, 86.623166678414776, 86.132069383835216, 84.869040714586163, 84.415381819707321, 84.360221952697444, 83.596479419898486, 82.645399994515572, 82.011556264898758, 82.32438205956916, 82.791361322331696, 82.343720119070028, 82.383920221565972, 82.924275713189232, 82.862602347056495, 82.598066868031665, 83.207785328696474, 83.399990380186864, 83.908544972317387, 84.460802271329413, 84.185186753785729, 83.904110804518723, 83.869377779264028, 84.882294662203023, 86.126807133132914, 85.650432665781494, 85.711704032092598, 85.213737548488922, 84.935582753003089, 85.034441287713207, 85.654764788659691, 85.936380903554237, 85.870950354490731, 85.386012611293609, 64.238923178366377, 84.66195609525731, 84.330450359178869, 82.93828138856189, 82.963099592981976, 82.656646402965094, 81.878518878835365, 80.639851241184928, 80.471642790383754, 81.192547717212946, 81.708137709472339, 83.685854620402154, 84.900586476270732, 85.48415759089832, 86.357205209351093, 86.948649697715467, 88.165320567025361, 88.565582996088196, 89.231396972409271, 89.756457314843999, 89.656956657266136, 90.639316989567774, 91.932888647486408]

In [ ]: