• Python 牛刀小试


    有一张用户签到表【t_user_attendence】,标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字段:

    • 日期【fdate】;用户id【fuser_id】;用户当天是否签到【fis_sign_in:0否1是】

    问题1:请计算截至当前每个用户已经连续签到的天数(输出表仅包含当天签到的所有用户,计算其连续签到天数)

    输出表【t_user_consecutive_days】:

    • 用户id【fuser_id】;用户连续签到天数【fconsecutive_days】

    解答逻辑非常简单,只需要用max和datediff

    问题2:请计算每个用户历史以来最大的连续签到天数(输出表为用户签到表中所有出现过的用户,计算其历史最大连续签到天数)

    输出表【t_user_max_days】:

    • 用户id【fuser_id】;用户最大连续签到天数【fmax_days】

    #问题1:
    create
    table t_user_consecutive_days as select fuser_id ,datediff('20200322',fdate_max) fconsecutive_days from (select fuser_id ,max(fdate) fdate_max from t_user_attendence where fis_sign_in = 0 #是否签到的标志,0代表签到 group by fuser_id ) t1; #问题2: create table t_user_max_days as select fuser_id ,max(length(cut_fsign_record)) as fmax_days (select fuser_id ,fsign_record ,cut_fsign_record from (select fuser_id ,wm_concat(fis_sign_in) fsign_record from t_user_attendence group by fuser_id ) t1 lateral view explode(split(fsign_record,'0')) t as cut_fsign_record ) t2 where cut_fsign_record<>'' group by fuser_id;

    超过3天连续签到的次数

    select uid,count(1) num
    from 
        (select uid,time,date_sub(date(time),t1.flag) curr_date
        from 
            (select uid,time,row_number() over(partition by uid order by time) flag
            from table) t1 
        )t1
    group by uid,curr_date
    having num >= 3

    Python 小题

    针对股票的最大回撤率指标定义,给出代码实现思路。给定的是产品所有交易日的净值序列,且其净值序列已按照日期排序。

    最大回撤率:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。

    def max_drawdown(accnavArr):
      mdd = 0
      for i in range(0, len(accnavArr)):
        for j in range(i + 1, len(accnavArr)):
          drawdown = accnavArr[i] / accnavArr[j] - 1
          if drawdown < mdd:
            mdd = drawdown
      return mdd

    空间换时间实现版本:

    把每个时间点计算的最大值都存到一个列表结构中,最大回撤的计算只需要再依赖这个列表进行多一次循环计算。

    def maxDrawdownGainCal(accnavArr):      # 默认accnavArr按日期降序排列
        maxDrawdown = 10000
        maxGain =0
        arrLen = len(accnavArr)
        startMdd = accnavArr[arrLen-1]
        startGain = accnavArr[arrLen-1]
        for i in range(arrLen-2,-1,-1):
            if accnavArr[i] > startMdd:
                startMdd = accnavArr[i]
            mdd = (accnavArr[i]/startMdd-1)
            if accnavArr[i] < startGain:
                startGain = accnavArr[i]
            mg = (accnavArr[i]/startGain-1)
            if mdd < maxDrawdown : maxDrawdown = mdd
            if mg > maxGain : maxGain = mg
        return maxDrawdown,maxGain
    天才是百分之一的灵感,加百分之九十九的汗水,但那百分之一的灵感往往比百分之九十九的汗水来的重要
  • 相关阅读:
    dubbo总结
    搞懂分布式技术28:微服务(Microservice)那点事
    搞懂分布式技术21:浅谈分布式消息技术 Kafka
    搞懂分布式技术20:消息队列因何而生
    搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
    搞懂分布式技术17,18:分布式事务总结
    热敏电阻
    eagle学习汇总
    CSS浮动通俗讲解
    总结一下CSS定位
  • 原文地址:https://www.cnblogs.com/Christbao/p/13596170.html
Copyright © 2020-2023  润新知