Seite 2 von 3

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 11:51
von __blackjack__
@fox1203: Warum wird bei `writer()` als zweites Argument `sys.stdout` übergeben? Das macht so gar keinen Sinn.

Verwendest Du etwa noch Python 2? Dann solltest Du *jetzt* auf Python 3 wechseln, denn 2 wird nicht mehr supported.

Ansonsten: Wie stellst Du denn fest das da Leerzeilen sind? In CSV-Dateien werden Datensätze mit "\r\n" abgeschlossen statt nur mit "\n". Es kann also auch sein, dass Dir das Programm das Du zum ansehen der Datei verwendest einen Streich spielt.

Edit: Ups, beim `open()` fehlt das ``newline=""``-Argument wenn das Python 3 ist.

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 12:02
von fox1203
So nun Schritt für Schritt.

Mit dem Code @sirius3 komme ich auf die gleichen Ergebnisse leider, der sieht aber für mich als LAIE cooler aus als meiner, darum habe ich ihn übernommen. Habe nun alle Dateien auf eine Cloud gepackt, hoffe Ihr seht den Link nachstehend:

[url]https://veruspraedium-my.sharepoint.com ... 1nHbzd[url]

@blackjack: Ich verwende Python 3.8, installiert auf Windows 10 über die python.org Seite. Zu den Leerzeichen: Da habe ich die CSV Datei mit Microsoft Excel 365 geöffnet und in der jeweiligen Zeile nachgesehen, kann durchaus sein, dass Excel da etwas ausblendet...


Könnt Ihr die von mir freigegebenen Daten einsehen?

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 12:09
von __blackjack__
@fox1203: Wie gesagt, das `sys.stdout` beim `writer()`-Aufruf gehört da nicht hin, und die Dateien die mit dem CSV-Modul verwendet werden brauchen ``newline=""`` als zusätzliches Argument, sonst passiert mindestens unter Windows das was Du da siehst.

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 12:11
von fox1203
Die beiden txt files bezeichnet mit imput_ sind dann für das exe Programm erforderlich.

Iteriert sollen in weiterer folge am Beispiel der Datei Input_manuell.txt:
1. Wert von 0,8 bis 4,5 in 0,05 Schritten
2. Wert von 50 bis 950 in 10 Schritten

Was bedeutet:
1. Wert 0,8; 2. Wert 50
1. Wert 0,8; 2. Wert 60
1. Wert 0,8; 2. Wert 70
usw. bis
1. Wert 0,8; 2. Wert 950

Dannach:
1. Wert 0,85; 2. Wert 50
usw.

Im 2. txt File Input_iteration befinden sich dann auch noch Werte die entsprechend gleichzeitig zu iterieren sind. In Summe sollen dabei wie gesagt ca. 250.000 Iterationsläufe durchfahren werden. Nach jeder Anpassung der Input Werte natürlich das Exe File starten und die Werte mit dem bereits in Entwicklung befindlichen Code in das CSV, samt den Input Werten, schreiben.

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 12:19
von fox1203
perfekt, danke Blackjack, habe den Code wie folgt geändert, nun schreibt er in jede Zeile! Top!

Code: Alles auswählen

import csv
import sys






all_lines = []
for filename in ["input_manuell.txt", "input_iteration.txt", "data.txt"]:
    with open(filename) as lines:
        all_lines.extend(lines)

with open("gesamt.txt", "w") as output:
    output.writelines(all_lines)

stripped_lines =  [line.strip() for line in all_lines if line.strip()]
with open("gesamt.csv", "a", newline='') as csv_gesamt:
    writer = csv.writer(csv_gesamt, delimiter='\t')
    writer.writerow(stripped_lines)

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 13:46
von fox1203
So, nun arbeite ich an der Iteration der Input Wert, wobei ich zunächst mal die Ergebnisse nur als Print() darstellen möchte, um zu sehen ob die Funktionen auch das tun was sie sollen. Zunächst habe ich 3 Parameter festgelegt und folgendes Skript erstellt:

Code: Alles auswählen

