ltv补充默认值
This commit is contained in:
parent
6894c70b9f
commit
d2194403af
@ -52,7 +52,15 @@ async def ltv_model_sql(
|
|||||||
sql = res['sql']
|
sql = res['sql']
|
||||||
quota = res['quota']
|
quota = res['quota']
|
||||||
df = await ckdb.query_dataframe(sql)
|
df = await ckdb.query_dataframe(sql)
|
||||||
|
if df.empty:
|
||||||
|
return schemas.Msg(code=-1, msg='查无数据')
|
||||||
df.fillna(0, inplace=True)
|
df.fillna(0, inplace=True)
|
||||||
|
for d in set(res['date_range']) - set(df['date']):
|
||||||
|
df.loc[len(df)] = '0'
|
||||||
|
df.loc[len(df) - 1, 'date'] = d
|
||||||
|
days = (pd.Timestamp.now().date() - d).days
|
||||||
|
df.loc[len(df) - 1, f'LTV{days + 2}':] = '-'
|
||||||
|
df.sort_values('date', inplace=True)
|
||||||
df.rename(columns={'date': '注册日期'}, inplace=True)
|
df.rename(columns={'date': '注册日期'}, inplace=True)
|
||||||
if quota == '#account_id':
|
if quota == '#account_id':
|
||||||
df.rename(columns={'cnt1': '角色数'}, inplace=True)
|
df.rename(columns={'cnt1': '角色数'}, inplace=True)
|
||||||
|
@ -38,6 +38,20 @@ class Settings(BaseSettings):
|
|||||||
'password': 'gncPASUwpYrc'
|
'password': 'gncPASUwpYrc'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CK_CALC_SYMBO = {
|
||||||
|
'==': lambda col, val: col == val,
|
||||||
|
'>=': lambda col, val: col >= val,
|
||||||
|
'<=': lambda col, val: col <= val,
|
||||||
|
'>': lambda col, val: col > val,
|
||||||
|
'<': lambda col, val: col < val,
|
||||||
|
'is not null': lambda col: col.isnot(None),
|
||||||
|
'is null': lambda col: col.is_(None),
|
||||||
|
'like': lambda col, val: col.like(f'%{val}%'),
|
||||||
|
'not like': lambda col, val: col.notlike(f'%{val}%'),
|
||||||
|
'in': lambda col, val: col.in_(val),
|
||||||
|
'!=': lambda col, val: col != val,
|
||||||
|
}
|
||||||
|
|
||||||
CK_TYPE_DICT = {"DateTime('UTC')": 'datetime',
|
CK_TYPE_DICT = {"DateTime('UTC')": 'datetime',
|
||||||
"Nullable(DateTime('UTC'))": 'datetime',
|
"Nullable(DateTime('UTC'))": 'datetime',
|
||||||
"DateTime()": 'datetime',
|
"DateTime()": 'datetime',
|
||||||
|
@ -27,6 +27,8 @@ class XAnalysis:
|
|||||||
self.global_filters = []
|
self.global_filters = []
|
||||||
self.account_filters = []
|
self.account_filters = []
|
||||||
self.global_relation = 'and'
|
self.global_relation = 'and'
|
||||||
|
self.date_range = []
|
||||||
|
|
||||||
self.ext_filters = (self.data_in.ext_filter.get('filts', []), self.data_in.ext_filter.get('relation', 'and'))
|
self.ext_filters = (self.data_in.ext_filter.get('filts', []), self.data_in.ext_filter.get('relation', 'and'))
|
||||||
|
|
||||||
def _get_global_filters(self):
|
def _get_global_filters(self):
|
||||||
@ -52,6 +54,8 @@ class XAnalysis:
|
|||||||
else:
|
else:
|
||||||
self.event_view = self.data_in.eventView
|
self.event_view = self.data_in.eventView
|
||||||
self.events = self.data_in.events
|
self.events = self.data_in.events
|
||||||
|
for d in pd.date_range(self.event_view['startTime'],self.event_view['endTime'], freq='D', tz='UTC'):
|
||||||
|
self.date_range.append(d.date())
|
||||||
|
|
||||||
self.global_filters = self._get_global_filters()
|
self.global_filters = self._get_global_filters()
|
||||||
self.global_relation = self.event_view.get('relation', 'and')
|
self.global_relation = self.event_view.get('relation', 'and')
|
||||||
@ -60,8 +64,6 @@ class XAnalysis:
|
|||||||
if 'data_where' in kwargs:
|
if 'data_where' in kwargs:
|
||||||
self.account_filters = kwargs['data_where'].get(self.game, [])
|
self.account_filters = kwargs['data_where'].get(self.game, [])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def handler_filts(self, *filters):
|
def handler_filts(self, *filters):
|
||||||
"""
|
"""
|
||||||
:param filters: (filts:list,relation:str)
|
:param filters: (filts:list,relation:str)
|
||||||
@ -120,56 +122,15 @@ class XAnalysis:
|
|||||||
if event_filter:
|
if event_filter:
|
||||||
event_filters.append(or_(*event_filter))
|
event_filters.append(or_(*event_filter))
|
||||||
|
|
||||||
|
|
||||||
return event_filters
|
return event_filters
|
||||||
|
|
||||||
# def handler_filts(self, filters):
|
|
||||||
# where = []
|
|
||||||
# for item in filters:
|
|
||||||
#
|
|
||||||
# col = sa.Column(item['columnName'])
|
|
||||||
#
|
|
||||||
# comparator = item['comparator']
|
|
||||||
# ftv = item['ftv']
|
|
||||||
# if comparator == '==':
|
|
||||||
# if len(ftv) > 1:
|
|
||||||
# where.append(or_(*[col == v for v in ftv]))
|
|
||||||
# else:
|
|
||||||
# where.append(col == ftv[0])
|
|
||||||
# elif comparator == '>=':
|
|
||||||
# where.append(col >= ftv[0])
|
|
||||||
# elif comparator == '<=':
|
|
||||||
# where.append(col <= ftv[0])
|
|
||||||
# elif comparator == '>':
|
|
||||||
# where.append(col > ftv[0])
|
|
||||||
# elif comparator == '<':
|
|
||||||
# where.append(col < ftv[0])
|
|
||||||
#
|
|
||||||
# elif comparator == 'is not null':
|
|
||||||
# where.append(col.isnot(None))
|
|
||||||
# elif comparator == 'is null':
|
|
||||||
# where.append(col.is_(None))
|
|
||||||
#
|
|
||||||
# elif comparator == '!=':
|
|
||||||
# where.append(col != ftv[0])
|
|
||||||
# elif comparator == 'not like':
|
|
||||||
# where.append(col.notlike(f'%{ftv[0]}%'))
|
|
||||||
#
|
|
||||||
# elif comparator == 'like':
|
|
||||||
# where.append(col.like(f'%{ftv[0]}%'))
|
|
||||||
#
|
|
||||||
# elif comparator == 'in':
|
|
||||||
# where.append(col.in_(ftv))
|
|
||||||
#
|
|
||||||
# return where
|
|
||||||
|
|
||||||
def ltv_model_sql(self):
|
def ltv_model_sql(self):
|
||||||
|
|
||||||
days = (arrow.get(self.event_view['endTime']).date() - arrow.get(self.event_view['startTime']).date()).days
|
days = (arrow.get(self.event_view['endTime']).date() - arrow.get(self.event_view['startTime']).date()).days
|
||||||
quota = self.event_view['quota']
|
quota = self.event_view['quota']
|
||||||
select_ltv = []
|
select_ltv = []
|
||||||
sumpay = []
|
sumpay = []
|
||||||
for i in range(1, days):
|
for i in range(1, days+2):
|
||||||
# select_ltv.append(func.round(sa.Column(f'sumpay_{i}') / sa.Column('cnt1'), 2).label(f'LTV{i}'))
|
# select_ltv.append(func.round(sa.Column(f'sumpay_{i}') / sa.Column('cnt1'), 2).label(f'LTV{i}'))
|
||||||
select_ltv.append(
|
select_ltv.append(
|
||||||
f"if(dateDiff('day', reg.date, now())<{i - 1}, '-',toString(round(sumpay_{i} / cnt1, 2))) AS LTV{i}")
|
f"if(dateDiff('day', reg.date, now())<{i - 1}, '-',toString(round(sumpay_{i} / cnt1, 2))) AS LTV{i}")
|
||||||
@ -181,7 +142,7 @@ class XAnalysis:
|
|||||||
select_ltv_str = ','.join(select_ltv)
|
select_ltv_str = ','.join(select_ltv)
|
||||||
|
|
||||||
where = [
|
where = [
|
||||||
sa.Column('date') > self.event_view['startTime'].split(' ')[0],
|
sa.Column('date') >= self.event_view['startTime'].split(' ')[0],
|
||||||
sa.Column('date') <= self.event_view['endTime'].split(' ')[0]
|
sa.Column('date') <= self.event_view['endTime'].split(' ')[0]
|
||||||
]
|
]
|
||||||
qry = sa.select().where(*where)
|
qry = sa.select().where(*where)
|
||||||
@ -195,14 +156,14 @@ class XAnalysis:
|
|||||||
sql = str(qry.compile(compile_kwargs={"literal_binds": True}))
|
sql = str(qry.compile(compile_kwargs={"literal_binds": True}))
|
||||||
where_order_str = sql.split('WHERE ')[1]
|
where_order_str = sql.split('WHERE ')[1]
|
||||||
|
|
||||||
where_account = self.handler_filts((self.account_filters, 'and'),self.ext_filters)
|
where_account = self.handler_filts((self.account_filters, 'and'), self.ext_filters)
|
||||||
where_account_str = 1
|
where_account_str = 1
|
||||||
if where_account:
|
if where_account:
|
||||||
qry = sa.select().where(*where_account)
|
qry = sa.select().where(*where_account)
|
||||||
sql = str(qry.compile(compile_kwargs={"literal_binds": True}))
|
sql = str(qry.compile(compile_kwargs={"literal_binds": True}))
|
||||||
where_account_str = sql.split('WHERE ')[1]
|
where_account_str = sql.split('WHERE ')[1]
|
||||||
|
|
||||||
sql = f"""SELECT toString(reg.date) as date,
|
sql = f"""SELECT reg.date as date,
|
||||||
cnt1,
|
cnt1,
|
||||||
{select_ltv_str}
|
{select_ltv_str}
|
||||||
FROM (SELECT toDate(addHours(`#event_time`, `#zone_offset`)) as date, uniqExact(`{quota}`) cnt1
|
FROM (SELECT toDate(addHours(`#event_time`, `#zone_offset`)) as date, uniqExact(`{quota}`) cnt1
|
||||||
@ -228,4 +189,5 @@ class XAnalysis:
|
|||||||
return {'sql': sql, 'quota': quota,
|
return {'sql': sql, 'quota': quota,
|
||||||
'start_date': self.event_view['startTime'][:10],
|
'start_date': self.event_view['startTime'][:10],
|
||||||
'end_date': self.event_view['endTime'][:10],
|
'end_date': self.event_view['endTime'][:10],
|
||||||
|
'date_range': self.date_range
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user