예제 #1
0
파일: pwfts.py 프로젝트: anhtholee/pyFTS
    def forecast_ahead_distribution(self, ndata, steps, **kwargs):

        ret = []

        smooth = kwargs.get("smooth", "none")

        uod = self.get_UoD()

        if 'bins' in kwargs:
            _bins = kwargs.pop('bins')
            nbins = len(_bins)
        else:
            nbins = kwargs.get("num_bins", 100)
            _bins = np.linspace(uod[0], uod[1], nbins)

        start = kwargs.get('start_at', 0)

        sample = ndata[start: start + self.max_lag]

        for dat in sample:
            if 'type' in kwargs:
                kwargs.pop('type')
            tmp = ProbabilityDistribution.ProbabilityDistribution(smooth, uod=uod, bins=_bins, **kwargs)
            tmp.set(dat, 1.0)
            ret.append(tmp)

        dist = self.forecast_distribution(sample, bins=_bins)[0]

        ret.append(dist)

        for k in np.arange(self.max_lag+1, steps+self.max_lag+1):
            dist = ProbabilityDistribution.ProbabilityDistribution(smooth, uod=uod, bins=_bins, **kwargs)

            lags = []

            # Find all bins of past distributions with probability greater than zero

            for ct, lag in enumerate(self.lags):
                dd = ret[k - lag]
                vals = [float(v) for v in dd.bins if np.round(dd.density(v), 4) > 0.0]
                lags.append( sorted(vals) )


            # Trace all possible combinations between the bins of past distributions

            for path in product(*lags):

                # get the combined probabilities for this path
                pk = np.prod([ret[k - (self.max_lag + lag)].density(path[ct])
                              for ct, lag in enumerate(self.lags)])


                d = self.forecast_distribution(path)[0]

                for bin in _bins:
                    dist.set(bin, dist.density(bin) + pk * d.density(bin))

            ret.append(dist)

        return ret[-steps:]
예제 #2
0
    def forecast_distribution_from_distribution(self, previous_dist, smooth,
                                                uod, bins, **kwargs):
        dist = ProbabilityDistribution.ProbabilityDistribution(smooth,
                                                               uod=uod,
                                                               bins=bins,
                                                               **kwargs)

        lags = []

        # Find all bins of past distributions with probability greater than zero

        for ct, lag in enumerate(self.lags):
            dd = previous_dist[-lag]
            vals = [
                float(v) for v in dd.bins if np.round(dd.density(v), 4) > 0.0
            ]
            lags.append(sorted(vals))

        # Trace all possible combinations between the bins of past distributions

        for path in product(*lags):

            # get the combined probabilities for this path
            pk = np.prod([
                previous_dist[-lag].density(path[ct])
                for ct, lag in enumerate(self.lags)
            ])

            d = self.forecast_distribution(path)[0]

            for bin in bins:
                dist.set(bin, dist.density(bin) + pk * d.density(bin))

        return dist
예제 #3
0
파일: knn.py 프로젝트: zilla-liu/pyFTS
    def forecast_ahead_distribution(self, data, steps, **kwargs):
        smooth = kwargs.get("smooth", "histogram")

        ret = []

        start = kwargs.get('start', self.order)

        uod = self.get_UoD()

        sample = [[k] for k in data[start - self.order:start]]

        for k in np.arange(self.order, steps + self.order):
            forecasts = []

            lags = [sample[k - i - 1] for i in np.arange(0, self.order)]

            # Trace the possible paths
            for path in product(*lags):
                forecasts.extend(self.knn(path))

            dist = ProbabilityDistribution.ProbabilityDistribution(
                smooth, uod=uod, data=forecasts, name="", **kwargs)
            ret.append(dist)

            sample.append(
                sampler(forecasts, np.arange(.1, 1, 0.1), bounds=True))

        return ret
예제 #4
0
    def forecast_distribution(self, data, **kwargs):

        ret = []

        X = []
        l = len(data)
        for t in np.arange(self.order, l):
            X.append([data[t - k - 1] for k in np.arange(self.order)])

        Y, sigma = self.model.predict(X, return_std=True)

        for k in len(Y):

            dist = ProbabilityDistribution.ProbabilityDistribution(
                type="histogram", uod=[self.original_min, self.original_max])
            intervals = []
            for alpha in np.arange(0.05, 0.5, 0.05):

                qt1 = Y[k] + st.norm.ppf(alpha) * sigma[k]
                qt2 = Y[k] + st.norm.ppf(1 - alpha) * sigma[k]

                intervals.append([qt1, qt2])

            dist.append_interval(intervals)

            ret.append(dist)

        return ret