#Input Werte für exe Programm und input_manuell.txt
i1 = 0.8 #Startwert für Durchmesser
i11 = 4.5 #Stoppwert für Durchmesser
d1 = 0.05 #Iterationsschritte Durchmesser

i2 = 80 #Startwert für Zementgehalt
i22 = 950 #Stoppwert für Zementgehalt
d2 = 10 #Iterationsschritte Zementgehalt

i3 = 1 #Startwert fiktiver Wert
i33 = 10 #Stoppwert fiktiver Wert
d3 = 1 # Iterationsschritte fiktiver Wert



durchmesser = i1-d1
zementgehalt = i2-d2


while durchmesser < i11:
    durchmesser = round(durchmesser + d1,2)
    zementgehalt = i2
    iteration = i3
    print(durchmesser, '\t', zementgehalt, '\t', iteration)

Dannach habe ich noch die Funktion range() entdeckt, welche ja genau das abbildet, was ich mühsam mit je drei Variablen getan habe.

Meine Frage, wenn ich zB folgende Formeln definiere:
durchmesser = range(0.8,4.5,0.05)
zementgehalt = range(80,950,10)
fiktiv = range(1,10,1)
Ist es möglich diese Variablen mit Unter-, Obergrenze und Schrittweite in einfacher Art und Weise miteinander kombinieren zu lassen, sowie die Zwischenergebnisse als print() zur Kontrolle darstellen zu lassen? Hat da jemand Erfahrungen damit??

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 15:10
von fox1203
Die Funktion range() arbeitet nur mit Ganzzahlen, habe jedoch eine Möglichkeit gefunden diese mit Gleitkommazahlen zu nutzen Code siehe untenstehend:

Code: Alles auswählen

def f_range(von=0, bis=None, schritt=1):
    if bis is None:
        von, bis = 0, von
    f = von
    if schritt > 0:
        while f < bis:
            yield(f)
            f += schritt
    else:
        while f > bis:
            yield(f)
            f += schritt

for x in f_range(0.8,4.5,0.05):
    print(round(x,2))
Falls dies wer auch noch brauchen kann....

Die Frage besteht jedoch, ob wer eine einfache Art und Weise hat wie man mehreren range() Funktionen Parametersets ausrechnen lassen kann??

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 15:13
von Sirius3
Welche Art von Kombination hast Du Dir denn vorgestellt?
`range` funktioniert nur mit ganzen Zahlenwerten. Für floats gibt es numpy.arange oder gleich numpy.linspace.

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 15:40
von fox1203
Im Grunde genommen wie schon oben beschrieben:

Iteriert sollen in weiterer folge am Beispiel der Datei Input_manuell.txt:
1. Wert von 0,8 bis 4,5 in 0,05 Schritten
2. Wert von 50 bis 950 in 10 Schritten

Was bedeutet:
1. Wert 0,8; 2. Wert 50
1. Wert 0,8; 2. Wert 60
1. Wert 0,8; 2. Wert 70
usw. bis
1. Wert 0,8; 2. Wert 950

Dannach:
1. Wert 0,85; 2. Wert 50
usw.

Ich bin auf das Modul "itertools" gestoßen, das scheint zumindest das zu tun was ich im Grunde möchte und zwar eine Permutation.

Habe dafür folgenden Code erstellt:

Code: Alles auswählen

import itertools


def f_range(von=0, bis=None, schritt=1):
    if bis is None:
        von, bis = 0, von
    f = von
    if schritt > 0:
        while f < bis:
            yield(f)
            f += schritt
    else:
        while f > bis:
            yield(f)
            f += schritt


#Input Werte für exe Programm und input_manuell.txt
i1 = 0.8 #Startwert für Durchmesser
i11 = 4.5 #Stoppwert für Durchmesser
d1 = 0.05 #Iterationsschritte Durchmesser

i2 = 80 #Startwert für Zementgehalt
i22 = 950 #Stoppwert für Zementgehalt
d2 = 10 #Iterationsschritte Zementgehalt

i3 = 1000 #Startwert fiktiver Wert
i33 = 1010 #Stoppwert fiktiver Wert
d3 = 1 # Iterationsschritte fiktiver Wert


