[Python] Hilo general

KarlosWins

#1710 Revisa que tengas los index correctos en esa tabla, quizás no tienes ninguno en la fecha y la consulta pasa de tardar minutos a tardar medio segundo.

1 respuesta
Lolerpopler

#1710 como te han respondido ya, tener una colina on la fecha de creación de la entrada no quiere decir que este particionada. Tiene que estar indexada en esa columna

CaNaRy_r00lz

No se si a alguien le interesa estas cosas

2
R

#1710 has probado a usar pyspark? Es más rápido que pandas

1 respuesta
werty

#1714 pues no lo conocía pero lo intentaré (he probado modin, dark, connectorx).

#1711 realmente la tabla tiene como 25 columnas, he creado los INDEX en las columnas de las que hago alguna query (WHERE), pero ya digo que hasta el count(*) tarda una eternidad...

B

#1710 ¿Cuántas columnas tiene la tabla? ¿Alguna almacena datos binarios?

1 respuesta
werty

#1716 pues el caso es que son 3 tablas, de las que hago JOIN al hacer las queries para exportar.
Una de las tablas tiene una columna (fragments) con datos BLOB, y debo hacer el inner JOIN con una parte de ese valor y la columna de otra tabla (id) .
Pues antes lo estaba haciendo con:
hex(fragments) LIKE SELECT ('%' + hex(id) + '%')
y me he descubierto que es bastante más rápido hacerlo con SUBSTRING, y aunque no me soluciona del todo el problema, ahora exportar la tabla de 1.2M de rows a csv me tarda unas 4 horas.

Estoy viendo la manera de optimizarlo iterando con iterdump + executescript, creando una nueva tabla que contenga una columna nueva que contenga el valor de "fragments" que necesito para hacer el INNER JOIN directamente sin SUBSTRING ni nada de eso, y de la que pueda crear un índice, a ver cómo de rápido va.

1 respuesta
B

#1717 Pues si tienes BLOB y son pesados.... estás jodido xD ... mira de usar "EXPLAIN" para ver el camino que sigue la consulta y que no tengas un "full table scan" dando por el ojete... y ver donde puedes afinar... y mira de afinar los indices para el JOIN.

7 días después
CaNaRy_r00lz

Probablemente sea una pregunta muy chorra, pero es que no veo la diferencia

spoiler

Son dos codigos iguales, el de arriba funciona, y el de abajo no funciona, el de arriba lo copie del ejercicio y lo probe funciona, el de abajo lo habia hecho mirando el ejercicio y no funciona, lo he vuelto a escribir pero sigue sin funcionar y no se que tengo mal, si hay algun punto o algo fuera de lugar no lo veo y llevo ya 15min dandole vueltas

1 respuesta
werty

#1719 si nos dices el error que te da, tal vez

1 respuesta
CaNaRy_r00lz

#1720 No da ningun error, unciamente deberia aparece un texto en una imagen, por eso estoy super descolocado, ojala me diera un error xD, lo ejecuto y no muestra el texto, el otro si lo muesta

spoiler

Te he puesto todo el codigo por si lo quieres probar

4 respuestas
werty

#1721 yo, que no soy programador, metería un print después de cada línea en ambos bloques mostrando cada variable, y vería a partir de cual es diferente.

Ismelldrama

#1721 Ejecuta el bloque hasta el primer if, y luego el primer if. Te debería de salir el resultado que comentas. Luego, vuelve a hacer lo mismo, y no ejecutes el primer if, sino el segundo if sin el primero; te debería de salir otra vez el mismo resultado. Si ejecutas los dos a la vez es posible que no te pinte dos veces el texto sobre la imagen. Es una suposición pero por probar...

La librería de Turtle no la he usado en mi vida así que no puedo decirte más.

1 respuesta
CaNaRy_r00lz

#1723 Eso he estado haciendo y funciona con el primer bloque pero no con el segundo, por eso he preguntado, pk no veo nada mas, maniana por la maniana le dare otro tiento a ver si veo alguna diferencia, incluso lo he re escrito pero seguia sin funcionar

1 respuesta
hda

#1724 yo ahí lo dejo: he tenido alguna vez este tipo de problema cuando pese a que pienso que he instanciado un nuevo objeto, en realidad estoy trabajando con la misma referencia. Ojeando el código no parece tu caso.

1
Fyn4r

#1721 100% el all_states o el answer_state es algún tipo de generador, es decir una vez que lo "consumes" pierde su valor, seguramente pase a None o algo así, por eso no entra el segundo if, porque la condición ya no se cumple

https://wiki.python.org/moin/Generators
https://stackoverflow.com/questions/51032155/why-can-a-python-generator-only-be-used-once

Pon un breakpoint() justo antes del segundo if y mira los valores de esas variables en el debugger, hay sorpresa fijo

1
Naith

