Exemple #1
0
    def generate(self, ffrom, tto):
        period_type = self.get_period_type()

        ret, new_ffrom, new_tto = self._reused_data(ffrom, tto)
        if new_ffrom is None and new_tto is None:  # full reuse - ret == old_data
            return ret

        gc = gspread.authorize(self.credentials)
        wks = getattr(gc.open(self.spreadsheet), self.sheet)

        date_column = self.config.get("date_column", 1)
        data_column = self.config.get("data_column", 2)
        start_row = self.config.get("start_row", 0)

        data_values = wks.col_values(data_column)

        data = {}

        for i, v in enumerate(wks.col_values(date_column)):
            if i < start_row:
                continue
            if not v:
                continue
            data[ensure_date(v)] = parse_float(data_values[i] or "0")

        return [{
            "label": d.strftime("%Y-%m-%d"),
            "data": data.get(d, 0)
        } for d in generate_date_series(ffrom, tto, period_type)]
Exemple #2
0
    def generate(self, ffrom, tto):
        period_type = self.get_period_type()
        file_name = self.config["filename"]
        date_column = self.config.get("date_column", 0)
        data_column = self.config.get("data_column", 1)
        filter_column = self.config.get("filter_column", -1)
        filter_value = self.config.get("filter_value", "")
        skip_rows = self.config.get("skip_rows", 0)

        f = csv.reader(open(file_name))

        if filter_column >= 0:

            def filter_row(r):
                return r[filter_column] == filter_value
        else:

            def filter_row(r):
                return True

        data = dict((ensure_date(row[date_column]), float(row[data_column]))
                    for i, row in enumerate(f)
                    if i >= skip_rows and row[date_column] and filter_row(row))

        return [{
            "label": d.strftime("%Y-%m-%d"),
            "data": data.get(d, 0)
        } for d in generate_date_series(ffrom, tto, period_type)]
Exemple #3
0
    def generate(self, ffrom, tto):
        period_type = self.get_period_type()

        sum_type = self.config.get("sum_type", "sum")

        ret, new_ffrom, new_tto = self._reused_data(ffrom, tto)
        if new_ffrom is None and new_tto is None:  # full reuse - ret == old_data
            return ret

        query = self._get_query()

        with self.db.cursor() as cursor:
            for period_from in generate_date_series(new_ffrom, new_tto,
                                                    period_type):
                period_to = calculate_period_to(period_from, period_type)
                params = {
                    'ffrom': period_from,
                    'tto': period_to,
                    "period": period_type
                }
                params.update(self.get_params())
                try:
                    cursor.execute(query, params)
                except:
                    import ipdb
                    ipdb.set_trace()
                rrow = cursor.fetchone()
                if not rrow:
                    ret[period_from] = 0
                else:
                    ret[period_from] = rrow["value"]

            totalized_movs = sorted(ret.items(), key=lambda k_v: k_v[0])

        accumulate(totalized_movs, sum_type)

        if [row for row in totalized_movs if row[1] is None]:
            import ipdb
            ipdb.set_trace()

        data = [{
            "label": row[0].strftime("%Y-%m-%d"),
            "data": float(row[1])
        } for row in totalized_movs]
        return data
Exemple #4
0
    def generate(self, ffrom, tto):
        source = self.config["source"]

        source_data = read_data(source, self.global_config)

        ret = []
        for month in generate_date_series(ffrom, tto, self.get_period_type()):
            label = month.strftime("%Y-%m-%d")
            datas = [
                d["data"] for d in source_data
                if d["label"][:7] == label[:7] and d["data"]
            ]
            if datas:
                data = sum(datas) / len(datas)
            else:
                data = 0
            ret.append({"label": label, "data": data})
        return ret
