【发布时间】: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。谁知道那会做什么。 -
但是您的代码一次不会连续工作。您的
adi和cov值需要应用于整个数据框。正确的?但如果是这样的话,剩下的代码在做什么呢?也许你应该用文字描述问题。 -
你怎么知道它是否对那些裸露的
excepts 有效? -
我知道它正在工作,因为我使用
print和完成百分比监控进度。我通过查看cp_ref列将数据框分成几部分,并使用它一次提取不止一行的唯一数据。我需要它将函数应用于这些块中的数据帧。
标签: python pandas dataframe function