This commit is contained in:
wuaho 2021-09-10 15:31:28 +08:00
parent abd4061e72
commit de42e34754
2 changed files with 76 additions and 17 deletions

View File

@ -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()

View File

@ -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,6 +346,11 @@ 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'):
event['customType'] = event.get('customType') or 'formula'
if event.get('customType') == 'formula':
if event.get('customEvent'): if event.get('customEvent'):
formula = event.get('customEvent') formula = event.get('customEvent')
custom = CustomEvent(self.event_tbl, formula, format).parse() custom = CustomEvent(self.event_tbl, formula, format).parse()
@ -332,6 +362,19 @@ class BehaviorAnalysis:
*select_exprs, *select_exprs,
custom['select'] custom['select']
).where(*base_where, *where, *event_filter) ).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