Exemplo n.º 1
0
    def add_timeseries(self, df, meta=False):
        """add a timeseries dataframe to the TimeSeries instance

        Parameters
        ----------
        df : a Pandas dataframe either
             - in tabular form (cols: region, variable, unit, year)
             - in 'IAMC-style' format (cols: region, variable, unit, [years])
        meta : boolean
            indicator whether this timeseries is 'meta-data'
            (special treatment during cloning for MESSAGE-scheme scenarios)
        """
        meta = 1 if meta else 0

        if "time" in df.columns:
            raise ("sub-annual time slices not supported by Python interface!")

        # if in tabular format
        if ("value" in df.columns):
            df = df.sort_values(by=['region', 'variable', 'unit', 'year'])\
                .reset_index(drop=True)

            region = df.region[0]
            variable = df.variable[0]
            unit = df.unit[0]
            time = None
            jData = java.LinkedHashMap()

            for i in df.index:
                if not (region == df.region[i] and variable == df.variable[i]
                        and unit == df.unit[i]):
                    # if new 'line', pass to Java interface, start a new
                    # LinkedHashMap
                    self._jobj.addTimeseries(region, variable, time, jData,
                                             unit, meta)

                    region = df.region[i]
                    variable = df.variable[i]
                    unit = df.unit[i]
                    jData = java.LinkedHashMap()

                jData.put(java.Integer(int(df.year[i])),
                          java.Double(float(df.value[i])))
            # add the final iteration of the loop
            self._jobj.addTimeseries(region, variable, time, jData, unit, meta)

        # if in 'IAMC-style' format
        else:
            for i in df.index:
                jData = java.LinkedHashMap()

                for j in ix.utils.numcols(df):
                    jData.put(java.Integer(int(j)),
                              java.Double(float(df[j][i])))

                time = None
                self._jobj.addTimeseries(df.region[i], df.variable[i], time,
                                         jData, df.unit[i], meta)