#Erstellung von Listen entsprechend den Iterationswerten
durchmesser = list(f_range(i1,i11,d1))
print(durchmesser)
zementgehalt = list(f_range(i2,i22,d2))
print(zementgehalt)

#Probeplott zur Darstellung der Permutation
print(list(itertools.permutations([1,2,3,4],2)))
print("Test1")

#Test für den Plot meiner Daten
print(list(itertools.permutations([f_range(i1,i11,d1)],2)))
print("erledigt")

iteration = itertools.permutations([durchmesser], [zementgehalt])


Also die Art und Weise dieser Funktion passt schon mal, er kann auch Listen bearbeiten wenn diese in einer [] stehen. Jedoch scheint die Funktion es nicht zu schaffen eine Formel als Liste zu erkennen.

Noch dazu sollte ja nach jedem Wertepaar das Exe File starten und die Ergebnisse daraus ins CSV fließen, das ist noch unklar ob ich das mit der Funktion itertools schaffe, oder ob ich da ein neues TXT file erstellen muss mit all den Wertepaaren, auf dieses könnte ich dann später nochmal zugreifen wenn es darum geht die Input Werte für meine exe Datei zu schreiben...

Fragen über Fragen....

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 15:50
von fox1203
Also die Permutation Funktion erkennt auf alle Fälle die range() Funktion s. am Beispiel Code:

Code: Alles auswählen

#Probeplott zur Darstellung der Permutation
print(list(itertools.permutations(range(1,10,1),2)))
print("Test2")
Natürlich muss man da noch import itertools hinzufügen.

Die mit der selbst gebastelten Funktion kann itertools offensichtlich nichts anfangen, any ideas how to solve that??

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 17:22
von __blackjack__
@fox1203: Die selbstgebastelte `f_range()` hat ein grosses Problem mit der Ungenauigkeit von Gleitkommazahlen. Du addierst da die Schrittweite immer wieder, was aber bei Werten die nicht exakt als Gleitkommazahl dargestellt werden können unerwartete/ungewünschte Folgen hat.

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 17:33
von fox1203
@Blackjack: OK verstehe, habe auch etwas weiter im Forum nachgesehen und bin da auf einen Artikel gestoßen, wo du für ein Würfelproblem ein Script erstellt hast.

viewtopic.php?f=1&t=45665

Sofern ich das richtig interpretiere ist der Anwendungsfall ähnlich bei mir. Ich habe Hausnummer 8 verschiedene Parameter, welche jeweils einen Wertebereich sowie eine Schrittweite haben.

1. Parameter (von/bis/Schrittweite)
2. Parameter (von/bis/Schrittweite)
usw.

Ermitteln möchte ich sämtliche Permutationen in folgenden Format:
1. Parameter, 2. Parameter, 3. Parameter, 4. Parameter, … 8. Parameter
Diese Reihenfolge ist mir wichtig

Das Modul itertools.permutations scheint auf die Reihenfolge Parameter 1 bis 8 keine Rücksicht zu nehmen. Finde ich in dem Code des anderen Topic da ansatzweise eine Lösung, oder ist dies auch ein Holzweg?

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 18:38
von Sirius3
Wie kommst Du drauf, das permutations keine Rücksicht nimmt?

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 19:43
von fox1203
Sirius3 hat geschrieben: Donnerstag 26. März 2020, 18:38 Wie kommst Du drauf, das permutations keine Rücksicht nimmt?
habe mehrere Varianten ausprobiert und da kein klares Muster entdeckt, daher die Vermutung. Auch ist es mir noch nicht gelungen wie oben beschrieben mehrere Parameter mit Werte Liste zu kombinieren. Bislang habe ich es nur geschafft einen Parameter in sich zu kombinieren, soll heissen Parameter 1 mit Parameter 1, je nachdem wie die Zahl x nach f_range(),x definiert ist. Das ist allerdings nicht das was ich wollte.

Code: Alles auswählen

import itertools


def f_range(von=0, bis=None, schritt=1):
    if bis is None:
        von, bis = 0, von
    f = von
    if schritt > 0:
        while f < bis:
            yield(f)
            f += schritt
    else:
        while f > bis:
            yield(f)
            f += schritt


