Seite 1 von 1

Paneldaten

Verfasst: Sonntag 24. Januar 2021, 13:27
von st_baum
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?

Re: Paneldaten

Verfasst: Montag 25. Januar 2021, 13:46
von st_baum
Falls mein Ansatz zum plotten der XS oder der Manipulation der Werte einzelner XS völlig falsch ist, freue ich mich über entsprechende Hinweise

Re: Paneldaten

Verfasst: Dienstag 26. Januar 2021, 18:45
von Bl3nder
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()