熊猫访谈问题 - 比较熊猫连接并理想地提供最快的方法

问题描述 投票:5回答:1

不久前,我接受了数据科学家角色的采访。奇怪的是,在没有询问机器学习或数据科学甚至是统计学的情况下,我被赋予了一个小任务来加入两个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。:虽然这个问题非常主观,但我发现他们发布数据科学家的角色(许多机器学习等等)并且因为这个而拒绝申请人,这很奇怪。我非常高兴我事先了解了他们的工作要求和期望。仍然喜欢学习更多关于熊猫,python最佳实践的知识,如果还有其他的话,这个特殊情况!

python pandas performance dataframe merge
1个回答
2
投票

您可以按照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进行并行化。

© www.soinside.com 2019 - 2024. All rights reserved.