예제 #5
0
    def forecast_distribution(self, data, **kwargs):

        ret = []

        smooth = kwargs.get("smooth", "KDE")
        alpha = kwargs.get("alpha", None)

        uod = self.get_UoD()

        for k in data.index:

            tmp = self.get_models_forecasts(data.ix[k])

            if alpha is None:
                tmp = np.ravel(tmp).tolist()
            else:
                tmp = self.get_distribution_interquantile(
                    np.ravel(tmp).tolist(), alpha)

            name = str(self.indexer.get_index(data.ix[k]))

            dist = ProbabilityDistribution.ProbabilityDistribution(smooth,
                                                                   uod=uod,
                                                                   data=tmp,
                                                                   name=name,
                                                                   **kwargs)

            ret.append(dist)

        return ret
예제 #6
0
    def forecast_ahead_distribution(self, data, steps, **kwargs):
        smoothing = kwargs.get("smoothing", 0.5)

        sigma = np.sqrt(self.model_fit.sigma2)

        l = len(data)

        ret = []

        nmeans = self.forecast_ahead(data, steps, **kwargs)

        for k in np.arange(0, steps):
            dist = ProbabilityDistribution.ProbabilityDistribution(
                type="histogram", uod=[self.original_min, self.original_max])
            intervals = []
            for alpha in np.arange(0.05, 0.5, 0.05):
                tmp = []

                hsigma = (1 + k * smoothing) * sigma

                tmp.append(nmeans[k] + st.norm.ppf(alpha) * hsigma)
                tmp.append(nmeans[k] + st.norm.ppf(1 - alpha) * hsigma)

                intervals.append(tmp)

            dist.append_interval(intervals)

            ret.append(dist)

        return ret
예제 #7
0
    def forecast_distribution(self, data, **kwargs):

        sigma = np.sqrt(self.model_fit.sigma2)

        l = len(data)

        ret = []

        for k in np.arange(self.order, l + 1):
            sample = [data[i] for i in np.arange(k - self.order, k)]

            mean = self.forecast(sample)

            if isinstance(mean, (list, np.ndarray)):
                mean = mean[0]

            dist = ProbabilityDistribution.ProbabilityDistribution(
                type="histogram", uod=[self.original_min, self.original_max])
            intervals = []
            for alpha in np.arange(0.05, 0.5, 0.05):

                qt1 = mean + st.norm.ppf(alpha) * sigma
                qt2 = mean + st.norm.ppf(1 - alpha) * sigma

                intervals.append([qt1, qt2])

            dist.append_interval(intervals)

            ret.append(dist)

        return ret
예제 #8
0
파일: ensemble.py 프로젝트: anhtholee/pyFTS
    def forecast_distribution(self, data, **kwargs):
        ret = []

        smooth = kwargs.get("smooth", "KDE")
        alpha = kwargs.get("alpha", None)

        uod = self.get_UoD()

        for k in np.arange(self.order, len(data)):

            sample = data[k - self.order:k]

            forecasts = self.get_models_forecasts(sample)

            if alpha is None:
                forecasts = np.ravel(forecasts).tolist()
            else:
                forecasts = self.get_distribution_interquantile(
                    np.ravel(forecasts).tolist(), alpha)

            dist = ProbabilityDistribution.ProbabilityDistribution(
                smooth, uod=uod, data=forecasts, name="", **kwargs)

            ret.append(dist)

        return ret
예제 #9
0
파일: quantreg.py 프로젝트: zilla-liu/pyFTS
    def forecast_ahead_distribution(self, ndata, steps, **kwargs):
        smoothing = kwargs.get("smoothing", 0.01)

        l = len(ndata)

        ret = []

        nmeans = self.forecast_ahead(ndata, steps, **kwargs)

        for k in np.arange(0, self.order):
            nmeans.insert(k, ndata[k])

        for k in np.arange(self.order, steps + self.order):
            dist = ProbabilityDistribution.ProbabilityDistribution(
                type="histogram", uod=[self.original_min, self.original_max])

            intervals = [[nmeans[self.order], nmeans[self.order]]]
            for qt in self.dist_qt:
                intl1 = self.point_to_interval(nmeans[k - self.order:k], qt[0],
                                               qt[1])
                tmpk = k - self.order
                intl2 = [
                    intl1[0] * (1 - (tmpk * smoothing)),
                    intl1[1] * (1 + (tmpk * smoothing))
                ]
                intervals.append(intl2)
            dist.append_interval(intervals)

            ret.append(dist)

        return ret
