2
$\begingroup$

I am trying to calculate Slope for the rolling window of 5 and 20 periods and append it to the existing data frame. The length of the total dataset would be let's say 30 days. I have two columns "Volume" and "Vpt", I have tried sklearn (linregress) and numpy (polyfit) but in both the scenario, I am getting an error message "IndexError: iloc cannot enlarge its target object". Please see below code and help to resolve this issue.

for j in range(len(temp)):
   x = np.array(temp['Volume'][j:j+5])
   y = np.array(temp['vpt'][j:j+5])
   slope = np.polyfit(x,y,1)
   # slope, intercept, r_value, p_value, std_err = linregress(x, y)
   temp['slope_5'].iloc[j+5] = slope[0]
   a = np.array(temp['Volume'][j:j+20])
   b = np.array(temp['vpt'][j:j+20])
   slope_1 = np.polyfit(a,b,1)
   # slope, intercept, r_value, p_value, std_err = linregress(a, b)
   temp['slope_20'].iloc[j+20] = slope_1[0]
$\endgroup$

2 Answers 2

2
$\begingroup$

Actually, I found an answer to my question above.

def np_slope(data):
    return np.polyfit(np.arange(data.shape[0]),data.values,1)[0]
 
temp.index = temp['Volume']
temp['slope_5'] = temp['vpt'].rolling(5,min_periods=5).apply(np_slope,raw=False)        
temp['slope_20']= temp['vpt'].rolling(20,min_periods=20).apply(np_slope,raw=False)        
$\endgroup$
0
$\begingroup$

this is a similar solution, but using scipy.stats.linregress

from scipy.stats import linregress

def slope(data):
    return linregress(np.arange(data.shape[0]),data).slope

temp.index = temp['Volume']
temp['slope_5'] = temp['vpt'].rolling(5,min_periods=5).apply(slope,raw=True)        
temp['slope_20']= temp['vpt'].rolling(20,min_periods=20).apply(slope,raw=True)        

as per pandas apply documentation, i'm passing raw=True in order to pass a numpy array, which can improve performance, specially on reduction functions

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.