2016-06-20 3 views
0

Ich streame einige Daten von einem API in Bezug auf Benutzer eines SaaS-Widget, und möchte einige Analysen auf "Benutzeraktivität" zu tun, um Effizienzen in dem Prozess zu finden. Ich hoffe auf Fragen wie "Was (Gruppen von Benutzeraktionen führen zum erfolgreichen Abschluss" etc.)Konvertieren von Streaming-Daten in Feature-Tabelle - Analysieren von Streaming-Daten

Derzeit sind die Daten ein zeitgestempeltes Protokoll der Antworten, einschließlich kategorischer Features über den jeweiligen Benutzer, sowie spezifische Aktionen und Antworten für diese bestimmte Interaktionsperiode:

Timestamp User Cat1 Cat2  Action  Response 
timenow  User1 False barbar action1 response4 
time(n-1) User2 False No value action1 response3 
time(n-2) User1 False barbar baraction response2 
time(n-3) User3 True bar  action1 response1 
time(n-4) User2 False foo  action1 response2 
time(n-5) User1 False barbar fooaction response1 

ich zu einer Gruppe von Benutzern die Daten erhalten möchte, und dann alle Aktionen mit Zählungen Liste:

User Cat1 Cat2  Action1 Action2  Response1 Response 2 
User3 True bar  2   1   7   1 
User2 False foo  4   5   8   4 
User1 False barbar 5   2   3   0 

ich kann mich vorstellen, dies zu tun Outwith Pandas, Schleifen verwenden, um ein neues zu erstellen Datenrahmen in dem Format, nach dem ich suche. Ich frage mich jedoch, ob es irgendwelche ordentlichen Wege gibt, dies in Pandas zu tun, oder ob es ein besseres Format (groupbys?) Gibt, das ein ähnliches Ergebnis liefern könnte?

Antwort

1

Ich verstehe Ihre Ausgabe nicht vollständig. Wohin geht die Timestamp-Spalte? Wie wählen Sie Cat1 und Cat2 Werte?

Wie für den Rest Sie get_dummies und groupby verwenden können:

Erstellen des Eingangsdatenrahmen:

import io 
temp = u"""Timestamp User Cat1 Cat2  Action  Response 
timenow  User1 False barbar action1 response4 
time(n-1) User2 False Novalue action1 response3 
time(n-2) User1 False barbar baraction response2 
time(n-3) User3 True bar  action1 response1 
time(n-4) User2 False foo  action1 response2 
time(n-5) User1 False barbar fooaction response1""" 
df = pd.read_csv(io.StringIO(temp),delim_whitespace = True) 

Ausgang:

Timestamp User Cat1 Cat2 Action  Response 
0 timenow  User1 False barbar action1  response4 
1 time(n-1) User2 False Novalue action1  response3 
2 time(n-2) User1 False barbar baraction response2 
3 time(n-3) User3 True bar  action1  response1 
4 time(n-4) User2 False foo  action1  response2 
5 time(n-5) User1 False barbar fooaction response1 

Mit get_dummies Sie erhalten die gewünschten Spalten:

df = df[['User','Action','Response']] 
df = pd.concat([df,df['Action'].str.get_dummies(),df['Response'].str.get_dummies()],axis = 1) 
df.drop(['Action','Response'],1,inplace = True) 


    User action1 baraction fooaction response1 response2 response3 response4 
0 User1 1  0   0   0   0   0   1 
1 User2 1  0   0   0   0   1   0 
2 User1 0  1   0   0   1   0   0 
3 User3 1  0   0   1   0   0   0 
4 User2 1  0   0   0   1   0   0 
5 User1 0  0   1   1   0   0   0 

Und Sie schließlich verwenden groupby:

df.groupby('User',as_index = False).sum() 

    User action1 baraction fooaction response1 response2 response3 response4 
0 User1 1  1   1   1   1   0   1 
1 User2 2  0   0   0   1   1   0 
2 User3 1  0   0   1   0   0   0 
+0

Hallo ysearka - in diesem Fall bin ich zu opfern die Zeitstempel, die Daten in einem anderen Format zu erhalten – TMrtSmith