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:
Meine Intuition ist, dass die Zeitintervalle irgendwie in diskrete Werte unterteilt werden müssen, um sie zu binden.
Antworten:
3 für die Antwort № 1Du 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()
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: 1