/ / Wie zeichnet man ein Zeitintervall-Histogramm mit Pandas? - Pandas

Wie zeichne ich ein Zeitintervall-Histogramm mit Pandas? - Pandas

Was wäre ein effektiver Weg, um ein Histogramm zu erstellen, das für jeden Zeitpunkt T bei einem Datenrahmen von Intervallen ("Startzeit" und "Endzeit") zeigt, wie viele Intervalle "aktiv" sind?

Code zum Generieren eines Beispiel-Datenrahmens (Entschuldigung, ich bin sicher, dass es einen besseren Weg gibt, dies zu tun):

from random import randint

intervals = []

for i in range(50):
start = randint(0,50)
intervals.append({"start":start, "end":start+randint(0,50)})

intervals_df = pd.DataFrame(intervals)

Ein Beispiel:

Für den folgenden Datenrahmen:

import pandas as pd
pd.DataFrame([{"start":2,"end":5},{"start":3,"end":8},{"start":9,"end":10},{"start":4,"end":5}])

Die zusammenpassende Grafik wäre ähnlich:

Bildbeschreibung hier eingeben

Meine Intuition ist, dass die Zeitintervalle irgendwie in diskrete Werte unterteilt werden müssen, um sie zu binden.

Antworten:

3 für die Antwort № 1

Du könntest benutzen apply um dann die Werte für jeden Bereich zu erzeugen melt um die Daten in lange Form umzuwandeln.

In [113]: expanded = df.apply(lambda row: pd.Series(np.arange(row["start"], row["end"] + 1)), axis=1)

In [114]: expanded
Out[114]:
0   1   2   3   4   5
0  2   3   4   5 NaN NaN
1  3   4   5   6   7   8
2  9  10 NaN NaN NaN NaN
3  4   5 NaN NaN NaN NaN

In [115]: expanded = pd.melt(expanded)["value"].dropna()

In [116]: expanded
Out[116]:
0      2
1      3
2      9
3      4
4      3
5      4
6     10
7      5
8      4
9      5
12     5
13     6
17     7
21     8
Name: value, dtype: float64

Von dort aus können Sie die eingebaute Histogrammdarstellung oder eine andere Art von Binning verwenden.

In [117]: expanded.hist()

hist


1 für die Antwort № 2

chrisbs Antwort ist großartig, aber der Grund, warum duhaben eine Lücke zwischen 5 und 6, weil die Standardanzahl der Fächer standardmäßig 10 beträgt. Dies bedeutet, dass die Fächer in Ihrem Fall um 0,8 entfernt sind, sodass der Abstand tatsächlich zwischen 5,2 und 6 liegt.

Um dem entgegenzuwirken, können Sie die Anzahl der Fächer manuell auf die Länge Ihrer Daten einstellen:

nb_bins = int(max(expanded) - min(expanded))
expanded.hist(bins = nb_bins)

Ergebnis: Bildbeschreibung hier eingeben 1