我有一个产品,其中包含产品经过的步骤 即数据结构如下: 产品ID,订单ID,新值,旧值,编辑日期。
我希望通过我们的系统转换产品的时间差和累计时间(以天为单位)。即总循环时间和步骤间循环时间。
我编写了以下代码,该代码运行良好,但仍然很慢。我希望有人可以提供更快的解决方案,因为目前需要数小时来处理具有4亿个流程步骤的YTD数据集。
def f(df):
df['diff'] = (df['Edit Date'].diff())/ np.timedelta64(1, 'D')
df['sum'] = df['diff'].cumsum()
print len(df)
return df
if __name__ == '__main__':
df = pd.read_csv('May 2017.csv')
df['Edit Date'] = pd.to_datetime(df['Edit Date'], format='%m/%d/%Y')
df.sort_values(by=['Order ID','Edit Date',] ,kind = 'mergesort', ascending=[1,1], inplace=True)
df= df.groupby(['Order ID'])
timediffference = df.apply(f)
这给了我我想要的东西,但它在大型数据集上变慢,在缓慢的月份通常超过2000万行。想知道是否有办法在每个订单组步骤的整个日期列中更快地执行此操作,而不是尝试使用apply。我尝试使用多核,但发现死路一条。
答案 0 :(得分:0)
使用apply时,Groupby非常慢。您应该使用groupby对象实现的函数,即:
df['diff'] = df.groupby('Order ID')['Edit Date'].diff() / np.timedelta64(1, 'D')
df['sum'] = df.groupby('Order ID')['diff'].cumsum()
修改: 如果这还不够,您还可以在整个数据集上应用差异,而不是在每个组的第一行。这也应该比以前的方法更快。
idx_wo_first = df.index.difference(df.groupby('Order ID').head(1).index)
df.loc[idx_wo_first, 'diff'] = df['Edit Date'].diff().loc[idx_wo_first] / np.timedelta64(1, 'D')
df['sum'] = df.groupby('Order ID')['diff'].cumsum()