Paneldaten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Ich habe einen Pandas DF, der Paneldaten beinhaltet.

Code: Alles auswählen

import pandas as pd
d = {'id': ['A','A','A','B','B','B' ], 'value': [2,1,6,6,3,2], 
     'time':['2020-12-01T08:00:0','2020-12-01T09:00:0','2020-12-03T08:00:0',
            '2020-12-02T10:00:0','2020-12-03T12:00:0','2020-12-03T12:00:0']}
df = pd.DataFrame(data=d)
df.time = pd.to_datetime(df.time)
df['day'] = df['time'].dt.date
df = df.set_index(['id','time'])
'id' sollen die cross-sections sein, 'time' die Zeit. Ist der Datensatz mit dem o.a. Code richtig "formatiert"?
Nun möchte ich gerne beide cross-sections plotten:

Code: Alles auswählen

plt.plot(df.xs('A', level = 0))
plt.plot(df.xs('B', level = 0))
Der Output ist unbrauchbar. Erzeuge ich df['day'] nicht, sieht der Output gut aus. Wo ist hier der Haken?

Außerdem möchte ich eine neue Variable 'value_demeaned' hinzufügen. Je cross-section soll der Mean bestimmt werden und von 'value' subtrahiert werden.

Code: Alles auswählen

mean_A = df.xs('A', level = 0).mean()
df[df['id'] == 'A']
Allerdings funktioniert der Filter nicht mehr. Was ist das Problem?
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Falls mein Ansatz zum plotten der XS oder der Manipulation der Werte einzelner XS völlig falsch ist, freue ich mich über entsprechende Hinweise
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Hey ich versuche dir mal zu helfen,

Ich verstehe leider garnicht was du genau machen möchstest deswegen kann es sein das wir aneinander vorbeireden....


Code: Alles auswählen

df['day'] = df['time'].dt.date
# hiermit erstellst du eine neue Spalte / Column in deinem Datenframe die deinen Zeitstempel ohne Uhrzeit beinhaltet soweit ok


Das Problem tritt jedoch dann beim Ausgeben auf vill wird es klar wenn du dir mal anguckst was du ploten möchstest:

Code: Alles auswählen

print(df.xs("A"))
Ausgabe:

Code: Alles auswählen

                     value         day
time                                  
2020-12-01 08:00:00      2  2020-12-01
2020-12-01 09:00:00      1  2020-12-01
2020-12-03 08:00:00      6  2020-12-03
Hier ist deine neu erstellte Spalte mit drinne da du lediglich über den Index auf die row / Reihe zugreift und dort wird logischerweise dann alles genommen deswegen könnte Ich mir vorstellen das dein Plot komisch aussieht


Um das zu Testen kannst du mal dein Plot verändern in dem du 1 der Beispiel benutzt :

Hast du sowas gemeint ???

Code: Alles auswählen

plt.plot(df.xs('A').iloc[:,0])
plt.plot(df.xs('B').iloc[:,0])

plt.plot(df.xs('A').loc[:,"value"])
plt.plot(df.xs('B').loc[:,"value"])

bzw 

plt.plot(df.xs('A')["value"])
plt.plot(df.xs('B')["value"])




Nun weiter :
mean_A = df.xs('A', level = 0).mean()
df[df['id'] == 'A']
Hier ist nun genaus das gleiche Problem du willst sicher nur den Mittelwert deiner Values Spalte

Code: Alles auswählen

mean_of_a = df.xs('A')["value"].mean()
Eine Vision ohne Aktion bleibe eine Illusion
Antworten