In [73]:
# Define a helper function to call into Wpad procedures via the Crossbar.io REST bridge

#rpc_url = "https://demo.crossbar.io/call"
rpc_url = "http://localhost:8080/call"

import requests, json

def call(proc, *args, **kwargs):
    payload = {
        "procedure": proc,
        "args": args,
        "kwargs": kwargs
    }
    r = requests.post(rpc_url, data=json.dumps(payload),
                      headers={'content-type': 'application/json'})
    res = r.json()
    return res['args'][0]

In [82]:
series = call("io.crossbar.demo.wpad.objstore.get", "series", 12)

fig, ax = plt.subplots(1,3)
fig.set_size_inches(15, 5)

ax[0].scatter(series['T'], series['A4'], facecolor='r')
ax[1].scatter(series['T'], series['A5'], facecolor='g')
ax[2].scatter(series['T'], series['A6'], facecolor='b')


Out[82]:
<matplotlib.collections.PathCollection at 0x2b7f3cd67b90>

In [ ]:
# Get a data series previously stored from the Wpad Lab UI: a dict with keys "A0" - "A6" and "T"
# is returned with arrays of ints with the analog sensors readings (0-1023) and the user defined
# target value (if any was provided)

series = call("io.crossbar.demo.wpad.objstore.get", "series", 11)
series

plt.scatter(np.array(series['T']) + 0.0, np.log(np.array(series['A0'])), facecolor='r')
plt.scatter(np.array(series['T']) + 0.2, np.log(np.array(series['A1'])), facecolor='g')
plt.scatter(np.array(series['T']) + 0.4, np.log(np.array(series['A2'])), facecolor='b')
plt.scatter(np.array(series['T']) + 0.6, np.log(np.array(series['A3'])), facecolor='y')

In [33]:
# Import libs and activate inline plotting

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

In [34]:
# Define a Wpad data series plotting helper

def plot_series(series, offset=4, length=3):
    fig, ax = plt.subplots()
    ind = np.arange(len(series['T']))
    width, colors = 0.3, ['r', 'b', 'g', 'grey']
    for i in range(length):
        ax.bar(ind + width * i, series['A{}'.format(i + offset)], width, color=colors[i])

In [35]:
# Plot a Wpad data series: each of the three colors corresponds to one of the analog sensors

plot_series(series, 0, 4)



In [6]:
# Load a second data series

series2 = call("io.crossbar.demo.wpad.objstore.get", "series", 3)
series2


Out[6]:
{u'A0': [0, 1, 0, 1, 1, 1, 1, 0],
 u'A1': [0, 1, 3, 1, 0, 1, 0, 1],
 u'A2': [1, 0, 1, 1, 2, 1, 0, 0],
 u'A3': [0, 0, 1, 0, 1, 1, 1, 0],
 u'A4': [100, 184, 248, 282, 285, 259, 225, 131],
 u'A5': [49, 169, 330, 424, 429, 337, 232, 57],
 u'A6': [34, 79, 147, 210, 219, 168, 111, 42],
 u'T': [0, 1, 2, 3, 3, 2, 1, 0]}

In [7]:
plot_series(series2)



In [62]:
# Fit a logit model to the first data series

from sklearn import linear_model

#X = np.matrix([series['A4'], series['A5'], series['A6']]).transpose()
X = np.matrix([series['A0'], series['A1'], series['A2'], series['A3']]).transpose()
y = series['T']

clf = linear_model.LogisticRegression(C=1.)
clf.fit(X, y)


Out[62]:
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, penalty='l2', random_state=None, tol=0.0001)

In [9]:
# Check prediction error on second data series

from sklearn import metrics

X2 = np.matrix([series2['A4'], series2['A5'], series2['A6']]).transpose()
y2 = series2['T']

pred = clf.predict(X2)
s = metrics.mean_absolute_error(y2, pred)
s


Out[9]:
0.125

In [38]:
# Dynamically access current sensor values (A4, A5, A6)

#call("io.crossbar.demo.wpad.1.get_last")["values"][4:7]
call("io.crossbar.demo.wpad.1.get_last")["values"][0:4]


Out[38]:
[910, 811, 758, 838]

In [42]:
# Predict target var based on current sensor values

