[Python] Hilo general

Kaiserlau

Lógicamente te sale siempre el True de amigo xq ya lo has declarado arriba antes del while, por lo tanto siempre entrara en ese if, el ejercicio es sencillo.

Por cierto para los incrementales se usa x+=1 y nunca como lo tenéis puesto.

#299 pero no le hagas los deberes xDDD lol

1 respuesta
Che931

#301 Puedes pegarme un tiro por mi empanamiento... :(

Por cierto tengo una duda con un test que escribí en una cosa que estoy haciendo porque no sé si es correcto o existe otra forma. Pego un código de ejemplo que resume lo que hacía aunque advierto que es esquelético y lo he hecho lo más simple que se me ha ocurrido:

#example.py

class A(object):
    def __init__(self):
        #self.blabla... 

    def doSomething(self):
       #Mucho código a continuación....

class B(object):
    def __init__(self):
        self.attr = 0
        self.a = A()

    def doSomething(self, value):
        self.attr = value
        self.a.doSomething()

class TestB(unittest.TestCase):

    @mock.patch("example.A.doSomething")
    def test_something(self, mockA):
        b = B()
        b.doSomething(20)

        self.assertTrue(b.attr, 20)

Básicamente quería probar que la funcionalidad de B.doSomething era la correcta pero sin que realizara la llamada A.doSomething porque no era relevante lo que hacía y sobre todo tiene su propio test.

Lo único que se me ocurrió fue la solución del código que he pegado pero no sé hasta que punto es correcto porque no encontré nada.

1 respuesta
Kaiserlau

#302 No he usado unittest y menos mock pero creo q lo estas haciendo bien, basicamente quieres probar B sin tener que por el camino testear o cargar la A original no? asi q la simulas.

De todas formas date cuenta q si cambias en el mock.patch el A por B va a seguir funcionando bien, no le veo mucho sentido del todo. Podrias hacer algo asi (ojo q npi de si es lo correcto) estoy juguando con ello ahora xD

[ simA.py ]

#Simulacion de A
class A(object):
    def __init__(self):
        self.lmao = "lmao"

    def doSomething(self):
       return " ayyy "+self.lmao

[ fileB.py ]

class B(object):
    def __init__(self):
        self.attr = 0
        self.a = A()

    def doSomething(self, value):
        self.attr = value
        return self.a.doSomething

[test.py]

import unittest
from unittest.mock import patch

class TestB(unittest.TestCase):
    @patch("simA.A")
    @patch("fileB.B")
    def test_something(self, mockA,mockB):
        A = mockA
        b = mockB()
        b.doSomething(20)
        self.assertTrue(b.attr, 20)

if __name__ == '__main__':
    unittest.main()


No se si es lo q buscas en concreto, Simulo A y lo cargo con mock.patch asi no carga el objeto original y solo testeas B conservando la estructura.

:ninjaedit:
De todas formas no consigo sacar el ayy lmao xD cambiando alguna cosilla. No entiendo muy bien como va jeje

pd: como pones el coloreo con el md de mv? lol si le meto python no me funciona ;(

1 respuesta
B

Hola chicos. Estoy aprendiendo Python desde hace solo unos meses y me encuentro haciendo un pequeño trabajo de visualización de datos para mi github.

El dataframe con el que estoy jugando es de pokemon y quiero definirme una función que me permita, dada una generación de pokemon, encontrar cual es el pokemon legendario más fuerte perteneciente a esa generación. Esto es lo que tengo definido

def most_powerful_legendary(i):
	total = 0 
	poke=""
    	for row in legendary_pokemon:
        	if row["Generation"] == i:
            		if row["Total"] >= total:
				total = row["Total"]
				poke=row["name"]
	return poke

El problema es que al ejecutar la función me salta el siguiente error: TypeError: string indices must be integers

He probado a cambiar los indices para que sean númericos tal que así:

def most_powerful_legendary(i):
	total = 0 
	poke=""
    	for row in legendary_pokemon:
        	if row[11] == i:
            		if row[4] >= total:
				total = row[4]
				poke=row[1]
	return poke

Pero entonces me da este error: IndexError: string index out of range, lo cual lo veo absurdo porque las columnas que quiero usar están en esos índices.

Alguien me puede indicar que es lo que estoy haciendo mal?

2 respuestas
MartiONE

#304 Puedes copiar un par de lines de esa variable "legendary pokemon"? Es una array o un diccionario?

Aparte del scope de la función, la cual deberias pasarle la variable como parámetro.

1 respuesta
B

#305 Es un dataframe de pandas.

[code]#	Name	Type 1	Type 2	Total	HP	Attack	Defense	Sp. Atk	Sp. Def	Speed	Generation	Legendary

156 144 Articuno Ice Flying 580 90 85 100 95 125 85 1 True
157 145 Zapdos Electric Flying 580 90 90 85 125 90 100 1 True
158 146 Moltres Fire Flying 580 90 100 90 125 85 90 1 True
162 150 Mewtwo Psychic NaN 680 106 110 90 154 90 130 1 True
163 150 MewtwoMega Mewtwo X Psychic Fighting 780 106 190 100 154 100 130 1 True[/code]

No entiendo muy bien a que te refieres con lo del scope

1 respuesta
MartiONE

#306

def most_powerful_legendary(i, legendary_pokemon):
    total = 0 
    poke=""
        for x, row in legendary_pokemon.iterrows():
            if row["Generation"] == i:
                    if row["Total"] >= total:
                total = row["Total"]
                poke=row["name"]
    return poke

Creo que esto es lo que quieres, extraer la información necesaria cada "row" y comprobarla.

Con el scope me refiero a, como dentro de la función sabe que variable es legendary_pokemon? Es una variable global?

1
B

Si legendary_pokemon está definida como variable global

Ya he conseguido que me funcione a la perfección haciendo un pequeño cambio en tu código, muchas gracias :)

