Python:Pandas:加速应用函数

Python:Pandas:加速应用函数,python,pandas,vectorization,apply,datareader,Python,Pandas,Vectorization,Apply,Datareader,我正在尝试在一个33MB的数据帧(CSV格式)上执行pandas apply函数,但速度非常慢。我正在试着找出原因。我在一个更大的数据帧(16GB)上做了一个应用程序,大约用了6个小时就完成了。这个函数在一个小得多的数据帧上运行,我让它运行了1.5个小时,但仍然一无所获 我正试图找出瓶颈在哪里。我的怀疑是,因为我正在使用datareader函数ping yahoo或GoogleFinance,这可能是它速度如此之慢的原因。但当我用它做一些股票的样本时,它似乎是瞬间的 有人对此有什么想法吗?或者如

我正在尝试在一个33MB的数据帧(CSV格式)上执行pandas apply函数,但速度非常慢。我正在试着找出原因。我在一个更大的数据帧(16GB)上做了一个应用程序,大约用了6个小时就完成了。这个函数在一个小得多的数据帧上运行,我让它运行了1.5个小时,但仍然一无所获

我正试图找出瓶颈在哪里。我的怀疑是,因为我正在使用datareader函数ping yahoo或GoogleFinance,这可能是它速度如此之慢的原因。但当我用它做一些股票的样本时,它似乎是瞬间的

有人对此有什么想法吗?或者如何让它更快?我已经考虑过了,但是如果瓶颈是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)

我不是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')

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