1
This commit is contained in:
parent
abd4061e72
commit
de42e34754
@ -17,7 +17,7 @@ from db import get_database
|
|||||||
from db.ckdb import get_ck_db, CKDrive
|
from db.ckdb import get_ck_db, CKDrive
|
||||||
from db.redisdb import get_redis_pool, RedisDrive
|
from db.redisdb import get_redis_pool, RedisDrive
|
||||||
|
|
||||||
from models.behavior_analysis import BehaviorAnalysis
|
from models.behavior_analysis import BehaviorAnalysis, CombinationEvent
|
||||||
from models.user_analysis import UserAnalysis
|
from models.user_analysis import UserAnalysis
|
||||||
from utils import DfToStream
|
from utils import DfToStream
|
||||||
|
|
||||||
@ -64,6 +64,8 @@ async def event_model_export(request: Request,
|
|||||||
mime = mimetypes.guess_type(file_name)[0]
|
mime = mimetypes.guess_type(file_name)[0]
|
||||||
excels = []
|
excels = []
|
||||||
for item in sqls:
|
for item in sqls:
|
||||||
|
if not item.get('combination_event'):
|
||||||
|
continue
|
||||||
sql = item['sql']
|
sql = item['sql']
|
||||||
event_name = item['event_name']
|
event_name = item['event_name']
|
||||||
df = await ckdb.query_dataframe(sql)
|
df = await ckdb.query_dataframe(sql)
|
||||||
@ -125,6 +127,17 @@ async def event_model(
|
|||||||
'end_date': item['end_date'],
|
'end_date': item['end_date'],
|
||||||
'time_particle': item['time_particle']
|
'time_particle': item['time_particle']
|
||||||
}
|
}
|
||||||
|
# 处理组合问题
|
||||||
|
if item.get('combination_event'):
|
||||||
|
combination_event = CombinationEvent(res, item.get('combination_event'), item['format'])
|
||||||
|
values, sum_, avg = combination_event.parse()
|
||||||
|
q['values'].append(values)
|
||||||
|
q['sum'].append(sum_)
|
||||||
|
q['avg'].append(avg)
|
||||||
|
q['date_range'] = item['date_range']
|
||||||
|
res.append(q)
|
||||||
|
continue
|
||||||
|
|
||||||
sql = item['sql']
|
sql = item['sql']
|
||||||
groupby = item['groupby']
|
groupby = item['groupby']
|
||||||
date_range = item['date_range']
|
date_range = item['date_range']
|
||||||
@ -193,16 +206,18 @@ async def event_model(
|
|||||||
break
|
break
|
||||||
q['sum'].append(round(float(df['values'].sum()), 2))
|
q['sum'].append(round(float(df['values'].sum()), 2))
|
||||||
q['avg'].append(round(float(df['values'].mean()), 2))
|
q['avg'].append(round(float(df['values'].mean()), 2))
|
||||||
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']
|
# q['eventNameDisplay']=item['event_name_display']
|
||||||
res.append(q)
|
res.append(q)
|
||||||
# 按总和排序
|
# 按总和排序
|
||||||
for item in res:
|
for item in res:
|
||||||
|
if item['time_particle'] in ('P1D', 'P1W'):
|
||||||
|
item['date_range'] = [d.strftime('%Y-%m-%d') for d in item['date_range']]
|
||||||
|
elif item['time_particle'] in ('P1M',):
|
||||||
|
item['date_range'] = [d.strftime('%Y-%m') for d in item['date_range']]
|
||||||
|
else:
|
||||||
|
item['date_range'] = [d.strftime('%Y-%m-%d %H:%M:%S') for d in item['date_range']]
|
||||||
|
|
||||||
sort_key = np.argsort(np.array(item['sum']))[::-1]
|
sort_key = np.argsort(np.array(item['sum']))[::-1]
|
||||||
if item.get('groups'):
|
if item.get('groups'):
|
||||||
item['groups'] = np.array(item['groups'])[sort_key].tolist()
|
item['groups'] = np.array(item['groups'])[sort_key].tolist()
|
||||||
|
@ -19,6 +19,30 @@ from db import get_database
|
|||||||
from db.redisdb import get_redis_pool, RedisDrive
|
from db.redisdb import get_redis_pool, RedisDrive
|
||||||
|
|
||||||
|
|
||||||
|
class CombinationEvent:
|
||||||
|
def __init__(self, data, string, format):
|
||||||
|
self.data = data
|
||||||
|
self.string = string
|
||||||
|
self.pattern = re.compile('[+\-*/]')
|
||||||
|
self.format = format
|
||||||
|
self.events_name = []
|
||||||
|
|
||||||
|
def parse(self):
|
||||||
|
opts = self.pattern.findall(self.string)
|
||||||
|
factors = self.pattern.split(self.string)
|
||||||
|
result = pd.Series(self.data[int(factors[0])]['values'][0])
|
||||||
|
for i, opt in enumerate(opts):
|
||||||
|
b = pd.Series(self.data[int(factors[i + 1])]['values'][0])
|
||||||
|
result = settings.ARITHMETIC[opt](result, b)
|
||||||
|
if self.format == 'percent':
|
||||||
|
result = round(result * 100, 2)
|
||||||
|
elif self.format == 'float':
|
||||||
|
result = round(result, 2)
|
||||||
|
elif self.format == 'integer':
|
||||||
|
result = result.astype(int)
|
||||||
|
return result.to_list(), result.sum(), round(result.mean(), 2)
|
||||||
|
|
||||||
|
|
||||||
class CustomEvent:
|
class CustomEvent:
|
||||||
def __init__(self, tbl, string, format):
|
def __init__(self, tbl, string, format):
|
||||||
self.tbl = tbl
|
self.tbl = tbl
|
||||||
@ -100,6 +124,7 @@ class BehaviorAnalysis:
|
|||||||
self.date_range = None
|
self.date_range = None
|
||||||
self.unit_num = None
|
self.unit_num = None
|
||||||
self.report_name = None
|
self.report_name = None
|
||||||
|
self.combination_event = []
|
||||||
|
|
||||||
async def init(self, *args, **kwargs):
|
async def init(self, *args, **kwargs):
|
||||||
|
|
||||||
@ -321,17 +346,35 @@ class BehaviorAnalysis:
|
|||||||
event_name_col = getattr(self.event_tbl.c, '#event_name')
|
event_name_col = getattr(self.event_tbl.c, '#event_name')
|
||||||
format = event.get('format') or 'float'
|
format = event.get('format') or 'float'
|
||||||
|
|
||||||
|
# 兼容以前的结构
|
||||||
if event.get('customEvent'):
|
if event.get('customEvent'):
|
||||||
formula = event.get('customEvent')
|
event['customType'] = event.get('customType') or 'formula'
|
||||||
custom = CustomEvent(self.event_tbl, formula, format).parse()
|
|
||||||
event_name = custom['event_name']
|
if event.get('customType') == 'formula':
|
||||||
where = [event_name_col.in_(event_name)]
|
if event.get('customEvent'):
|
||||||
event_filter, _ = self.handler_filts(*event['filts'])
|
formula = event.get('customEvent')
|
||||||
select_exprs.extend(self.groupby)
|
custom = CustomEvent(self.event_tbl, formula, format).parse()
|
||||||
qry = sa.select(
|
event_name = custom['event_name']
|
||||||
*select_exprs,
|
where = [event_name_col.in_(event_name)]
|
||||||
custom['select']
|
event_filter, _ = self.handler_filts(*event['filts'])
|
||||||
).where(*base_where, *where, *event_filter)
|
select_exprs.extend(self.groupby)
|
||||||
|
qry = sa.select(
|
||||||
|
*select_exprs,
|
||||||
|
custom['select']
|
||||||
|
).where(*base_where, *where, *event_filter)
|
||||||
|
|
||||||
|
# 指标组合计算
|
||||||
|
elif event.get('customType') == 'combination':
|
||||||
|
sqls.append({'combination_event': event.get('customEvent'),
|
||||||
|
'time_particle': self.time_particle,
|
||||||
|
'start_date': self.start_date[:10],
|
||||||
|
'end_date': self.end_date[:10],
|
||||||
|
'event_name': event.get('eventNameDisplay'),
|
||||||
|
'format': event.get('format') or 'float',
|
||||||
|
'date_range': self.date_range
|
||||||
|
}
|
||||||
|
)
|
||||||
|
continue
|
||||||
else:
|
else:
|
||||||
event_name = event['event_name']
|
event_name = event['event_name']
|
||||||
|
|
||||||
@ -386,6 +429,7 @@ class BehaviorAnalysis:
|
|||||||
'time_particle': self.time_particle,
|
'time_particle': self.time_particle,
|
||||||
'start_date': self.start_date[:10],
|
'start_date': self.start_date[:10],
|
||||||
'end_date': self.end_date[:10],
|
'end_date': self.end_date[:10],
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return sqls
|
return sqls
|
||||||
|
Loading…
Reference in New Issue
Block a user