def calc_purchase_rate(target_date=None): # 首先获得本周新加入的用户 user_collect = db['User'] if target_date is None: start_date = local2utc(get_first_datetime_in_week(get_today_date() - datetime.timedelta(days=7))) end_date = local2utc(get_last_datetime_in_week(get_today_date() - datetime.timedelta(days=7))) else: start_date = local2utc(get_first_datetime_in_week(target_date - datetime.timedelta(days=7))) end_date = local2utc(get_last_datetime_in_week(target_date - datetime.timedelta(days=7))) users = user_collect.find({'created_at': {'$gte': start_date}}) user_count = 0 once = 0 # 用户的一次购买人数 twice = 0 # 用户的二次购买人数 user_pay_collect = db['UserPay'] for user in users: user_count += 1 user_id = user.get('_id') user_pay_count = user_pay_collect.find({'user._id': user_id, 'status': 'PAY_SUCCESS', 'created_at': {'$gte': start_date, '$lt': end_date}}).count() if user_pay_count >= 1: once += 1 elif user_pay_count > 1: twice += 1 if user_count <= 0 or once <=0 : return 0, 0, once, twice, user_count return once / (user_count * 1.0), twice / (once * 1.0), once, twice, user_count
def paid_purchases(target_date=None): user_pay = db['UserPay'] if target_date is None: start_date = local2utc(get_first_datetime_in_week(get_today_date() - datetime.timedelta(days=7))) end_date = local2utc(get_last_datetime_in_week(get_today_date() - datetime.timedelta(days=7))) else: start_date = local2utc(get_first_datetime_in_week(target_date - datetime.timedelta(days=7))) end_date = local2utc(get_last_datetime_in_week(target_date - datetime.timedelta(days=7))) return user_pay.find({'status': 'PAY_SUCCESS', 'updated_at': {'$gte': start_date, '$lt': end_date}}).count()
def end_clazz_count(target_date=None): clazz_collect = db['Clazz'] if target_date is None: start_date = local2utc(get_first_datetime_in_week(get_today_date() - datetime.timedelta(days=7))) end_date = local2utc(get_last_datetime_in_week(get_today_date() - datetime.timedelta(days=7))) else: start_date = local2utc(get_first_datetime_in_week(target_date - datetime.timedelta(days=7))) end_date = local2utc(get_last_datetime_in_week(target_date - datetime.timedelta(days=7))) end_count = clazz_collect.find({'clazzType': {'$ne': 'LTS'}, 'endDate': {'$gte': start_date, '$lt': end_date}}).count() return end_count
def subscriptions(target_date=None): clazz_account = db['ClazzAccount'] if target_date is None: start_date = local2utc(get_first_datetime_in_week(get_today_date() - datetime.timedelta(days=7))) end_date = local2utc(get_last_datetime_in_week(get_today_date() - datetime.timedelta(days=7))) else: start_date = local2utc(get_first_datetime_in_week(target_date - datetime.timedelta(days=7))) end_date = local2utc(get_last_datetime_in_week(target_date - datetime.timedelta(days=7))) return clazz_account.find({'status': 'PROCESSING', 'clazz.created_at': {'$gte': start_date, '$lt': end_date}, 'clazz.clazzType': 'SEMESTER' }).count()
def calc_norm(target_date=None): pp = paid_purchases(target_date) ss = subscriptions(target_date) once_purchase_rate, twice_purchase_rate, once, twice, user_count = calc_purchase_rate(target_date) goingon_clazz = goingon_clazz_count() end_clazz = end_clazz_count(target_date) if target_date is None: week_norm = WeekNorm(pp, ss, once_purchase_rate, twice_purchase_rate, goingon_clazz, end_clazz, get_first_datetime_in_week(), get_last_datetime_in_week(), once, twice, user_count) else: week_norm = WeekNorm(pp, ss, once_purchase_rate, twice_purchase_rate, goingon_clazz, end_clazz, get_first_datetime_in_week(target_date), get_last_datetime_in_week(target_date), once, twice, user_count) norm = Norm(week_norm.to_dict(), 'week') norm_collect = db['norm'] norm_collect.insert(norm.__dict__) if target_date is None: return norm_collect.find_one({'flag': 'week', 'norm.startDate': get_first_datetime_in_week().strftime('%Y-%m-%d')}) else: return norm_collect.find_one({'flag': 'week', 'norm.startDate': get_first_datetime_in_week(target_date).strftime('%Y-%m-%d')})