gpt4 book ai didi

python - 优化 Python 代码 - 由于 pandas.core.series.Series.__getitem__ 造成的开销

转载 作者:太空宇宙 更新时间:2023-11-03 18:10:50 25 4
gpt4 key购买 nike

我有 pandas 数据对象 - data - 存储为系列系列。第一个系列在 ID1 上建立索引,第二个系列在 ID2 上建立索引。

ID1      ID2
1 10259 0.063979
14166 0.120145
14167 0.177417
14244 0.277926
14245 0.436048
15021 0.624367
15260 0.770925
15433 0.918439
15763 1.000000
...
1453 812690 0.752274
813000 0.755041
813209 0.756425
814045 0.778434
814474 0.910647
814475 1.000000
Length: 19726, dtype: float64

我有一个函数,它使用该对象中的值进行进一步的数据处理。这是函数:

#Function
def getData(ID1, randomDraw):
dataID2 = data[ID1]
value = dataID2.index[np.searchsorted(dataID2, randomDraw, side='left').iloc[0]]
return value

我使用 np.vectorize 将此函数应用于大约有 2200 万行的 DataFrame - dataFrame

dataFrame['ID2'] = np.vectorize(getData)(dataFrame['ID1'], dataFrame['RAND'])

其中 ID1RAND 是包含输入到函数中的值的列。

该代码大约需要 6 个小时来处理所有内容。 Java 中的类似实现只需大约 6 分钟即可获取 2200 万行数据。

在我的程序上运行探查器时,我发现最昂贵的调用是对data的索引,第二昂贵的是searchsorted

Function Name: pandas.core.series.Series.__getitem__
Elapsed inclusive time percentage: 54.44

Function Name: numpy.core.fromnumeric.searchsorted
Elapsed inclusive time percentage: 25.49

使用data.loc[ID1]获取数据会使程序变得更慢。我怎样才能让它更快?我知道 Python 无法达到与 Java 相同的效率,但 6 小时与 6 分钟相比似乎差别太大。也许我应该使用不同的数据结构/函数?我正在使用 Python 2.7PTVS IDE。

添加最小工作示例:

import numpy as np
import pandas as pd

np.random.seed = 0

#Creating a dummy data object - Series within Series
alt = pd.Series(np.array([ 0.25, 0.50, 0.75, 1.00]), index=np.arange(1,5))
data = pd.Series([alt]*1500, index=np.arange(1,1501))

#Creating dataFrame -
nRows = 200000
d = {'ID1': np.random.randint(1500, size=nRows) + 1
,'RAND': np.random.uniform(low=0.0, high=1.0, size=nRows)}
dataFrame = pd.DataFrame(d)

#Function
def getData(ID1, randomDraw):
dataID2 = data[ID1]
value = dataID2.index[np.searchsorted(dataID2, randomDraw, side='left').iloc[0]]
return value

dataFrame['ID2'] = np.vectorize(getData)(dataFrame['ID1'], dataFrame['RAND'])

最佳答案

使用此代码您可能会获得更好的性能:

>>> def getData(ts):
... dataID2 = data[ts.name]
... i = np.searchsorted(dataID2.values, ts.values, side='left')
... return dataID2.index[i]
...
>>> dataFrame['ID2'] = dataFrame.groupby('ID1')['RAND'].transform(getData)

关于python - 优化 Python 代码 - 由于 pandas.core.series.Series.__getitem__ 造成的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25999821/

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