?作者主页:小小明-代码实体
?简介:Python领域优质创作者?、数据处理专家✌
?欢迎点赞 ? 收藏 ⭐留言 ?
昨晚有位童鞋一道Pandas面试题完全没有思路不会做,通过黄同学找到我时,这道题目离提交答案仅剩20分钟,不过我最终还是在15分钟之内解决了问题,这整个过程简直是刺激~???
原题题目如下:
最终要求输出:
要在20分钟内解决这个问题,对于我来说最困难的第一步就是理解题意,作为一名英文渣渣,硬看这个还是理解的太慢。ε=ε=ε=(#>д<)ノ啊啊啊,简直是生死竞速啊,怎么办?
最终我使用了腾讯翻译官进行辅助,翻译结果如下:
有了图片翻译工具,这个题目总算理解了。
我总结一下四个规则要求:对于每一天的每一支股票,会有N个来源的价格,去掉空值后优先选择最频繁出现的价格,出现次数全部一样时选择来源id最小的价格,当天该股票全部都是空值时,选择前一个交易日的价格。
搞清楚了规则就可以开始整理数据了,这里我手敲编辑了数据为:
date | ticker | price | source_id |
---|---|---|---|
2013/1/2 | AAPL | 515.61 | 0 |
2013/1/2 | AAPL | 515.62 | 1 |
2013/1/2 | AAPL | 515.62 | 2 |
2013/1/3 | AAPL | 515.16 | 0 |
2013/1/3 | AAPL | 515.17 | 1 |
2013/1/3 | AAPL | 515.18 | 2 |
2013/1/4 | AAPL | 0 | |
2013/1/4 | AAPL | 515.45 | 1 |
2013/1/4 | AAPL | 515.47 | 2 |
2013/1/7 | AAPL | 0 | |
2013/1/7 | AAPL | 1 | |
2013/1/7 | AAPL | 2 | |
2013/1/8 | AAPL | 527.28 | 0 |
2013/1/8 | AAPL | 528.29 | 1 |
保存Excel文件。
已经耗时10分钟了?怎么办?怎么办??
不过也已经到了我最擅长的编码阶段,开干吧❗❗❗
首先使用pandas读取数据:
import pandas as pddf = pd.read_excel("股票数据.xlsx")df
这四个规则,直接使用pandas本身的方法会导致代码较为臃肿。由于时间紧迫,这里我直接使用万能的循环来解决这个问题,最终完整代码如下:
result = []for (date, ticker), split in df.groupby(["date", "ticker"]): prices = split.price.mode() if prices.shape[0] > 0: price = split.price.mode().iat[0] else: price = last result.append((date, ticker, price)) last = priceresult = pd.DataFrame(result, columns=["date", "ticker", "price"])result
结果:
可以看到结果满足题目的四点规则要求,历时5分钟编码终于搞定了。?长舒一口气压压惊~
做完后我立马将代码和截图发给了对方,对方也在提交答案后立马回了我一个红包。
但是表达看不懂,希望我写篇文章:
既然如此,那么我就写下这篇文章来详解这其中的几个小知识点。虽然其实这其中涉及的内容比我以前的老文章要简单20倍以上,不太屑于写,但黄同学都这样邀请了,我就逼自己写一把吧?
首先呢,我们将整个datafream按照每天每支股票拆分成一个个的Datafream:
for (date, ticker), df_split in df.groupby(["date", "ticker"]): print(date, ticker) display(df_split)
结果如下:
可以看到这支股票的每一天的数据都被拆分了出来。
取最频繁的价格,我们可以使用众数:
df_split.price.mode()
0 527.281 528.29dtype: float64
这种形式表示众数不止一个,表示出现次数一致,此时规则2要求选择来源id最小的价格,由于数据本身是按照来源id从小到大排序的,那么我们直接取第一个众数即可:
df_split.price.mode().iat[0]
527.28
但是问题是,某个分组可能出现价格全部为空值的情况,此时规则要求取前一个分组的价格,这也是我直接使用循环来解决这个问题的原因,因为可以通过一个变量记录前一次遍历分组的结果。
当然为了避免数据源可能出现无序的情况的情况,我们需要事先对数据进行排序:
df.sort_values(["ticker", "date", "source_id"], inplace=True)
最后我将所有的结果数据都保存到了一个列表中,通过DataFrame的构造函数则可以直接根据一个列表生成一个DataFrame,columns参数指定了列名。
额,感觉实在太过于基础已经没啥可写的了,推荐几篇老文章吧:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119820.html
☀️苏州程序大白一文从基础手把手教你Python数据可视化大佬☀️《❤️记得收藏❤️》 目录 ?️?开讲啦!!!!?️?苏州程序大白?️??博主介绍前言数据关系可视化散点图 Scatter plots折线图强调连续性 Emphasizing continuity with line plots同时显示多了图表 数据种类的可视化 Plotting with categorical da...
此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), 毕竟算法不是做了一遍就能完全记住的. 所以本文适合已经知道解题思路和方法, 想进一步加强理解和记忆的朋友, 并不适合第一次接触此题的朋友(可以根据题号先去力扣看看官方题解, 然后再看本文内容). 关...
在使用openpyxl时,出现ValueError: Unknown engine: openpyxl 问题定位解决思路拓展 问题定位 在使用链接: https://blog.csdn.net/SuperAlanSun/article/details/120042466 博客中的方法读取excel数据时: import pandas as pddf=pd.rea...
上次给大家分享了一个springboot+vue的校园招聘系统,视频教程加项目源码,都是开源的,应该说很香了,今天再给大家分享一个不错的springboot的项目。 老规矩,开源,开源,开源!!! 金九银十来了,小伙伴们,冲啊!前面已经整理了很多的面试题,拿去学习吧! 1,❤️爆肝!整理了一周的Spring面试大全【含答案】,吊打Java面试官【建议收藏】!❤️ 2,❤️肝完了,一天掌握数据...
阅读 2547·2021-11-23 09:51
阅读 2463·2021-09-30 09:48
阅读 1058·2021-09-10 10:51
阅读 2169·2021-08-12 13:22
阅读 3529·2021-08-11 10:24
阅读 2119·2019-08-30 15:55
阅读 590·2019-08-30 14:05
阅读 3184·2019-08-30 13:03