def time_series()

in integrations/python-client/nexuscli/nexuscli.py [0:0]


def time_series(datasets, bounding_box, start_datetime, end_datetime, spark=True):
    """
    Send a request to NEXUS to calculate a time series.
    
    __datasets__ Sequence (max length 2) of the name of the dataset(s)  
    __bounding_box__ Bounding box for area of interest as a `shapely.geometry.polygon.Polygon`  
    __start_datetime__ Start time as a `datetime.datetime`  
    __end_datetime__ End time as a `datetime.datetime`  
    __spark__ Optionally use spark. Default: `False`
    
    __return__ List of `nexuscli.nexuscli.TimeSeries` namedtuples
    """

    if isinstance(datasets, str):
        datasets = [datasets]

    assert 0 < len(datasets) <= 2, "datasets must be a sequence of 1 or 2 items"

    params = {
        'ds': ','.join(datasets),
        'b': ','.join(str(b) for b in bounding_box.bounds),
        'startTime': start_datetime.strftime(ISO_FORMAT),
        'endTime': end_datetime.strftime(ISO_FORMAT),
    }

    if spark:
        url = "{}/timeSeriesSpark?".format(target)
        params['spark'] = "mesos,16,32"
    else:
        url = "{}/stats?".format(target)

    response = session.get(url, params=params)
    response.raise_for_status()
    response = response.json()

    data = np.array(response['data']).flatten()

    assert len(data) > 0, "No data found in {} between {} and {} for Datasets {}.".format(bounding_box.wkt,
                                                                                          start_datetime.strftime(
                                                                                              ISO_FORMAT),
                                                                                          end_datetime.strftime(
                                                                                              ISO_FORMAT),
                                                                                          datasets)

    time_series_result = []

    for i in range(0, len(response['meta'])):
        key_to_index = {k: x for x, k in enumerate(data[0].keys())}

        time_series_data = np.array([tuple(each.values()) for each in [entry for entry in data if entry['ds'] == i]])

        if len(time_series_data) > 0:
            if 'iso_time' in key_to_index:
                time_series_result.append(
                    TimeSeries(
                        dataset=response['meta'][i]['shortName'],
                        time=np.array([datetime.strptime(t, PYTHON32_ISO_FORMAT) for t in
                                       time_series_data[:, key_to_index['iso_time']]]),
                        mean=np.array(time_series_data[:, key_to_index['mean']], dtype=float),
                        standard_deviation=np.array(time_series_data[:, key_to_index['std']], dtype=float),
                        count=np.array(time_series_data[:, key_to_index['cnt']], dtype=int),
                        minimum=np.array(time_series_data[:, key_to_index['min']], dtype=float),
                        maximum=np.array(time_series_data[:, key_to_index['max']], dtype=float),
                    )
                )
            else:
                time_series_result.append(
                    TimeSeries(
                        dataset=response['meta'][i]['shortName'],
                        time=np.array([datetime.utcfromtimestamp(int(t)).replace(tzinfo=UTC) for t in
                                       time_series_data[:, key_to_index['time']]]),
                        mean=np.array(time_series_data[:, key_to_index['mean']], dtype=float),
                        standard_deviation=np.array(time_series_data[:, key_to_index['std']], dtype=float),
                        count=np.array(time_series_data[:, key_to_index['cnt']], dtype=int),
                        minimum=np.array(time_series_data[:, key_to_index['min']], dtype=float),
                        maximum=np.array(time_series_data[:, key_to_index['max']], dtype=float),
                    )
                )

    return time_series_result