2016-07-08 10 views
1

Verwenden Sie den folgenden Datenrahmen als ein Beispiel, das unterschiedliche Richtungen für einen Börsentag angibt. Was sind die pythonischsten Ansätze zur Erfassung von Statistiken, die zeigen, welcher Tag am wahrscheinlichsten jeden Tag folgt?Wahrscheinlichkeit des nächsten Tages als spezifische Werte mit Python Pandas

In diesem Beispiel haben wir einfache Tagestypen wie 'Down', 'Up' und 'Flat'.

rng = pd.DataFrame({'day_direction':['Down', 'Down', 'Up', 'Down', 'Up', 'Up', 'Flat', 'Down', 'Down', 'Down', 'Up', 'Up', 'Up','Down',]}, 
         index = pd.date_range('4/2/2014', periods=14, freq='D')) 
rng 

Wunsch Ausgabe wird in etwa so aussehen:

day_direction  Next_day 

    Down   Down 60% 
        Up 15% 
        Flat 35% 

    Up   Up 55% 
        Flat 15% 
        Down 30% 

    Flat   Flat 20% 
        Down 20% 
        Up 60% 

Könnte dies mit einem groupby oder ähnlichem erreicht werden? Wäre toll, mögliche Lösungen dafür zu sehen.

Antwort

1

Ja, es ist möglich. Zuerst können Sie eine zweite Spalte erstellen, die für jeden Tag enthält, was am nächsten Tag geschieht (und natürlich fallen Sie die letzte Zeile):

rng['day2'] = rng['day_direction'].shift(-1) 
rng = rng.iloc[:-1] 

      day_direction day2 
2014-04-02 Down   Down 
2014-04-03 Down   Up 
2014-04-04 Up    Down 
2014-04-05 Down   Up 
2014-04-06 Up    Up 
2014-04-07 Up    Flat 
2014-04-08 Flat   Down 
2014-04-09 Down   Down 
2014-04-10 Down   Down 
2014-04-11 Down   Up 
2014-04-12 Up    Up 
2014-04-13 Up    Up 
2014-04-14 Up    Down 

Dann nutzen Sie groupby auf zwei Säulen:

output = rng.groupby(['day_direction','day2']).size() 

day_direction day2 
Down   Down 3 
       Up  3 
Flat   Down 1 
Up    Down 2 
       Flat 1 
       Up  3 

Beachten Sie, dass Sie es später neu skalieren müssen, um die Wahrscheinlichkeit zu erhalten.

EDIT: andere Verfahren, die den neu skalierten Ausgang geht:

rng['day2'] = rng['day_direction'].shift(-1) 
rng = rng.iloc[:-1] 
rng['N'] = 1 
output = rng.groupby(['day_direction','day2'],as_index = False).sum() 
for direction in ['Down','Flat','Up']: 
    output.ix[output.day_direction == direction,'N'] /= output[output.day_direction == direction].N.sum() 
output.set_index(['day_direction','day2'],inplace = True) 
output['N'] = [str(int(100*w))+'%' for w in output.values] 



         N 
day_direction day2  
Down   Down 50% 
       Up  50% 
Flat   Down 100% 
Up    Down 33% 
       Flat 16% 
       Up  50% 

EDIT: Diese zweite Methode als Funktion:

def my_function(data, col_name, list_values): 
    """ 
    Inputs: - Your dataframe 
      - The name of the column containing the values to predict on, as a string 
      - The list of the possible values 
    """ 
    data = data[[col_name]] 
    data['day2'] = data[col_name].shift(-1) 
    data.dropna(inplace=True) 
    data['N'] = 1 
    output = data.groupby([col_name,'day2'],as_index = False).agg({'N':np.sum}) 
    for direction in list_values: 
     output.ix[output[col_name] == direction,'N'] /= output[output[col_name] == direction].N.sum() 
    output.set_index([col_name,'day2'],inplace=True) 
    output['N'] = [str(int(100*w))+'%' for w in output.values] 
    return output 
+0

Das sieht sehr gut dank ysearka. Ich bekomme jedoch einen 'KeyError: 'N'' mit der zweiten Lösung. – ade1e

+0

Mein Fehler, ich habe den ersten Teil dieses Codes vergessen. Die Idee ist, eine andere Spalte von rng mit der Bezeichnung "N" zu summieren, anstatt "size" zu verwenden, um den Index zu behalten. Ich habe meine Antwort bearbeitet. – ysearka

+0

Danke ysearka das ist sehr netter Code. Gibt es eine Chance, dass Sie dies in eine Funktion stellen können, damit es für andere Daten verwendet werden kann? Markierung als akzeptiert, wäre aber toll, um die Funktion zu sehen. – ade1e

Verwandte Themen