#1721 Del primer if al segundo no has cambiado nada. Por lo que hace exactamente lo mismo y como ya está dibujado no cambia nada. Te faltaría un textinput entre medias ¿No?

CaNaRy_r00lz

Ambos if son iguales, yo no veo diferencia pero si quito el de abajo funciona y si quito el de arriba no funciona, es decir, no hace lo que deberia que es mostrar el texto en la imagen.

Esta mañana lo he vuelto a probar y ahora funciona sinceramente no se que ha cambiado o pk ayer no funcionaba y ahora si, es la segunda vez que me pasa algo asi con pycharm, supongo que a veces se quedara trabajo y no basta solo con cerrar el programa, gracias por todos los consejos!

1 respuesta
Lolerpopler

#1728 Si uno de los bloques de codigo es un copia pega de internett, puede ser que haya algun caracter que no se vea a simple vista.
Por ejemplo como explican en este articulo: https://springmerchant.com/blog/invisible-character-can-cause-you-hours-lost-work-and-some-gray-hairs/

De todas formas seria mas comodo si quieres pedir ayuda que pongas un link al gist del codigo correctamenete formateado, mv no es el mejor sitio para visualizarlo

1 respuesta
CaNaRy_r00lz

#1729 Era copiado del archivo *.py algo tendria mal puesto, esta mañana lo he hecho de nuevo y ha funcionado sin problema, ayer es que era tarde estaba cansado y ciego

KARMA

A ver si alguien me puede iluminar un poco, después de mucho tiempo de videos de Youtube varios,openbootcam,el 100 days de Ángela tu(no acabado de el todo), me decidí hacer un porgama que tuviera una utilidad para mi con pandas y flask.
El programa lo tengo "terminado" lo que quiero que me haga , va perfecto me coge los datos de ambos Excel y me refleja los datos como los quiero en flask, hasta ahí todo perfecto.
Las dos dudas que tengo, esto quiero llevarlo fuera de mi pc(a los de el trabajo vamos) y ahí tengo los 2 problemas,me gustaría subirlo a una web para probarlo( he visto por ahí pyanywhere que tiene 1 proyecto gratis?), Tampoco se muy bien cómo funciona esto de"subirlo" puesto que en las cientas de horas que he visto han sido todo sobre trabajar en las IDEs , cuál sería la manera menos complicada o mejor de hacerlo?(obviamente gratis,solo quiero probarlo y si en un futuro hago más no me importaria pagar algo por subir más ).
La segunda duda que me asalta es con los 2 archivos de Excel que necesito, actualmente los pillo de la ruta de mi pc, he probado con inputs en el html a subirlos, debo de investigar un poco más sobre esto porque me funciona , pero el action al no estar subido a algun lado pues me dice que no existe, sería está la mejor manera( teniendo en cuenta que ambos archivos cambiarían diariamente) o habría otra manera más correcta de gestionarlo?.

El programa consta de varios archivos .py(flask included) + varios html + css

Perdón el tocho post , espero haberme podido explicar

3 respuestas
CaNaRy_r00lz

#1731 Desde la barra del bar, ya que no he hecho ninguno, pero es como tengo pensado hacer el mio, yo lo compilaria en un .exe que no necesite nada mas para ser ejecutado y con respecto a los archivos excels, que selecciones la ruta donde estan sobretodo pk cambian diariamente como comentas, o sino poner una ruta por defecto y un popup diciendo que los archivos deben estar en "x" directorio como por ejemplo "Mis Documentos"

gonya707

#1731 En lo que respecta a la parte de flask, antaño podias hostearlo en Heroku gratis si no era nada muy ambicioso, de hecho en el 100 days tienes las instrucciones de hosteo en heroku en una leccion, pero desde este noviembre Heroku ya no tiene planes gratis. Me recomendaron probar Fly.io y railway.app como alternativas, pero aun no he sacado tiempo para probarlas, ya contaras que tal

Lo de los excels... Simplemente conviertelo a SQL de algun tipo y haces las querys desde tu web en flask

1
B

#1731 Desplegar un servicio es todo un mundo... por eso existen perfiles dedicados para ello. Ten en cuenta que no solo debes configurar tu aplicación sino también el sistema.

Flask es una parte de tu proyecto... necesitas un servidor HTTP compatible con WSGI. Yo en mi proyectos uso gunicorn. Luego, también sería interesante montar un proxy inverso para controlar el tráfico que va de internet a tu aplicación. Para esto suelo usar Traefik.
Si solo quieres "probarlo" puedes seguir tirando del servidor "built-in" de flask... y con simplemente correr tu aplicación ya debería de ser accesible.

Respecto a los archivos... o lo haces por input o los vas subiendo con "scp", por ejemplo.