예제 #10
0
    def forecast_ahead_distribution(self, data, steps, **kwargs):
        smoothing = kwargs.get("smoothing", 0.5)

        X = [data[t] for t in np.arange(self.order)]
        S = []

        for k in np.arange(self.order, steps + self.order):
            sample = [X[k - t - 1] for t in np.arange(self.order)]
            Y, sigma = self.model.predict([sample], return_std=True)
            X.append(Y[0])
            S.append(sigma[0])

        X = X[-steps:]
        #uncertainty = st.norm.ppf(alpha) * np.sqrt(np.diag(sigma))
        ret = []
        for k in range(steps):
            dist = ProbabilityDistribution.ProbabilityDistribution(
                type="histogram", uod=[self.original_min, self.original_max])
            intervals = []
            for alpha in np.arange(0.05, 0.5, 0.05):
                qt1 = X[k] - st.norm.ppf(alpha) * (
                    1 + k * smoothing) * np.sqrt(S[k])
                qt2 = X[k] - st.norm.ppf(1 - alpha) * (
                    1 + k * smoothing) * np.sqrt(S[k])

                intervals.append([qt1, qt2])

            dist.append_interval(intervals)

            ret.append(dist)

        return ret
예제 #11
0
    def forecast_ahead_distribution(self, ndata, steps, **kwargs):

        ret = []

        if 'type' in kwargs:
            kwargs.pop('type')

        smooth = kwargs.get("smooth", "none")

        uod = self.get_UoD()

        if 'bins' in kwargs:
            _bins = kwargs.pop('bins')
            nbins = len(_bins)
        else:
            nbins = kwargs.get("num_bins", 100)
            _bins = np.linspace(uod[0], uod[1], nbins)

        start = kwargs.get('start_at', 0)

        if 'fuzzyfied' in kwargs:
            fuzzyfied = kwargs.pop('fuzzyfied')
        else:
            fuzzyfied = False

        if not fuzzyfied:
            sample = ndata[start:start + self.max_lag]
        else:
            sample = []
            for k in ndata[start:start + self.max_lag]:
                kv = self.partitioner.defuzzyfy(k, mode='both')
                sample.append(kv)

        for dat in sample:
            if not isinstance(dat,
                              ProbabilityDistribution.ProbabilityDistribution):
                tmp = ProbabilityDistribution.ProbabilityDistribution(
                    smooth, uod=uod, bins=_bins, **kwargs)
                tmp.set(dat, 1.0)
                ret.append(tmp)
            else:
                ret.append(dat)

        dist = self.forecast_distribution_from_distribution(
            ret, smooth, uod, _bins, **kwargs)

        ret.append(dist)

        for k in np.arange(start + self.max_lag, steps + start + self.max_lag):
            dist = self.forecast_distribution_from_distribution(
                ret[k - self.max_lag:], smooth, uod, _bins, **kwargs)
            ret.append(dist)

        return ret[-steps:]
예제 #12
0
    def forecast_distribution(self, data, **kwargs):

        sim_vector = self.inference(steps)

        ret = []

        for ct, sample in enumerate(sim_vector):
            pd = ProbabilityDistribution.ProbabilityDistribution(type='histogram', data=sample, nbins=500)
            ret.append(pd)

        return ret
예제 #13
0
    def forecast_distribution(self, ndata, **kwargs):

        smooth = kwargs.get("smooth", "none")

        l = len(ndata)
        uod = self.get_UoD()

        if 'bins' in kwargs:
            _bins = kwargs.pop('bins')
            nbins = len(_bins)
        else:
            nbins = kwargs.get("num_bins", 100)
            _bins = np.linspace(uod[0], uod[1], nbins)

        ret = []

        for k in np.arange(self.order - 1, l):
            sample = ndata[k - (self.order - 1):k + 1]

            flrgs = self.generate_lhs_flrg(sample)

            if 'type' in kwargs:
                kwargs.pop('type')

            dist = ProbabilityDistribution.ProbabilityDistribution(smooth,
                                                                   uod=uod,
                                                                   bins=_bins,
                                                                   **kwargs)

            for bin in _bins:
                num = []
                den = []
                for s in flrgs:
                    if s.get_key() in self.flrgs:
                        flrg = self.flrgs[s.get_key()]
                        pk = flrg.lhs_conditional_probability(
                            sample, self.sets, self.global_frequency_count,
                            uod, nbins)
                        wi = flrg.rhs_conditional_probability(
                            bin, self.sets, uod, nbins)
                        num.append(wi * pk)
                        den.append(pk)
                    else:
                        num.append(0.0)
                        den.append(0.000000001)
                pf = sum(num) / sum(den)

                dist.set(bin, pf)

            ret.append(dist)

        return ret
