Exemplo n.º 1
0
def _getElementList(jItem, filters=None, has_value=False, has_level=False):

    # get list of elements, with filter HashMap if provided
    if filters is not None:
        jFilter = java.HashMap()
        for idx_name in filters.keys():
            jFilter.put(idx_name, to_jlist(filters[idx_name]))
        jList = jItem.getElements(jFilter)
    else:
        jList = jItem.getElements()

    # return a dataframe if this is a mapping or multi-dimensional parameter
    dim = jItem.getDim()
    if dim > 0:
        idx_names = np.array(jItem.getIdxNames().toArray()[:])
        idx_sets = np.array(jItem.getIdxSets().toArray()[:])

        data = {}
        for d in range(dim):
            ary = np.array(jItem.getCol(d, jList)[:])
            if idx_sets[d] == "year":
                # numpy tricks to avoid extra copy
                # _ary = ary.view('int')
                # _ary[:] = ary
                ary = ary.astype('int')
            data[idx_names[d]] = ary

        if has_value:
            data['value'] = np.array(jItem.getValues(jList)[:])
            data['unit'] = np.array(jItem.getUnits(jList)[:])

        if has_level:
            data['lvl'] = np.array(jItem.getLevels(jList)[:])
            data['mrg'] = np.array(jItem.getMarginals(jList)[:])

        df = pd.DataFrame.from_dict(data, orient='columns', dtype=None)
        return df

    else:
        #  for index sets
        if not (has_value or has_level):
            return pd.Series(jItem.getCol(0, jList)[:])

        data = {}

        # for parameters as scalars
        if has_value:
            data['value'] = jItem.getScalarValue().floatValue()
            data['unit'] = str(jItem.getScalarUnit())

        # for variables as scalars
        elif has_level:
            data['lvl'] = jItem.getScalarLevel().floatValue()
            data['mrg'] = jItem.getScalarMarginal().floatValue()

        return data