更新留存
This commit is contained in:
parent
c6b6e0e4c5
commit
c2993483d8
@ -43,6 +43,7 @@ async def edit_data_auth(request: Request,
|
||||
await crud.data_auth.edit_data_auth(db, data_id)
|
||||
return schemas.Msg(code=0, msg='ok', data=data_id)
|
||||
|
||||
|
||||
@router.get("/quotas_map")
|
||||
async def quotas_map(
|
||||
request: Request,
|
||||
@ -103,7 +104,7 @@ async def my_event(request: Request,
|
||||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||||
) -> schemas.Msg:
|
||||
"""获取自己的事件权限"""
|
||||
|
||||
event_list = []
|
||||
data_auth_id = await crud.authority.get_data_auth_id(db, game, request.user.username)
|
||||
|
||||
my_data_auth = []
|
||||
@ -112,6 +113,7 @@ async def my_event(request: Request,
|
||||
if data_auth_id == '*':
|
||||
my_data_auth = await ck.distinct(game, 'event', '#event_name')
|
||||
|
||||
|
||||
else:
|
||||
# 设置了数据权限
|
||||
my_data_auth = await crud.data_auth.get(db, ObjectId(data_auth_id))
|
||||
@ -120,8 +122,6 @@ async def my_event(request: Request,
|
||||
if not my_data_auth:
|
||||
return schemas.Msg(code=0, msg='ok', data=[])
|
||||
|
||||
event_list = []
|
||||
|
||||
event_show_name = await crud.event_mana.get_all_show_name(db, game)
|
||||
event_list.append({'id': 'event', 'title': '全部事件', 'category': []})
|
||||
for item in my_data_auth:
|
||||
@ -129,6 +129,7 @@ async def my_event(request: Request,
|
||||
'event_name': item,
|
||||
'event_desc': event_show_name.get(item, item)
|
||||
})
|
||||
event_list[-1]['category'].append({'event_name': '*', 'event_desc': '任意事件'})
|
||||
event_list.sort()
|
||||
return schemas.Msg(code=0, msg='ok', data=event_list)
|
||||
|
||||
@ -146,7 +147,7 @@ async def user_property(request: Request,
|
||||
data = json.loads(data)
|
||||
propertys = []
|
||||
|
||||
data_attr = await crud.data_attr.find_many(db, {'game':game, 'cat':'user'})
|
||||
data_attr = await crud.data_attr.find_many(db, {'game': game, 'cat': 'user'})
|
||||
data_attr = {item['name']: item for item in data_attr}
|
||||
|
||||
for k, v in data.items():
|
||||
@ -162,9 +163,6 @@ async def user_property(request: Request,
|
||||
return schemas.Msg(code=0, msg='ok', data=propertys)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@router.post('/load_prop_quotas')
|
||||
async def load_prop_quotas(request: Request,
|
||||
game: str,
|
||||
@ -181,7 +179,7 @@ async def load_prop_quotas(request: Request,
|
||||
|
||||
all_filed = await rdb.get(f'{game}_event')
|
||||
all_filed = json.loads(all_filed)
|
||||
data_attr = await crud.data_attr.find_many(db, {'game':game, 'cat':'event'})
|
||||
data_attr = await crud.data_attr.find_many(db, {'game': game, 'cat': 'event'})
|
||||
data_attr = {item['name']: item for item in data_attr}
|
||||
event_props = []
|
||||
for item in event_prop_list:
|
||||
@ -274,7 +272,7 @@ async def load_filter_props(request: Request,
|
||||
all_filed = await rdb.get(f'{game}_event')
|
||||
all_filed = json.loads(all_filed)
|
||||
|
||||
data_attr = await crud.data_attr.find_many(db, {'game':game, 'cat':'event'})
|
||||
data_attr = await crud.data_attr.find_many(db, {'game': game, 'cat': 'event'})
|
||||
data_attr = {item['name']: item for item in data_attr}
|
||||
event_props = []
|
||||
for item in event_prop_list:
|
||||
@ -288,7 +286,7 @@ async def load_filter_props(request: Request,
|
||||
}
|
||||
event_props.append(event_prop)
|
||||
|
||||
data_attr = await crud.data_attr.find_many(db, {'game':game, 'cat':'user'})
|
||||
data_attr = await crud.data_attr.find_many(db, {'game': game, 'cat': 'user'})
|
||||
data_attr = {item['name']: item for item in data_attr}
|
||||
user_props = []
|
||||
for item in user_prop_list:
|
||||
|
@ -72,7 +72,7 @@ async def event_model(
|
||||
q['date_range'] = date_range
|
||||
df = await ckdb.query_dataframe(sql)
|
||||
if df.shape[0] == 0:
|
||||
return schemas.Msg(code=0, msg='ok', data=q)
|
||||
return schemas.Msg(code=0, msg='ok', data=[q])
|
||||
|
||||
if groupby:
|
||||
# 有分组
|
||||
@ -141,31 +141,31 @@ async def retention_model(
|
||||
concat_data = []
|
||||
df = pd.concat([df, pd.DataFrame(concat_data, columns=df.columns)])
|
||||
# 计算整体
|
||||
summary_df = df.groupby(['date', 'event_name'])[['values', 'amount']].sum()
|
||||
summary_df = df.groupby('date')[['val_a', 'val_b', 'amount_a']].sum()
|
||||
summary_values = {}
|
||||
for i, d1 in enumerate(date_range):
|
||||
a = set(summary_df.loc[(d1, event_a)]['values']) if (d1, event_a) in summary_df.index else set()
|
||||
a = set(summary_df.loc[d1]['val_a']) if d1 in summary_df.index else set()
|
||||
if not a:
|
||||
continue
|
||||
key = d1.strftime('%Y-%m-%d')
|
||||
for j, d2 in enumerate(date_range[i:]):
|
||||
if j > unit_num:
|
||||
break
|
||||
b = set(summary_df.loc[(d2, event_b)]['values']) if (d2, event_b) in summary_df.index else set()
|
||||
b = set(summary_df.loc[d2]['val_b']) if d2 in summary_df.index else set()
|
||||
tmp = summary_values.setdefault(key, {})
|
||||
tmp.setdefault('d0', len(a))
|
||||
tmp.setdefault('p', []).append(division(len(a & b) * 100, len(a)))
|
||||
tmp.setdefault('n', []).append(len(a & b))
|
||||
groups = set([tuple(i) for i in df[res['groupby'][2:]].values])
|
||||
groups = set([tuple(i) for i in df[res['groupby']].values])
|
||||
df.set_index(res['groupby'], inplace=True)
|
||||
df.sort_index(inplace=True)
|
||||
values = {}
|
||||
days = [i for i in range((date_range[-1] - date_range[0]).days + 1)][:unit_num + 1]
|
||||
for i, d1 in enumerate(date_range):
|
||||
for g in groups:
|
||||
if g == tuple():
|
||||
if len(g) == 1:
|
||||
continue
|
||||
a = set(df.loc[(d1, event_a, *g)]['values']) if (d1, event_a, *g) in df.index else set()
|
||||
a = set(df.loc[g]['val_a']) if g in df.index else set()
|
||||
if not a:
|
||||
continue
|
||||
key = d1.strftime("%Y-%m-%d")
|
||||
@ -173,8 +173,8 @@ async def retention_model(
|
||||
for j, d2 in enumerate(date_range[i:]):
|
||||
if j > unit_num:
|
||||
break
|
||||
b = set(df.loc[(d2, event_b, *g)]['values']) if (d2, event_b, *g) in df.index else set()
|
||||
tmp = tmp_g.setdefault(','.join(g), {})
|
||||
b = set(df.loc[g]['val_b']) if g in df.index else set()
|
||||
tmp = tmp_g.setdefault(','.join(g[1:]), {})
|
||||
tmp.setdefault('d0', len(a))
|
||||
tmp.setdefault('p', []).append(division(len(a & b) * 100, len(a)))
|
||||
tmp.setdefault('n', []).append(len(a & b))
|
||||
|
@ -44,7 +44,7 @@ class BehaviorAnalysis:
|
||||
self.event_view = report['query']['eventView']
|
||||
self.events = report['query']['events']
|
||||
e_days, s_days = self.event_view['recentDay'].split('-')
|
||||
self.event_view['endTime'] = arrow.get().shift(days=-int(e_days)+1).strftime('%Y-%m-%d 23:59:59')
|
||||
self.event_view['endTime'] = arrow.get().shift(days=-int(e_days) + 1).strftime('%Y-%m-%d 23:59:59')
|
||||
self.event_view['startTime'] = arrow.get().shift(days=-int(s_days)).strftime('%Y-%m-%d 00:00:00')
|
||||
|
||||
|
||||
@ -144,27 +144,42 @@ class BehaviorAnalysis:
|
||||
def retention_model_sql(self):
|
||||
event_name_a = self.events[0]['eventName']
|
||||
event_name_b = self.events[1]['eventName']
|
||||
visit_name = self.events[0].get('event_attr_id')
|
||||
event_time_col = getattr(self.event_tbl.c, '#event_time')
|
||||
event_name_col = getattr(self.event_tbl.c, '#event_name')
|
||||
e_account_id_col = getattr(self.event_tbl.c, '#account_id')
|
||||
u_account_id_col = getattr(self.user_tbl.c, '#account_id')
|
||||
date_col = sa.Column('date')
|
||||
who_visit = e_account_id_col
|
||||
if visit_name:
|
||||
who_visit = getattr(self.event_tbl.c, visit_name)
|
||||
|
||||
selectd = [func.toStartOfDay(func.addHours(event_time_col, self.zone_time)).label('date'),
|
||||
event_name_col.label('event_name'),
|
||||
*self.groupby,
|
||||
func.arrayDistinct(func.groupArray(e_account_id_col)).label('values'),
|
||||
func.length(sa.Column('values')).label('amount')
|
||||
func.arrayDistinct(
|
||||
(func.groupArray(func.if_(event_name_col == event_name_a, who_visit, None)))).label('val_a'),
|
||||
|
||||
func.length(sa.Column('val_a')).label('amount_a'),
|
||||
func.length(sa.Column('val_b')).label('amount_b'),
|
||||
]
|
||||
|
||||
if event_name_b == '*':
|
||||
val_b = func.arrayDistinct(
|
||||
(func.groupArray(func.if_(event_name_col != event_name_a, who_visit, None)))).label('val_b'),
|
||||
selectd.insert(-2, *val_b)
|
||||
else:
|
||||
val_b = func.arrayDistinct(
|
||||
(func.groupArray(func.if_(event_name_col == event_name_b, who_visit, None)))).label('val_b'),
|
||||
selectd.insert(-2, *val_b)
|
||||
|
||||
base_where = [
|
||||
func.addHours(event_time_col, self.zone_time) >= self.start_date,
|
||||
func.addHours(event_time_col, self.zone_time) <= self.end_date,
|
||||
event_name_col.in_([event_name_a, event_name_b]),
|
||||
]
|
||||
|
||||
event_filter, user_filter = self.handler_filts()
|
||||
|
||||
groupby = [date_col, event_name_col] + self.groupby
|
||||
groupby = [date_col] + self.groupby
|
||||
oredrby = [date_col]
|
||||
if user_filter:
|
||||
qry = sa.select(selectd).select_from(
|
||||
@ -177,7 +192,7 @@ class BehaviorAnalysis:
|
||||
sql = str(qry.compile(compile_kwargs={"literal_binds": True}))
|
||||
print(sql)
|
||||
return {'sql': sql,
|
||||
'groupby': ['date', 'event_name'] + [i.key for i in self.groupby],
|
||||
'groupby': ['date'] + [i.key for i in self.groupby],
|
||||
'date_range': self.date_range,
|
||||
'event_name': [event_name_a, event_name_b],
|
||||
'unit_num': self.unit_num
|
||||
|
Loading…
Reference in New Issue
Block a user