熊猫面试问题-比较熊猫加入并理想地提供最快的方法

Twi*_*ins 5 python performance merge dataframe 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]
})
Run Code Online (Sandbox Code Playgroud)

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

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

{'naive_iterrows': 5.810565948486328,
 'pandas_apply': 0.6743350028991699,
 'numpy_vec': 0.6381142139434814,
 'pandas_bin-merge': 0.009788990020751953}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

PS:虽然这件事是很主观的,但是我觉得奇怪的是,他们扮演了数据科学家的角色(有很多机器学习之类的要求),却因此而拒绝了申请人。我很高兴我事先知道他们的工作要求和期望。仍然喜欢学习更多有关pandas和python最佳实践的信息,对于这种特殊情况,还有其他问题!

Dmy*_*tro 2

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

\n\n
hist_df = pd.DataFrame(columns=[\'HoD\', \'Volume\'])\nhist_df[\'HoD\'] = np.random.randint(0, 10000, 365 * 10000)\nhist_df[\'Volume\'] = np.random.uniform(1, 10000, 365 * 10000)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们来比较一下:

\n\n
%timeit merged_df = pd.merge(hist_df, tariffs_df, how=\'left\', left_on=\'bin\', right_on=\'Time range\')\n\n1 loop, best of 3: 740 ms per loop\n\n\n%timeit hist = hist_df.set_index(\'bin\')\n%timeit tariffs = tariffs_df.set_index(\'Time range\')\n%timeit merged_df = hist.join(tariffs)\n\n10 loops, best of 3: 20.1 ms per loop\n1000 loops, best of 3: 449 \xc2\xb5s per loop\n100 loops, best of 3: 3.59 ms per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n