【问题标题】:Improving pandas performance with apply method使用 apply 方法提高 pandas 的性能
【发布时间】:2017-08-24 09:12:48
【问题描述】:

我正在使用 pandas 进行高性能计算,下面的函数给出 1 个循环,最好的 5 个:每个循环 7.24 秒 50,000 行。

我必须将其扩展到 100 万行。

如何向量化函数并应用于所有行。这样可以提高整体性能?

def weightedFlowAmt(startDate,endDate,tradeDate,tradeAmt):
  startInDays = datetime.strptime(startDate, "%Y-%m-%d")
  endInDays = datetime.strptime(endDate, "%Y-%m-%d")
  tradeInDays = datetime.strptime(tradeDate, "%Y-%m-%d")
  differenceTradeAndEnd=abs((endInDays - tradeInDays).days)
  differenceStartAndEnd=abs((endInDays - startInDays).days)
  weighted_FlowAmt = (tradeAmt * differenceTradeAndEnd)/differenceStartAndEnd

mutatedCashFlow['flow'] = mutatedCashFlow.apply(lambda row:
        weightedFlowAmt(row['startDate'], row['EndDate'], row['tradeDate'],
                        row['tradeAmount']),
    axis=1)

【问题讨论】:

    标签: python pandas numpy scikit-learn


    【解决方案1】:

    我认为您可以删除 apply 并使用矢量化函数:

    mutatedCashFlow['startDate'] = pd.to_datetime(mutatedCashFlow['startDate'])
    mutatedCashFlow['EndDate'] = pd.to_datetime(mutatedCashFlow['EndDate'])
    mutatedCashFlow['tradeDate'] = pd.to_datetime(mutatedCashFlow['tradeDate'])
    
    diffTradeAndEnd=((mutatedCashFlow['EndDate']-mutatedCashFlow['tradeDate']).dt.days).abs()
    diffStartAndEnd=((mutatedCashFlow['EndDate']-mutatedCashFlow['startDate']).dt.days).abs()
    
    mutatedCashFlow['flow'] = (mutatedCashFlow['tradeAmount']*diffTradeAndEnd)/diffStartAndEnd
    

    替代方案:

    mutatedCashFlow['startDate'] = pd.to_datetime(mutatedCashFlow['startDate'])
    mutatedCashFlow['EndDate'] = pd.to_datetime(mutatedCashFlow['EndDate'])
    mutatedCashFlow['tradeDate'] = pd.to_datetime(mutatedCashFlow['tradeDate'])
    
    diffTradeAndEnd=mutatedCashFlow['EndDate'].sub(mutatedCashFlow['tradeDate']).dt.days.abs()
    diffStartAndEnd=mutatedCashFlow['EndDate'].sub(mutatedCashFlow['startDate']).dt.days.abs()
    
    mutatedCashFlow['flow'] = mutatedCashFlow['tradeAmount'].mul(diffTradeAndEnd)
                                                            .div(diffStartAndEnd)
    print (mutatedCashFlow)
    

    【讨论】:

    • 这完全正确。希望 OP 下次可以自己做,只需一步一步。当第一步是在表格中的每个单元格上调用 strptime() 时,对于像 to_datetime 这样的矢量化函数来说,这很容易获胜。除了需要知道名称to_datetime 和魔术.dt 访问器之外,整个事情几乎是一个微不足道的转换,然后才能执行.days
    • 秒,但tradeAmt 是什么?
    • @jezrael 它是从 DataFrame 传递的(lambda row: weightedFlowAmt(row['startDate'], row['EndDate'], row['tradeDate'], row['tradeAmount']),
    • @jezrael 你是 MVP 人,f*****g 地狱这是现在的消息 1 个循环,最好的 5 个:每个循环 930 µs跨度>
    • 哇,真的太棒了。谢谢。
    猜你喜欢
    • 2021-08-12
    • 1970-01-01
    • 2019-09-08
    • 2022-11-14
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多