values = call("io.crossbar.demo.wpad.1.get_last")["values"][0:4]
#values = call("io.crossbar.demo.wpad.1.get_last")["values"][4:7]
clf.predict(values)[0]


Out[42]:
4

In [63]:
# Here are the model coefficients:

model = [list(row) for row in clf.coef_]
model


Out[63]:
[[-0.84095693327755106,
  -0.8555280101698387,
  -0.86740689627310907,
  -0.75379988603016423],
 [-0.55403866439951344,
  -0.24914321492523414,
  -0.11372052480074477,
  -0.57320198421601565],
 [0.099091959277148284,
  -0.29621544962693624,
  -0.37415509108887351,
  0.092196092671921276],
 [0.28432207234535112,
  -0.36469268156398749,
  0.50724431506418377,
  -0.22105992741310987],
 [0.034839834608043081,
  0.62214402283062742,
  -0.019091934760316256,
  0.42492659884672124]]

In [41]:
# Upload the model coefficients

call("io.crossbar.demo.wpad.objstore.save", "model", model)


Out[41]:
5

In [29]:
series = call("io.crossbar.demo.wpad.objstore.get", "series", 6)
series


Out[29]:
{u'A0': [673, 721, 770, 820, 801, 749, 679, 732, 786, 818, 807, 744, 676],
 u'A1': [359, 370, 440, 527, 503, 431, 369, 385, 464, 527, 514, 457, 383],
 u'A2': [367, 642, 750, 808, 797, 707, 370, 656, 776, 856, 827, 733, 375],
 u'A3': [570, 645, 715, 771, 753, 696, 563, 643, 694, 761, 759, 688, 566],
 u'A4': [2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1],
 u'A5': [1, 2, 2, 2, 2, 2, 1, 1, 2, 3, 2, 2, 2],
 u'A6': [1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 1, 2],
 u'T': [0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0]}

In [36]:
fig, axs = plt.subplots(2,2)
fig.set_size_inches(10, 10)
axs[0][0].scatter(series['T'], series['A0'])
axs[1][0].scatter(series['T'], series['A1'])
axs[0][1].scatter(series['T'], series['A2'])
axs[1][1].scatter(series['T'], series['A3'])


Out[36]:
<matplotlib.collections.PathCollection at 0x2b7f3c024b10>

In [70]:
series = call("io.crossbar.demo.wpad.objstore.get", "series", 11)

models = {'A0': [95.848065712341779,
  57.032814042098209,
  1764.5904494757251,
  435.92186791749396],
 'A1': [128.56762208699021,
  -11.380319227995484,
  122.05944140193783,
  19.048998297515116],
 'A2': [181.76143053727156,
  -117.68360457435577,
  34.545688484235406,
  15.763720159554804],
 'A3': [133.63762724427815,
  28.026724373199375,
  92.727258995959318,
  39.821232916028038]}

In [67]:
for key in ['A0', 'A1', 'A2', 'A3']:
    series[key] = (np.exp((np.array(series[key]) - models[key][1]) / models[key][0]) - models[key][3]) / models[key][2]

In [71]:
from sklearn import linear_model

#X = np.matrix([series['A4'], series['A5'], series['A6']]).transpose()
X = np.matrix([series['A0'], series['A1'], series['A2'], series['A3']]).transpose()
y = series['T']

clf = linear_model.LogisticRegression(C=1.)
clf.fit(X, y)


Out[71]:
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, penalty='l2', random_state=None, tol=0.0001)

In [72]:
model = [list(row) for row in clf.coef_]
model


Out[72]:
[[0.14381581017582307,
  -0.16421294454497481,
  -0.17543025905124576,
  0.082173566951153132],
 [0.0090292121114863861,
  -0.0069278210283592592,
  -0.0047886204245969457,
  -0.0029647384239719688],
 [-0.00014054496072987059,
  -0.00076106916981090987,
  -0.0020040959784665639,
  0.0012269473841927058],
 [-0.0082443173435014661,
  0.0046031309905016108,
  0.011672697631687948,
  -0.0069803753859394796],
 [-0.050520768460331836,
  0.03285477349822967,
  0.023052753822433589,
  0.0052827373251393816]]

In [ ]: