做亚马逊外国网站需要语言好吗,深圳住房与建设部网站,管城郑州网站建设,单位网站 方案没想到这篇文章这么受欢迎#xff0c;那就再分享一篇#xff1a;苏克1900#xff1a;腾讯高级数据分析师#xff1a;十年分析之路的力荐书籍zhuanlan.zhihu.com以下原文章#xff1a;近期暑期实习和提前批招聘已经开始了#xff0c;不论你是校招还是想社招#xff0c;…没想到这篇文章这么受欢迎那就再分享一篇苏克1900腾讯高级数据分析师十年分析之路的力荐书籍zhuanlan.zhihu.com以下原文章近期暑期实习和提前批招聘已经开始了不论你是校招还是想社招肯定是要刷很多题才行如果你想投鹅厂的数据分析师岗位强烈建议看下下面两道面试题是鹅厂资深数据分析面试官(annatx)出的特别好用的硬性技能考察题目。做实战题目是王道刷一道顶得上在网上刷百道。面试都有固定的流程通常是自我介绍硬性技能考察项目经历追问和QA环节。之所以把硬性技能考察紧跟自我介绍后面是因为不管简历包装的有多好招来的小伙伴始终要能get hands dirty如果一些必须的技能不ok那就没啥给机会的必要了。我们团队这边比较关注的还是SQL和Python技能所以但凡学生声称自己熟练掌握SQL和Python的都会详细考察一下实际能力。所以两道题目一道是SQL题一道是Python题。SQL题目这道题目还挺舍不得分享出来的不过我自己用下来是真的觉得堪称SQL试金石。不仅是校招生就算是写了好多年SQL的人也不一定真的能快速想出来答案但被告知答案了又会觉得真的其实蛮简单的。因为题目都是我工作时候遇到觉得很有趣记录下来的case所以可能是百度orGoogle也搜不出来的珍藏私货。题目有一张用户签到表【t_user_attendence】标记每天用户是否签到(说明该表包含所有用户所有工作日的出勤记录) 包含三个字段日期【fdate】用户id【fuser_id】用户当天是否签到【fis_sign_in0否1是】问题1请计算截至当前每个用户已经连续签到的天数(输出表仅包含当天签到的所有用户计算其连续签到天数)输出表【t_user_consecutive_days】:用户id【fuser_id】用户联系签到天数【fconsecutive_days】解答逻辑非常简单只需要用max和datediff。实际答案就留在文末好了。问题2请计算每个用户历史以来最大的连续签到天数(输出表为用户签到表中所有出现过的用户计算其历史最大连续签到天数)输出表【t_user_max_days】:用户id【fuser_id】用户最大连续签到天数【fmax_days】这个乍看不太是SQL能解决的问题但仔细想想就有思路。我的答案可能也不是最佳答案但暂时还没问到过别的答案吧。Python题目题目针对股票的最大回撤率指标定义给出代码实现思路。给定的是产品所有交易日的净值序列且其净值序列已按照日期排序。最大回撤率在选定周期内任一历史时点往后推产品净值走到最低点时的收益率回撤幅度的最大值。追问如何在提升计算效率这道题类似的题目其实在leecode也有这个大概是变化但类似版本(可以搜leecode股票最大回报)因为团队里处理比较多金融资产数据这个指标是策略中最常见的指标之一所以也是一道工作中攒下来的题目。这个指标的计算优化问题真的非常值得问我后面会列几个版本的代码思路和实现代码。通常最简单的计算实现会需要O(n2)的计算复杂度可以针对如何降低计算复杂度专门追问。漫谈其实这俩题目核心考察的都不是语言能力因为语言永远都在更新始终可以通过写得多来提升熟悉度核心考察的其实都是逻辑和算法能力就算忘记核心函数或者语法回归到问题本身有逻辑的candidate还是能给出思路和步骤那当然如果语法和函数都非常熟悉那就更完美了可以马上写出来答案。其他经验很多硬性技能考察题核心一样题面可以一直换比如签到可以变成用户活跃用户充值次数之类的可以换成候选人项目经历里熟悉的context有些候选人比较紧张换点熟悉的场景似乎就脑子转的快一点。如果候选人最简单的版本能快速给出思路可以一层层追问了解ta的思考过程更全面考察逻辑能力。参考解答感觉要是不给参考答案的话分享题目还是有点耍流氓的意思就还是给几个答案参考参考。SQL题目问题1答案思路先找用户最近一次未签到日期再用今天减那个日期create table t_user_consecutive_days asselect fuser_id,datediff(20200322,fdate_max) fconsecutive_daysfrom(select fuser_id,max(fdate) fdate_maxfrom t_user_attendencewhere fis_sign_in 0group by fuser_id) t1;问题2答案把用户所有签到记录转化成一条0-1字符串序列用0做split切割计算切出来的1序列组中的最大长度create table t_user_max_days asselect fuser_id,max(length(cut_fsign_record)) as fmax_days(select fuser_id,fsign_record,cut_fsign_recordfrom(select fuser_id,wm_concat(fis_sign_in) fsign_recordfrom t_user_attendencegroup by fuser_id) t1lateral view explode(split(fsign_record,0)) t as cut_fsign_record) t2where cut_fsign_recordgroup by fuser_id;Python题目最大回撤率输入参数都是按照日期降序排列的净值序列基础实现版本def max_drawdown(accnavArr):mdd 0for i in range(0, len(accnavArr)):for j in range(i 1, len(accnavArr)):drawdown accnavArr[i] / accnavArr[j] - 1if drawdown mdd:mdd drawdownreturn mdd空间换时间实现版本把每个时间点计算的最大值都存到一个列表结构中最大回撤的计算只需要再依赖这个列表进行多一次循环计算。def maxDrawdownGainCal(accnavArr): # 默认accnavArr按日期降序排列maxDrawdown 10000maxGain 0arr_len len(accnavArr)maxList [0.0] * arr_lenminList [0.0] * arr_lenmaxList[arr_len-1] accnavArr[arr_len-1]minList[arr_len-1] accnavArr[arr_len-1]for i in range(arr_len-2,-1,-1):if accnavArr[i] maxList[i1]:maxList[i] accnavArr[i]else:maxList[i] maxList[i1]if accnavArr[i] minList[i1]:minList[i] accnavArr[i]else:minList[i] minList[i1]for i in range(0,arr_len):mdd (accnavArr[i]/maxList[i]-1)mg (accnavArr[i]/minList[i]-1)if mdd maxDrawdown : maxDrawdown mddif mg maxGain : maxGain mgreturn maxDrawdown,maxGain当前最优版本每个时间点同时更新最大值和最大回撤两个指标不需要额外空间且只做一次列表循环计算。def maxDrawdownGainCal(accnavArr): # 默认accnavArr按日期降序排列maxDrawdown 10000maxGain 0arrLen 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 mddif mg maxGain : maxGain mgreturn maxDrawdown,maxGain更多干货欢迎关注我的公众号高级农民工。鹅厂内推可以加我wxninteen__1900(备注知乎鹅厂)