python - Pandas 面试问题 - 比较 Pandas-Joins 并理想地提供最快的方法

标签 python pandas performance dataframe merge

不久前,我接受了数据科学家职位的面试。奇怪的是,在没有询问机器学习或数据科学甚至统计学的情况下,我被分配了一个小任务来连接两个 pandas 数据框,并比较各种方法。我没有得到期望是什么的标准。我提供了多种解决方案。令人惊讶的是,后来有人告诉我,我的解决方案都不符合他们为这项任务制定的其他解决方案的性能基准!显然,我要求提供反馈或他们用于此任务的其他方法优于我提供的解决方案,但请回答;不仅如此。我认为自己是一名中级 Python 程序员,当然我不知道很多技巧或最佳实践,而且到目前为止我也没有太多关注性能,除非它非常明显地慢。这就是为什么自从采访以来,我开始思考还有什么其他方法可以以最快的方式完成这项任务。

问题:

# Randomly generated historical data about how many megabytes were downloaded from the Internet."HoD" is the Hour of the Day!
hist_df = pd.DataFrame(columns=['HoD', 'Volume'])
hist_df['HoD'] = np.random.randint(0, 24, 365 * 24)
hist_df['Volume'] = np.random.uniform(1, 1000, 365 * 24)

# Tariffs based on the hour of the day
tariffs_df = pd.DataFrame({
    'Time range': ['00:00 to 09:00', '09:00 to 18:00', '18:00 to 00:00'],
    'cost': [10, 14, 22]
})

任务:返回带有附加列“成本”的历史数据框,该列将显示历史数据中每小时花费了多少钱。基本上关税数据框需要合并到历史数据中。

我的解决方案:这是 gist 包含我提供的四种方法。我提供了基于(最慢到最快)的合并:i)简单的 iterrows(最慢),ii)pandas_apply,iii)和 numpy vectorize,以及 iv)pandas binning(最快)。结果是(以秒为单位):

{'naive_iterrows': 5.810565948486328,
 'pandas_apply': 0.6743350028991699,
 'numpy_vec': 0.6381142139434814,
 'pandas_bin-merge': 0.009788990020751953}

enter image description here

问题:有哪些更快的方法可以实现这一目标?正如我在第一段中提到的,他们对我的解决方案的性能不满意。

P.S.:虽然这件事很主观,但我觉得很奇怪,他们发布了一个数据科学家角色(有很多机器学习等等要求),却因此拒绝了申请人。我非常高兴能事先了解他们的工作要求和期望。仍然喜欢更多地了解 pandas、python 最佳实践,对于这个特殊情况,如果还有其他情况的话!

最佳答案

您可以按照 Siddharth 的建议更改最后加入的方法.假设您的 DataFrame 更大:

hist_df = pd.DataFrame(columns=['HoD', 'Volume'])
hist_df['HoD'] = np.random.randint(0, 10000, 365 * 10000)
hist_df['Volume'] = np.random.uniform(1, 10000, 365 * 10000)

让我们比较一下:

%timeit merged_df = pd.merge(hist_df, tariffs_df, how='left', left_on='bin', right_on='Time range')

1 loop, best of 3: 740 ms per loop


%timeit hist = hist_df.set_index('bin')
%timeit tariffs = tariffs_df.set_index('Time range')
%timeit merged_df = hist.join(tariffs)

10 loops, best of 3: 20.1 ms per loop
1000 loops, best of 3: 449 µs per loop
100 loops, best of 3: 3.59 ms per loop

如果允许其他包,你也可以使用dask进行并行化。

关于python - Pandas 面试问题 - 比较 Pandas-Joins 并理想地提供最快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55807283/

相关文章:

python - 用于过滤空类别的上下文处理器

python - 从单独行上的字符串文本文件生成整数数组。更好的方法?

Python Pandas 通过将值连接到列名来组合 2 个数据框

条件连接的性能

linux - 为什么我看到某个进程的 CPU 使用率很高,但总体 CPU 空闲百分比很高?

python - Python : `key not in list` or `not key in list` ? 什么更高效

python - OpenAI GPT-3 API 错误 : "InvalidRequestError: Unrecognized request argument supplied"

python - Pandas: reshape 数据框

python - 如果 Pandas 有公共(public)键,它们会将行中的某些值转换为列

mysql - JDBC 批量插入性能