Mi briconsejo: Descargate una maquina virtual como "VirtualBox", móntate un Debian pelado (sin entorno gráfico) y aprende a configurarlo... ponle a la maquina un "Adaptador Puente" en la red y ya tendrás un escenario realista. Tu ordenador será como internet y la maquina virtual como el VPS que te vayas a alquilar.
Podrás hacer pruebas y seguir tutoriales sin pagar un duro... y lo podrás mover todo una vez listo a un campo de batalla real (el vps) sin mayor problema.

Briconsejo 2: Usa poetry en tus proyectos (o sucedáneos).

1
KARMA

Antes de meterme en berenjenales he intenado hacerlo algo de manera mas sencilla para tener una muestra funcional y hacerlo en un .exe y he añadido en flask para que se me abra el explorador automaticamente con el localhost , el caso que al compilarlo con :

pyinstaller -F --add-data "templates;templates" --add-data "static;static" nombreapp.py

Funciona(aunque tarde como 30/60 segundos en abrirlo, ¿es normal?) y me abre sin ningun tipo de problema , pero si le añado el -w para que no me abra la consola y simplemente abra la pestaña de el explorador.

pyinstaller -w -F --add-data "templates;templates" --add-data "static;static" nombreapp.py

me tira este error https://imgur.com/a/THXfBFv no doy con la tecla porque deberia ser exactamente lo mismo pero sin la ventana de comandos no?

He leido que puede ser que tuviera algo que se tenga que mostrar en la ventana de comandos , si es cierto que tenia un print olvidado , lo he borrado y he resvisado todo el codigo y no me queda ningun print y sigue igual, tengo la teoria que es por los mesnajes de warning + lanzamiento de server de flask que salen por consola , pero todo lo que he probado para quitarlos de momento no me ha funcionado

15 días después
KARMA

Al final he conseguido hostearlo en pythonanywhere y funciona a las mil maravillas , salvo que cuando subo los excel , tengo que darle a reload al server para que me los lea y me salgan los datos nuevos , encontre la solucion llamando a la API , desde la IDE genial el problema que al llevarlo a el pythonanywhere me dice "has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.", he probado bastantes cosas que he encontrado(llevare unas 7 horas con aproximadamente) pero sigo igual, os pongo el script que me envia los archivos + el call de API y la parte de flask, a ver si alguien puede darme alguna idea o otra manera de manejarlo.

<script>
document.getElementById('formulario-subida').addEventListener('submit', function(event) {
  event.preventDefault();
  // Envía la solicitud de la API aquí
  username = 'xxxxxx';
  token = 'xxxxxx'
  domain_name = "xxxxx";
  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'https://www.pythonanywhere.com/api/v0/user/' + username + '/webapps/' + domain_name + '/reload/');
  xhr.setRequestHeader('Authorization', 'Token ' + token);
  xhr.onload = function() {
    if (xhr.status === 200) {
      // La solicitud se ha enviado correctamente. Puedes mostrar un mensaje de éxito al usuario aquí.
      window.location.href = '/main'
    }
  }
  xhr.onerror = function() {
    // Hubo un error con la solicitud. Puedes manejar el error aquí.
    console.error(xhr.status);
  }
  xhr.send();
});
</script>

Pero cuando le doy al boton no me hace nada y en la consola del chrome me pone:
Access to XMLHttpRequest at 'xxxxxx' from origin 'xxxxx' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

He probado a poner en mi flask , entre otras muchas cosas (aunque parece que esta es la que mas concuerda la gente que funciona)

from flask_cors import CORS
app = Flask(name)
cors = CORS(app)

Alguna idea? tambien habia leido que haciendo touch al .wsgi hacia refresh pero parece ser que no funciona con las /static

stuckED

Buenas chicos, estaba intentando resolver un algoritmo sencillote: sumar los elementos en diagonal de una matrix. Después de la obvia solución con un doble bucle for, un compañero me ha comentado esta:

matrix = [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16],
total_sum = sum(matrix[i][i] for i in range(len(matrix)))

Me ha parecido una solución súper elegante pero no comprendo la lógica que hay por detrás. Es decir, cuando tú iteras con ese bucle for, ¿cuál es la lógica que subyace para que coja los elementos 0, 1, 2, 3, 4...de las sucesivas sub matrices?

2 respuestas
gonya707

#1737 Es porque las diagonales son siempre en los que x=y, es decir matrix[0][0], matrix[1][1], matrix[2][2]... etc.

Asi que con el list comprehension estas recorriendo los numeros desde 0 hasta la longitud de la matriz, 0, 1, 2, 3 y usando esos numeros como indices en matrix

1
Rivendel

#1737 el elemento de la diagonal es [1,1] [2,2] , el primer elemento es indice de la matriz de listas, el segundo es el indice de la lista

1
stuckED

Joder, claro, qué inutil soy xDDD
Me estaba costando muchísimo verlo porque tenía en la cabeza el típico esquema del doble for con i==j...Pero claro, si necesitas siempre el [1][1], [2][2], etc con un solo bucle sirve.
Mil gracias, hoy he hecho click

3