# pyFTS.models.cheng — pyFTS 1.4 documentation

# Source code for pyFTS.models.cheng

    """
    Trend Weighted Fuzzy Time Series by Cheng, Chen and Wu (2009)

    C.-H. Cheng, Y.-S. Chen, and Y.-L. Wu, “Forecasting innovation diffusion of products using trend-weighted fuzzy time-series model,”
    Expert Syst. Appl., vol. 36, no. 2, pp. 1826–1832, 2009.
    """

    import numpy as np
    from pyFTS.common import FuzzySet, FLR, fts
    from pyFTS.models import yu

    class TrendWeightedFLRG(yu.WeightedFLRG):
        """
        First Order Trend Weighted Fuzzy Logical Relationship Group
        """
        def __init__(self, LHS, **kwargs):
            super(TrendWeightedFLRG, self).__init__(LHS, **kwargs)
            self.w = None

        def weights(self, sets):
            if self.w is None:
                count_nochange = 0.0
                count_up = 0.0
                count_down = 0.0
                weights = []

                for c in self.RHS:
                    tmp = 0
                    if sets[self.LHS].centroid == sets[c].centroid:
                        count_nochange += 1.0
                        tmp = count_nochange
                    elif sets[self.LHS].centroid > sets[c].centroid:
                        count_down += 1.0
                        tmp = count_down
                    else:
                        count_up += 1.0
                        tmp = count_up
                    weights.append(tmp)

                tot = sum(weights)
                self.w = np.array([k / tot for k in weights])
            return self.w

    class TrendWeightedFTS(yu.WeightedFTS):
        """First Order Trend Weighted Fuzzy Time Series"""
        def __init__(self, **kwargs):
            super(TrendWeightedFTS, self).__init__(**kwargs)
            self.shortname = "TWFTS"
            self.name = "Trend Weighted FTS"
            self.detail = "Cheng"
            self.is_high_order = False

        def generate_FLRG(self, flrs):
            for flr in flrs:
                if flr.LHS in self.flrgs:
                    self.flrgs[flr.LHS].append_rhs(flr.RHS)
                else:
                    self.flrgs[flr.LHS] = TrendWeightedFLRG(flr.LHS)
                    self.flrgs[flr.LHS].append_rhs(flr.RHS)