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
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
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