循环和条件代码的最快方式(Python + 数据帧)



我有以下循环,10 000 次循环需要 9 秒以上。对于我的程序,我必须执行此函数 1000 多次。我需要一些帮助来优化"simu"函数,因为从现在开始,我的代码自持续时间以来无法使用。有关信息,日期范围值仅是示例,但可能彼此非常不同。

主要需要时间:

  • df.itertuples(['DATES'])
  • 即使使用迭代器也循环
  • 如果条件
  • f.index.get_loc具有日期的位置

有人知道如何优化此代码吗?

def simu(nbprod, df, daterange):

    timer = time.time()
    mat = np.zeros((len(df), nbprod))
    iterator = ((i,j) for j in xrange(len(daterange)) for i in df.itertuples(['DATES']))
    for (i,j) in iterator:
        thedate = i[0]
        if (thedate >= daterange[j][0]) and (thedate <= daterange[j][1]):
            mat[df.index.get_loc(i[0])][j] = 1
    print time.time() - timer
    return mat

new_index = pd.date_range(start=pd.datetime(2014,1,1), periods=24*10000, freq='H')
df = pd.DataFrame(np.random.randn(len(new_index)), new_index)
df.index.name = 'DATES'
daterange = [[pd.datetime(2014,1,3), pd.datetime(2014,1,7)], [pd.datetime(2015,6,3), pd.datetime(2017,1,7)], [pd.datetime(2017,1,3), pd.datetime(2020,1,7)]]
### for 1 time
>>> simu(len(daterange), df, daterange)
9.43400001526
### for 3 times more
>>> simu(len(daterange)*3, df, daterange*3)
30.6919999123
>>> simu(len(daterange)*10, df, daterange*10)
92.2009999752

这将返回一个框架,恕我直言,无论如何它更有用(如果你想要底层数据,只是df.values.这将与日期范围的长度成线性比例。

def simu2(df, daterange):
    mat = pd.DataFrame(0,index=df.index,columns=range(len(daterange)))
    for j, (d1,d2) in enumerate(daterange):
        result = df[(df.index>=d1)&(df.index<=d2)]
        mat.loc[result.index,j] = 1
    return mat

In [7]: result1 = simu2(df, daterange)
In [10]: result2 = simu(len(daterange), df, daterange)
5.7844748497
In [11]: (result1.values==result2).all()
Out[11]: True
In [12]: %timeit simu2(df, daterange)
10 loops, best of 3: 162 ms per loop

最新更新