'Returns a generator yielding tuples of ``(<datetime>, <value>)``.
The data points will start at ``start_date``, and be at every time interval specified by
``precision``.
``distrib`` is a callable that accepts ``<datetime>`` and returns ``<value>``'

@classmethod
def time_series(cls, start_date=u'-30d', end_date=u'now', precision=None, distrib=None, tzinfo=None):

    start_date = cls._parse_date_time(start_date, tzinfo=tzinfo)
    end_date = cls._parse_date_time(end_date, tzinfo=tzinfo)
    if (end_date < start_date):
        raise ValueError(u'`end_date`    must    be    greater    than    `start_date`.')
    if (precision is None):
        precision = ((end_date - start_date) / 30)
    precision = cls._parse_timedelta(precision)
    if (distrib is None):
        distrib = (lambda dt: random.uniform(0, precision))
    if (not callable(distrib)):
        raise ValueError(u'`distrib`    must    be    a    callable.    Got    {}    instead.'.format(distrib))
    datapoint = start_date
    while (datapoint < end_date):
        datapoint += precision
        dt = timestamp_to_datetime(datapoint, tzinfo)
        (yield (dt, distrib(dt)))
