dataframe mit normalverteilten daten erstellen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Hallo zusammen,

ich bin noch relativ neu mit Python. Deshalb bitte ich um Verzeihung wenn ich etwas ungeschickt formulieren sollte (freue mich über Verbesserungsvorschläge).

1) Ich möchte die Header aus einer .csv Datei mit Pandas einlesen
2) Der Umfang des Datenframes (Anzahl Zeilen) soll durch einen Parameter festgelegt werden können)
3) Über die Spalte sollen die Zahlen normalverteilt vorliegen (für alle Spalten); in Spalte 1 sollen z.B. alle Werte um 3 normalverteilt sein; in Spalte 2 z.B. um Wert 6; ...

Könnte mir hier evtl. jemand weiterhelfen?

Vielen Dank!
Benutzeravatar
ThomasL
User
Beiträge: 1377
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Und für 3): numpy.random.normal().
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Hallo zusammen,

ich habe jetzt folgendes gemacht:

Code: Alles auswählen

#csv einlesen
...

#extract header 
header = list(data_frame)

#Anzahl der Zeilen
meas_r  = 20

rndm_vals = list(np.random.randint(5,500, size = len(header))
i = 0

d = {}
for element in header: 
	temp = []
	if i == 0:             # erste Spalte gibt jeweilige Nummer zu Messung an.
		temp = list(range(1, meas_nr +1))
	else:
		temp = list(np.random.normal(rndm_vals[i],1,meas_nr))
	d[element] = temp
	i += 1

df = pd.DataFrame.from_dict(d)
Wie findet ihr das? Freue mich über positive Kritik :)
Sirius3
User
Beiträge: 18221
Registriert: Sonntag 21. Oktober 2012, 17:20

Dataframes haben automatisch einen Index, den von Hand zu generieren ist unnötig.
Ansonsten würde man einfach den ersten Durchlauf der Schleife nicht machen.
meas_r wird gar nicht verwendet, dafür ist meas_nr nicht definiert. Unter anderem aus diesem Grund sollte man keine Abkürzungen benutzen, weil da viel zu schnell Tippfehler passieren und man sich zusätzlich merken muß, wie man denn den Begriff abgekürzt hat.
Statt eines Indexes benutzt man zip um über mehrere Listen gleichzeitig zu iterieren.

Code: Alles auswählen

#extract header 
header = list(data_frame)

#Anzahl der Zeilen
measles_rings = 20

normal_centers = np.random.randint(5,500, size=len(header))
data = {
    header[0]: range(1, measles_rings + 1)
}
for center, element in zip(normal_centers[1:], header[1:]):
    data[element] = np.random.normal(center, 1, measles_rings)

df = pd.DataFrame.from_dict(data)
for-Schleifen werden bei pandas bzw. numpy eigentlich selten wirklich gebraucht, wie auch hier, weil np.random.normal gleich mehrere Verteilungen erzeugen kann. Wenn man dann noch die unnötige erste Spalte wegläßt, kommt man zu:

Code: Alles auswählen

header = list(data_frame)
measles_rings  = 20

normal_centers = np.random.randint(5, 500, size=len(header))
data = np.random.normal(normal_centers, 1, size=(measles_rings, len(normal_centers)))
df = pd.DataFrame(data, columns=headers, index=range(1, len(data) + 1))
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Vielen Dank für deinen Input!

Tatsächlich hatte ich meas_r nachträglich nochmal verändert, weshalb es zu dem Fehler im Code kommt.

Den Index in Spalte 1 hatte ich absichtlich hinzugefügt, da Pandas bei 0 beginnt zu zählen und ich meine Zeile ab 1 beginnend labeln wollte.
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Ok jetzt habe ich doch nochmal eine Frage zu Deinem Code Sirius:

Code: Alles auswählen

data = np.random.normal(normal_centers, 1, size=(measles_rings, len(normal_centers)))
Vgl zu:

Code: Alles auswählen

temp = list(np.random.normal(rndm_vals[i],1,meas_nr))
Gibt es einen Unterschied zwischen Deinen normalverteilten Daten und meiner Variante? Ich loope ja durch die einzelnen Spalten (ich weiß ich hab nur einen Code-Schnipsel eingefügt, der selbst nicht laufen würde), wodurch alle Werte in einer Spalte zueinander normalverteilt sind.

In Deinem Fall lese ich die Liste ein mit den normal_centers und gebe die Länge vor.
Liegen die Daten einer Zeile dann normalverteilt zu den anderen Zeilen vor? Wenn nicht, wie könnte ich das erreichen?
Sirius3
User
Beiträge: 18221
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Zahlen sind nicht zueinander normalverteilt, die Zahlen sind zufällig und unabhängig voneinander.
Nur wenn man viele Zufallszahlen anschaut, dann merkt man, das die Verteilung der Zahlen einer Normalverteilung entspricht.
Die beiden Codes liefern die gleichen Zahlen (aber natürlich nicht die selben).
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Ah ok alles klar. Wie kann ich denn eine Normalverteilung der Zahlen über die Spalten sowie über die Zeilen erreichen? Also, dass die Zeilen zueinander auch normalverteilt sind?
Sirius3
User
Beiträge: 18221
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Frage verstehe ich nicht.
Der Normalverteilung ist es egal, ob Zahlen in Spalten oder Zeilen orientiert sind.
Wenn alle Zahlen der selben Normalverteilung folgen sollen, dann darfst Du für die verschiedenen Spalten nicht unterschiedliche Parameter wählen.
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Entschuldigung ich habe mich wahrscheinlich etwas ungünstig ausgedrückt. Was ich genau meine ist:

1) Die Werte in einer Spalte folgen der Normalverteilung, das ist gut so und auch gewollt. Da sie ja immer den gleichen Sachverhalt darstellen, sollten sie eigentlich gleich sein, aber da wir in keiner idealen Welt leben ist das nicht der Fall.
2) Da der Datensatz zeilenmäßig jeweils eine Messung darstellt (über die Spalten wird ein el. Parameter verändert) möchte ich nun sicherstellen, dass die Zeilen zueinander normalverteilt sind. Es könnte ja sein, dass eine Messung (komplette Zeile) komplett aus dem Ruder läuft und somit in jeder Spalte einen statistischen Ausreißer bildet.

Nach meinem Verständis habe ich ja im Moment eine Normalverteilung über jede Spalte, die jedoch vollkommen unabhängig von den anderen Spalten ist.

Vielen Dank für Ihre Hilfe :)
Sirius3
User
Beiträge: 18221
Registriert: Sonntag 21. Oktober 2012, 17:20

Nochmal: jede Zahl an sich ist unabhängig von allen anderen Zahlen, also sowohl in Spalten als auch Zeilen.

Wenn ich Dich richtig verstehe, hast Du ein ideales Signal f(x) wobei x über die Spalten ändert, und darauf wendest Du eine Messung an, die Werte normalverteilt um diesen idealen Wert abweicht.
Antworten