Source code for pyam.slice
import pandas as pd
from pyam.utils import print_list
[docs]
class IamSlice(pd.Series):
"""A slice object of the IamDataFrame timeseries data index"""
@property
def _constructor(self):
return IamSlice
_internal_names = pd.Series._internal_names + ["_iamcache"]
_internal_names_set = set(_internal_names)
def __init__(self, data=None, index=None, **kwargs):
super().__init__(data, index, **kwargs)
self._iamcache = dict()
def __dir__(self):
return self.dimensions + super().__dir__()
def __getattr__(self, attr):
try:
return super().__getattr__(attr)
except AttributeError:
cache = object.__getattribute__(self, "_iamcache")
ret = cache.get(attr)
if ret is not None:
return ret.tolist()
if attr in self.dimensions:
ret = cache[attr] = self.index[self].unique(level=attr)
return ret.tolist()
raise
def __len__(self):
return self.sum()
@property
def dimensions(self):
"""Return the list of index names & data coordinates"""
return self.index.names
@property
def time(self):
"""The time index, i.e., axis labels related to the time domain.
Returns
-------
- A :class:`pandas.Index` (dtype 'int64') if the :attr:`time_domain` is 'year'
- A :class:`pandas.DatetimeIndex` if the time-domain is 'datetime'
- A :class:`pandas.Index` if the time-domain is 'mixed'
"""
ret = self._iamcache.get("time")
if ret is None:
ret = self._iamcache["time"] = (
self.index[self].unique(level=self.time_col).rename("time")
)
return ret
@property
def time_col(self):
return "year" if "year" in self.dimensions else "time"
def __repr__(self):
return self.info()
[docs]
def info(self, n=80):
"""Print a summary of the represented index dimensions and data coordinates
Parameters
----------
n : int
The maximum line length
"""
# concatenate list of index dimensions and levels
info = f"{type(self)}\nIndex dimensions and data coordinates:\n"
c1 = max([len(i) for i in self.dimensions]) + 1
c2 = n - c1 - 5
info += "\n".join(
[
f" {i:{c1}}: {print_list(getattr(self, i), c2)}"
for i in self.dimensions
]
)
return info