Python:熊猫:加快应用功能

时间:2014-07-29 17:17:15

标签: python pandas vectorization apply datareader

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

我想弄清楚瓶颈在哪里。我怀疑是因为我使用的是datareader功能,它可能会使雅虎或谷歌财务变得更加缓慢。但是,当我为一些股票做一个样品时,它似乎很快。

有没有人对此有任何想法?或者让它更快的方法?我考虑过cython,但如果瓶颈是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 个答案:

答案 0 :(得分: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')