【发布时间】:2019-11-22 21:40:14
【问题描述】:
- 我尝试比较 Pandas 和 传统循环 的性能。我意识到,与传统循环相比,相同的输入和输出,Pandas 的计算速度非常快。
我的代码:
#df_1h has been imported before
import time
n = 14
pd.options.display.max_columns = 8
display("df_1h's Shape {} rows x {} columns".format(df_1h.shape[0], df_1h.shape[1]))
close = df_1h['close']
start = time.time()
df_1h['sma_14_pandas'] = close.rolling(14).mean()
end = time.time()
display('pandas: {}'.format(end - start))
start = time.time()
df_1h['sma_14_loop'] = np.nan
for i in range(n-1, df_1h.shape[0]):
df_1h['sma_14_loop'][i] = close[i-n+1:i+1].mean()
end = time.time()
display('loop: {}'.format(end - start))
display(df_1h.tail())
输出:
"df_1h's Shape 16598 rows x 15 columns"
'pandas: 0.0030088424682617188'
'loop: 7.2529966831207275'
open_time open high low ... ignore rsi_14 sma_14_pandas sma_14_loop
16593 1.562980e+12 11707.39 11739.90 11606.04 ... 0.0 51.813151 11646.625714 11646.625714
16594 1.562983e+12 11664.32 11712.61 11625.00 ... 0.0 49.952679 11646.834286 11646.834286
16595 1.562987e+12 11632.64 11686.47 11510.00 ... 0.0 47.583619 11643.321429 11643.321429
16596 1.562990e+12 11582.06 11624.04 11500.00 ... 0.0 48.725262 11644.912857 11644.912857
16597 1.562994e+12 11604.96 11660.00 11588.16 ... 0.0 50.797087 11656.723571 11656.723571
5 rows × 15 columns
- Pandas 几乎快于 2.5k 倍!!!
我的问题:
- 我的代码错误吗?
- 如果我的代码是正确的,为什么 Pandas 这么快?
- 如何为 Pandas 定义运行如此之快的自定义函数?
【问题讨论】:
-
Pandas 的滚动功能特别非常快,比您的时间显示的循环快得多
-
附带说明,您应该避免使用链式索引,而是使用 panda 的
loc和iloc索引器,查找更多 here -
@yatu 我完全支持你的建议,但我注意到将
df_1h['SMA_14_loop'][i] =...替换为df_1h.loc[i,'SMA_14_loop'] = ...将循环算法的执行时间增加了30%(在描述的测试中从7.6 秒到10.1 秒)我的答案)。你知道任何类似的比较吗?或者你有解释吗?
标签: python python-3.x pandas python-2.7 jupyter-notebook