gpt4 book ai didi

python - pandas df.loc[z,x]=y 如何提高速度?

转载 作者:太空狗 更新时间:2023-10-29 19:35:48 25 4
gpt4 key购买 nike

我已经确定了一个 pandas 命令

timeseries.loc[z, x] = y

负责一次迭代中花费的大部分时间。现在我正在寻找更好的方法来加速它。循环甚至不包括 50k 个元素(生产目标是 ~250k 或更多),但已经需要 20 秒了。

这是我的代码(忽略上半部分,它只是计时助手)

def populateTimeseriesTable(df, observable, timeseries):
"""
Go through all rows of df and
put the observable into the timeseries
at correct row (symbol), column (tsMean).
"""

print "len(df.index)=", len(df.index) # show number of rows

global bf, t
bf = time.time() # set 'before' to now
t = dict([(i,0) for i in range(5)]) # fill category timing with zeros

def T(i):
"""
timing helper: Add passed time to category 'i'. Then set 'before' to now.
"""
global bf, t
t[i] = t[i] + (time.time()-bf)
bf = time.time()

for i in df.index: # this is the slow loop
bf = time.time()

sym = df["symbol"][i]
T(0)

tsMean = df["tsMean"][i]
T(1)

tsMean = tsFormatter(tsMean)
T(2)

o = df[observable][i]
T(3)

timeseries.loc[sym, tsMean] = o
T(4)

from pprint import pprint
print "times needed (total = %.1f seconds) for each command:" % sum(t.values())
pprint (t)

return timeseries

With(不重要,不慢)

def tsFormatter(ts):
"as human readable string, only up to whole seconds"
return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(ts))

..

--> 待优化代码在for循环中

(T 和 t 只是辅助函数和 dict,用于计时。)

我已经为每一步计时了。绝大多数时间:

len(df.index)= 47160
times needed (total = 20.2 seconds) for each command:
{0: 1.102,
1: 0.741,
2: 0.243,
3: 0.792,
4: 17.371}

花费在最后一步

timeseries.loc[sym, tsMean] = o

我已经下载并安装了 pypy - 但遗憾的是,它还不支持 pandas。

关于如何加快填充二维数组的任何想法?

谢谢!


编辑:抱歉,没有提到 - 'timeseries' 也是一个数据框:

timeseries = pd.DataFrame({"name": titles}, index=index)

最佳答案

更新: 从 Pandas 0.20.1 开始 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers .

============================================= ======================

@jezrael 提供了一个有趣的比较,我决定使用更多索引方法和 1000 万行 DF 重复它(实际上在这种特殊情况下大小并不重要):

设置:

In [15]: df = pd.DataFrame(np.random.rand(10**7, 5), columns=list('abcde'))

In [16]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000000 entries, 0 to 9999999
Data columns (total 5 columns):
a float64
b float64
c float64
d float64
e float64
dtypes: float64(5)
memory usage: 381.5 MB

In [17]: df.shape
Out[17]: (10000000, 5)

时间:

In [37]: %timeit df.loc[random.randint(0, 10**7), 'b']
1000 loops, best of 3: 502 µs per loop

In [38]: %timeit df.iloc[random.randint(0, 10**7), 1]
1000 loops, best of 3: 394 µs per loop

In [39]: %timeit df.at[random.randint(0, 10**7), 'b']
10000 loops, best of 3: 66.8 µs per loop

In [41]: %timeit df.iat[random.randint(0, 10**7), 1]
10000 loops, best of 3: 32.9 µs per loop

In [42]: %timeit df.ix[random.randint(0, 10**7), 'b']
10000 loops, best of 3: 64.8 µs per loop

In [43]: %timeit df.ix[random.randint(0, 10**7), 1]
1000 loops, best of 3: 503 µs per loop

条形图形式的结果:

enter image description here

作为 DF 的时序数据:

In [88]: r
Out[88]:
method timing
0 loc 502.0
1 iloc 394.0
2 at 66.8
3 iat 32.9
4 ix_label 64.8
5 ix_integer 503.0

In [89]: r.to_dict()
Out[89]:
{'method': {0: 'loc',
1: 'iloc',
2: 'at',
3: 'iat',
4: 'ix_label',
5: 'ix_integer'},
'timing': {0: 502.0,
1: 394.0,
2: 66.799999999999997,
3: 32.899999999999999,
4: 64.799999999999997,
5: 503.0}}

绘图

ax = sns.barplot(data=r, x='method', y='timing')
ax.tick_params(labelsize=16)
[ax.annotate(str(round(p.get_height(),2)), (p.get_x() + 0.2, p.get_height() + 5)) for p in ax.patches]
ax.set_xlabel('indexing method', size=20)
ax.set_ylabel('timing (microseconds)', size=20)

关于python - pandas df.loc[z,x]=y 如何提高速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37757844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com