Lo que no entiendo es por que usas un x, row en el for

1 respuesta
MartiONE

#308

Intentaré explicarlo lo más sencillo que pueda, cada vez que recorres linea por linea, el contenido se desempaqueta tal que x es el número de linea y row es el contenido. Pasa algo igual con los diccionarios. Por ejemplo:

dicti = {"a": 1, "b": 2, "c": 3}

Con el diccionario de arriba, si lo recorremos tal que:

for x, y in dicti.items():
   print(x, y)

el .items() extrae tanto clave como valor del diccionario y los asigna a x (la clave) y a y (el valor), por lo que imprimiria:

a 1
b 2
c 3

PD: Por conveniencia, y convención, las variables globales son completamente en mayúsculas :)

1
Che931

#303 Si usas ```python ``` te debería salir el texto con colorines.

Básicamente mi idea era esa ya que no quería ejecutar un método pero como estoy muy verde en temas de testing por eso preguntaba. Ejemplos de crear un mock a un método para que devuelva un valor determinado hay millones pero lo que buscaba ni rastro. El test pasa y todo pero no me genera una gran confianza xd

También te digo que el ejemplo que puse no es que fuera muy bueno la verdad. Entre eso y la pregunta, te debí dar un buen dolor de cabeza la verdad...

1 respuesta
Kaiserlau

#310 la proxima probare el md en condiciones xD

En cuando al unittest y por lo que estuve toqueteando mola mucho pero es super extenso ese modulo, es para echarle unos buenos dias. Lo que te pase si funciona xq si q carga "A" y testea B correctamente. Ahora q npi como se hace en proyectos grandes para diseccionar y probar de manera "correcta".

Si hay alguien q lo domine, ejemplos pls.

HeXaN

Durante el día de hoy está disponible de forma gratuita el libro titulado Python 201. Disponible en PDF y formatos para libros electrónicos.

https://leanpub.com/python201/c/201free

5 1 respuesta
Aibehn

#312 Mirar en la misma página el catálogo, porque hay varios más gratis.

PD. Gracias!

ciza

A ver si a alguien le ha pasado alguna vez:

Estoy haciendo una optimizacion con scipy.optimize.minimize y si ejecuto mi código desde consola todo funciona perfectamente pero si en cambio lo hago desde ipython con run archivo.py:

  • La primera vez funciona correctamente
  • La segunda vez no converge
  • La tercera vez vuelve a funcionar y asi sucesivamente
spoiler
1 respuesta
mortadelegle

#314 Que método de optimización estas usando? La documentación de la función dice que si no le dices ninguno elige uno de tres, puede ser eso.

1 respuesta
ciza

#315 siempre estoy usando 'L-BFGS-B', es decir siempre utilizo lo mismo. De hecho desde la terminal obtengo resultados consistentes siempre.

spoiler
Tirik

Estoy teniendo problemas para meter un NULL en un campo datetime usando mysqldb. Antes del update trato el dato para que si viene vacio le haga un = None, pero al ejecutar el script me sale un warning de mysql diciendo que se ha truncado la fecha y en bbdd me mete un 0000-00-00 00:00

Sé que está fatal explicado, pero estoy desde el móvil :/

Alguna idea?

1 respuesta
Lolerpopler

#317 buscando un poco he encontrado esto:
http://stackoverflow.com/questions/14565652/cannot-insert-none-using-python-and-mysql-in-datetime-field

En el peor de los casos no podrías tratar la fecha 0000-00-00 00:00 como un caso especial e ignorarla al buscar datos en la bd? Es tapar una cañería con cinta aislante, pero te puede sacar del paso

Tirik

Al final me he puesto y he arreglado el código del todo (era de otra persona).
El animalico tenía 54 %s después del values y le pasaba los datos en plan row[0], row[1],...row[55] porque hay dos elementos de la lista que no se meten. Simplemente le he puesto un del a los dos elementos que no se usan y he puesto ("""replace into ..... Values %s""", [row]) y ya mete el NULL en las fechas correctamente

Phatality

#304 Es recomendable usar el método .loc[] para iterar data frames. Como iterable para filas y columnas puedes usar df.index.values y df.columns.values respectivamente.

1 1 respuesta
ciza

#320 yo suelo utilizar df.iterrows() y df.iteritems()

2 respuestas
Phatality

#321 Ni los conocía, probaré! A que son una gozada los df como estructura de datos? Yo los uso a saquísimo para ETL. Se echan de menos en lenguajes de más bajo nivel.

1 respuesta
HeXaN
#322Phatality:

Se echan de menos en lenguajes de más bajo nivel.

Cuanto más chulo, más alto nivel jaja.

Phatality

#321 Pues parece que lo hacías de la manera correcta XD http://nipunbatra.github.io/2015/06/pandas-iteration/ A partir de ahora lo haré con iterrows!

1 respuesta
ciza

#324 todos los dias se aprende algo nuevo

11 días después
HeXaN

Os dejo el libro previo a #312. Corred que no debe quedarle mucho tiempo gratis: http://leanpub.com/python_101/c/48hours

6 3 respuestas
Merkury

#326 Gracias!

Sorii34

#326 muchas gracias pronto empezare en clases con python y me viene de lujo

nagast0rm

#326 Mierda, llegué tarde :(

¿Alguna alma caritativa me podría mandar un mp con ellos?

1 respuesta
Zoth

Manda huevos, me acabo de enterar que existe este post xd. ¿Alguien lo usa con selenium? tengo un problema, concretamente. Me gustaría poder solucionarlo ya que es la primera vez que toco python y me ha gustado mucho.

Saludos.

Usuarios habituales