# [SciPy-User] scikits.timeseries: cmov_average() strange result for dtype int

Georges Schutz georges.schutz@internet...
Thu Apr 15 11:07:55 CDT 2010

```Hello all
first thank you all for your great work and the really useful scikits
extensions.

While analysing the behaviour of the lib.moving_funcs of
scikits.timeseries I encountered a strange but explainable behaviour
using the cmov_average() method in the case of integer data.

cmov_average() should do a "centralized" moving average on a
time-series. This seams also OK for float data but in the case of
integer data the behaviour is not as one could expect form numerical
point of view.

Here two examples to illustrate what I mean:
1) TS = [-- 4 4 4 0 0 0 --]
as Integer: cmov_average(TS,3) -> [-- 4 4 2 1 0 0 --]
as float: cmov_average(TS,3)   -> [-- 4.0 4.0 2.667 1.333 0.0 0.0 --]
I would have expected form the signal / numerical point of view for the
integer result -> [-- 4 4 3 1 0 0 --] which is symmetric like the
original signal.

2) TS = [-- 1 1 1 0 0 0 --]
as Integer: cmov_average(TS,3) -> [-- 1 1 0 0 0 0 --]
as float: cmov_average(TS,3)   -> [-- 1.0 1.0 0.667 0.333 0.0 0.0 --]
My expectation would have been -> [-- 1 1 1 0 0 0 --]
In this case the central moving average is simply shifting the step to
the left by one timestamp.

The reason of this behaviour is the floor rounding done by default if
using integer division. If the round() method where used the result
where as I would have expected.

Is there a possibility to change this default behaviour knowing that the
functions cmov_average() and others are implemented in C.

Best Regards
Georges Schutz

--- Here the used code ---
import numpy as np
import scikits.timeseries as ts
from scikits.timeseries.lib.moving_funcs import cmov_average

ISeries = ts.time_series(np.array([3]*4+[0]*4), #Change 3 to 1 for ex. 2
start_date=ts.Date(freq='D',
string='2010-01-01'),
dtype=int)
FSeries = ts.time_series(ISeries, dtype=float)
print cmov_average(ISeries, 3)
print cmov_average(FSeries, 3)

```