diff --git a/api/api_v1/endpoints/query.py b/api/api_v1/endpoints/query.py index 0c38414..4c336a3 100644 --- a/api/api_v1/endpoints/query.py +++ b/api/api_v1/endpoints/query.py @@ -213,6 +213,7 @@ async def funnel_model( df = await ckdb.query_dataframe(sql) # df.set_index('date',inplace=True) data_list = [] + date_data = {} if df.shape == (0, 0): return schemas.Msg(code=0, msg='ok', data={'list': data_list, 'level': cond_level}) @@ -232,9 +233,9 @@ async def funnel_model( if groupby: # 补齐数据 concat_data = [] - idx = set(df.set_index(groupby).index) - all_idx = {(j, i) for i in range(1, len(cond_level) + 1) for j in idx} - for i in all_idx - set(df.set_index(list((*groupby, 'level'))).index): + idx = set(df.set_index(['date'] + groupby).index) + all_idx = {(*j, i) for i in range(1, len(cond_level) + 1) for j in idx} + for i in all_idx - set(df.set_index(list(('date', *groupby, 'level'))).index): concat_data.append((*i, 0)) df = pd.concat([df, pd.DataFrame(concat_data, columns=df.columns)]) @@ -242,7 +243,7 @@ async def funnel_model( for key, tmp_df in df.groupby(groupby): tmp = {'title': key} - tmp_df.set_index('level', inplace=True) + tmp_df = tmp_df.groupby('level').sum() tmp_df.sort_index(inplace=True) for i in tmp_df.index: tmp_df.loc[i, 'values'] = tmp_df.loc[i:]['values'].sum() @@ -253,5 +254,26 @@ async def funnel_model( for i, v in tmp_df.loc[2:, 'values'].items(): tmp['p1'].append(round(v * 100 / tmp_df.loc[1, 'values'], 2)) # tmp['p2'].append(round(v*100 / tmp_df.loc[i - 1, 'values'], 2)) - data_list.append(tmp) - return schemas.Msg(code=0, msg='ok', data={'list': data_list, 'level': cond_level}) + data_list.append(tmp) + + for key, tmp_df in df.groupby(['date'] + groupby): + + tmp_df = tmp_df.groupby('level').sum() + tmp_df.sort_index(inplace=True) + for i in tmp_df.index: + tmp_df.loc[i, 'values'] = tmp_df.loc[i:]['values'].sum() + + tmp = dict() + + tmp['n'] = tmp_df['values'].to_list() + tmp['p1'] = [100] + # tmp['p2'] = [] + for i, v in tmp_df.loc[2:, 'values'].items(): + tmp['p1'].append(round(v * 100 / tmp_df.loc[1, 'values'], 2)) + # tmp['p2'].append(round(v*100 / tmp_df.loc[i - 1, 'values'], 2)) + + _ = date_data.setdefault(key[0].strftime('%Y-%m-%d'), {}) + _[key[1]] = tmp + + resp = {'list': data_list, 'date_data': date_data, 'title': groupby + cond_level} + return schemas.Msg(code=0, msg='ok', data=resp) diff --git a/models/behavior_analysis.py b/models/behavior_analysis.py index 9754ffb..727400c 100644 --- a/models/behavior_analysis.py +++ b/models/behavior_analysis.py @@ -241,9 +241,10 @@ ORDER BY level windows_gap = self.event_view['windows_gap'] * 86400 event_time_col = getattr(self.event_tbl.c, '#event_time') event_name_col = getattr(self.event_tbl.c, '#event_name') + date_col = func.toStartOfDay(func.addHours(event_time_col, self.zone_time)).label('date') e_account_id_col = getattr(self.event_tbl.c, '#account_id') - sub_group = [*self.groupby, e_account_id_col] + sub_group = [date_col, *self.groupby, e_account_id_col] conds = [] cond_level = [] for item in self.events: @@ -253,7 +254,7 @@ ORDER BY level ) cond_level.append(item['eventName']) # todo 替换 _windows_gap_ - subq = sa.select(*[sa.Column(i.key) for i in self.groupby], + subq = sa.select(*[sa.Column(i.key) for i in self.groupby], date_col, func.windowFunnel_windows_gap__(event_time_col, *conds).label('level')).select_from( self.event_tbl) @@ -266,11 +267,11 @@ ORDER BY level subq = subq.where(and_(*where)).group_by(*sub_group) subq = subq.subquery() - qry = sa.select(*[sa.Column(i.key) for i in self.groupby], sa.Column('level'), + qry = sa.select(sa.Column('date'), *[sa.Column(i.key) for i in self.groupby], sa.Column('level'), func.count().label('values')).select_from(subq) \ .where(sa.Column('level') > 0) \ - .group_by(*[sa.Column(i.key) for i in self.groupby], sa.Column('level')) \ - .order_by(*[sa.Column(i.key) for i in self.groupby], sa.Column('level')) + .group_by(sa.Column('date'), *[sa.Column(i.key) for i in self.groupby], sa.Column('level')) \ + .order_by(sa.Column('date'), *[sa.Column(i.key) for i in self.groupby], sa.Column('level')) sql = str(qry.compile(compile_kwargs={"literal_binds": True})) sql = sql.replace('_windows_gap_', f"({windows_gap},'strict_increase')") print(sql)