diff --git a/api/api_v1/endpoints/query.py b/api/api_v1/endpoints/query.py index 43d579d..7f75e72 100644 --- a/api/api_v1/endpoints/query.py +++ b/api/api_v1/endpoints/query.py @@ -72,10 +72,19 @@ async def event_model( date_range = item['date_range'] q['date_range'] = date_range df = await ckdb.query_dataframe(sql) - df.fillna(0,inplace=True) + df.fillna(0, inplace=True) if df.shape[0] == 0: continue # return schemas.Msg(code=0, msg='ok', data=[q]) + if item['time_particle'] == 'total': + # for group, df_group in df.groupby(groupby): + # df_group.reset_index(drop=True, inplace=True) + q['groups'].append(groupby) + q['values'].append(df['values'].to_list()) + q['sum'].append(int(df['values'].sum())) + q['date_range']=[f'{i[0]}-{i[1]}' for i in df.set_index(['svrindex','name']).index] + res.append(q) + continue if groupby: # 有分组 @@ -103,7 +112,12 @@ async def event_model( df.sort_values('date', inplace=True) q['values'].append(df['values'].to_list()) q['sum'].append(int(df['values'].sum())) - q['date_range'] = [d.strftime('%Y-%m-%d %H:%M:%S') for d in q['date_range']] + if item['time_particle'] in ('P1D', 'P1W'): + q['date_range'] = [d.strftime('%Y-%m-%d') for d in q['date_range']] + elif item['time_particle'] in ('P1M',): + q['date_range'] = [d.strftime('%Y-%m') for d in q['date_range']] + else: + q['date_range'] = [d.strftime('%Y-%m-%d %H:%M:%S') for d in q['date_range']] # q['eventNameDisplay']=item['event_name_display'] res.append(q) return schemas.Msg(code=0, msg='ok', data=res) diff --git a/core/config.py b/core/config.py index d08cdc3..2473253 100644 --- a/core/config.py +++ b/core/config.py @@ -262,6 +262,7 @@ class Settings(BaseSettings): "P1D": "D", "P1W": "W", "P1M": "MS", + "total": "D", } TIME_GRAIN_EXPRESSIONS = { @@ -271,7 +272,8 @@ class Settings(BaseSettings): 'PT10M': lambda col, zone: func.toStartOfTenMinutes(func.addHours(col, zone)).label('date'), 'PT15M': lambda col, zone: func.toStartOfFifteenMinutes(func.addHours(col, zone)).label('date'), 'PT1H': lambda col, zone: func.toStartOfHour(func.addHours(col, zone)).label('date'), - 'P1D': lambda col, zone: func.toStartOfDay(func.addHours(col, zone)).label('date'), + 'P1D': lambda col, zone: func.toDate(func.addHours(col, zone)).label('date'), + 'total': lambda col, zone: func.toStartOfDay(func.addHours(col, zone)).label('date'), 'P1W': lambda col, zone: func.toStartOfWeek(func.addHours(col, zone)).label('date'), 'P1M': lambda col, zone: func.toStartOfMonth(func.addHours(col, zone)).label('date'), } diff --git a/models/behavior_analysis.py b/models/behavior_analysis.py index aec569e..a390657 100644 --- a/models/behavior_analysis.py +++ b/models/behavior_analysis.py @@ -147,9 +147,10 @@ class BehaviorAnalysis: end_date: str = self.event_view.get('endTime') date_range = pd.date_range(start_date, end_date, freq=settings.PROPHET_TIME_GRAIN_MAP[self.time_particle], tz='UTC').tolist() - if self.time_particle in ('P1M','P1W'): + if self.time_particle in ('P1D', 'P1W', 'P1M'): date_range = [item.date() for item in date_range] - + # start_date = date_range[0].strftime('%Y-%m-%d') + # end_date = date_range[-1].strftime('%Y-%m-%d') return start_date, end_date, date_range @@ -284,8 +285,10 @@ class BehaviorAnalysis: for event in self.events: event_name_display = event.get('eventNameDisplay') - select_exprs = [ - settings.TIME_GRAIN_EXPRESSIONS[self.time_particle](event_time_col, self.zone_time)] + select_exprs = [] + if self.time_particle != 'total': + select_exprs.append( + settings.TIME_GRAIN_EXPRESSIONS[self.time_particle](event_time_col, self.zone_time)) base_where = [ func.addHours(event_time_col, self.zone_time) >= self.start_date, @@ -342,7 +345,10 @@ class BehaviorAnalysis: qry = sa.select(selectd).where(and_(*event_filter, *base_where)) qry = qry.group_by(*select_exprs) - qry = qry.order_by(sa.Column('date')) + if self.time_particle != 'total': + qry = qry.order_by(sa.Column('date')) + else: + qry = qry.order_by(sa.Column('values').desc()) qry = qry.limit(1000) sql = str(qry.compile(compile_kwargs={"literal_binds": True})) @@ -351,7 +357,8 @@ class BehaviorAnalysis: 'groupby': [i.key for i in self.groupby], 'date_range': self.date_range, 'event_name': event_name_display or event_name, - 'format': format + 'format': format, + 'time_particle': self.time_particle }) return sqls @@ -440,7 +447,7 @@ ORDER BY level qry = sa.select(event_date_col, *self.groupby, values_col) \ .where(and_(*where)) \ - .group_by(event_date_col, *self.groupby, e_account_id_col) + .group_by(event_date_col, *self.groupby) sql = str(qry.compile(compile_kwargs={"literal_binds": True})) print(sql)