Exemple #5
0
    def generate(self, ffrom, tto):
        period_type = self.get_period_type()

        sum_type = self.config.get("sum_type", "sum")

        ret, new_ffrom, new_tto = self._reused_data(ffrom, tto)
        if new_ffrom is None and new_tto is None:  # full reuse - ret == old_data
            return ret

        query = self._get_query()

        with self.db.cursor() as cursor:
            params = {
                'ffrom': new_ffrom,
                'tto': new_tto,
                "period": period_type
            }
            params.update(self.get_params())
            try:
                cursor.execute(query, params)
            except:
                import ipdb
                ipdb.set_trace()
                raise
            for row in cursor.fetchall():
                ret[ensure_date(row["period"])] = row["value"]
            # Fill missing dates with zeros
            missing_dates = [
                d
                for d in generate_date_series(new_ffrom, new_tto, period_type)
                if d not in ret
            ]
            for missing in missing_dates:
                ret[missing] = 0

            totalized_movs = sorted(ret.items(), key=lambda k_v: k_v[0])

        accumulate(totalized_movs, sum_type)

        data = [{
            "label": row[0].strftime("%Y-%m-%d"),
            "data": float(row[1])
        } for row in totalized_movs]
        return data
Exemple #6
0
    def generate(self, ffrom, tto):
        period_type = self.get_period_type()

        ret, new_ffrom, new_tto = self._reused_data(ffrom, tto)
        if new_ffrom is None and new_tto is None:  # full reuse - ret == old_data
            return ret
        values = self.profile.core.query.metrics(self.metric_name).daily(
            new_ffrom, days=(new_tto - new_ffrom).days + 1).values

        # Agrupo por período
        for i, v in enumerate(values):
            date = new_ffrom + datetime.timedelta(days=i)
            period_start = date_to_period(period_type, date)
            ret[period_start] = v + ret.get(period_start, 0)

        return [{
            "label": d.strftime("%Y-%m-%d"),
            "data": ret.get(d, 0)
        } for d in generate_date_series(ffrom, tto, period_type)]
Exemple #7
0
 def _reused_data(self, ffrom, tto):
     reuse = self.config.get("reuse", self.global_config.get("default_reuse", False))
     period_type = self.get_period_type()
     if reuse:
         old_data = read_data(self.name, self.global_config)
         ret = dict((parse_date(v["label"]).date(), v["data"]) for v in old_data)
         missing_dates = [d for d in generate_date_series(ffrom, tto, period_type)
                          if not d in ret]
         if not missing_dates:
             return old_data, None, None
         new_ffrom = missing_dates[0]
         if period_type == "weekS":
             delta = relativedelta(days=7)
         else:
             delta = relativedelta(**{"%ss" % period_type: 1})
         new_tto = missing_dates[-1] + delta - relativedelta(days=1)
     else:
         new_ffrom = ffrom
         new_tto = tto
         ret = {}
     return ret, new_ffrom, new_tto
Exemple #8
0
    def generate(self, ffrom, tto):
        period_type = self.get_period_type()

        url = self.base_url + self.path

        params = {
            "limit": self.limit,
        }
        for k, v in self.filters.items():
            params[self.filter_format.format(k)] = v

        ret, new_ffrom, new_tto = self._reused_data(ffrom, tto)
        if new_ffrom is None and new_tto is None:  # full reuse - ret == old_data
            return ret

        for period_from in generate_date_series(new_ffrom, new_tto, period_type):
            period_to = calculate_period_to(period_from, period_type)

            period_params = dict(params)
            period_params.update({
                self.filter_format.format("date_from"): period_from.strftime("%Y-%m-%d"),
                self.filter_format.format("date_to"): period_to.strftime("%Y-%m-%d"),
            })

            resp = requests.get(url + "?{}".format(parse.urlencode(period_params)),
                                headers={"API-Key": self.api_key})

            resp.raise_for_status()
            resp = resp.json()

            ret[period_from] = resp["pagination"]["total_count"]

        totalized_movs = sorted(ret.items(), key=lambda k_v: k_v[0])

        data = [{"label": row[0].strftime("%Y-%m-%d"), "data": float(row[1])}
                for row in totalized_movs]
        return data