如何更有效地计算轧制率

时间:2016-05-30 10:43:50

标签: python numpy pandas dataframe iteration

  1. 我的数据长度超过3000。
  2. 下面是制作20天价值的代码(股票市场的成交量)
  3. 花了超过2分钟。
  4. 有什么好方法可以减少运行时间。

    import pandas as pd
    import numpy as np
    from pandas.io.data import DataReader
    import matplotlib.pylab as plt
    data = DataReader('047040.KS','yahoo',start='2010')
      data['vr']=0
      data['Volume Ratio']=0
      data['acend']=0
     data['vr'] = np.sign(data['Close']-data['Open']) 
     data['vr'] = np.where(data['vr']==0,0.5,data['vr']) 
     data['vr'] = np.where(data['vr']<0,0,data['vr']) 
     data['acend'] = np.multiply(data['Volume'],data['vr']) 
    
     for i in range(len(data['Open'])):
         if i<19:
             data['Volume Ratio'][i]=0
         else:
             data['Volume Ratio'][i] = ((sum(data['acend'][i-19:i]))/((sum(data['Volume'][i-19:i])-sum(data['acend'][i-19:i]))))*100
    

1 个答案:

答案 0 :(得分:0)

考虑使用条件行选择和rolling.sum()

data.loc[data.index[:20], 'Volume Ratio'] = 0
data.loc[data.index[20:], 'Volume Ratio'] = (data.loc[:20:, 'acend'].rolling(window=20).sum() / (data.loc[:20:, 'Volume'].rolling(window=20).sum() - data.loc[:20:, 'acend'].rolling(window=20).sum()) * 100

或简化 - .rolling.sum()会为前20个值创建np.nan,因此只需使用.fillna(0)

data['new_col'] = data['acend'].rolling(window=20).sum().div(data['Volume'].rolling(window=20).sum().subtract(data['acend'].rolling(window=20).sum()).mul(100).fillna(0)