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!
dataframe mit normalverteilten daten erstellen
Schon mal hier vorbei geschaut?
https://pandas.pydata.org/pandas-docs/s ... d_csv.html
https://pandas.pydata.org/pandas-docs/s ... d_csv.html
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
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
-
- User
- Beiträge: 510
- Registriert: Mittwoch 13. November 2019, 08:38
Und für 3): numpy.random.normal().
-
- User
- Beiträge: 20
- Registriert: Mittwoch 3. Februar 2021, 21:18
Hallo zusammen,
ich habe jetzt folgendes gemacht:
Wie findet ihr das? Freue mich über positive Kritik 
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)

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.
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:
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)
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))
-
- 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.
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.
-
- User
- Beiträge: 20
- Registriert: Mittwoch 3. Februar 2021, 21:18
Ok jetzt habe ich doch nochmal eine Frage zu Deinem Code Sirius:
Vgl zu:
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?
Code: Alles auswählen
data = np.random.normal(normal_centers, 1, size=(measles_rings, len(normal_centers)))
Code: Alles auswählen
temp = list(np.random.normal(rndm_vals[i],1,meas_nr))
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?
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).
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).
-
- 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?
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.
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.
-
- 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
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

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.
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.