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