IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> ??仅剩20分钟挑战一道Pandas面试题??生死竞速??简直刺激? -> 正文阅读

[大数据]??仅剩20分钟挑战一道Pandas面试题??生死竞速??简直刺激?

👉作者主页:小小明-代码实体

👉简介:Python领域优质创作者🏆、数据处理专家?

👉欢迎点赞 👍 收藏 ?留言 📝


昨晚有位童鞋一道Pandas面试题完全没有思路不会做,通过黄同学找到我时,这道题目离提交答案仅剩20分钟,不过我最终还是在15分钟之内解决了问题,这整个过程简直是刺激~😱😱😱

原题题目如下:

最终要求输出:

要在20分钟内解决这个问题,对于我来说最困难的第一步就是理解题意,作为一名英文渣渣,硬看这个还是理解的太慢。ε=ε=ε=(#>д<)ノ啊啊啊,简直是生死竞速啊,怎么办?

最终我使用了腾讯翻译官进行辅助,翻译结果如下:

有了图片翻译工具,这个题目总算理解了。

我总结一下四个规则要求:对于每一天的每一支股票,会有N个来源的价格,去掉空值后优先选择最频繁出现的价格,出现次数全部一样时选择来源id最小的价格,当天该股票全部都是空值时,选择前一个交易日的价格。

搞清楚了规则就可以开始整理数据了,这里我手敲编辑了数据为:

datetickerpricesource_id
2013/1/2AAPL515.610
2013/1/2AAPL515.621
2013/1/2AAPL515.622
2013/1/3AAPL515.160
2013/1/3AAPL515.171
2013/1/3AAPL515.182
2013/1/4AAPL0
2013/1/4AAPL515.451
2013/1/4AAPL515.472
2013/1/7AAPL0
2013/1/7AAPL1
2013/1/7AAPL2
2013/1/8AAPL527.280
2013/1/8AAPL528.291

保存Excel文件。

已经耗时10分钟了😧怎么办?怎么办?😱

不过也已经到了我最擅长的编码阶段,开干吧???

首先使用pandas读取数据:

import?pandas?as?pd

df?=?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?=?price
result?=?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.28
1????528.29
dtype:?float64

这种形式表示众数不止一个,表示出现次数一致,此时规则2要求选择来源id最小的价格,由于数据本身是按照来源id从小到大排序的,那么我们直接取第一个众数即可:

df_split.price.mode().iat[0]
527.28

但是问题是,某个分组可能出现价格全部为空值的情况,此时规则要求取前一个分组的价格,这也是我直接使用循环来解决这个问题的原因,因为可以通过一个变量记录前一次遍历分组的结果。

当然为了避免数据源可能出现无序的情况的情况,我们需要事先对数据进行排序:

df.sort_values(["ticker",?"date",?"source_id"],?inplace=True)

最后我将所有的结果数据都保存到了一个列表中,通过DataFrame的构造函数则可以直接根据一个列表生成一个DataFrame,columns参数指定了列名。

额,感觉实在太过于基础已经没啥可写的了,推荐几篇老文章吧:

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 10:55:57  更:2021-09-10 10:56:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:36:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码