如何使用从其他数据帧计算的值有效填充数据框列

时间:2017-03-04 21:44:09

标签: python pandas dataframe stockquotes

我正在尝试用公司的累积回报和累积市场回报来填充数据框( elist )。这可以通过使用iterrows循环访问elist数据框来完成,请参阅此link。但是,这很慢。

我正在寻找更有效,更快速的解决方案。

作为累积回报计算输入的原始回报来自两个数据帧(ri,rm)。然后应将结果记录在 elist 列中。请参阅下面的示例,使用此file中的数据。

在运行iterrows循环之前, elist 如下所示:

    permno  begdat      enddat   return vwretd
0   11628   2012-03-31  2013-03-31  NaN NaN
1   11628   2012-06-30  2013-06-30  NaN NaN
2   11628   2012-09-30  2013-09-30  NaN NaN
3   11628   2012-12-31  2013-12-31  NaN NaN
4   11628   2013-03-31  2014-03-31  NaN NaN

运行循环后, elist 应如下所示:

    permno   begdat     enddat      return      vwretd
0   11628   2012-03-31  2013-03-31  0.212355    0.133429
1   11628   2012-06-30  2013-06-30  0.274788    0.198380
2   11628   2012-09-30  2013-09-30  0.243590    0.198079
3   11628   2012-12-31  2013-12-31  0.299277    0.304479
4   11628   2013-03-31  2014-03-31  0.303147    0.208454

这是依赖于iterrows的代码,这很慢:

import os,sys
import pandas as pd
import numpy as np
rm     = pd.read_csv('rm_so.csv') # market return
ri     = pd.read_csv('ri_so.csv') # firm return
elist  = pd.read_csv('elist_so.csv') # table to be filled with cumlative returns over a period (begdat to enddat)
for index, row in elist.iterrows():
    #fill cumulative market return
    elist.loc[index, 'vwretd']=rm.loc[(rm['date']>row['begdat']) & (rm['date']<=row['enddat']),'vwretd'].product()-1    
    #fill cumulative firm return
    r = ri.loc[(ri['permno']==row['permno']),]
    elist.loc[index, 'return'] = r.loc[(r['date']>row['begdat']) & (r['date']<=row['enddat']),'ret'].product()-1

很高兴看到这个过程运行得更快!

0 个答案:

没有答案