summaryrefslogtreecommitdiff
path: root/doc/discussion/base_classes.rst
diff options
context:
space:
mode:
Diffstat (limited to 'doc/discussion/base_classes.rst')
-rw-r--r--doc/discussion/base_classes.rst139
1 files changed, 139 insertions, 0 deletions
diff --git a/doc/discussion/base_classes.rst b/doc/discussion/base_classes.rst
new file mode 100644
index 0000000..591f9b7
--- /dev/null
+++ b/doc/discussion/base_classes.rst
@@ -0,0 +1,139 @@
+.. _base_classes:
+
+==============
+ Base classes
+==============
+
+We have two sets of base-classes. The first is used in order to represent time
+and inherits from :class:`np.ndarray`, see :ref:`time_classes`. The other are
+data containers, used to represent different kinds of time-series data, see
+:ref:`time_series_classes`
+
+.. _time_classes:
+
+Time
+====
+Experimental data is usually represented with regard to *relative* time. That
+is, the time relative to the beginning of the measurement. This is in contrast
+to many other kinds of data, which are represented with regard to *absolute*
+time, (one example of this kind of time is calendaric time, which includes a
+reference to some common point, such as 0 CE, or Jan. 1st 1970). An example of
+data which benefits from representation with absolute time is the
+representation of financial time-series, which can be compared against each
+other, using the common reference and for which the concept of the work-week
+applies.
+
+However, because most often the absolute calender time of the occurence of
+events in an experiment is of no importance, we can disregard it. Rather, the
+comparison of the time progression of data in different experiments conducted
+in different calendar times (different days, different times in the same day)
+is more common.
+
+The underlying representation of time in :module:`nitime` is in arrays of dtype
+:class:`int64`. This allows the representation to be immune to rounding errors
+arising from representation of time with floating point numbers (see
+[Goldberg1991]_). However, it restricts the smallest time-interval that can be
+represented. In :module:`nitime`, the smallest discrete time-points are of size
+:attribute:`base_unit`, and this unit is *picoseconds*. Thus, all underlying
+representations of time are made in this unit. Since for most practical uses,
+this representation is far too small, this might have resulted, in most cases
+in representations of time too long to be useful. In order to make the
+time-objects more manageable, time objects in :module:`nitime` carry a
+:attribute:`time_unit` and a :attribute:`_conversion_factor`, which can be used
+as a convenience, in order to convert between the representation of time in the
+base unit and the appearance of time in the relevant time-unit.
+
+The first set of base classes is a set of representations of time itself. All
+these classes inherit from :class:`np.array`. As mentioned above, the dtype of
+these classes is :class:`int64` and the underlying representation is always at
+the base unit. These representations will all serve as the underlying machinery
+to index into the :class:`TimeSeries` objects with arrays of time-points. The
+additional functionality common to all of these is described in detail in
+:ref:`time_series_access`. Briefly, they will all have an :func:`at` method,
+which allows indexing with time-objects of various kind. The result of this
+indexing will be to return the time-point in the the respective
+:class:`TimeSeries` which is most appropriate (see :ref:`time_series_access`
+for details). They will also all have an :func:`index_at` method, which returns
+the integer index of this time in the underlying array. Finally, they will all
+have a :func:`during` method, which will allow indexing into these objects with
+an :ref:`interval_class`. This will return the appropriate times corresponding
+to an :ref:`interval_class` and :func:`index_during`, which will return the
+array of integers corresponding to the indices of these time-points in the
+array.
+
+There are three types of Time base classes: :ref:`TimeArray`
+:ref:`NonUniformTime`, and :ref:`UniformTime`. :ref:`time_table` captures
+the essential differences between them.
+
+.. _TimeArray:
+
+:class:`TimeArray`
+-------------------
+
+This class has the least restrictions on it: it will be a 1d array, which
+contains time-points that are not neccesarily ordered. It can also contain
+several copies of the same time-point. This class will be used in order to
+represent sparsely occuring events, measured at some unspecified sampling rate
+and possibly collected from several different channels, where the data is
+sampled in order of channel and not in order of time. As in the case of the
+:class:`np.ndarray`, slicing into this kind of representation should allow a
+reshaping operation to occur, which would change the dimensions of the
+underlying array. In this case, this should allow a ragged/jagged array
+structure to emerge (see http://en.wikipedia.org/wiki/Array_data_structure for
+details). This representation of time carries, in addition to the array itself
+an attribute :attr:`time_unit`, which is the unit in which we would like to
+present the time-points (recall that the underlying representation is always in
+the base-unit).
+
+.. _NonUniformTime:
+
+:class:`NonUniformTime`
+-------------------------
+
+This class can be used in order to represent time with a varying sampling rate,
+or also represent events which occur at different times in an ordered
+series. Thus, the time-points in this representation are ordered (and
+unique?). This will be used as the time representation used in the
+:ref:`NonUniformTimeSeries` class. As in the case of the
+:class:`TimeArray`, slicing into a :class:`NonUniformTime` array should
+result in a ragged/jagged array.
+
+.. _UniformTime:
+
+:class:`UniformTime`
+--------------------
+
+This class contains ordered uniformly sampled time-points. This class has an
+explicit representation of :attr:`t_0`, :attr:`sampling_rate` and
+:attr:`sampling_interval` (the latter two implemented as
+:meth:`setattr_on_read`, which can be computed from each other). Thus, each
+element in this array can be used in order to represent the entire time
+interval $t$, such that: $t_i\leq t < t + \delta t$, where $t_i$ is the nominal
+value held by that element of the array, and $\delta t$ is the value of
+:attr:`sampling_interval`. As in the case of the
+:ref:`NonUniformTimeSeries`, this kind of class can be reshaped in such a way
+that induces an increase in the number of dimensions (see also
+:ref:`time_table`).
+.. XXX: is 'inducing an increase in the number of dimensions" the same as jagged/ragged array?
+
+This object will contain additional attributes that are not shared by the other
+time objects. In particular, an object of :class:`UniformTime`, UT, will have
+the following:
+
+* :attr:`UT.t_0`: the first time-point in the series.
+* :attr:`UT.sampling_rate`: the sampling rate of the series.
+* :attr:`UT.sampling_interval`: the value of $\delta t$, mentioned above.
+* :attr:`UT.duration`: the total time (in dtype :class:`deltatime64`) of
+ the series.
+
+Obviously, :attr:`UT.sampling_rate` and :attr:`UT.sampling_interval`
+are redundant, but can both be useful.
+
+
+:class:`Frequency`
+------------------
+
+The :attr:`UT.sampling_rate` of :class:`UniformTime` is an object of this
+class. This is a representation of the frequency in Hz. It is derived from a
+combination of the :attr:`sampling_interval` and the :attr:`time_unit`.
+