importloggingfromtypingimportCollection,Mapping,Sequence,Unionimportpandasaspdimportpintlog=logging.getLogger(__name__)#: Dimensions of the IAMC data structure used by :mod:`pyam`.IAMC_DIMS=frozenset("model scenario region variable unit year time".split())# Deprecated aliasIAMC_IDX=IAMC_DIMS
[docs]defclean_units(df:pd.DataFrame,unit=None)->pd.DataFrame:"""Convert magnitudes and units of `df` to `unit` in :class:`str`. Raises ------ ValueError if there is more than one unit. """# Convert unitsiflen(df)==0:returndfifunit:from_unit=df["unit"].unique()iflen(from_unit)>1:raiseValueError(f"cannot convert non-unique units {list(from_unit)}")q=pint.Quantity(df["value"].values,from_unit[0]).to(unit)df["value"]=q.magnitudedf["unit"]=unit# pyam requires units are str, not pint.Unitifnotisinstance(df.loc[0,"unit"],str):df["unit"]=f"{df.loc[0,'unit']:~}"returndf
[docs]defcollapse(df:pd.DataFrame,columns:Mapping[str,Sequence[str]]=dict(),sep="|")->pd.DataFrame:"""Collapse `columns` into the IAMC columns of `df`."""to_drop=set()fortarget_col,valuesincolumns.items():iftarget_colnotinIAMC_DIMS:raiseValueError(f"non-IAMC column {repr(target_col)}")entries=[]forvinvalues:ifvindf:entries.append(df[v])to_drop.add(v)else:entries.append(pd.Series(str(v),index=df.index))iftarget_colnotindfordf[target_col].isna().all():# df doesn't contain the column, or all entries are None, e.g. if# quantity.name was not set. Initialize with first entry.df[target_col]=entries.pop(0)df[target_col]=df[target_col].str.cat(entries,sep=sep)returndf.drop(to_drop,axis=1)
def_extra(obj):"""Extra columns in `obj`."""returnsorted(set(obj.columns)-IAMC_DIMS-{"value"})
[docs]defdrop(df:pd.DataFrame,columns:Union[Collection[str],str])->pd.DataFrame:"""Drop `columns` if given, or all non-IAMC columns."""ifisinstance(columns,str):ifcolumns!="auto":raiseValueError(columns)# Drop all non-IAMC columnsreturndf.drop(_extra(df),axis=1)else:result=df.drop(columns,axis=1)extra=_extra(result)ifextra:log.info(f"Extra columns {repr(extra)} when converting to IAMC format")returnresult