示例#1
0
    def _get_social_search(self, google_query, date_start, date_end, summary_metrics, max_results=10):
        organic_table = google_query.get_table(
            params={
                'ids': 'ga:%s' % self.remote_id,
                'start-date': date_start,
                'end-date': date_end,
                'filters': 'ga:medium!=referral;ga:medium!=(not set);ga:socialNetwork==(not set)',
                'sort': '-ga:pageviews',
                'max-results': str(max_results),
            },
            dimensions=[
                Column('ga:source', type_cast=_prune_abstract),
            ],
            metrics=[col.new() for col in summary_metrics],
        )

        social_table = google_query.get_table(
            params={
                'ids': 'ga:%s' % self.remote_id,
                'start-date': date_start,
                'end-date': date_end,
                'sort': '-ga:pageviews',
                'max-results': str(max_results),
            },
            dimensions=[
                Column('ga:socialNetwork', type_cast=_prune_abstract),
            ],
            metrics=[col.new() for col in summary_metrics],
        )

        source_col = Column('source', label='Social & Search & Campaigns', visible=1, type_cast=_cast_title)
        t = Table(columns=[
            source_col,
        ] + [col.new() for col in summary_metrics])

        for cells in social_table.iter_rows():
            t.add(cells)

        for cells in organic_table.iter_rows():
            t.add(cells)

        t.sort(reverse=True)
        return t
示例#2
0
    def _get_versions(self, google_query, summary_metrics):
        t = google_query.get_table(
            params={
                'ids': 'ga:%s' % self.remote_id,
                'start-date': self.date_start,
                'end-date': self.date_end,
                'sort': '-ga:appVersion',
                'max-results': '50',
            },
            dimensions=[
                Column('ga:appVersion', label='Version', visible=1),
                Column('ga:operatingSystem',
                       label='Operating System',
                       visible=2),
            ],
            metrics=[col.new() for col in summary_metrics] + [],
        )
        t.set_visible('ga:users', 'ga:appVersion')
        t.tag_rows()

        col_exception = Column('ga:fatalExceptions',
                               label='Crashes',
                               type_cast=int,
                               type_format=h.human_int)
        crashes_table = google_query.get_table(
            params={
                'ids': 'ga:%s' % self.remote_id,
                'start-date': self.date_start,
                'end-date': self.date_end,
                'sort': '-ga:appVersion',
                'max-results': '50',
            },
            dimensions=[
                Column('ga:appVersion', label='Version', visible=1),
                Column('ga:operatingSystem',
                       label='Operating System',
                       visible=2),
            ],
            metrics=[col_exception],
        )
        crashes_lookup = dict(
            ((version, os), crashes)
            for crashes, version, os in crashes_table.iter_rows(
                'ga:fatalExceptions', 'ga:appVersion', 'ga:operatingSystem'))

        total = float(t.get('ga:users').sum)

        out = Table(columns=[
            Column(
                'users', label='Users', visible=0,
                type_format=_format_percent),
            Column('version', label='Version', visible=1),
        ])

        latest_version = None
        for i, (users, sessions, version, os) in enumerate(
                t.iter_rows('ga:users', 'ga:sessions', 'ga:appVersion',
                            'ga:operatingSystem')):
            row = out.add([users * 100.0 / total, u"%s on %s" % (version, os)])
            row.tags = t.rows[i].tags
            if not latest_version:
                latest_version = version
            crashes = crashes_lookup.get((version, os), 0)
            if latest_version == version:
                row.tag('latest')
            if crashes and crashes > sessions * 0.1:
                row.tag('crashes',
                        value=h.human_int(crashes),
                        is_positive=False,
                        is_prefixed=True)

        self.latet_version = latest_version
        out.limit(5)
        out.sort(reverse=True)
        return out
示例#3
0
    def _get_goals(self, google_query, interval_field):
        goals_api = 'https://www.googleapis.com/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals'
        r = google_query.get(
            goals_api.format(profileId=self.remote_data['id'],
                             **self.remote_data))
        has_goals = r.get('items') or []
        goal_metrics = [
            Column('ga:goal{id}Completions'.format(id=g['id']),
                   label=g['name'],
                   type_cast=float) for g in has_goals if g.get('active')
        ]

        if not goal_metrics:
            return

        # Note: max 10 metrics allowed
        metrics = goal_metrics[-9:] + [Column('ga:sessions', type_cast=int)]
        raw_table = google_query.get_table(
            params={
                'ids': 'ga:%s' % self.remote_id,
                'start-date': self.previous_date_start,  # Extra week
                'end-date': self.date_end,
                'sort': '-{}'.format(interval_field),
            },
            metrics=metrics,
            dimensions=[
                Column(interval_field),
            ],
        )

        if len(raw_table.rows) != 2:
            # Less than 2 weeks of data available
            return

        t = Table(columns=[
            Column('goal', label='Goals', visible=1, type_cast=_cast_title),
            Column('completions',
                   label='Events',
                   visible=0,
                   type_cast=int,
                   type_format=h.human_int,
                   threshold=0),
        ])

        num_sessions, num_sessions_last = [
            next(v) for v in raw_table.iter_rows('ga:sessions')
        ]

        this_week, last_week = raw_table.rows
        col_compare = t.get('completions')
        col_compare_delta = Column('%s:delta' % col_compare.id,
                                   label='Events',
                                   type_cast=float,
                                   type_format=h.human_delta,
                                   threshold=0)
        has_completions = False
        for col_id, pos in raw_table.column_to_index.items():
            col = raw_table.columns[pos]
            if not col.id.startswith('ga:goal'):
                continue

            completions, completions_last = this_week.values[
                pos], last_week.values[pos]
            percent_completions = completions * 100.0 / num_sessions if num_sessions else 0.0
            percent_completions_last = completions_last * 100.0 / num_sessions_last if num_sessions_last else 0.0
            row = t.add([col.label, completions])
            if not row:
                # Boring
                continue

            if completions > 0:
                row.tag(type="Conversion",
                        value=_format_percent(percent_completions))

            if completions + completions_last > 0:
                has_completions = True
                # Old method:
                # delta = (percent_completions - percent_completions_last) / 100.0
                # New method (same as GA shows):
                delta = completions / completions_last - 1 if completions_last > 0.0 else 1.0
                if abs(delta) > 0.001:
                    row.tag(type='delta',
                            value=delta,
                            column=col_compare_delta,
                            is_positive=delta > 0)

        if not has_completions:
            return

        t.sort(reverse=True)

        return t