Python:Pandas:加速应用函数

Posted

技术标签:

【中文标题】Python:Pandas:加速应用函数【英文标题】:Python: Pandas: Speeding up an Apply Function 【发布时间】:2014-07-29 17:17:15 【问题描述】:

我正在尝试在 33 MB 数据帧(CSV 格式)上执行 pandas 应用功能,但速度非常慢。我正在尝试找出原因。我正在对更大的数据帧(16 GB)进行申请,并在大约 6 小时内完成。这个函数在一个小得多的数据帧上运行,我让它运行了 1.5 小时,仍然没有。

我试图找出瓶颈可能在哪里。我的怀疑是,因为我使用的是 ping 雅虎或谷歌金融的数据阅读器功能,这可能是它慢得多的原因。但是,当我用它为几只股票做样本时,它似乎是瞬间完成的。

有人对此有任何想法吗?或者有什么方法让它更快?我已经考虑过对它进行 cythoning,但如果瓶颈是 ping 时间不会加快速度。或者更好的是有没有办法将它矢量化? (我看不到方法,但有些人比我聪明得多 :) )这是很多问题,但基本上我只是在寻找建议以使其运行得更快。谢谢!

PS- 如果有人知道如何在应用功能上添加进度条,那将是一个很好的额外奖励:) 再次感谢!

data4=pd.read_csv('check2.csv', parse_dates=['dater1','dater2'], infer_datetime_format=True)

def nextweekday(date):
    day=date.weekday()
    if day==4:
        return date+datetime.timedelta(days=3)
    if day==5:
        return date+datetime.timedelta(days=2)
    else:
        return date+datetime.timedelta(days=1)

def getquote(tick,date,plus):
    date=date+datetime.timedelta(days=plus)
    nextday=nextweekday(date)
    try:
        return DataReader(tick, "yahoo",date, nextday)["Close"]
    except:
        return "NO"

def apply_days5(row):
    return getquote(row['AcquirorTickerSymbol'],row['dater2'],5)

data4['days5']=data4.apply(apply_days5, axis=1)

【问题讨论】:

【参考方案1】:

我不是 100% 确定您要完成什么,但有一些想法。

首先,像这样反复点击雅虎会增加很多不必要的开销。我可能会做这样的事情,将所有股票数据读入一个数据框。

In [83]: tickers = data4['AcquirorTickerSymbol'].unique()

In [84]: min_date = data4['dater2'].min()
    ...: max_date = data4['dater2'].max()
    ...:     
    ...: dfs = []
    ...: for ticker in tickers:
    ...:     df = DataReader(ticker, 'yahoo', min_date, max_date)[['Close']]
    ...:     df['AcquirorTickerSymbol'] = ticker
    ...:     df['dater2'] = df.index
    ...:     dfs.append(df)

In [85]: stock_df = pd.concat(dfs, ignore_index=True)

然后,您可以将现有数据与股票 df 合并,而不是使用 apply,如下所示:

In [92]: data4 = data4.merge(stock_df, how='left')

如果您想填充缺失值,而不是在应用中使用自定义逻辑,使用fillna 会快得多

In [94]: data4['Close'] = data4['Close'].fillna('NO')

【讨论】:

已接受答案。抱歉耽搁了(出城了)。我希望有更好的东西,但我认为你是对的,这是最好的方法。感谢您的回复。

以上是关于Python:Pandas:加速应用函数的主要内容,如果未能解决你的问题,请参考以下文章

Python3快速入门(十五)——Pandas数据处理

如果列值不为 NULL,则 Python pandas 应用函数

python pandas:将带有参数的函数应用于系列

将函数应用于pandas Python中的每一行时出现数据转换错误

python pandas-将带有两个参数的函数应用于列

应用自定义 groupby 聚合函数在 pandas python 中输出二进制结果