builtins.TypeError: int() argument must be a string, a bytes-like object or a number, not 'zip'

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fabi15@
User
Beiträge: 2
Registriert: Donnerstag 13. Mai 2021, 13:35

Hallo liebes Forum,

vorab: Ich bin neu hier und entschuldige mich, falls ich etwaige Gepflogenheiten übersehen sollte. Ich habe ein wenig Programmiererfahrung in C# und in Matlab. In Python versuche ich mich allerdings erst noch einzuarbeiten. Ich beschäftige mich derzeit mit Portfolio-Optimierung und bin auf einen theoretisch fertigen Code gestoßen, den ich sehr interessant finde http://dspace.library.uu.nl/handle/1874/345758.
Ich glaube, mit dem könnte man ganz gut weiter herumspielen :)
Da der Verfasser eine CSV-Datei übergibt, wollte ich stattdessen erstmal per Hand Daten mitgeben. Soweit so gut. Dabei muss ich etwas Grundlegendes übersehen haben:

Ich benutze Python 3.8.8. und meine "main" sieht stattdessen einfach so aus:

Code: Alles auswählen

 def main():
   import numpy as np
   import CLA

   covar = np.array([ [0.000246, 0.000084, 0.000122, 0.000142], [0.000084, 0.000219, 0.000085, 0.000092], [0.000122, 0.000085, 0.000221, 0.000176], [0.000142, 0.000092, 0.000176, 0.000333] ])
   mean = np.array([[0.3612, 0.1626, 0.1554, 0.2959]]).T
   lB = np.array([[0,0,0,0]]).T
   uB = np.array([[1,1,1,1]]).T
   
   #3) Invoke object
   cla=CLA.CLA(mean,covar,lB,uB)
   cla.solve()
...
Von den Dimensionen her wurde im Text geschrieben, dass "mean, lB und uB" Vektoren (4x1)-Vektoren sein sollen und "covar" eine (4x4)-Matrix.
Jetzt kommt aber folgender Fehler:

Traceback (most recent call last):
File "C:/Users/rodef/Desktop/code/bache.py", line 50, in <module>
main()
File "C:/Users/rodef/Desktop/code/bache.py", line 34, in <module>
cla.solve()
File "C:\Users\rodef\Desktop\code\CLA.py", line 18, in solve
f,w=self.initAlgo()
File "C:\Users\rodef\Desktop\code\CLA.py", line 80, in initAlgo
a[:]=zip(range(self.mean.shape[0]),b) # fill structured array
builtins.TypeError: int() argument must be a string, a bytes-like object or a number, not 'zip'

Wenn ich das weiter verfolge, dann sieht die nun problematische Funktion so aus:

Code: Alles auswählen

def initAlgo(self):
   # Initialize the algo
   #1) Form structured array
     a=np.zeros((self.mean.shape[0]),dtype=[('id',int),('mu',float)])
     b=[self.mean[i][0] for i in range(self.mean.shape[0])] # dump array into list
    a[:]=zip(range(self.mean.shape[0]),b) # fill structured array
     #2) Sort structured array
     b=np.sort(a,order='mu')
     #3) First free weight
     i,w=b.shape[0],np.copy(self.lB)
     while sum(w)<1:
        i-=1
        w[b[i][0]]=self.uB[b[i][0]]
        w[b[i][0]]+=1-sum(w)
     return [b[i][0]],w  
Soweit ich das sehe, werden die beiden Arrays einfach nur zusammengefügt. Das einzige was ich geändert habe, waren die Inputparamter. Habe ich einen Dimensionsfehler kreiert, sodass er "a" nicht sauber füllen kann?

Viele Grüße und Danka im Voraus
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist eine Änderung bedingt durch Python 3. Um das zip muss noch ein list, etwa so: list(zip(…))
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das list macht eine eh schon ziemlich verworrene Funktion nur noch verworrener.
Es wird erst ein Structured-Array mit 0en erzeugt, die dann mit aufsteigenden Zahlen und mean gefüllt werden, um danach nach mean zu sortieren, wobei das sortierte mean gar nicht gebraucht wird, sondern nur die Indizes, die man viel einfacher per argsort bekommen könnte.

Code: Alles auswählen

    def initAlgo(self):
        indices = np.argsort(self.mean[:, 0])
        w = self.lB.copy()
        for i in reversed(indices):
            if w.sum() >= 1:
                break
            w[i] = self.uB[i]
        w[i] += 1 - w.sum()
        return [i], w
fabi15@
User
Beiträge: 2
Registriert: Donnerstag 13. Mai 2021, 13:35

Zuerst einmal ein Danke. Ich bin beeindruckt von den schnellen Antworten. Es scheint beides zu funktionieren. Letzlich muss ich aber noch ein, zwei Baustellen beheben, um es mit Gewissheit sagen zu können. Der Tipp mit den Fehlern bedingt durch Änderungen von Python 3 scheint auch gut zu sein. Mit ein wenig Recherche komme ich gut voran. Allerdings bastel ich nun an einem anderem Punkt herum. Ist es üblich, einen neuen Diskussionschat aufzumachen oder hier weiterzuarbeiten?

Ich bin einfach mal so frei und mache hier weiter: Mit dem "linspace" ist er nicht zufrieden. Da möchte er anscheind einen Integeger statt eines Floats. Aber in einer Numpy-Datei würde ich ungern mein Unwesen treiben... Ideen um das zu umgehen?

Code: Alles auswählen

def efFrontier(self,points):
    
     mu,sigma,weights=[],[],[]
     a=np.linspace(0,1,points/len(self.w))[:-1] # remove the 1, to avoid duplications
     b=range(len(self.w)-1)
     for i in b:
        w0,w1=self.w[i],self.w[i+1]
        if i==b[-1]:a=np.linspace(0,1,points/len(self.w)) # include the 1 in the last iteration
        for j in a:
           w=w1*j+(1-j)*w0
           weights.append(np.copy(w))
           mu.append(np.dot(w.T,self.mean)[0,0])
           sigma.append(np.dot(np.dot(w.T,self.covar),w)[0,0]**.5)
 
     return mu,sigma,weight 
 
Fehlercode:

File "C:...CLA.py", line 295, in efFrontier
a=np.linspace(0,1,points/len(self.w))[:-1] # remove the 1, to avoid duplications
File "<__array_function__ internals>", line 5, in linspace
File "C:...\anaconda3.8\Lib\site-packages\numpy\core\function_base.py", line 120, in linspace
num = operator.index(num)
builtins.TypeError: 'float' object cannot be interpreted as an integer
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Zwischen Python2 und Python3 hat sich der /-Operator geändert. Du mußt statt dessen // verwenden.
Antworten