예제 #14
0
    def forecast_ahead_distribution(self, ndata, steps, **kwargs):

        ret = []

        for k in np.arange(self.order, steps + self.order):
            dist = ProbabilityDistribution.ProbabilityDistribution(type="histogram",
                                                                   uod=[self.original_min, self.original_max])
            intervals = [[k, k] for k in ndata[-self.order:]]
            for qt in self.dist_qt:
                intl = self.interval_to_interval([intervals[x] for x in np.arange(k - self.order, k)], qt[0], qt[1])
                intervals.append(intl)
            dist.append_interval(intervals)

            ret.append(dist)

        return ret
예제 #15
0
    def forecast_ahead_distribution(self, data, steps, **kwargs):
        if 'method' in kwargs:
            self.point_method = kwargs.get('method', 'mean')

        smooth = kwargs.get("smooth", "KDE")
        alpha = kwargs.get("alpha", None)

        ret = []

        start = kwargs.get('start', self.order)

        uod = self.get_UoD()

        sample = data[start - self.order:start]

        for k in np.arange(self.order, steps + self.order):
            forecasts = []
            lags = {}
            for i in np.arange(0, self.order):
                lags[i] = sample[k - self.order]

            # Build the tree with all possible paths

            root = tree.FLRGTreeNode(None)

            tree.build_tree_without_order(root, lags, 0)

            for p in root.paths():
                path = list(reversed(list(filter(None.__ne__, p))))

                forecasts.extend(self.get_models_forecasts(path))

            sample.append(sampler(forecasts, np.arange(0.1, 1, 0.1)))

            if alpha is None:
                forecasts = np.ravel(forecasts).tolist()
            else:
                forecasts = self.get_distribution_interquantile(
                    np.ravel(forecasts).tolist(), alpha)

            dist = ProbabilityDistribution.ProbabilityDistribution(
                smooth, uod=uod, data=forecasts, name="", **kwargs)

            ret.append(dist)

        return ret
예제 #16
0
파일: knn.py 프로젝트: zilla-liu/pyFTS
    def forecast_distribution(self, data, **kwargs):
        ret = []

        smooth = kwargs.get("smooth", "histogram")

        uod = self.get_UoD()

        for k in np.arange(self.order, len(data)):

            sample = data[k - self.order:k]

            forecasts = self.knn(sample)

            dist = ProbabilityDistribution.ProbabilityDistribution(
                smooth, uod=uod, data=forecasts, name="", **kwargs)
            ret.append(dist)

        return ret
예제 #17
0
    def forecast_distribution(self, ndata, **kwargs):

        ret = []

        l = len(ndata)

        for k in np.arange(self.order, l + 1):
            dist = ProbabilityDistribution.ProbabilityDistribution(type="histogram",
                                                                   uod=[self.original_min, self.original_max])
            intervals = []
            for qt in self.dist_qt:
                sample = ndata[k - self.order: k]
                intl = self.point_to_interval(sample, qt[0], qt[1])
                intervals.append(intl)

            dist.append_interval(intervals)

            ret.append(dist)

        return ret
예제 #18
0
파일: ensemble.py 프로젝트: anhtholee/pyFTS
    def forecast_ahead_distribution(self, data, steps, **kwargs):
        if 'method' in kwargs:
            self.point_method = kwargs.get('method', 'mean')

        smooth = kwargs.get("smooth", "histogram")
        alpha = kwargs.get("alpha", None)

        ret = []

        start = kwargs.get('start_at', self.order)

        uod = self.get_UoD()

        sample = [[k] for k in data[start:start + self.order]]

        for k in np.arange(self.order, steps + self.order):
            forecasts = []

            lags = []
            for i in np.arange(0, self.order):
                lags.append(sample[i - self.order])

            # Trace the possible paths
            for path in product(*lags):
                forecasts.extend(self.get_models_forecasts(path))

            sample.append(
                sampler(forecasts, np.arange(.1, 1, 0.1), bounds=True))

            if alpha is None:
                forecasts = np.ravel(forecasts).tolist()
            else:
                forecasts = self.get_distribution_interquantile(
                    np.ravel(forecasts).tolist(), alpha)

            dist = ProbabilityDistribution.ProbabilityDistribution(
                smooth, uod=uod, data=forecasts, name="", **kwargs)

            ret.append(dist)

        return ret[-steps:]
