[SciPy-user] Subclass of TimeSeries
Robert Ferrell
ferrell at diablotech.com
Wed May 20 23:56:16 EDT 2009
On May 20, 2009, at 5:50 PM, Pierre GM wrote:
>
> On May 20, 2009, at 7:12 PM, Robert Ferrell wrote:
>
>> How do I derive a subclass from TimeSeries? I tried
>>
>>
>> import scikits.timeseries as ts
>> import numpy as np
>>
>> class MyTS(ts.TimeSeries):
>> def __init__(self, label, dataArray, dateArray):
>> ts.TimeSeries.__init__(self, data=dataArray, dates=dateArray)
>> self.label=label
>> return
>
> Just like the use of __init__ is not the way to subclass ndarray
> (except when subclassing also from an object that requires __init__),
> that's not the way to go. You need to implement a __new__ and a
> __array_finalize__ as described here:
> http://docs.scipy.org/doc/numpy/user/basics.subclassing.html
>
> The easiest is to follow some of the examples given in the
> scikits.hydroclimpy package (http://hydroclimpy.sourceforge.net/).
> For instance, here's a class that attaches a reference period to the
> series (in scikits/hydroclimpy/core/base.py). Adapting this example to
> your case should be straightforward. Nevertheless, don't hesitate to
> ask for more details/info as needed.
>
> Cheers
> P.
Thanks for the response. I think I get the idea. For my purposes, it
seems to work if I just call the TimeSeries.__new__ method. That way
I don't have to get into maoptions.
I don't think I need to call __array_finalize__. I think I can use
__init__ for my case. I hope I've understood the docs correctly on
that. I definitely did not understand that part completely.
thanks for the help,
-robert
Here's what seems to do what I want.
###
import scikits.timeseries as ts
import numpy as np
from numpy import ma
from numpy.ma import nomask
import unittest
class MyTS(ts.TimeSeries):
def __new__(cls, label, data, dates, mask=nomask, dtype=None,
copy=False, fill_value=None, subok=True, keep_mask=True,
hard_mask=False, autosort=True, **options):
cls = ts.TimeSeries.__new__(cls, data=data, dates=dates, mask=mask,
dtype=dtype,
copy=copy, fill_value=fill_value, subok=subok, keep_mask=keep_mask,
hard_mask=hard_mask, autosort=autosort, **options)
return cls
def __init__(self, label, **args):
self.label=label
return
class MyTSTests(unittest.TestCase):
def setUp(self):
self.dateArray = ts.date_array(start_date = ts.Date('d',
'2009-1-1'), length=10, freq='d')
self.A = np.random.random(10)
self.B = np.random.random(10)
self.myDtype = [('a', np.float64), ('b', np.float64)]
self.myData = np.array(zip(self.A,self.B), dtype=self.myDtype)
def test_1_instantiate(self):
"""Test that we can instantiate a MyTS instance."""
myts = MyTS(label='doesWork', data=zip(self.A,self.B),
dates=self.dateArray, dtype=self.myDtype)
self.failUnless(isinstance(myts, MyTS), 'Expected an instance of %s,
but got %s.' % (MyTS, type(myts)))
def test_2_label(self):
"""Test that the label got set"""
myts = MyTS(label='doesWork', data=zip(self.A,self.B),
dates=self.dateArray, dtype=self.myDtype)
self.failUnless(myts.label == 'doesWork', 'Expected label %s, but
got label %s.' % ('doesWork', myts.label))
def test_3_field(self):
"""Test that we can get the fields and they have the correct data."""
myts = MyTS(label='doesWork', data=zip(self.A,self.B),
dates=self.dateArray, dtype=self.myDtype)
# Put the field accessor first
self.failUnless((myts['a'].data == self.A).all())
# Or apply it to the data
self.failUnless((myts.data['b'] == self.B).all())
MyTSTestSuite = unittest.TestLoader().loadTestsFromTestCase(MyTSTests)
if __name__ == '__main__':
unittest.TextTestRunner(verbosity=2).run(MyTSTestSuite)
More information about the SciPy-User
mailing list