2017-07-03 2 views
1

Ich bin auf der Suche nach einer Möglichkeit, die beiden maximalen Höhen in einem rollenden Rahmen zu finden und die Steigung zu extrapolieren ein mögliches drittes Hoch zu berechnen.Pandas finden zwei rollende Max-Höhen und berechnen Steigung

Ich habe einige Probleme mit diesem :) a) wie eine zweite Hoch zu finden? b) wie kann man die Position der beiden Höhen kennen (für eine einfache Steigung: Steigung = (MaxHigh2-MaxHigh1)/(PosMaxHigh2-PosMaxHigh1))?

Ich könnte natürlich so etwas tun. aber ich arbeite nur, wenn high1> high2 :) und ich würde nicht die Höhen der gleichen Reichweite haben.

import quandl 
import pandas as pd 
import numpy as np 
import sys 


df = quandl.get("WIKI/GOOGL") 
df = df.ix[:10, ['High', 'Close' ]] 

df['MAX_HIGH_3P'] = df['High'].rolling(window=3,center=False).max() 
df['MAX_HIGH_5P'] = df['High'].rolling(window=5,center=False).max() 

df['SLOPE'] = (df['MAX_HIGH_5P']-df['MAX_HIGH_3P'])/(5-3) 

print(df.head(20).to_string()) 
+0

"Zwei maximale Höhen" scheint sehr schlecht gestellt. Sie müssen definieren, was es in Ihrem Kontext ist, weil dies keinen allgemeinen Sinn ergibt. –

+0

@ B.M. Es tut uns leid. Ich brauche die höchste und die zweithöchste :) – Ele

Antwort

1

Sorry für ein bisschen chaotisch Lösung aber ich hoffen, dass es hilft:

ersten definiere ich eine Funktion, die numpy Array als Eingabe, überprüft, ob mindestens 2 Elemente nicht Null, und berechnet dann Neigung (nach Ihrer Formel - glaube ich), sieht wie folgt aus:

def calc_slope(input_list): 
    if sum(~np.isnan(x) for x in input_list) < 2: 
     return np.NaN 
    temp_list = input_list[:] 
    max_value = np.nanmax(temp_list) 
    max_index = np.where(input_list == max_value)[0][0] 
    temp_list = np.delete(temp_list, max_index) 
    second_max = np.nanmax(temp_list) 
    second_max_index = np.where(input_list == second_max)[0][0] 
    return (max_value - second_max)/(1.0*max_index-second_max_index) 

in Variable df ich dieses:

enter image description here

Und Sie müssen nur gelten, was auch immer Sie es vorziehen, in Beispiel Rollfenster angewendet auf „Hoch“:

df['High'].rolling(window=5, min_periods=2, center=False).apply(lambda x: calc_slope(x)) 

Endergebnis sieht wie folgt aus:

enter image description here

Sie können auch Speichern Sie es in einer anderen Spalte, wenn Sie möchten:

df['High_slope'] = df['High'].rolling(window=5, min_periods=2, center=False).apply(lambda x: calc_slope(x)) 

Ist es das, was Sie wollten?

+0

genau was ich brauchte. Nein, ich brauche etwas Zeit, um zu verstehen, was du getan hast !! Vielen Dank! E. – Ele

Verwandte Themen