예제 #19
0
    def forecast_ahead_distribution(self, ndata, steps, **kwargs):

        ret = []

        smooth = kwargs.get("smooth", "none")

        uod = self.get_UoD()

        if 'bins' in kwargs:
            _bins = kwargs.pop('bins')
            nbins = len(_bins)
        else:
            nbins = kwargs.get("num_bins", 100)
            _bins = np.linspace(uod[0], uod[1], nbins)

        start = kwargs.get('start', self.order)

        sample = ndata[start - self.order:start]

        for dat in sample:
            if 'type' in kwargs:
                kwargs.pop('type')
            tmp = ProbabilityDistribution.ProbabilityDistribution(smooth,
                                                                  uod=uod,
                                                                  bins=_bins,
                                                                  **kwargs)
            tmp.set(dat, 1.0)
            ret.append(tmp)

        dist = self.forecast_distribution(sample, bins=_bins)[0]

        ret.append(dist)

        for k in np.arange(self.order + 1, steps + self.order + 1):
            dist = ProbabilityDistribution.ProbabilityDistribution(smooth,
                                                                   uod=uod,
                                                                   bins=_bins,
                                                                   **kwargs)

            lags = {}

            # Find all bins of past distributions with probability greater than zero

            for ct, dd in enumerate(ret[k - self.order:k]):
                vals = [
                    float(v) for v in dd.bins if round(dd.density(v), 4) > 0
                ]
                lags[ct] = sorted(vals)

            root = tree.FLRGTreeNode(None)

            tree.build_tree_without_order(root, lags, 0)

            # Trace all possible combinations between the bins of past distributions

            for p in root.paths():
                path = list(reversed(list(filter(None.__ne__, p))))

                # get the combined probabilities for this path

                pk = np.prod([
                    ret[k - self.order + o].density(path[o])
                    for o in np.arange(0, self.order)
                ])

                d = self.forecast_distribution(path)[0]

                for bin in _bins:
                    dist.set(bin, dist.density(bin) + pk * d.density(bin))

            ret.append(dist)

        return ret[self.order:]
예제 #20
0
    def forecast_distribution(self, ndata, **kwargs):

        smooth = kwargs.get("smooth", "none")

        from_distribution = kwargs.get('from_distribution', False)

        fuzzyfied = kwargs.get('fuzzyfied', False)

        l = len(ndata)
        uod = self.get_UoD()

        if 'bins' in kwargs:
            _bins = kwargs.pop('bins')
            nbins = len(_bins)
        else:
            nbins = kwargs.get("num_bins", 100)
            _bins = np.linspace(uod[0], uod[1], nbins)

        ret = []

        for k in np.arange(self.max_lag - 1, l):
            sample = ndata[k - (self.max_lag - 1):k + 1]

            if from_distribution:
                dist = self.forecast_distribution_from_distribution(
                    sample, smooth, uod, _bins)
            else:

                if not fuzzyfied:
                    flrgs = self.generate_lhs_flrg(sample)
                else:
                    fsets = self.get_sets_from_both_fuzzyfication(sample)
                    flrgs = self.generate_lhs_flrg_fuzzyfied(fsets)

                if 'type' in kwargs:
                    kwargs.pop('type')

                dist = ProbabilityDistribution.ProbabilityDistribution(
                    smooth, uod=uod, bins=_bins, **kwargs)

                for bin in _bins:
                    num = []
                    den = []
                    for s in flrgs:
                        if s.get_key() in self.flrgs:
                            flrg = self.flrgs[s.get_key()]
                            wi = flrg.rhs_conditional_probability(
                                bin, self.partitioner.sets, uod, nbins)
                            if not fuzzyfied:
                                pk = flrg.lhs_conditional_probability(
                                    sample, self.partitioner.sets,
                                    self.global_frequency_count, uod, nbins)
                            else:
                                lhs_mv = self.pwflrg_lhs_memberhip_fuzzyfied(
                                    flrg, sample)
                                pk = flrg.lhs_conditional_probability_fuzzyfied(
                                    lhs_mv, self.partitioner.sets,
                                    self.global_frequency_count, uod, nbins)

                            num.append(wi * pk)
                            den.append(pk)
                        else:
                            num.append(0.0)
                            den.append(0.000000001)
                    pf = np.nansum(num) / np.nansum(den)

                    dist.set(bin, pf)

            ret.append(dist)

        return ret