diff --git a/api/api_v1/endpoints/query.py b/api/api_v1/endpoints/query.py index cf4f9ef..f8c7c31 100644 --- a/api/api_v1/endpoints/query.py +++ b/api/api_v1/endpoints/query.py @@ -212,6 +212,15 @@ async def funnel_model( groupby = res['groupby'] df = await ckdb.query_dataframe(sql) + # 补齐level数据 + concat_data = [] + for key, tmp_df in df.groupby(['date'] + groupby): + not_exists_level = {i for i in range(1, len(cond_level) + 1)} - set(tmp_df['level']) + for item in not_exists_level: + key = key if isinstance(key, tuple) else (key,) + concat_data.append((*key, item, 0)) + df = pd.concat([df, pd.DataFrame(concat_data, columns=df.columns)]) + # df.set_index('date',inplace=True) data_list = [] date_data = {} @@ -231,6 +240,34 @@ async def funnel_model( 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) + + # 补齐日期 + all_idx = {(dt, lv) for dt in date_range for lv in range(1, len(cond_level) + 1)} + concat_data = [] + for i in all_idx - set(df.set_index(['date', 'level']).index): + concat_data.append((*i, 0)) + summary_df = pd.concat( + [df[['date', 'level', 'values']], pd.DataFrame(concat_data, columns=['date', 'level', 'values'])]) + for key, tmp_df in summary_df.groupby('date'): + 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(): + var = round(v * 100 / tmp_df.loc[1, 'values'], 2) + var = 0 if np.isnan(var) else var + tmp['p1'].append(var) + # tmp['p2'].append(round(v*100 / tmp_df.loc[i - 1, 'values'], 2)) + + _ = date_data.setdefault(key.strftime('%Y-%m-%d'), {}) + _['总体'] = tmp + if groupby: # 补齐数据 concat_data = [] @@ -253,7 +290,9 @@ async def funnel_model( 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)) + var = round(v * 100 / tmp_df.loc[1, 'values'], 2) + var = 0 if np.isnan(var) else var + tmp['p1'].append(var) # tmp['p2'].append(round(v*100 / tmp_df.loc[i - 1, 'values'], 2)) data_list.append(tmp) @@ -270,13 +309,15 @@ async def funnel_model( 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)) + var = round(v * 100 / tmp_df.loc[1, 'values'], 2) + var = 0 if np.isnan(var) else var + tmp['p1'].append(var) # 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, 'level': cond_level + title = (groupby or ['总体']) + cond_level + resp = {'list': data_list, 'date_data': date_data, 'title': title, 'level': cond_level } return schemas.Msg(code=0, msg='ok', data=resp) @@ -320,7 +361,7 @@ async def scatter_model_sql( resp['label'] = [f'[{i},{i + interval})' for i in range(min_v, max_v, interval)] bins = [i for i in range(min_v, max_v + interval, interval)] else: - quota_interval_arr = [-float('inf')] + quota_interval_arr+[float('inf')] + quota_interval_arr = [-float('inf')] + quota_interval_arr + [float('inf')] resp['label'] = [] bins = [quota_interval_arr[0]] for i, v in enumerate(quota_interval_arr[1:]): diff --git a/models/behavior_analysis.py b/models/behavior_analysis.py index d9dd590..bd7e3f2 100644 --- a/models/behavior_analysis.py +++ b/models/behavior_analysis.py @@ -273,7 +273,8 @@ ORDER BY 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')") + # sql = sql.replace('_windows_gap_', f"({windows_gap},'strict_increase')") + sql = sql.replace('_windows_gap_', f"({windows_gap})") print(sql) return {'sql': sql, 'groupby': [i.key for i in self.groupby],