%matplotlib inline
import json as json
import numpy as np
import matplotlib.pylab as plt
from statsmodels.tsa.api import ARMA, ARIMA
import statsmodels.api as sm
file_path = '/home/david/git/MIC-XRD-Polymer/visualization/Vis_data.json'
with open(file_path) as json_file:
data_dicts = json.load(json_file)
keys = data_dicts[0].keys()
pt_key = keys[5]
strain_key = keys[4]
sample_key = keys[3]
stress_key = keys[2]
samples = []
strains = []
pc_points = []
stresses = []
for pt_dict in data_dicts:
samples.append(pt_dict[sample_key])
strains.append(pt_dict[strain_key])
stresses.append(pt_dict[stress_key])
samples_numbers = sorted(set(samples))
sample_dict = {}
for sample in samples_numbers:
sub_data_dict = {}
sub_strains = []
sub_stress = []
for strain, stress, samp, pts in zip(strains, stresses, samples, data_dicts):
if samp == sample:
if len(sub_data_dict) == 0:
sub_data_dict['points'] = np.array(pts[pt_key])[..., None]
else:
sub_data_dict['points'] = np.concatenate((sub_data_dict['points'], np.array(pts[pt_key])[..., None]), axis=-1)
sub_strains.append(strain)
sub_stress.append(stress)
sub_data_dict['strains'] = np.array(sub_strains)
sub_data_dict['stresses'] = np.array(sub_stress)
sample_dict[sample] = sub_data_dict
sample0 = sample_dict[samples_numbers[0]]
sample1 = sample_dict[samples_numbers[1]]
sample2 = sample_dict[samples_numbers[2]]
stresses0 = sample0['stresses']
strains0 = sample0['strains']
points0 = sample0['points'][0]
stresses1 = sample1['stresses']
strains1 = sample1['strains']
points1 = sample1['points'][0]
stresses2 = sample2['stresses']
strains2 = sample2['strains']
points2 = sample2['points'][0]
p = 4
exo0 = np.concatenate((np.zeros(p), strains0))
exo = np.concatenate((stresses0[:, None], strains0[:, None]))
model = ARIMA(endog=points0 - points0[0], order=(p, 0, 0), exog=exo0[p:])
results = model.fit()
print(results.summary())
ARMA Model Results ============================================================================== Dep. Variable: y No. Observations: 184 Model: ARMA(4, 0) Log Likelihood 48.941 Method: css-mle S.D. of innovations 0.181 Date: Thu, 12 Mar 2015 AIC -83.881 Time: 11:23:09 BIC -61.377 Sample: 0 HQIC -74.760 ============================================================================== coef std err z P>|z| [95.0% Conf. Int.] ------------------------------------------------------------------------------ const -9.9415 5.122 -1.941 0.054 -19.980 0.097 x1 17.8994 3.317 5.396 0.000 11.397 24.401 ar.L1.y 1.0544 0.069 15.366 0.000 0.920 1.189 ar.L2.y 0.4320 0.105 4.101 0.000 0.226 0.638 ar.L3.y -0.1146 0.105 -1.090 0.277 -0.321 0.091 ar.L4.y -0.3773 0.070 -5.420 0.000 -0.514 -0.241 Roots ============================================================================= Real Imaginary Modulus Frequency ----------------------------------------------------------------------------- AR.1 1.0156 -0.0476j 1.0167 -0.0075 AR.2 1.0156 +0.0476j 1.0167 0.0075 AR.3 -1.1674 -1.0959j 1.6012 -0.3800 AR.4 -1.1674 +1.0959j 1.6012 0.3800 -----------------------------------------------------------------------------
strains_exo = np.concatenate((np.zeros(p), strains2))
stresses_exo = np.concatenate((np.zeros(p), stresses1))
print stresses1.shape
(241,)
print points2.shape
print points2[0]
y_points2 = model.predict(params=results.params, exog=strains_exo, dynamic=True) + points2[0]
(245,) -17.0737094879
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-169-67bfaaa71dbe> in <module>() 1 print points2.shape 2 print points2[0] ----> 3 y_points2 = model.predict(params=results.params, exog=strains_exo, dynamic=True) + points2[0] /home/david/anaconda/lib/python2.7/site-packages/statsmodels/tsa/arima_model.pyc in predict(self, params, start, end, exog, dynamic) 637 return _arma_predict_out_of_sample(params, out_of_sample, resid, 638 k_ar, self.k_ma, self.k_trend, self.k_exog, endog, exog, --> 639 start, method) 640 641 predictedvalues = _arma_predict_in_sample(start, end, endog, resid, /home/david/anaconda/lib/python2.7/site-packages/statsmodels/tsa/arima_model.pyc in _arma_predict_out_of_sample(params, steps, errors, p, q, k_trend, k_exog, endog, exog, start, method) 233 exparams, arparams, 234 maparams, steps, method, --> 235 exog) 236 237 forecast = np.zeros(steps) /home/david/anaconda/lib/python2.7/site-packages/statsmodels/tsa/arima_model.pyc in _get_predict_out_of_sample(endog, p, q, k_trend, k_exog, start, errors, trendparam, exparams, arparams, maparams, steps, method, exog) 204 #TODO: technically should only hold for MLE not 205 # conditional model. See #274. --> 206 X = lagmat(np.dot(exog, exparams), p, original='in', trim='both') 207 mu = trendparam * (1 - arparams.sum()) 208 # arparams were reversed in unpack for ease later ValueError: shapes (249,) and (1,) not aligned: 249 (dim 0) != 1 (dim 0)
plt.figure()
plt.plot(y_points2, label='Predicted')
plt.plot(points2, label='Actual')
plt.legend(loc=2)
<matplotlib.legend.Legend at 0x7f73d6d21fd0>
y_points0 = model.predict(params=results.params, exog=exo0) + points0[0]
plt.figure()
plt.plot(y_points0, label='Predicted')
plt.plot(points0, label='Actual')
plt.legend(loc=2)
<matplotlib.legend.Legend at 0x7f73d6bf5b50>
l = 0
plt.plot(points0[:] - y_points0[l:])
[<matplotlib.lines.Line2D at 0x7f73d6ba9690>]