生死竞速最后20分钟拯救一道Pandas作业

简介: 一道Pandas作业
👉作者主页: 小小明-代码实体

👉简介: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 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参数指定了列名。

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

相关文章
|
4月前
|
存储 缓存 Rust
Polars (最强Pandas平替)
Polars (最强Pandas平替)
175 1
|
数据挖掘 Python
[工作必备]pandas数据分析处理52个常用技巧(下)
[工作必备]pandas数据分析处理52个常用技巧
144 0
|
1月前
|
数据挖掘 大数据 数据处理
数据分析师的秘密武器:精通Pandas DataFrame合并与连接技巧
【8月更文挑战第22天】在数据分析中,Pandas库的DataFrame提供高效的数据合并与连接功能。本文通过实例展示如何按员工ID合并基本信息与薪资信息,并介绍如何基于多列(如员工ID与部门ID)进行更复杂的连接操作。通过调整`merge`函数的`how`参数(如&#39;inner&#39;、&#39;outer&#39;等),可实现不同类型的连接。此外,还介绍了使用`join`方法根据索引快速连接数据,这对于处理大数据集尤其有用。掌握这些技巧能显著提升数据分析的能力。
49 1
|
30天前
|
分布式计算 大数据 数据处理
别说你会用Pandas
别说你会用Pandas
|
11月前
|
XML JSON 数据处理
pandas&numpy 数据处理~~两万字超全(下)
pandas&numpy 数据处理~~两万字超全(下)
79 0
|
11月前
|
数据处理 索引 Python
pandas&numpy 数据处理~~两万字超全(上)
pandas&numpy 数据处理~~两万字超全(上)
59 0
|
11月前
|
存储 数据处理 索引
pandas&numpy 数据处理~~两万字超全(中)
pandas&numpy 数据处理~~两万字超全(中)
77 0
|
编解码 数据挖掘 数据处理
[工作必备]pandas数据分析处理52个常用技巧(上)
[工作必备]pandas数据分析处理52个常用技巧
161 1
|
数据挖掘 索引 Python
[工作必备]pandas数据分析处理52个常用技巧(中)
[工作必备]pandas数据分析处理52个常用技巧
119 0
|
存储 SQL 数据处理
10个Pandas的另类数据处理技巧
本文所整理的技巧与以前整理过10个Pandas的常用技巧不同,你可能并不会经常的使用它,但是有时候当你遇到一些非常棘手的问题时,这些技巧可以帮你快速解决一些不常见的问题。
227 0
10个Pandas的另类数据处理技巧