242 lines
8.8 KiB
Python
242 lines
8.8 KiB
Python
'''generate py modules with test cases and results from mlabwrap
|
|
|
|
currently matlab: princomp, garchar, garchma
|
|
'''
|
|
|
|
import numpy as np
|
|
from numpy.testing import assert_array_almost_equal
|
|
from numpy import array
|
|
|
|
|
|
|
|
xo = array([[ -419, -731, -1306, -1294],
|
|
[ 6, 529, -200, -437],
|
|
[ -27, -833, -6, -564],
|
|
[ -304, -273, -502, -739],
|
|
[ 1377, -912, 927, 280],
|
|
[ -375, -517, -514, 49],
|
|
[ 247, -504, 123, -259],
|
|
[ 712, 534, -773, 286],
|
|
[ 195, -1080, 3256, -178],
|
|
[ -854, 75, -706, -1084],
|
|
[-1219, -612, -15, -203],
|
|
[ 550, -628, -483, -2686],
|
|
[ -365, 1376, -1266, 317],
|
|
[ -489, 544, -195, 431],
|
|
[ -656, 854, 840, -723],
|
|
[ 16, -1385, -880, -460],
|
|
[ 258, -2252, 96, 54],
|
|
[ 2049, -750, -1115, 381],
|
|
[ -65, 280, -777, 416],
|
|
[ 755, 82, -806, 1027],
|
|
[ -39, -170, -2134, 743],
|
|
[ -859, 780, 746, -133],
|
|
[ 762, 252, -450, -459],
|
|
[ -941, -202, 49, -202],
|
|
[ -54, 115, 455, 388],
|
|
[-1348, 1246, 1430, -480],
|
|
[ 229, -535, -1831, 1524],
|
|
[ -651, -167, 2116, 483],
|
|
[-1249, -1373, 888, -1092],
|
|
[ -75, -2162, 486, -496],
|
|
[ 2436, -1627, -1069, 162],
|
|
[ -63, 560, -601, 587],
|
|
[ -60, 1051, -277, 1323],
|
|
[ 1329, -1294, 68, 5],
|
|
[ 1532, -633, -923, 696],
|
|
[ 669, 895, -1762, -375],
|
|
[ 1129, -548, 2064, 609],
|
|
[ 1320, 573, 2119, 270],
|
|
[ -213, -412, -2517, 1685],
|
|
[ 73, -979, 1312, -1220],
|
|
[-1360, -2107, -237, 1522],
|
|
[ -645, 205, -543, -169],
|
|
[ -212, 1072, 543, -128],
|
|
[ -352, -129, -605, -904],
|
|
[ 511, 85, 167, -1914],
|
|
[ 1515, 1862, 942, 1622],
|
|
[ -465, 623, -495, -89],
|
|
[-1396, -979, 1758, 128],
|
|
[ -255, -47, 980, 501],
|
|
[-1282, -58, -49, -610],
|
|
[ -889, -1177, -492, 494],
|
|
[ 1415, 1146, 696, -722],
|
|
[ 1237, -224, -1609, -64],
|
|
[ -528, -1625, 231, 883],
|
|
[ -327, 1636, -476, -361],
|
|
[ -781, 793, 1882, 234],
|
|
[ -506, -561, 1988, -810],
|
|
[-1233, 1467, -261, 2164],
|
|
[ 53, 1069, 824, 2123],
|
|
[-1200, -441, -321, 339],
|
|
[ 1606, 298, -995, 1292],
|
|
[-1740, -672, -1628, -129],
|
|
[-1450, -354, 224, -657],
|
|
[-2556, 1006, -706, -1453],
|
|
[ -717, -463, 345, -1821],
|
|
[ 1056, -38, -420, -455],
|
|
[ -523, 565, 425, 1138],
|
|
[-1030, -187, 683, 78],
|
|
[ -214, -312, -1171, -528],
|
|
[ 819, 736, -265, 423],
|
|
[ 1339, 351, 1142, 579],
|
|
[ -387, -126, -1573, 2346],
|
|
[ 969, 2, 327, -134],
|
|
[ 163, 227, 90, 2021],
|
|
[ 1022, -1076, 174, 304],
|
|
[ 1042, 1317, 311, 880],
|
|
[ 2018, -840, 295, 2651],
|
|
[ -277, 566, 1147, -189],
|
|
[ 20, 467, 1262, 263],
|
|
[ -663, 1061, -1552, -1159],
|
|
[ 1830, 391, 2534, -199],
|
|
[ -487, 752, -1061, 351],
|
|
[-2138, -556, -367, -457],
|
|
[ -868, -411, -559, 726],
|
|
[ 1770, 819, -892, -363],
|
|
[ 553, -736, -169, -490],
|
|
[ 388, -503, 809, -821],
|
|
[ -516, -1452, -192, 483],
|
|
[ 493, 2904, 1318, 2591],
|
|
[ 175, 584, -1001, 1675],
|
|
[ 1316, -1596, -460, 1500],
|
|
[ 1212, 214, -644, -696],
|
|
[ -501, 338, 1197, -841],
|
|
[ -587, -469, -1101, 24],
|
|
[-1205, 1910, 659, 1232],
|
|
[ -150, 398, 594, 394],
|
|
[ 34, -663, 235, -334],
|
|
[-1580, 647, 239, -351],
|
|
[-2177, -345, 1215, -1494],
|
|
[ 1923, 329, -152, 1128]])
|
|
|
|
x = xo/1000.
|
|
|
|
class HoldIt:
|
|
def __init__(self, name):
|
|
self.name = name
|
|
def save(self, what=None, filename=None, header=True, useinstant=True,
|
|
comment=None):
|
|
if what is None:
|
|
what = (i for i in self.__dict__ if i[0] != '_')
|
|
if header:
|
|
txt = ['import numpy as np\nfrom numpy import array\n\n']
|
|
if useinstant:
|
|
txt.append('from statsmodels.tools.testing import Holder\n\n')
|
|
else:
|
|
txt = []
|
|
|
|
if useinstant:
|
|
txt.append('%s = Holder()' % self.name)
|
|
prefix = '%s.' % self.name
|
|
else:
|
|
prefix = ''
|
|
|
|
if comment is not None:
|
|
txt.append(f"{prefix}comment = '{comment}'")
|
|
|
|
for x in what:
|
|
txt.append(f'{prefix}{x} = {repr(getattr(self,x))}')
|
|
txt.extend(['','']) #add empty lines at end
|
|
if filename is not None:
|
|
with open(filename, 'a+', encoding="utf-8") as fd:
|
|
fd.write('\n'.join(txt))
|
|
return txt
|
|
|
|
def generate_princomp(xo, filen='testsave.py'):
|
|
# import mlabwrap only when run as script
|
|
from mlabwrap import mlab
|
|
np.set_printoptions(precision=14, linewidth=100)
|
|
data = HoldIt('data')
|
|
data.xo = xo
|
|
data.save(filename='testsave.py', comment='generated data, divide by 1000')
|
|
|
|
res_princomp = HoldIt('princomp1')
|
|
res_princomp.coef, res_princomp.factors, res_princomp.values = \
|
|
mlab.princomp(x, nout=3)
|
|
res_princomp.save(filename=filen, header=False,
|
|
comment='mlab.princomp(x, nout=3)')
|
|
|
|
res_princomp = HoldIt('princomp2')
|
|
res_princomp.coef, res_princomp.factors, res_princomp.values = \
|
|
mlab.princomp(x[:20,], nout=3)
|
|
np.set_printoptions(precision=14, linewidth=100)
|
|
res_princomp.save(filename=filen, header=False,
|
|
comment='mlab.princomp(x[:20,], nout=3)')
|
|
|
|
res_princomp = HoldIt('princomp3')
|
|
res_princomp.coef, res_princomp.factors, res_princomp.values = \
|
|
mlab.princomp(x[:20,]-x[:20,].mean(0), nout=3)
|
|
np.set_printoptions(precision=14, linewidth=100)
|
|
res_princomp.save(filename=filen, header=False,
|
|
comment='mlab.princomp(x[:20,]-x[:20,].mean(0), nout=3)')
|
|
|
|
def generate_armarep(filen='testsave.py'):
|
|
# import mlabwrap only when run as script
|
|
from mlabwrap import mlab
|
|
res_armarep = HoldIt('armarep')
|
|
res_armarep.ar = np.array([1., -0.5, +0.8])
|
|
res_armarep.ma = np.array([1., -0.6, 0.08])
|
|
|
|
res_armarep.marep = mlab.garchma(-res_armarep.ar[1:], res_armarep.ma[1:], 20)
|
|
res_armarep.arrep = mlab.garchar(-res_armarep.ar[1:], res_armarep.ma[1:], 20)
|
|
res_armarep.save(filename=filen, header=False,
|
|
comment=("''mlab.garchma(-res_armarep.ar[1:], res_armarep.ma[1:], 20)\n" +
|
|
"mlab.garchar(-res_armarep.ar[1:], res_armarep.ma[1:], 20)''"))
|
|
|
|
|
|
|
|
|
|
|
|
def exampletest(res_armarep):
|
|
from statsmodels.sandbox import tsa
|
|
arrep = tsa.arma_impulse_response(res_armarep.ma, res_armarep.ar, nobs=21)[1:]
|
|
marep = tsa.arma_impulse_response(res_armarep.ar, res_armarep.ma, nobs=21)[1:]
|
|
assert_array_almost_equal(res_armarep.marep.ravel(), marep, 14)
|
|
#difference in sign convention to matlab for AR term
|
|
assert_array_almost_equal(-res_armarep.arrep.ravel(), arrep, 14)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
from mlabwrap import mlab
|
|
|
|
import savedrvs
|
|
xo = savedrvs.rvsdata.xar2
|
|
x100 = xo[-100:]/1000.
|
|
x1000 = xo/1000.
|
|
|
|
filen = 'testsavetls.py'
|
|
res_pacf = HoldIt('mlpacf')
|
|
res_pacf.comment = 'mlab.parcorr(x, [], 2, nout=3)'
|
|
res_pacf.pacf100, res_pacf.lags100, res_pacf.bounds100 = \
|
|
mlab.parcorr(x100, [], 2, nout=3)
|
|
res_pacf.pacf1000, res_pacf.lags1000, res_pacf.bounds1000 = \
|
|
mlab.parcorr(x1000, [], 2, nout=3)
|
|
res_pacf.save(filename=filen, header=True)
|
|
|
|
res_acf = HoldIt('mlacf')
|
|
res_acf.comment = 'mlab.autocorr(x, [], 2, nout=3)'
|
|
res_acf.acf100, res_acf.lags100, res_acf.bounds100 = \
|
|
mlab.autocorr(x100, [], 2, nout=3)
|
|
res_acf.acf1000, res_acf.lags1000, res_acf.bounds1000 = \
|
|
mlab.autocorr(x1000, [], 2, nout=3)
|
|
res_acf.save(filename=filen, header=False)
|
|
|
|
|
|
res_ccf = HoldIt('mlccf')
|
|
res_ccf.comment = 'mlab.crosscorr(x[4:], x[:-4], [], 2, nout=3)'
|
|
res_ccf.ccf100, res_ccf.lags100, res_ccf.bounds100 = \
|
|
mlab.crosscorr(x100[4:], x100[:-4], [], 2, nout=3)
|
|
res_ccf.ccf1000, res_ccf.lags1000, res_ccf.bounds1000 = \
|
|
mlab.crosscorr(x1000[4:], x1000[:-4], [], 2, nout=3)
|
|
res_ccf.save(filename=filen, header=False)
|
|
|
|
|
|
res_ywar = HoldIt('mlywar')
|
|
res_ywar.comment = "mlab.ar(x100-x100.mean(), 10, 'yw').a.ravel()"
|
|
mbaryw = mlab.ar(x100-x100.mean(), 10, 'yw')
|
|
res_ywar.arcoef100 = np.array(mbaryw.a.ravel())
|
|
mbaryw = mlab.ar(x1000-x1000.mean(), 20, 'yw')
|
|
res_ywar.arcoef1000 = np.array(mbaryw.a.ravel())
|
|
res_ywar.save(filename=filen, header=False)
|