#Input Werte für exe Programm und input_manuell.txt
i1 = 0.8 #Startwert für Durchmesser
i11 = 4.5 #Stoppwert für Durchmesser
d1 = 0.05 #Iterationsschritte Durchmesser

i2 = 80 #Startwert für Zementgehalt
i22 = 950 #Stoppwert für Zementgehalt
d2 = 10 #Iterationsschritte Zementgehalt

i3 = 1000 #Startwert fiktiver Wert
i33 = 1010 #Stoppwert fiktiver Wert
d3 = 1 # Iterationsschritte fiktiver Wert


#Erstellung von Listen entsprechend den Iterationswerten
durchmesser = list(f_range(i1,i11,d1))
print(durchmesser)
zementgehalt = list(f_range(i2,i22,d2))
print(zementgehalt)
print("Test0000000000000")

#Probeplott zur Darstellung der Permutation
print(list(itertools.permutations([1,2,3,4],4)))
print("Test11111111111")


#Probeplott zur Darstellung der Permutation
print(list(itertools.permutations(range(1,11),3)))
print("Test2222222222")


#Probeplott zur Darstellung der Permutation
print(list(itertools.permutations(f_range(i1,i11,d1),1)))
print("Test3333333333333")


#Probeplott zur Darstellung der Permutation
#print(list(itertools.permutations(zementgehalt)))
#print("Test444444444444444")
Any ideas how to solve?

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 19:53
von Sirius3
Wenn Du eine Kombination von drei Listen willst, dann ist permutations auch falsch, `product` dagegen richtig:

Code: Alles auswählen

import itertools
import numpy as np

#Input Werte für exe Programm und input_manuell.txt
durchmesser = np.arange(0.8, 4.5, 0.05)
zementgehalt = np.arange(80, 950, 10)
fiktiver_wert = np.arange(1000,1010)

print(list(itertools.product(durchmesser, zementgehalt, fiktiver_wert)))

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 20:10
von fox1203
Sirius3 hat geschrieben: Donnerstag 26. März 2020, 19:53 Wenn Du eine Kombination von drei Listen willst, dann ist permutations auch falsch, `product` dagegen richtig:

Code: Alles auswählen

import itertools
import numpy as np

#Input Werte für exe Programm und input_manuell.txt
durchmesser = np.arange(0.8, 4.5, 0.05)
zementgehalt = np.arange(80, 950, 10)
fiktiver_wert = np.arange(1000,1010)

print(list(itertools.product(durchmesser, zementgehalt, fiktiver_wert)))

Genial, bist der Beste! Ich bedanke mich mit den Worten "Ich bedanke mich"!!

Genau das was ich gesucht habe!! Musste nur noch numpy installieren!! Ab zum nächsten step!

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 21:42
von fox1203
Habe den Code nun so optimiert, sodass ich gleich eine Ausgabe in ein CSV File bekomme. Die Werte sind nun wie folgt im CSV vorhanden:

(Parameter1, Parameter2, Parameter3,...) --> inkl. der Klammern!
(Parameter1, Parameter2, Parameter3,...)
(Parameter1, Parameter2, Parameter3,...)
(Parameter1, Parameter2, Parameter3,...)
...

und davon jede Menge, siehe Code:

Code: Alles auswählen

import itertools
import numpy as np
import csv


#Input Werte für exe Programm und input_manuell.txt
#1. Wert = Start; 2. Wert ist Stopp; 3. Wert = Schrittweite
#beim 3. Wert immer ein Intervall mehr als gewünscht eingeben
durchmesser = np.arange(0.8, 4.55, 0.05)
zementgehalt = np.arange(80, 960, 10)
temperatur = np.arange(5,41,1)


#Übergabe der Messwertpaare in CSV
parameter_iteration = itertools.product(durchmesser, zementgehalt, temperatur)
with open ("parameter_iteration.csv", "w") as csv_parameter:
    writer = csv.writer(csv_parameter, delimiter='\n')
    writer.writerow(parameter_iteration)

#Kontrolle der Messpaare
parameter_iteration = itertools.product(durchmesser, zementgehalt, temperatur)
print(list(parameter_iteration))

