a
    !f                     @   s&   d Z ddlZdZdddZdd ZdS )	z(Time series as :mod:`pandas` dataframes.    N)Z
project_idZaws_accountlocationregionzonec                    sT  ddl }|dur.|dur"tdn|s.tdg }g }| D ]B}|jdd |jD dd |jD d}|| ||  q:|du r|du rttj	d	d
 |D }ttj	dd
 |D }	dgt
| t|	 }|j|j}
||
j|
_g }|p|gD ]"  fdd|D }|| q|jj||p8dd|
_|
jddjddS )aj  Build a :mod:`pandas` dataframe out of time series.

    :type time_series_iterable:
        iterable over :class:`~gcloud.monitoring.timeseries.TimeSeries`
    :param time_series_iterable:
        An iterable (e.g., a query object) yielding time series.

    :type label: string or None
    :param label:
        The label name to use for the dataframe header. This can be the name
        of a resource label or metric label (e.g., ``"instance_name"``), or
        the string ``"resource_type"``.

    :type labels: list of strings, or None
    :param labels:
        A list or tuple of label names to use for the dataframe header.
        If more than one label name is provided, the resulting dataframe
        will have a multi-level column header.

        Specifying neither ``label`` or ``labels`` results in a dataframe
        with a multi-level column header including the resource type and
        all available resource and metric labels.

        Specifying both ``label`` and ``labels`` is an error.

    :rtype: :class:`pandas.DataFrame`
    :returns: A dataframe where each column represents one time series.
    r   Nz)Cannot specify both "label" and "labels".z#"labels" must be non-empty or None.c                 S   s   g | ]
}|j qS  )value.0pointr   r   ]/var/www/html/python-backend/venv/lib/python3.9/site-packages/gcloud/monitoring/_dataframe.py
<listcomp>F       z$_build_dataframe.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   )end_timer   r   r   r
   r   G   r   )dataindexc                 s   s   | ]}|j jV  qd S N)resourcelabelsr   headerr   r   r
   	<genexpr>N   s   z#_build_dataframe.<locals>.<genexpr>c                 s   s   | ]}|j jV  qd S r   )Zmetricr   r   r   r   r
   r   P   s   Zresource_typec                    s   g | ]}|j  d qS ) )r   getr   keyr   r
   r   `   r   )names)Zaxis   )pandas
ValueErrorZSeriesZpointsappendr   set	itertoolschainfrom_iterable_sorted_resource_labelssortedZ	DataFrameZfrom_recordsTto_datetimer   Z
MultiIndexZfrom_arrayscolumnsZ
sort_index)Ztime_series_iterablelabelr   r   r'   headersZtime_seriesZpandas_seriesZresource_labelsZmetric_labelsZ	dataframeZlevelslevelr   r   r
   _build_dataframe   sL    



r+   c                    s,    fddt D }tdd  D }|| S )z;Sort label names, putting well-known resource labels first.c                    s   g | ]}| v r|qS r   r   r   r(   r   r   r
   r   q   r   z+_sorted_resource_labels.<locals>.<listcomp>c                 s   s   | ]}|t vr|V  qd S r   )TOP_RESOURCE_LABELSr,   r   r   r
   r   r   s   z*_sorted_resource_labels.<locals>.<genexpr>)r.   r$   )r   headtailr   r-   r
   r#   o   s    r#   )NN)__doc__r    r.   r+   r#   r   r   r   r
   <module>   s
   
 
S