1.新增月充总额和充值总额看板
This commit is contained in:
parent
8408fe5af8
commit
9bd21f574c
@ -245,9 +245,13 @@ async def event_model(
|
|||||||
sql = item['sql']
|
sql = item['sql']
|
||||||
groupby = item['groupby']
|
groupby = item['groupby']
|
||||||
date_range = item['date_range'] # 获取的要查询的每一天的时间
|
date_range = item['date_range'] # 获取的要查询的每一天的时间
|
||||||
q['date_range'] = date_range # 把要查询的时间加入q字典中
|
|
||||||
df = await ckdb.query_dataframe(sql) # 以sql语句查出数据,df是二维列表
|
df = await ckdb.query_dataframe(sql) # 以sql语句查出数据,df是二维列表
|
||||||
df.fillna(0, inplace=True) # 以0填补空数据
|
if item['event_name'] == '月充总额':
|
||||||
|
date_range=df['date'].tolist()
|
||||||
|
q['date_range']=[str(i).split('-')[0]+'-'+str(i).split('-')[1] for i in date_range]
|
||||||
|
else:
|
||||||
|
q['date_range'] = date_range # 把要查询的时间加入q字典中
|
||||||
|
df.fillna(0, inplace=True) # 以0填补空数据
|
||||||
# 映射对应中文返回给前端展示
|
# 映射对应中文返回给前端展示
|
||||||
for i in groupby:
|
for i in groupby:
|
||||||
if i == 'svrindex':
|
if i == 'svrindex':
|
||||||
@ -268,10 +272,13 @@ async def event_model(
|
|||||||
df = pd.DataFrame({'date': date_range, 'values': 0 * len(date_range)})
|
df = pd.DataFrame({'date': date_range, 'values': 0 * len(date_range)})
|
||||||
# continue
|
# continue
|
||||||
# return schemas.Msg(code=0, msg='ok', data=[q])
|
# return schemas.Msg(code=0, msg='ok', data=[q])
|
||||||
if item['time_particle'] == 'total':
|
if item['time_particle'] == 'total' or item['event_name'] == '充值总额':
|
||||||
# for group, df_group in df.groupby(groupby):
|
# for group, df_group in df.groupby(groupby):
|
||||||
# df_group.reset_index(drop=True, inplace=True)
|
# df_group.reset_index(drop=True, inplace=True)
|
||||||
q['groups'].append(groupby)
|
if item['event_name'] == '充值总额':
|
||||||
|
q['groups']=[]
|
||||||
|
else:
|
||||||
|
q['groups'].append(groupby)
|
||||||
q['values'].append(df['values'].to_list())
|
q['values'].append(df['values'].to_list())
|
||||||
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))
|
||||||
@ -360,12 +367,14 @@ async def event_model(
|
|||||||
else:
|
else:
|
||||||
# 无分组
|
# 无分组
|
||||||
concat_data = []
|
concat_data = []
|
||||||
|
|
||||||
for i in set(date_range) - set(df['date']):
|
for i in set(date_range) - set(df['date']):
|
||||||
concat_data.append((i, 0))
|
concat_data.append((i, 0))
|
||||||
# 纵向拼接两个表
|
# 纵向拼接两个表
|
||||||
df = pd.concat([df, pd.DataFrame(concat_data, columns=df.columns)])
|
if item['event_name'] != '月充总额':
|
||||||
# 在原数据上按data排序
|
df = pd.concat([df, pd.DataFrame(concat_data, columns=df.columns)])
|
||||||
df.sort_values('date', inplace=True)
|
# 在原数据上按data排序
|
||||||
|
df.sort_values('date', inplace=True)
|
||||||
if len(df) >= 2:
|
if len(df) >= 2:
|
||||||
q['chain_ratio'] = division((df.iloc[-1, 1] - df.iloc[-2, 1]) * 100, df.iloc[-2, 1], 2)
|
q['chain_ratio'] = division((df.iloc[-1, 1] - df.iloc[-2, 1]) * 100, df.iloc[-2, 1], 2)
|
||||||
if len(df) >= 8:
|
if len(df) >= 8:
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import calendar
|
||||||
|
import datetime
|
||||||
import re
|
import re
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
@ -19,7 +21,7 @@ from db import get_database
|
|||||||
|
|
||||||
from db.redisdb import get_redis_pool, RedisDrive
|
from db.redisdb import get_redis_pool, RedisDrive
|
||||||
from models.user_label import UserClusterDef
|
from models.user_label import UserClusterDef
|
||||||
from utils import get_week, strptime, start_end_month, strptime1, get_event
|
from utils import get_week, strptime, start_end_month, strptime1, get_event, get_time
|
||||||
|
|
||||||
|
|
||||||
class CombinationEvent:
|
class CombinationEvent:
|
||||||
@ -568,6 +570,7 @@ class BehaviorAnalysis:
|
|||||||
"""事件分析生成sql会经过"""
|
"""事件分析生成sql会经过"""
|
||||||
sqls = []
|
sqls = []
|
||||||
event_time_col = getattr(self.event_tbl.c, '#event_time')
|
event_time_col = getattr(self.event_tbl.c, '#event_time')
|
||||||
|
event_date_col = settings.TIME_GRAIN_EXPRESSIONS['P1M'](event_time_col, self.zone_time)#按月的
|
||||||
for idx, event in enumerate(self.events):
|
for idx, event in enumerate(self.events):
|
||||||
operator_ = event.get('operator_val', '')
|
operator_ = event.get('operator_val', '')
|
||||||
# 排头显示名
|
# 排头显示名
|
||||||
@ -602,10 +605,45 @@ class BehaviorAnalysis:
|
|||||||
self.ext_filters, nu=idx
|
self.ext_filters, nu=idx
|
||||||
)
|
)
|
||||||
select_exprs.extend(self.groupby)
|
select_exprs.extend(self.groupby)
|
||||||
qry = sa.select(
|
if event_name_display == '充值总额':
|
||||||
*select_exprs,
|
qry = sa.select(
|
||||||
custom['select']
|
custom['select']
|
||||||
).where(*base_where, *where, *event_filter)
|
).where(*where,*event_filter)
|
||||||
|
elif event_name_display == '月充总额':
|
||||||
|
times = self.start_date.split('-')
|
||||||
|
start_date = times[0] + '-' + times[1] + '-' + '01 00:00:00'
|
||||||
|
now = get_time('%Y-%m-%d %H:%M:%S')
|
||||||
|
_sp_end = self.end_date[0:7]
|
||||||
|
_now = now[0:7]
|
||||||
|
if self.end_date < now:
|
||||||
|
if _sp_end == _now: # 如果结束时间和现在时间是一个月,则取今天为结束时间
|
||||||
|
times = now.split(' ')
|
||||||
|
end_date = times[0] + ' 23:59:59'
|
||||||
|
else: # 如果是之前月份,则算出那个月的最后一天
|
||||||
|
data = self.end_date.split(' ')[0].split('-')
|
||||||
|
year = int(data[0])
|
||||||
|
month = int(data[1])
|
||||||
|
weekDay, monthCountDay = calendar.monthrange(year, month)
|
||||||
|
time = str(datetime.date(year, month, day=monthCountDay))
|
||||||
|
end_date = time + ' 23:59:59'
|
||||||
|
else: # 结束时间大于现在的时间,则取今天的时间
|
||||||
|
times = now.split(' ')
|
||||||
|
end_date = times[0] + ' 23:59:59'
|
||||||
|
base_time = [
|
||||||
|
func.addHours(event_time_col, self.zone_time) >= start_date,
|
||||||
|
func.addHours(event_time_col, self.zone_time) <= end_date,
|
||||||
|
]
|
||||||
|
qry = sa.select(event_date_col,
|
||||||
|
custom['select']
|
||||||
|
).where(*base_time, *where, *event_filter)#.group_by(event_date_col)
|
||||||
|
# qry = sa.select(event_date_col, *self.groupby, values_col) \
|
||||||
|
# .where(and_(*where)) \
|
||||||
|
# .group_by(event_date_col, *self.groupby, e_account_id_col)
|
||||||
|
else:
|
||||||
|
qry = sa.select(
|
||||||
|
*select_exprs,
|
||||||
|
custom['select']
|
||||||
|
).where(*base_where, *where, *event_filter)
|
||||||
|
|
||||||
# 指标组合计算
|
# 指标组合计算
|
||||||
elif event.get('customType') == 'combination':
|
elif event.get('customType') == 'combination':
|
||||||
@ -685,15 +723,19 @@ class BehaviorAnalysis:
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
qry = sa.select(selectd).where(and_(*event_filter, *base_where))
|
qry = sa.select(selectd).where(and_(*event_filter, *base_where))
|
||||||
|
if event_name_display == '月充总额':
|
||||||
qry = qry.group_by(*select_exprs)
|
qry = qry.group_by(event_date_col)
|
||||||
|
else:
|
||||||
|
qry = qry.group_by(*select_exprs)
|
||||||
if self.time_particle != 'total':
|
if self.time_particle != 'total':
|
||||||
qry = qry.order_by(sa.Column('date'))
|
qry = qry.order_by(sa.Column('date'))
|
||||||
else:
|
else:
|
||||||
qry = qry.order_by(sa.Column('values').desc())
|
qry = qry.order_by(sa.Column('values').desc())
|
||||||
qry = qry.limit(10000)
|
qry = qry.limit(10000)
|
||||||
|
|
||||||
sql = str(qry.compile(compile_kwargs={"literal_binds": True}))
|
sql = str(qry.compile(compile_kwargs={"literal_binds": True}))
|
||||||
|
if event_name_display == '充值总额':
|
||||||
|
sql=sql.replace("""GROUP BY toDate(addHours(huixie.event."#event_time", 8)) ORDER BY date
|
||||||
|
LIMIT 10000""",'',1)
|
||||||
print(sql)
|
print(sql)
|
||||||
# 单独付费率的拿出来
|
# 单独付费率的拿出来
|
||||||
if event.get('customEvent') == 'pay.touch_user_count/login.touch_user_count':
|
if event.get('customEvent') == 'pay.touch_user_count/login.touch_user_count':
|
||||||
|
@ -223,10 +223,20 @@ async def get_event(attr, game):
|
|||||||
:param game: str 游戏名
|
:param game: str 游戏名
|
||||||
:return: str 事件名
|
:return: str 事件名
|
||||||
"""
|
"""
|
||||||
res = await crud.event_point.all_event(get_database(),game)
|
res = await crud.event_point.all_event(get_database(), game)
|
||||||
event_name=''
|
event_name = ''
|
||||||
for i in res:
|
for i in res:
|
||||||
if attr in i['event_attr']:
|
if attr in i['event_attr']:
|
||||||
event_name = i['event_name']
|
event_name = i['event_name']
|
||||||
break
|
break
|
||||||
return event_name
|
return event_name
|
||||||
|
|
||||||
|
|
||||||
|
def get_time(fmt: str = '%Y-%m-%d') -> str:
|
||||||
|
'''
|
||||||
|
获取当前时间
|
||||||
|
'''
|
||||||
|
ts = time.time()
|
||||||
|
ta = time.localtime(ts)
|
||||||
|
t = time.strftime(fmt, ta)
|
||||||
|
return t
|
||||||
|
Loading…
Reference in New Issue
Block a user