您现在的位置是:主页 > news > 怎么建网站 手机版/每日一则小新闻
怎么建网站 手机版/每日一则小新闻
admin2025/6/26 16:02:03【news】
简介怎么建网站 手机版,每日一则小新闻,武汉网站优化建设,东莞网站建设策划今天给大家分享2道数据分析试题,这是腾讯数据分析面试官在面试时考察候选人喜欢出的题,属于硬性技能考察题目,特别好用。 面试都有固定的流程,通常是自我介绍,硬性技能考察,项目经历追问和Q&A环节。 …
今天给大家分享2道数据分析试题,这是腾讯数据分析面试官在面试时考察候选人喜欢出的题,属于硬性技能考察题目,特别好用。
面试都有固定的流程,通常是自我介绍,硬性技能考察,项目经历追问和Q&A环节。
之所以把硬性技能考察紧跟自我介绍后面,是因为不管简历包装的有多好,招来的小伙伴始终要能get hands dirty,如果一些必须的技能不ok,那就没啥给机会的必要了。
我们团队这边比较关注的还是SQL和Python技能,所以但凡学生声称自己熟练掌握SQL和Python的,都会详细考察一下实际能力。所以两道题目,一道是SQL题,一道是Python题。
文章目录
- 交流
- 01 SQL题目
- 题目
- 02 Python 题目
- 题目
- 03 参考解答
- SQL题目答案
- 问题1答案
- 问题2答案
- Python题目
- 基础实现版本:
- 空间换时间实现版本:
- 当前最优版本:
交流
本文来自技术群小伙伴分享的,技术交流欢迎入群
目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到更快获取资料、入群
方式①、添加微信号:dkl88191,备注:来自CSDN+加群
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群
01 SQL题目
这道题目还挺舍不得分享出来的,不过我自己用下来是真的觉得堪称SQL试金石。不仅是校招生,就算是写了好多年SQL的人,也不一定真的能快速想出来答案,但被告知答案了又会觉得真的其实蛮简单的。因为题目都是我工作时候遇到觉得很有趣记录下来的case,所以可能是百度orGoogle也搜不出来的珍藏私货。
题目
有一张用户签到表【t_user_attendence】,标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含3个字段:
-
日期【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】
这个乍看不太是SQL能解决的问题,但仔细想想就有思路。我的答案可能也不是最佳答案,但暂时还没问到过别的答案吧。
02 Python 题目
题目
针对股票的最大回撤率指标定义,给出代码实现思路。给定的是产品所有交易日的净值序列,且其净值序列已按照日期排序。
最大回撤率: 在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。
追问: 如何在提升计算效率?
这道题类似的题目其实在leecode也有,这个大概是变化但类似版本(可以搜leecode股票最大回报);因为团队里处理比较多金融资产数据,这个指标是策略中最常见的指标之一,所以也是一道工作中攒下来的题目。这个指标的计算优化问题真的非常值得问,我后面会列几个版本的代码思路和实现代码。
通常最简单的计算实现,会需要O(n2)的计算复杂度;可以针对如何降低计算复杂度,专门追问。
其实这俩题目,核心考察的都不是语言能力,因为语言永远都在更新,始终可以通过写得多来提升熟悉度;核心考察的其实都是逻辑和算法能力,就算忘记核心函数或者语法,回归到问题本身,有逻辑的candidate还是能给出思路和步骤,那当然如果语法和函数都非常熟悉,那就更完美了,可以马上写出来答案。
很多硬性技能考察题,核心一样,题面可以一直换,比如:签到可以变成用户活跃,用户充值次数之类的,可以换成候选人项目经历里熟悉的context,有些候选人比较紧张,换点熟悉的场景,似乎就脑子转的快一点。如果候选人最简单的版本能快速给出思路,可以一层层追问,了解ta的思考过程,更全面考察逻辑能力。
03 参考解答
感觉要是不给参考答案的话,分享题目还是有点耍流氓的意思,就还是给几个答案参考参考。
SQL题目答案
问题1答案
思路: 先找用户最近一次未签到日期,再用今天减那个日期。
create table t_user_consecutive_days as select fuser_id,datediff('20200322',fdate_max) fconsecutive_daysfrom (select fuser_id ,max(fdate) fdate_max from t_user_attendence where fis_sign_in = 0 group by fuser_id ) t1;
问题2答案
把用户所有签到记录转化成一条0-1字符串序列,用0做split切割,计算切出来的1序列组中的最大长度
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_recordfrom t_user_attendencegroup 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
;
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[i+1]:maxList[i] = accnavArr[i]else:maxList[i] = maxList[i+1]if accnavArr[i] < minList[i+1]:minList[i] = accnavArr[i]else:minList[i] = minList[i+1]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
每个时间点同时更新最大值和最大回撤,两个指标,不需要额外空间,且只做一次列表循环计算。如果你有更好的答案,欢迎评论区见!