Как рассчитать уклон в NumPy - PullRequest
       4

Как рассчитать уклон в NumPy

7 голосов
/ 08 сентября 2011

Если у меня есть массив из 50 элементов, как бы я рассчитал наклон 3 периода и наклон 5 периода?Документы не добавляют много .....

>>> from scipy import stats
>>> import numpy as np
>>> x = np.random.random(10)
>>> y = np.random.random(10)
>>> slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)

Будет ли это работать?

def slope(x, n): 
   if i<len(x)-n: 
        slope = stats.linregress(x[i:i+n],y[i:i+n])[0]
        return slope 

, но массивы будут одинаковой длины

@ joe:::

xx = [2.0 ,4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30]
x  = np.asarray(xx, np.float)
s  = np.diff(x[::3])/3

window  = [1, 0, 0, 0,  -1]
window2 = [1, 0,  -1]
slope   = np.convolve(x, window, mode='same') / (len(window) - 1)
slope2  = np.convolve(x, window2, mode='same') / (len(window2) - 1)

print x
print s

print slope
print slope2

Результаты .....

[  2.   4.   6.   8.  10.  12.  14.  16.  18.  20.  22.  24.  26.  28.  30.]
[ 2.  2.  2.  2.]
[ 1.5  2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.  -6.  -6.5]
[  2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2. -14.]

Наклон и наклон2 - это то, что Im после, кроме -6, -6.5 и -14 не результаты, которые я ищуза.

это сработало .......

window    = [1, 0, 0, -1]
slope     = np.convolve(xx, window, mode='valid') / float(len(window) - 1)
padlength = len(window) -1
slope     = np.hstack([np.ones(padlength), slope])
print slope

Ответы [ 2 ]

7 голосов
/ 08 сентября 2011

Я предполагаю, что вы имеете в виду наклон, рассчитанный для каждого 3-го и 5-го элемента, чтобы у вас была серия (точных, не наименьших квадратов) наклонов?

Если это так, вы просто что-то делаетев соответствии с:

third_period_slope = np.diff(y[::3]) / np.diff(x[::3])
fifth_period_slope = np.diff(y[::5]) / np.diff(x[::5])

Я, вероятно, совершенно не понимаю, что вы имеете в виду, хотя.Я никогда раньше не употреблял термин «3 периода наклона» ...

Если вы хотите больше вычислений "движущегося окна" (чтобы у вас было столько же элементов ввода, сколько и элементов вывода), простосмоделируйте это как свертку с окном [-1, 0, 1] или [-1, 0, 0, 0, 1].

Например,

window = [-1, 0, 1]
slope = np.convolve(y, window, mode='same') / np.convolve(x, window, mode='same')
3 голосов
/ 08 сентября 2011

Просто используйте подмножество данных, которые содержат точки (периоды - я предполагаю, что вы говорите о финансовых данных здесь), которые вас интересуют:

for i in range(len(x)):
    if i<len(x)-3:
        slope, intercept, r_value, p_value, std_err = stats.linregress(x[i:i+3],y[i:i+3])
    if i<len(x)-5:
        slope, intercept, r_value, p_value, std_err = stats.linregress(x[i:i+5],y[i:i+5])

(Это не 't самый эффективный подход, кстати, если все, что вам нужно, это склоны, но это просто.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...