This commit is contained in:
wuaho 2021-06-16 20:19:30 +08:00
parent bee7045492
commit 749ff54ddf
2 changed files with 34 additions and 11 deletions

View File

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

View File

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