2016-05-30 2 views
-1
  1. я есть длина данных составляет более 3000.
  2. ниже код для создания 20days значение (Volume Ration на фондовом рынке)
  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 
    
+0

пожалуйста подумайте над редактированием названия: сделайте его более конкретным для yo ур проблема. –

+0

Можете ли вы добавить [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve)? – jezrael

ответ

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() создаст np.nan за первые 20 значений, так просто использовать .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)