variables in variable explorer in Spyder

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Tudee92
User
Beiträge: 4
Registriert: Sonntag 21. Oktober 2018, 23:45

Code: Alles auswählen

import numpy as np
import pandas as pd

def absmatdata(a,b,c,d,material,tmp_ref):
    material_map = {2.016: 'H2', 28.016: 'N2', 32.000: 'O2', 32.065: 'S',
                    18.016: 'H2O', 64.065: 'SO2', 12.001: 'C Graphite', 
                    28.011: 'CO', 44.011: 'CO2', 16.043: 'CH4', 30.070: 'C2H6',
                    44.097: 'C3H8', 58.124: 'C4H10'}
    if material in material_map:
        df = pd.read_excel('F:\MAschinenbau\Bachelorarbeit\ABSMAT.xlsx',sheet_name=material_map[material])        
    else:
        print('No data for this material available')
        df = [list(np.arange(0,1100,100)),list(np.arange(0,11,1)),list(np.arange(0,11,1)),list(np.arange(0,11,1)),list(np.arange(0,11,1))]
    return df
Tmp = df[:,0]
Cpm = df[:,1]
Hm = df[:,2]
Smp = df[:,3]
Smv = df[:,4]
TN = np.size(df)
Tmp0 = tmp_ref
Tmpx = a
Cpmx = 0
Hmx = b
Smpx = c
Smvx = d
Wenn ich diese Funktion aufrufe mit df=absmatdata(1,2,3,4,32.065,100) dann sehe ich zwar df in variable explorer aber keine andere variables, die ich in Funktion definiert habe...z.B. Tmp, Cpm, Hm....usw.
Weiß jemand woran es liegt und wie ich das verbessern kann ?
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tudee92: Tmp, Cpm, Hm, usw. hast Du in keiner Funktion definiert. Die stehen das auf Modulebene. Was sie nebenbei bemerkt nicht sollten, denn auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Sonst wird es sehr schnell sehr unübersichtlich und man macht viel leichter Fehler, die dann viel schwerer zu finden/lokalisieren sind.

Da wir nicht wissen was Du *tatsächlich* für Code hast, kann man da nicht viel sagen, denn der Code den Du zeigst, der wird mit einem `NameError` bei der Definition von `Tmp` enden, denn `df` wird nicht definiert. Womit beim gezeigten Code auch klar wird warum keiner der Namen danach definiert ist, denn soweit kommt der Programmablauf gar nicht.

Gleitkommazahlen als Schlüssel in einem Wörterbuch kann man machen, aber das ist mit Vorsicht zu geniessen. Da darf man dann nur literale Gleitkommazahlen (direkt oder indirekt) für den Zugriff verwenden, wenn man sicher gehen will, das der Wert dazu auch gefunden wird, und man aus einer Berechnung nicht einen ganz geringfügig anderen Wert bekommt, wegen der Rechenungenauigkeiten bei Gleitkommazahlen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Tudee92
User
Beiträge: 4
Registriert: Sonntag 21. Oktober 2018, 23:45

@_blackjack_ Danke erst mal.
Also du meinst ich darf keine neue variables wie z.B. Tmp, Cpm,...usw innerhalb der Function absmata definieren ?
Der Code ist nur der Anfang und die variables wie z.B. Tmp, Cpm,...usw. brauche ich später für die Berechnung und viele von den variablen sind von df abhängig.
Hast du einen besseren Vorschlag wie ich den Code schreiben soll ? Im MATLAB ging das eigentlich so.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tudee92: Du definierst Tmp, Cpm, usw. ja gar nicht innerhalb der Funktion `absmata()`. Das steht ja nach der Funktionsdefinition auf Modulebene. Dort ist aber `df` nicht definiert. Dafür müsste man die Funktion aufrufen und den Rückgabewert an den Namen `df` binden bevor man die Variablen definiert die vom Wert von `df` abhängen.

Einen besseren Vorschlag habe ich konkret nicht weil mir nicht klar ist was Du da eigentlich machen willst. Kann es sein das die Funktion da eigentlich gar nicht `df` zurückgeben soll, sondern die Werte die Du davon abhängen und die Du an die einzelnen Namen binden möchtest? Vielleicht würde es dann auch Sinn machen ein Objekt mit entsprechenden Attributen zurück zu geben, statt vieler Einzelwerte in einem Tupel. `collections.namedtuple()` wäre dann vielleicht einen Blick wert, oder man schreibt eine eigene Klasse.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Tudee92
User
Beiträge: 4
Registriert: Sonntag 21. Oktober 2018, 23:45

@_blackjack_ danke noch mal
Also der ursprüngliche MATLB Funktion ist function [Tmpx, Cpmx, Hmx, Smpx, Smvx] = ABSMATDATA(a, b, c, d, Material, TmpRef). Ich versuche diese MATLAB funktion in python zu schreiben.
Wie du siehst, die Funktion soll Tmpx, Cpmx, Hmx, Smpx, Smvx ausgeben und nun df ist ein variable wo die Daten aus der Exceldatei gespeichert sind und aus diesen Daten soll die Tmpx, Cpmx, Hmx.....berechnet und am Ende ausgegeben werden. Tmpx, Cpmx...sind auch keine Einzelwerte sondern auch ein 2x38 Array.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

du stellst dir vermutlich sowas vor

Code: Alles auswählen

import numpy as np
import pandas as pd

def absmatdata(a, b, c, d, material, tmp_ref):
    material_map = {2.016: 'H2', 28.016: 'N2', 32.000: 'O2', 32.065: 'S',
                    18.016: 'H2O', 64.065: 'SO2', 12.001: 'C Graphite', 
                    28.011: 'CO', 44.011: 'CO2', 16.043: 'CH4', 30.070: 'C2H6',
                    44.097: 'C3H8', 58.124: 'C4H10'}
    if material in material_map:
        df = pd.read_excel('F:\MAschinenbau\Bachelorarbeit\ABSMAT.xlsx', sheet_name=material_map[material])    #  überprüfe den Pfadnamen
        Tmpx, Cpmx, Hmx, Smpx, Smvx = df['Spalte1'], df['Spalte2'], df['Spalte3'], df['Spalte4'], df['Spalte5']
    else:
        print('No data for this material available')
        Tmpx, Cpmx, Hmx, Smpx, Smvx = np.arange(0,1100,100), np.arange(0,11,1), np.arange(0,11,1), np.arange(0,11,1), np.arange(0,11,1)
    return Tmpx, Cpmx, Hmx, Smpx, Smvx

Tmpx, Cpmx, Hmx, Smpx, Smvx = absmatdata(1, 2, 3, 4, 132.065, 100)

print(Tmpx)
print(Cpmx)
print(Hmx)
print(Smpx)
print(Smvx)
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
Antworten