diff --git a/api/api_v1/endpoints/query.py b/api/api_v1/endpoints/query.py index 3d526c4..063f880 100644 --- a/api/api_v1/endpoints/query.py +++ b/api/api_v1/endpoints/query.py @@ -337,13 +337,32 @@ async def retention_model(request: Request, tmp['p_outflow'].append(v[f'op{i}']) tmp['n_outflow'].append(v[f'on{i}']) tmp = summary_values['均值'] - tmp['d0'] = int(df['cnt0'].sum()) - tmp['p'] = (pd.Series(avg) * 100 / tmp['d0']).round(2).tolist() - tmp['n'] = pd.Series(avg).values.tolist() - tmp['p_outflow'] = (pd.Series(avgo) * 100 / tmp['d0']).round(2).tolist() - tmp['n_outflow'] = pd.Series(avgo).values.tolist() + retention_avg_dict = {} - title = ['日期', '用户数', '次留', *[f'{i+1}留' for i in retention_n[1:]]] + for rn in retention_n: + for rt, rd in df.T.items(): + if rt + datetime.timedelta(days=rn) <= pd.datetime.now().date(): + retention_avg_dict.setdefault(rn, {'cnt0': 0, 'cntn': 0,'o_cnt0':0,'o_cntn':0}) + retention_avg_dict[rn]['cnt0'] += rd['cnt0'] + retention_avg_dict[rn]['cntn'] += rd[f'cnt{rn}'] + + retention_avg_dict[rn]['o_cnt0'] += rd['cnt0'] + retention_avg_dict[rn]['o_cntn'] += rd[f'on{rn}'] + + tmp['p'] = [] + tmp['n'] = [] + tmp['p_outflow'] = [] + tmp['n_outflow'] = [] + tmp['d0'] = 0 + for rt, rd in retention_avg_dict.items(): + tmp['d0'] = tmp['d0'] + rd['cnt0'] + tmp['p'].append(round(rd['cntn'] * 100 / rd['cnt0'], 2)) + tmp['n'].append(rd['cntn']) + tmp['p_outflow'].append(round(rd['o_cntn'] * 100 / rd['cnt0'], 2)) + tmp['n_outflow'].append(rd['o_cntn']) + + + title = ['日期', '用户数', '次留', *[f'{i + 1}留' for i in retention_n[1:]]] # 未到达的日期需要补齐- retention_length = len(retention_n)