【问题标题】:How do I speed up applying a function to a large pandas dataframe?如何加快将函数应用于大型 pandas 数据帧的速度?
【发布时间】:2022-01-21 19:47:46
【问题描述】:

所以我昨天开始将一个函数应用于一个大小合适的数据集(600 万行),但它需要很长时间。我什至在尝试使用 pandarallel,但这也不是很好。无论如何,这是我正在使用的代码...

def classifyForecast(dataframe):

    buckets = len(dataframe[dataframe['QUANTITY'] != 0])

    try:
        adi = dataframe.shape[0] / buckets
        cov = dataframe['QUANTITY'].std() / dataframe['QUANTITY'].mean()

        if adi < 1.32:
            if cov < .49:
                dataframe['TYPE'] = 'Smooth'
            else:
                dataframe['TYPE'] = 'Erratic'
        else:
            if cov < .49:
                dataframe['TYPE'] = 'Intermittent'
            else:
                dataframe['TYPE'] = 'Lumpy'

    except:
        dataframe['TYPE'] = 'Smooth'
    
    try:
        dataframe['ADI'] = adi
    except:
        dataframe['ADI'] = np.inf
    try:
        dataframe['COV'] = cov
    except:
        dataframe['COV'] = np.inf
    

    return dataframe

from pandarallel import pandarallel

pandarallel.initialize()

def quick_classification(df):
    return df.parallel_apply(classifyForecast(df))

另外,请注意,我将数据框拆分为多个批次。我不希望函数在每一行上工作,而是我希望它在块上工作。这样我就可以获得特定列的.mean().std()

不应需要 48 小时才能完成。如何加快速度?

【问题讨论】:

  • 如果这就是你的代码,那不是你使用apply的方式。您应该将一个函数传递给parallel_apply,并且该函数将为每一行调用一次。您不是在传递函数,而是在调用函数。它将在正常方法中完成它的工作,然后返回一个数据帧。然后将该数据框传递给parallel_apply。谁知道那会做什么。
  • 但是您的代码一次不会连续工作。您的 adicov 值需要应用于整个数据框。正确的?但如果是这样的话,剩下的代码在做什么呢?也许你应该用文字描述问题。
  • 你怎么知道它是否对那些裸露的excepts 有效?
  • 我知道它正在工作,因为我使用print 和完成百分比监控进度。我通过查看cp_ref 列将数据框分成几部分,并使用它一次提取不止一行的唯一数据。我需要它将函数应用于这些块中的数据帧。

标签: python pandas dataframe function


【解决方案1】:

看起来 meanstd 是这里唯一的计算,所以我猜这是瓶颈。

您可以尝试使用numba 加快速度。

from numba import njit
import numpy as np

@njit(parallel=True)
def numba_mean(x):
    return np.mean(x)

@njit(parallel=True)
def numba_std(x):
    return np.std(x)

cov = numba_std(dataframe['QUANTITY'].values) / numba_mean(dataframe['QUANTITY'].values)

【讨论】:

  • 没有加快速度。它只有 6M 行。这应该不会花很长时间。
猜你喜欢
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 2014-03-05
  • 2018-07-29
相关资源
最近更新 更多