Das macht ja auch Sinn, diese Parameter gesondert durchzuführen, in ein CSV zu packen und erst später darauf zuzugreifen, da es ja lange dauert bis numpy durch ist.


Nun wäre der nächste Schritt das CSV (Parameter_iteration.csv) einzulesen und die Werte je Zeile in die Input.txt files zu schreiben, damit anschließend die exe Datei die Berechnung durchführen kann. Das Schwierige an der Sache ist nun einerseits, dass der Code bei der ersten Zeile anfängt und nach exe Rechenvorgang die zweite Zeile verwendet usw, sowie dem Code zu sagen welcher Parameter in der Klammer (Parameter1, Parameter2, Parameter3,...) in welches TXT Input file an welcher Stelle (zB Zementgehalt ist an 2. Stelle des Input_manuell.txt).

Habt ihr da eine Idee wie man das Ganze angehen könnte??

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 21:50
von Sirius3
Es ist unsinnig, eine einfach zu erzeugende Folge in eine Datei zu schreiben, um sie danach wieder in andere Dateien zu schreiben.
Du benutzt auch csv-Writer völlig falsch. Du hast einen Iterator über Tuple, die Du in EINE Zeile der csv-Datei schreibst, mit dem selbtsamen Spaltentrenner \n. Jedes Spalteelement ist wiederum die Stringrepräsentation eines Tuples, das nicht für die Speicherung vorgesehen ist, sondern nur zu Debugging-Zwecke. Das ist alles sowas von verquer.

Also, wenn Du die Parameter in eine Datei schreiben willst (was ja wie schon gesagt unsinnig ist), dann macht man das so:

Code: Alles auswählen

with open ("parameter_iteration.csv", "w") as parameter_file:
    writer = csv.writer(parameter_file, delimiter=',')
    writer.writerows(parameter_iteration)

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 22:02
von fox1203
Sirius3 hat geschrieben: Donnerstag 26. März 2020, 21:50 Es ist unsinnig, eine einfach zu erzeugende Folge in eine Datei zu schreiben, um sie danach wieder in andere Dateien zu schreiben.
Du benutzt auch csv-Writer völlig falsch. Du hast einen Iterator über Tuple, die Du in EINE Zeile der csv-Datei schreibst, mit dem selbtsamen Spaltentrenner \n. Jedes Spalteelement ist wiederum die Stringrepräsentation eines Tuples, das nicht für die Speicherung vorgesehen ist, sondern nur zu Debugging-Zwecke. Das ist alles sowas von verquer.

Also, wenn Du die Parameter in eine Datei schreiben willst (was ja wie schon gesagt unsinnig ist), dann macht man das so:

Code: Alles auswählen

with open ("parameter_iteration.csv", "w") as parameter_file:
    writer = csv.writer(parameter_file, delimiter=',')
    writer.writerows(parameter_iteration)

Ich prüfe gerne nach, was der Code gerade macht. Mit dem Code zuvor bekomme ich eine CSV Datei, wo jeder Parameterset in einer eigenen Zeile steht. Da kann ich dann, zugegeben etwas umständlich, die Daten in Zeilen umformen, die Klammer durch suchen/ersetzen entfernen und nachdem ich eine Kopfzeile eingefügt habe, die Daten auch filtern, sodass ich mir die Parametersets für die Durchmesser von zB 1,2 ansehen kann.

Mit dem Code von dir erhalte ich einen Datenhaufen, den ich mit meinen bescheidenen Excel Kenntnisse nicht bearbeiten kann, daher diese Vorgangsweise. Hatte auch zuvor als Trennung delimiter ',' drinnen exact wie du.


Aber Back to the Topic, gibt's da eine Möglichkeit, zu meiner obigen Frage??

Re: Das Ding des Jahres

Verfasst: Donnerstag 26. März 2020, 22:32
von Sirius3
Wenn Du mit Excel arbeitest, mußt Du halt die richtigen Einstellungen nehmen, statt später da was tumzueditiieren. Hederzeilen kann man da auch schreiben. Oder gleich mit openpyxl eine Excel-Datei schreiben.
Zur Frage oben: man schreibt einfach das, was man will in eine Datei.