El juego “Generala” en Python

No me gusta hacerle la tarea a la gente… pero estoy suscrito a Google Alert y me llegan las cosas de Python y hoy me puse a revisar y vi este interesante programa que le mandaron a hacer a un flojo… de verdad que yo pienso que soy flojo para lo que no me gusta hacer… pero si usted estudia programación y tiene pereza de hacer un programa tan simple de verdad déjeme decirle que se equivoco de carrera…

Hoy por ejemplo tuve que implementar 2 módulos en ODOO y extraer datos de unos archivos KIU y de verdad no me seria nada agradable si no me gustara la programación… ademas de instalar un FTP seguro :D… es dura la vida del programador y te tiene que gustar pasar horas intentando solucionar tus problemas de código o el de otros programadores… Si te gusta aprender e investigar y ademas intentas correr tus programas bienvenido al Club… no hay nada malo en equivocarse yo por ejemplo estudie Ing. Química y ahora soy programador, me gusta lo que hago y pagan bien 😀

Manos a la obra, el enunciado dice así:

El juego “Generala” consiste en tirar cinco dados y establecer el puntaje de la jugada. De las posibles, la escalera se da cuando suceden algunas de las tres progresiones: 1-2-3-4-5, 2-3-4-5-6 y 3-4-5-6-1. Realice un programa que tire los 5 dados al azar y determine si se produjo una escalera.

Es un poco sencillo si conoces las estructuras de python, quizá se pueda hacer mejor que lo que hice pero esto lo hice en 10 minutos aproximadamente junto con el otro código 😀

Primer código resolviendo la tarea :S

# -*- coding: utf-8 -*-
import random
###   El juego "Generala" consiste en tirar cinco dados y establecer el puntaje de la
###   jugada. De las posibles, la escalera se da cuando suceden algunas de las tres progresiones: 1-2-3-4-
###   5, 2-3-4-5-6 y 3-4-5-6-1. Realice un programa que tire los 5 dados al azar y determine si se produjo
###   una escalera. 



Iteraciones = 0 
Ganaste = 0
while Ganaste != 1000:
    Lista_dados=[]
    dado_1= random.randrange(1,7)
    Lista_dados.append(dado_1)
  
    dado_2= random.randrange(1,7)
    Lista_dados.append(dado_2)
  
    dado_3= random.randrange(1,7)
    Lista_dados.append(dado_3)
  
    dado_4= random.randrange(1,7)
    Lista_dados.append(dado_4)
  
    dado_5= random.randrange(1,7)
    Lista_dados.append(dado_5)
    
    Lista_dados.sort()
    
    
    if ( Lista_dados == [1, 2, 3, 4, 5] ) or ( Lista_dados == [ 2, 3, 4, 5,6] ) or ( Lista_dados == [1, 3, 4, 5, 6] ):
          Iteraciones +=1
          print "Ganaste en: ", Iteraciones, "Lanzadas"
          print Lista_dados

          Ganaste += 1000
          
          
    else:
          Iteraciones +=1
          print "Sigue intentando solo son: ", Iteraciones, "Lanzadas"

      

Prueba el código y veras la salida, explico este brevemente el otro no :S

Importamos Random para agregar azar al código :D, creamos un bucle while que se ejecutara hasta que Ganaste sea diferente  a 1 o haya 1 ganador, lanzamos los dados desde 1 a 6, recuerda que range no toma el ultimo numero, al final de los dados los sorteamos por defecto de menor a mayor, y creamos 1 if, si los dados aparecen como en alguna de las listas ganadoras, agregamos a ganaste y se rompe el bucle, ademas agregamos 1 a iteraciones y escribimos ganaste en X iteraciones e imprimimos la lista ganadora, esto se hace hasta que Ganaste sea 1 o haya 1 ganador si no se agrega 1 a iteraciones, se muestra un mensaje de consolación y se reanuda el Bucle.. fácil verdad

Ahora como soy ocioso y me gusta pensar y tratar de plasmar mis ideas en código, quería saber cual es la mas alta probabilidad de ganar es decir si lanzo los dados x veces cuantas veces ganare en X lanzadas, pero como mi pensamiento estaba algo no explicito cree una lista con las 10 iteraciones mas comunes en ganar este es el resultado:

# -*- coding: utf-8 -*-
from collections import Counter, OrderedDict
from prettytable import PrettyTable

import random
###   El juego "Generala" consiste en tirar cinco dados y establecer el puntaje de la
###   jugada. De las posibles, la escalera se da cuando suceden algunas de las tres progresiones: 1-2-3-4-
###   5, 2-3-4-5-6 y 3-4-5-6-1. Realice un programa que tire los 5 dados al azar y determine si se produjo
###   una escalera. 


Lista_ganadas=[]
iteraciones_total = 5000
for lanzada in range(1,iteraciones_total):
  Ganaste = 0
  Iteraciones = 0
  while Ganaste != 1:
    Lista_dados=[]
    dado_1= random.randrange(1,7)
    Lista_dados.append(dado_1)
  
    dado_2= random.randrange(1,7)
    Lista_dados.append(dado_2)
  
    dado_3= random.randrange(1,7)
    Lista_dados.append(dado_3)
  
    dado_4= random.randrange(1,7)
    Lista_dados.append(dado_4)
  
    dado_5= random.randrange(1,7)
    Lista_dados.append(dado_5)
    
    Lista_dados.sort()
    
    
    if ( Lista_dados == [1, 2, 3, 4, 5] ) or ( Lista_dados == [ 2, 3, 4, 5,6] ) or ( Lista_dados == [1, 3, 4, 5, 6] ):
          print "Ganaste en: ", lanzada, "Lanzadas"
          print Lista_dados
          Ganaste += 1
          Iteraciones += 1
          Lista_ganadas.append(Iteraciones)

          
    else:
          print "Sigue intentando solo son: ", lanzada, "Lanzadas"
          Iteraciones += 1
    
      
c = Counter(Lista_ganadas)
mas_comunes=  c.most_common()[:10]  

print "mas_comunes",mas_comunes
primer = mas_comunes[0][1]

numero_de_repeticiones = len(mas_comunes)

porcentajes = []
iteracion_ganada = []
for repeticion in range(0,numero_de_repeticiones):
    x = mas_comunes[repeticion][1]
    porentaje_de_iteraciones_total = float(x * 100.0000/ iteraciones_total)
    porcentajes.append(porentaje_de_iteraciones_total)
    iteracion_win = mas_comunes[repeticion][0]
    iteracion_ganada.append(iteracion_win)

    


table = PrettyTable(["iteracion_ganada", "porcentaje"])
i = 0
for repeticion in iteracion_ganada:
    
    table.add_row([iteracion_ganada[i], porcentajes[i]] )
    i += 1

print table


El resultado es algo como esto 😀

+------------------+-------------+
| iteracion_ganada | porcentajes |
+------------------+-------------+
|        1         |     4.88    |
|        2         |     4.54    |
|        4         |     4.1     |
|        3         |     3.98    |
|        7         |     3.74    |
|        5         |     3.72    |
|        9         |     3.56    |
|        6         |     3.26    |
|        11        |     2.96    |
|        10        |     2.88    |
+------------------+-------------+

Dios les Bendiga y recuerden si nos gusta lo que trabajamos no podemos llamarle trabajo 😀

Anuncios

VSFTP en Debian/Ubuntu o Centos ERROR 500 OOPS: vsftpd

500 OOPS: vsftpd: refusing to run with writable root inside chroot() Login failed.

Estaba instalando el Servidor VSFTP y me encontré con este error que rápidamente solucione buscando en la web con estos comandos:


chmod a-w /home/ruta_del_home_del_usuario_FTP

Recuerda cambiar ruta_del_home_del_usuario_FTP por el home que le asignaste en la configuración…

Si no agregaste la linea allow_writeable_chroot=YES debes hacerlo asi


echo 'allow_writeable_chroot=YES' >> /etc/vsftpd/vsftpd.conf

Ahora Reiniciamos el Servidor



systemctl restart vsftpd

 

Hay otro error y es este:  vsftpd 553 Could not create file.

vsftpd 553 Could not create file.

Pero este error es mas sencillo simplemente con chown darle permisos a la carpeta :S, no por que no lo hace automático, sera por que es Centos :S

chown usuario_ftp /home/usuario_ftp

 

Recuerda cambiar usuario_ftp por tu usuario en las 2 partes, esto es todo que Dios les Bendiga… Comentar es gratis 😀

Información sacada de:

www.liquidweb.com

aula128.wordpress.com

También te puede interesar este post:

rootear.com

Python Scraping NFL [Parte 1]

Al final decidí hacer la parte 1 de esta interesante serie, estamos bastante desfasados :S, pero esta semana creo que podre terminar esta serie hasta la parte del scraping… ya la parte del análisis espero tenerla este año, y sera para la próxima temporada que podremos usarla a tope… Hoy vamos a ver el codigo de como extraer los datos para cada juego, solo vamos a extraer los score de cada equipo por separado, ya luego podemos hacer un for para que nos los agrupe de 2 en 2 y asi saber a quien se enfrento cada equipo….

Aqui el codigo, aunque pienso cambiarlo un poco en como aplicar el get.TEXT, luego algun comentario del codigo:

import requests, urllib2
from bs4 import BeautifulSoup
import re

import math

lista_regular_season = [range(1, 6)]

### Pagina primaria para buscar los datos

url_1er = 'http://www.nfl.com/scores/2016/REG'
for semana in lista_regular_season[0]:
  
    print "      " 
    print "      " 

    print "      " 
    print "Que semana esta: ", semana 
    print "      " 
    print "      " 
    print "      " 

    url_1er = 'http://www.nfl.com/scores/2016/REG'+str(semana)
    
    print url_1er

    url_1er = 'http://www.nfl.com/scores/2016/REG'

            
    page_1era = urllib2.urlopen(url_1er)
            
    soup_1er = BeautifulSoup(page_1era, 'lxml')

    divicion_Diviciones = soup_1er.find_all('div',class_="new-score-box-wrapper" )
    
    quarters_total = soup_1er.find_all('p',class_="total-score" )
    if "--" in quarters_total:
      print "Este juego No se ha jugado"
      pass
    else:
      
      
        results_total = []
        results_first = []
        results_second = []
        results_third = []
        results_fourth = []
        nombres_equipos = []

        ### Total
        quarters_total = soup_1er.find_all('p',class_="total-score" )
        results_total.append([headers.get_text() for headers in quarters_total])
        results_total = results_total[0]


        ### nombre Equipo
        nombre_equipo= soup_1er.find_all('p',class_="team-name" )
        nombres_equipos.append([headers.get_text() for headers in nombre_equipo])
        nombres_equipos = nombres_equipos[0][2:]
        
        ### Primer cuarto
        first_qt = soup_1er.find_all('span',class_="first-qt" )
        results_first.append([data.get_text() for data in first_qt])
        results_first = results_first[0][2:]

        ### segundo cuarto

        second_qt = soup_1er.find_all('span',class_="second-qt" )
        results_second.append([data.get_text() for data in second_qt])
        results_second = results_second[0][2:]

        ### tercer cuarto

        third_qt = soup_1er.find_all('span',class_="third-qt" )
        results_third.append([data.get_text() for data in third_qt])
        results_third = results_third[0][2:]

        ### cuarto cuarto

        fourth_qt = soup_1er.find_all('span',class_="fourth-qt" )
        results_fourth.append([data.get_text() for data in fourth_qt])
        
        ## Debo cambiar la linea anterior para obtener 1 sola lista 😀
        results_fourth = results_fourth[0][2:]





        i = 0
        for datos in nombres_equipos:
                print "Nombre Equipo", datos
                primer_cuarto =  results_first[i]
                primer_cuarto =  int(primer_cuarto)
        

                segundo_cuarto = results_second[i]
                segundo_cuarto =  int(segundo_cuarto)

        
                tercer_cuarto =  results_third[i]
                tercer_cuarto =  int(tercer_cuarto)

        
                cuarto_cuarto =  results_fourth[i]
                cuarto_cuarto =  int(cuarto_cuarto)
                print "1er Cuarto:  ", primer_cuarto,"2do Cuarto:  " ,segundo_cuarto,"3er Cuarto:  ", tercer_cuarto,"4to Cuarto:  ", cuarto_cuarto
        

                total_total = primer_cuarto + segundo_cuarto +tercer_cuarto + cuarto_cuarto
                total = results_total[i]
                
                print "Total", total_total
        
        
        

                i += 1

No hay mucho que comentar solo que la pagina usada para extraer los datos es http://www.nfl.com/scores/2016/REG y se le agrega un numero que corresponde a la semana o jornada de la temporada…

También la linea data.get_text() debo modificarla para hacer el código mas viable 😀

Las otras partes son faciles de entender si has seguido mis entradas 😀

Hasta luego Feliz Dia y que Dios te Bendiga

Un Robot que mueve Archivos en Python + Bash

De verdad que es muy importante aprender mas cada día de nuestro trabajo pero en especial de Dios, recordemos que todo el conocimiento proviene de Dios la Sabiduría es el temor a Jehova o al Señor, y el Discernimiento es conocer Al Señor… por esto yo día a día busco a Dios y dice la palabra todas las cosas se te darán por añadidura, es decir el conocimiento y las fuerzas para hacer cada Día tu trabajo serán añadidos y se te harán mucho mas fácil y podrás hacer cosas que ni pensabas 😀

Les cuento que Tenia que probar en tiempo real que el ODOO v8 leía los documentos PNR de Sabre, en Openerp v7 solo implemente una clase que al ser creada leía los PNRs, luego se me pidió que colocara dicha función que leía los PNR en el planificador de tareas de ODOO v7, y bueno me encontré con algunos detalles que poco  a poco fui sorteando :D, al final todo funciono y tocaba hacer lo mismo en ODOO v8 y así lo hice, pero también debía agregar cada cierto tiempo algunos PNRs para estar seguros que ODOO estaba leyendo los PNRs apenas llegaban y ademas estar seguros que los PNRs una vez leídos eran pasados a otra carpeta para no perder tiempo en leerlos o si quiera contarlos nuevamente, aunque fueran segundos son importantes 😀

Por lo que se me ocurrió la idea de crear un programita que hiciera esa ardua tarea de mover archivos cada cierto tiempo de una carpeta a otra, al final pensé en como hacerlo y quedo así:

# -*- coding: utf-8 -*-
import os

import random

import subprocess

os.system("ls /home/usuario/emular_server_sabre/resspl >/home/usuario/emular_server_sabre/lista_archivos_resspl")

archi=open('/home/usuario/emular_server_sabre/lista_archivos_resspl','r')
    
lineas=archi.read().splitlines()
lista_definitiva = []
for linea in lineas:
      
    lista_definitiva.append(linea)
    

print lista_definitiva
    
archi.close()

while len(lista_definitiva) >= 20:
    numero_aleatorio= random.randrange(20)
    print len(lista_definitiva)
    
    for archivos in range(numero_aleatorio):
      
          numero_aleatorio_sacar= random.randrange(len(lista_definitiva))
          
          archivo_pnr = lista_definitiva[numero_aleatorio_sacar]
          archivo_a_mover = '/home/usuario/emular_server_sabre/resspl/'+ archivo_pnr
          subprocess.call(['mv', archivo_a_mover, '/home/usuario/emular_server_sabre/resspl_new'])
          
          lista_definitiva.pop(numero_aleatorio_sacar)
          
          print archivo_a_mover
          
    os.system("sleep 10")

          

Les comento algunas lineas, importamos os y subprocess, por que es mas cómodo trabajar la shell desde os algunas veces y otras desde subprocess, random para darle un poco de realismo entre comillas :D, lo primero que hacemos es leer la carpeta donde llegaran los PNRs y la pasamos a un archivo, dicho archivo lo leemos linea a linea y lo agregamos 1 a 1 con for a una lista, cerramos el archivo, luego creamos un bucle que mientras queden mas de 20 archivos se ejecute siempre, luego creamos un numero_aleatorio que sera la cantidad de archivos que pasaremos entre 0 y 20, luego creamos en el for un numero aleatorio esta ves para sacar los números de la lista, así vamos moviendo dicho archivo  otro directorio, y hacemos eso para el numero de veces definidas aleatoria-mente, luego esperamos 10 segundos y repetimos el proceso:

Esta podría ser la salida:


Quedan este numero de archivos: 442
/home/setnorac/emular_server_sabre/resspl/TNMLIR00.PNR
/home/setnorac/emular_server_sabre/resspl/CMQSJB00.PNR
/home/setnorac/emular_server_sabre/resspl/BBILYI00.PNR
/home/setnorac/emular_server_sabre/resspl/VKTKVL00.PNR
/home/setnorac/emular_server_sabre/resspl/ASFFGA00.PNR
/home/setnorac/emular_server_sabre/resspl/NZBTGI00.PNR
/home/setnorac/emular_server_sabre/resspl/DEGYFS00.PNR
/home/setnorac/emular_server_sabre/resspl/WFBUUR00.PNR
/home/setnorac/emular_server_sabre/resspl/TEDUYP00.PNR
/home/setnorac/emular_server_sabre/resspl/AQVSGF00.PNR
/home/setnorac/emular_server_sabre/resspl/WNNESL00.PNR
/home/setnorac/emular_server_sabre/resspl/EZTZAX00.PNR
Quedan este numero de archivos: 430
/home/setnorac/emular_server_sabre/resspl/ODGGSK01.PNR
/home/setnorac/emular_server_sabre/resspl/WZUSXY02.PNR
/home/setnorac/emular_server_sabre/resspl/QCCKUP00.PNR
/home/setnorac/emular_server_sabre/resspl/QRYXQJ00.PNR
/home/setnorac/emular_server_sabre/resspl/MLLHVX00.PNR
/home/setnorac/emular_server_sabre/resspl/LKJVCP00.PNR
/home/setnorac/emular_server_sabre/resspl/GNUNXP00.PNR
/home/setnorac/emular_server_sabre/resspl/ZZXVVX00.PNR
/home/setnorac/emular_server_sabre/resspl/ZSTHCV00.PNR
/home/setnorac/emular_server_sabre/resspl/LLIBLM00.PNR
/home/setnorac/emular_server_sabre/resspl/KJNDYN00.PNR
/home/setnorac/emular_server_sabre/resspl/CDAZSI00.PNR
Quedan este numero de archivos: 418
/home/setnorac/emular_server_sabre/resspl/USYRFJ00.PNR
/home/setnorac/emular_server_sabre/resspl/HRZUTH09.PNR
/home/setnorac/emular_server_sabre/resspl/KABKQK00.PNR
/home/setnorac/emular_server_sabre/resspl/WFIIEH00.PNR
/home/setnorac/emular_server_sabre/resspl/RBHQMX00.PNR
/home/setnorac/emular_server_sabre/resspl/ZJVGZF00.PNR
/home/setnorac/emular_server_sabre/resspl/SZKRTH00.PNR
/home/setnorac/emular_server_sabre/resspl/WKEIPW00.PNR
Quedan este numero de archivos: 410
/home/setnorac/emular_server_sabre/resspl/NTJHEC00.PNR
Quedan este numero de archivos: 409
/home/setnorac/emular_server_sabre/resspl/KCMOWH03.PNR
/home/setnorac/emular_server_sabre/resspl/IWMGLY00.PNR
/home/setnorac/emular_server_sabre/resspl/UIVSYI00.PNR
/home/setnorac/emular_server_sabre/resspl/JREMOQ00.PNR
/home/setnorac/emular_server_sabre/resspl/TCPTNN00.PNR
/home/setnorac/emular_server_sabre/resspl/EQZFFS00.PNR
/home/setnorac/emular_server_sabre/resspl/FFFSRL00.PNR
/home/setnorac/emular_server_sabre/resspl/ZAKAMO01.PNR
/home/setnorac/emular_server_sabre/resspl/GWOYGO00.PNR
Quedan este numero de archivos: 400
/home/setnorac/emular_server_sabre/resspl/FTYBXG00.PNR
/home/setnorac/emular_server_sabre/resspl/GGSFVQ00.PNR
/home/setnorac/emular_server_sabre/resspl/YRYHQE00.PNR
/home/setnorac/emular_server_sabre/resspl/GVGEHA00.PNR
/home/setnorac/emular_server_sabre/resspl/EOUVSS00.PNR
/home/setnorac/emular_server_sabre/resspl/VDZGUO00.PNR
/home/setnorac/emular_server_sabre/resspl/ZKVDFB00.PNR
/home/setnorac/emular_server_sabre/resspl/WBEPNT00.PNR
/home/setnorac/emular_server_sabre/resspl/RYPPFK00.PNR
/home/setnorac/emular_server_sabre/resspl/VEWSTU00.PNR
/home/setnorac/emular_server_sabre/resspl/FFWFZB00.PNR
/home/setnorac/emular_server_sabre/resspl/BGDXGH00.PNR
/home/setnorac/emular_server_sabre/resspl/UZEDKC00.PNR
Quedan este numero de archivos: 387
Quedan este numero de archivos: 387
/home/setnorac/emular_server_sabre/resspl/EIGPDE00.PNR
/home/setnorac/emular_server_sabre/resspl/OJWCOC00.PNR
/home/setnorac/emular_server_sabre/resspl/DDCMEX00.PNR
/home/setnorac/emular_server_sabre/resspl/DKTGPP00.PNR
/home/setnorac/emular_server_sabre/resspl/AEJHFG00.PNR
/home/setnorac/emular_server_sabre/resspl/TGHKIK00.PNR
/home/setnorac/emular_server_sabre/resspl/DRKFSS00.PNR
Quedan este numero de archivos: 380
/home/setnorac/emular_server_sabre/resspl/KELLQI00.PNR
/home/setnorac/emular_server_sabre/resspl/OGGFZL00.PNR
/home/setnorac/emular_server_sabre/resspl/YUVINL00.PNR
/home/setnorac/emular_server_sabre/resspl/TAPXAA00.PNR
/home/setnorac/emular_server_sabre/resspl/EEMYZM00.PNR
/home/setnorac/emular_server_sabre/resspl/EBJWPM00.PNR
/home/setnorac/emular_server_sabre/resspl/STJHUE00.PNR
/home/setnorac/emular_server_sabre/resspl/EMSWIR00.PNR
/home/setnorac/emular_server_sabre/resspl/KPPWGH00.PNR
/home/setnorac/emular_server_sabre/resspl/FMFAYL00.PNR
/home/setnorac/emular_server_sabre/resspl/OJGBZT00.PNR
/home/setnorac/emular_server_sabre/resspl/DQKLJH00.PNR
/home/setnorac/emular_server_sabre/resspl/EHUKQF00.PNR
/home/setnorac/emular_server_sabre/resspl/CFGMKG00.PNR
/home/setnorac/emular_server_sabre/resspl/VXKOPK00.PNR
/home/setnorac/emular_server_sabre/resspl/YZHXZQ00.PNR
/home/setnorac/emular_server_sabre/resspl/QYOLSD00.PNR
/home/setnorac/emular_server_sabre/resspl/MSTWAM00.PNR
Quedan este numero de archivos: 362
/home/setnorac/emular_server_sabre/resspl/BJEIWS00.PNR
/home/setnorac/emular_server_sabre/resspl/RPXTNN00.PNR
/home/setnorac/emular_server_sabre/resspl/ETWBCA00.PNR
/home/setnorac/emular_server_sabre/resspl/UBUIYY00.PNR
/home/setnorac/emular_server_sabre/resspl/NEMIQT00.PNR

Y bueno en realidad no hace mucho pero nos puede dar muchas ideas de uso 😀

Ya subi el video a Youtube mañana lo subo al blog 😀

Feliz Día que Dios les Bendiga y les Llene de Gozo….

Planificación de Tareas desde Openerp v7 (ODOO) ir_cron

Me disculpan que no he subido el vídeo de PNRs Sabre con ODOO, pero es que he estado bastante ocupado con el Trabajo que estoy haciendo para la AeroLinea esta(aunque no directamente, soy freelancer)…

Hoy les vengo a contar que después que cree, el modulo que lee los PNRs que imprime el software SABRE, para la segunda Fase tengo que hacer que todo sea automático, es decir que con el modulo ir_cron de ODOO se ejecute la lectura de los PNRs y se vacié en las clases correspondientes, lo segundo ya estaba hecho lo primero no, me pareció muy sencillo pero tiene su truco, como todo en ODOO 😀

Al principio pensé que correría directamente en el planificador colocando los datos del objeto y el método a llamar, pero me equivoque y me daba este error(ojo corte el error pero básicamente eso dice):

openerp.addons.base.ir.ir_cron: Call of  create TypeError: create() takes at least 4 arguments (3 given)

Y ahora que hago el Botón si esta funcionando pero el planificador no quería leer mi código :S… Buscando en internet y leyendo ayudas con respecto a este tema me encontré con varias y son de las que vamos a hablar aquí, creo que si llegaste aquí es por que tienes algún error de los que vamos a hablar… por eso no colocare el código completo 😀

  • El error me dice estas pasando 4 argumentos mientras que la llamada a create del planificador necesita 3.
def run_actions(self, cr, uid, ids, context=None):

Así mas o menos tenemos nuestra función definida, les cuento que no hay nada de malo para un botón, pero si lo que queremos es pasársela al planificador solo debemos eliminar “ids” de los argumentos que estamos pasando y ya funcionara 😀

def run_actions(self, cr, uid, context=None):

Por otra parte si quieres saber exactamente como hacer una función para ser llamada por el planificador aquí te dejo este enlace

Ademas si quieras ir un poco mas allá no dejes de leer esto

En un rato o mañana voy a subir un código en python que esta muy interesante, que tuve que hacer para simular la llegada de archivos PNRs a el servidor que las procesa, para cambiarlas de Directorio(carpetas) donde llegan a un directorio de Procesados, no es mucho pero es interesante las formas que tenemos de embeber código Shelscript en Python

Voy a ir subiendo los vídeos a ver si algún día suben :S

 

 

Sabre + ODOO pasando datos de Archivos PNR a ODOO

Luego de Hablarle a el cliente me dio permisos de subir un vídeo de como funciona el ODOO en conjunto con SABRE…

odoo_sabre

SABRE es un sistema operativo de procesamiento en tiempo real (RT TPOS) centralizado, desarrollado por American Airlines e IBM. segun

Este sistema es usado por las AeroLineas para administrar todo lo que tiene que ver con La Venta de Pasajes, y bueno ya que este es un sistema cerrado muchas AeroLineas han migrado a ODOO no es la primera vez que escucho de ODOO y AeroLineas, por hay me contacto alguien para este mismo tema hace varios meses y me dejo como novia de pueblo jajaja, sin rencores…. Aprovecho para decir que estoy a la Orden para cualquier Reto en los siguientes temas:

  • Migracion y adaptacion de Bases de Datos  a ODOO, siempre que la Base de datos este en sistemas legibles por ejemplo que se puedan pasar a CSV de alguna manera…
  • Scraping desde Python a cualquier Pagina, adecuación de los datos a Bases de Datos y Creacion de APIs a partir de los datos recolectados, tampoco soy mago
  • Scraping desde ODOO, bueno eso 😀

Siguiendo con el tema, esto lo hice en una semana, aunque los 3 primeros días fueron una tortura por que no sabia que era un archivo PNR, luego fui leyendo la documentación que casi no existía, en realidad tuve que leer el código de otros, tenían una API que al final nunca supe por que no funcionaba , eran muchos códigos, scripts y mucha configuración… al final recree las condiciones de la API en ODOO directamente(en la próxima entrada un par de vídeos)

Aunque bajo mucha presión lo logre y Sabre ahora esta conectado a ODOO de alguna manera… los Archivos PNR son correctamente leídos desde ODOO y pasan toda su información.

Las limitaciones con ODOO son casi imperceptibles, ahora mismo hay muchas formas de hacer las cosas y si queremos programar algo es cuestión de tiempo y cuanto están dispuesto a invertir por software único o para adaptar a sus necesidades…

El fuerte de este programa en realidad es como leer los archivos PNR, pero a mi me gusto mucho por que aquí si que tuve que colocar toda la carne en el asador, al sacarle el máximo provecho a Python, al usar Diccionarios, Listas, Tuplas, Tuplas de Listas, Diccionarios de Diccionarios, Listas de Diccionarios, Tuplas de listas con Diccionarios, agregar información a estas  estructuras cada ves que se hacían mas complejas era un poco raro al principio pero luego uno se acostumbra…

Hasta aquí esta entrada en la próxima los 2 Vídeos del Sistema corriendo y extrayendo los PNR… Dios les Bendiga y les de Discernimiento…

Pensando en la Proxima entrada y cosas que nos quedan por hacer en Python

Les cuento que esta semana he estado trabajando Full Time programando en Openerp v7, aunque me gustaría subir por lo menos el vídeo de lo que hice debo preguntar si puedo :S… mas o menos los tiros van así, he estado rehaciendo una API de una Aerolinea para extraer los datos de unos archivos llamados PNR, vaya que ni me imaginaba ese mundillo :S, al final todo salio bien gracias a Dios con muchos momentos de frustración al estar en terreno desconocido, pero al final corrió el código y aunque le faltan bastantes detalles(esto es bueno por que tengo trabajo :D) ya esta consumiendo los archivos en cuestión 😀

Debo comunicarles que me he decidido implementar la Base de Datos directamente a ODOO, les hablo del scrapping de la NFL que estaba haciendo, les cuento que tengo mas de 1 semana con una Otitis terrible y ya Gracias a Dios se me esta pasando, Voy a implementarla directamente en ODOO por que asi tendremos un mapeo de la base de datos y vistas interesantes en ODOO ojo que pronto subo un Vídeo 😀

Voy a ir subiendo Vídeos de entradas anteriores para los que no les gusta leer(aunque háganlo un habito :D), voy a comenzar con un Cursito de Python para Dummies en vídeo, así como también un vídeo de buenas practicas debugueando código en python si Dios nos lo permite claro 😀

Hay varias series que hay que retomar si o si, pero ahora trabajo 8 horas al día, y otras 3 copadas, mas 2 en otros proyectos me quedan como 3 libres :S bueno algo haré :D, por ejemplo Criptografia, APIS le tengo el ojo a Google :D, entre otras……. hay bastante que elegir en este blog :S

Bueno hasta aquí esta micro entrada informativa, me despido que Dios les bendiga les ilumine sus pasos y les de discernimiento…

Python Scraping NFL [Parte preliminar 2]

Si si todavía no tengo el código completo, es que he estado pensando mejorar el código cada vez mas y bueno de verdad hasta ahora ya tengo el programa funcionando y saca los datos de las divisiones, los datos de los equipos, y los datos de cada jugador por equipo, lo único que me falta para decir que la primera parte esta terminada es agregarle la base de datos y tendríamos la parte estática funcionando…

La parte dinámica la he ido diseñando de una manera diferente, he pensado en tomar cada juego como una tabla que se llamara fechas o jornadas donde tendremos los equipos enfrentados(ids para la BD) y los resultados, luego tendremos otra tabla con las estadísticas de cada equipo, y luego la tabla mas importante y la final, la que mas nos interesa ya que el objetivo es hacer SABERMETRIA de la NFL con este programita, hablamos de la tabla de las estadísticas de cada jugador por juego, luego estas estadísticas se sumaran y se les agregaran a cada jugador y a cada equipo y por ay me suena algo para las divisiones pero vamos con calma…

Hoy les he venido a mostrar el código hasta ahora y unos cuantos cambios que vamos a ir haciendo, como por ejemplo crear funciones y así tener un código mas simple con las referencias de como hace lo que hace en otro lado, esto para que cuando lleguemos a el Béisbol podamos reutilizar completamente el código simplemente cambiando NFL por Béisbol(esto lo hará el sistema con las URLs)… vamos a ver que tenemos hasta ahora:

Hasta ahora cree 2 archivos Python, diviciones_equipos_y_jugadores_NFL.py y funcion_jugadores_plantel.py, hoy les voy a de como llegue a funcion_jugadores_plantel y es que tuve que pensar unos 10 minutos para tomar algunas decisiones en este código y al final me gusto tanto que comparto como llegue a el 😀

El código es el siguiente:

import requests, urllib2
from bs4 import BeautifulSoup
import re

import math

### Pagina primaria para buscar los datos
url_1er = 'http://www.espn.com.ve/futbol-americano/nfl/equipo/plantel/_/nombre/jax'

            
page_1era = urllib2.urlopen(url_1er)
            
soup_1er = BeautifulSoup(page_1era, 'lxml')

divicion_Diviciones = soup_1er.find_all('table',class_="tablehead" )
results = []
for row in divicion_Diviciones:
        ### los 2 condiciones se van a ejecutar para buscar las headers y luego las rows
        table_headers = row.find_all('th')
        if table_headers:
            results.append([headers.get_text() for headers in table_headers])
           
        table_data = row.find_all('td')
        if table_data:
	    results.append([data.get_text() for data in table_data])
            a_ver = [data for data in table_data]
            
            
            
print results

Y la salida es la siguiente, no se asusten aun vamos a la mitad del código pero quería que vieran esta estructura:

[[u'Ofensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'10', u'Brandon Allen', u'QB', u'24', u'6-2', u'219', u'D', u'Arkansas', u'5', u'Blake Bortles', u'QB', u'24', u'6-5', u'239', u'3', u'UCF', u'7', u'Chad Henne', u'QB', u'31', u'6-3', u'219', u'9', u'Michigan', u'30', u'Corey Grant', u'RB', u'24', u'5-11', u'204', u'2', u'Auburn', u'33', u'Chris Ivory', u'RB', u'28', u'6-0', u'224', u'7', u'Tiffin University', u'16', u'Denard Robinson', u'RB', u'25', u'6-0', u'213', u'4', u'Michigan', u'24', u'T.J. Yeldon', u'RB', u'22', u'6-1', u'223', u'2', u'Alabama', u'17', u'Arrelious Benn', u'RM', u'28', u'6-2', u'222', u'6', u'Illinois', u'14', u'Justin Blackmon', u'RM', u'26', u'6-1', u'210', u'2', u'Oklahoma State', u'13', u'Rashad Greene', u'RM', u'23', u'5-11', u'190', u'2', u'Florida State', u'88', u'Allen Hurns', u'RM', u'24', u'6-3', u'201', u'3', u'Miami', u'11', u'Marqise Lee', u'RM', u'24', u'6-0', u'200', u'3', u'USC', u'15', u'Allen Robinson', u'RM', u'23', u'6-3', u'218', u'3', u'Penn State', u'81', u'Bryan Walters', u'RM', u'28', u'6-0', u'195', u'5', u'Cornell', u'83', u'Ben Koyack', u'TE', u'23', u'6-5', u'269', u'1', u'Notre Dame', u'89', u'Marcedes Lewis', u'TE', u'32', u'6-6', u'280', u'11', u'UCLA', u'87', u'Neal Sterling', u'TE', u'24', u'6-4', u'254', u'2', u'Monmouth', u'80', u'Julius Thomas', u'TE', u'28', u'6-5', u'256', u'6', u'Portland State', u'70', u'Luke Bowanko', u'C', u'25', u'6-6', u'313', u'3', u'Virginia', u'60', u'A.J. Cann', u'J', u'24', u'6-3', u'317', u'2', u'South Carolina', u'65', u'Brandon Linder', u'J', u'24', u'6-6', u'309', u'3', u'Miami', u'77', u'Patrick Omameh', u'J', u'26', u'6-4', u'316', u'4', u'Michigan', u'64', u'Chris Reed', u'J', u'24', u'6-5', u'310', u'1', u'Minnesota State', u'69', u'Tyler Shatley', u'J', u'25', u'6-3', u'306', u'2', u'Clemson', u'68', u'Kelvin Beachum', u'TE', u'27', u'6-3', u'316', u'5', u'SMU', u'76', u'Luke Joeckel', u'TE', u'24', u'6-6', u'312', u'4', u'Texas A&M', u'62', u'Jeffrey Linkenbach', u'TE', u'29', u'6-6', u'317', u'7', u'Cincinnati', u'78', u'Jermey Parnell', u'TE', u'30', u'6-6', u'323', u'6', u'Ole Miss', u'72', u'Josh Wells', u'TE', u'25', u'6-6', u'310', u'3', u'James Madison', u'Defensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'93', u'Tyson Alualu', u'DE', u'29', u'6-3', u'304', u'7', u'California', u'56', u'Dante Fowler Jr.', u'DE', u'22', u'6-3', u'250', u'2', u'Florida', u'91', u'Yannick Ngakoue', u'DE', u'21', u'6-2', u'246', u'D', u'Maryland', u'98', u'Chris Smith', u'DE', u'24', u'6-1', u'262', u'3', u'Arkansas', u'66', u'Jonathan Woodard', u'DE', u'22', u'6-5', u'271', u'D', u'Central Arkansas', u'96', u'Michael Bennett', u'DT', u'23', u'6-2', u'298', u'2', u'Ohio State', u'92', u'Sheldon Day', u'DT', u'22', u'6-1', u'285', u'D', u'Notre Dame', u'90', u'Malik Jackson', u'DT', u'26', u'6-5', u'300', u'5', u'Tennessee', u'95', u'Abry Jones', u'DT', u'25', u'6-4', u'318', u'4', u'Georgia', u'99', u"Sen'Derrick Marks", u'DT', u'29', u'6-2', u'309', u'8', u'Auburn', u'97', u'Roy Miller', u'DT', u'29', u'6-2', u'318', u'8', u'Texas', u'75', u'Jared Odrick', u'DL', u'28', u'6-5', u'298', u'7', u'Penn State', u'59', u'Arthur Brown', u'LB', u'26', u'6-0', u'240', u'4', u'Kansas State', u'44', u'Myles Jack', u'LB', u'21', u'6-1', u'247', u'D', u'UCLA', u'51', u'Paul Posluszny', u'LB', u'31', u'6-2', u'232', u'10', u'Penn State', u'52', u'Hayes Pullard III', u'LB', u'24', u'6-0', u'233', u'2', u'USC', u'55', u'Dan Skuta', u'LB', u'30', u'6-2', u'252', u'8', u'Grand Valley State', u'50', u'Telvin Smith', u'LB', u'25', u'6-3', u'218', u'3', u'Florida State', u'21', u'Prince Amukamara', u'CB', u'27', u'6-0', u'202', u'6', u'Nebraska', u'22', u'Aaron Colvin', u'CB', u'24', u'6-0', u'195', u'3', u'Oklahoma', u'27', u'Dwayne Gratz', u'CB', u'26', u'5-11', u'199', u'4', u'Connecticut', u'31', u'Davon House', u'CB', u'27', u'6-0', u'200', u'6', u'New Mexico State', u'29', u'Josh Johnson', u'CB', u'26', u'5-10', u'195', u'1', u'Purdue', u'20', u'Jalen Ramsey', u'CB', u'21', u'6-2', u'211', u'D', u'Florida State', u'37', u'Johnathan Cyprien', u'S', u'26', u'6-0', u'217', u'4', u'Florida Intl', u'39', u'Tashaun Gipson', u'S', u'26', u'5-11', u'210', u'5', u'Wyoming', u'23', u'James Sample', u'S', u'24', u'6-2', u'215', u'2', u'Louisville', u'25', u'Peyton Thompson', u'S', u'25', u'5-10', u'189', u'2', u'San Jos\xe9 State', u'47', u'Jarrod Wilson', u'S', u'22', u'6-2', u'209', u'D', u'Michigan', u'Equipos especiales', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'2', u'Jason Myers', u'PK', u'25', u'5-10', u'195', u'2', u'Marist', u'3', u'Brad Nortman', u'P', u'27', u'6-2', u'218', u'5', u'Wisconsin', u'46', u'Carson Tinker', u'LS', u'26', u'6-0', u'239', u'4', u'Alabama']]
[u'Ofensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD']


Si nos fijamos bien antes de tirar la toalla y pensar que ya no podemos hacer scraping(recuerda tienes 2 herramientas muy fuertes tu cerebro y python, ademas si cuentas con la ayuda de Dios ni te cuento)… si visualizamos bien aquí están fundidas las 3 tablas de “http://www.espn.com.ve/futbol-americano/nfl/equipo/plantel/_/nombre/jax” y bueno ahora como hacemos para sacar las 3 tablas mejor vamos y buscamos bien cada etiqueta(a mi me dio flojera hacerlo con html y me quede pensando como hacerlo con python)… hasta que di con esta solución sabemos que cada 10 elementos en esa lista ahí información importante como el numero del jugador y los otros datos:


[u'Ofensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'10',

Y bueno como las listas comienzan en 0 en la posición 9 tenemos nuestro primer dato interesantes, pero si colocamos un bucle para sacar los datos de 9 en 9 nos topamos con que el nombre de cada tabla también esta en la lista, por lo que se me ocurrió crear un bucle while debido a que no sabemos cuantos jugadores tiene cada equipo siempre en las tablas y entonces necesitamos que busque los  datos siempre que el nombre de la tabla siguiente no este en la lista, y luego para la siguiente tabla use el mismo contador +1 y ha comenzar de nuevo y así para la ultima tabla, el código final es el siguiente:


import requests, urllib2
from bs4 import BeautifulSoup
import re

import math

### Pagina primaria para buscar los datos
url_1er = 'http://www.espn.com.ve/futbol-americano/nfl/equipo/plantel/_/nombre/jax'

            
page_1era = urllib2.urlopen(url_1er)
            
soup_1er = BeautifulSoup(page_1era, 'lxml')

divicion_Diviciones = soup_1er.find_all('table',class_="tablehead" )
results = []
for row in divicion_Diviciones:
        ### los 2 condiciones se van a ejecutar para buscar las headers y luego las rows
        table_headers = row.find_all('th')
        if table_headers:
            results.append([headers.get_text() for headers in table_headers])
           
        table_data = row.find_all('td')
        if table_data:
	    results.append([data.get_text() for data in table_data])
            a_ver = [data for data in table_data]
            
            
            
print results
results_ofensiva = []

tabl_encbezados_todos = results[0][0:9]
print tabl_encbezados_todos
contador_i = 9
contador_j = 17

for jugador_ofensiva in range(0,50):
    jugador_nfl = results[0][contador_i:contador_j]
    
    if u'Defensiva' in results[0][contador_i:contador_j]:
        break
    else:
        results_ofensiva.append(jugador_nfl)
    
    contador_i += 8
    contador_j += 8
    
    contador_ii = contador_i + 8
    contador_jj = contador_j + 8

print" "
print" "
print" OFENSIVA"
print results_ofensiva



results_defensiva = []
contador_jj =  contador_jj + 1
contador_ii =  contador_ii + 1
for jugador_def in range(0,50):
    jugador_nfl = results[0][contador_ii:contador_jj]
    
    if (u'Equipos especiales') in results[0][contador_ii:contador_jj]:
        break
    else:
        results_defensiva.append(jugador_nfl)
    
    contador_ii += 8
    contador_jj += 8
        
    contador_iii = contador_ii +8
    contador_jjj = contador_jj +8

print" "
print" "
print" Defensiva"
print results_defensiva


results_especiales = []


contador_iii =  contador_iii + 1

contador_jjj =  contador_jjj + 1




for jugador_ofensiva in range(0,50):
    
    if results[0][contador_iii:contador_jjj]:
        jugador_nfl = results[0][contador_iii:contador_jjj]
        results_especiales.append(jugador_nfl)
    
    contador_iii += 8
    contador_jjj += 8


print" "
print" "
print" Equipos especiales"
print results_especiales





Y la salida es la siguiente:

 
[[u'Ofensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'10', u'Brandon Allen', u'QB', u'24', u'6-2', u'219', u'D', u'Arkansas', u'5', u'Blake Bortles', u'QB', u'24', u'6-5', u'239', u'3', u'UCF', u'7', u'Chad Henne', u'QB', u'31', u'6-3', u'219', u'9', u'Michigan', u'30', u'Corey Grant', u'RB', u'24', u'5-11', u'204', u'2', u'Auburn', u'33', u'Chris Ivory', u'RB', u'28', u'6-0', u'224', u'7', u'Tiffin University', u'16', u'Denard Robinson', u'RB', u'25', u'6-0', u'213', u'4', u'Michigan', u'24', u'T.J. Yeldon', u'RB', u'22', u'6-1', u'223', u'2', u'Alabama', u'17', u'Arrelious Benn', u'RM', u'28', u'6-2', u'222', u'6', u'Illinois', u'14', u'Justin Blackmon', u'RM', u'26', u'6-1', u'210', u'2', u'Oklahoma State', u'13', u'Rashad Greene', u'RM', u'23', u'5-11', u'190', u'2', u'Florida State', u'88', u'Allen Hurns', u'RM', u'24', u'6-3', u'201', u'3', u'Miami', u'11', u'Marqise Lee', u'RM', u'24', u'6-0', u'200', u'3', u'USC', u'15', u'Allen Robinson', u'RM', u'23', u'6-3', u'218', u'3', u'Penn State', u'81', u'Bryan Walters', u'RM', u'28', u'6-0', u'195', u'5', u'Cornell', u'83', u'Ben Koyack', u'TE', u'23', u'6-5', u'269', u'1', u'Notre Dame', u'89', u'Marcedes Lewis', u'TE', u'32', u'6-6', u'280', u'11', u'UCLA', u'87', u'Neal Sterling', u'TE', u'24', u'6-4', u'254', u'2', u'Monmouth', u'80', u'Julius Thomas', u'TE', u'28', u'6-5', u'256', u'6', u'Portland State', u'70', u'Luke Bowanko', u'C', u'25', u'6-6', u'313', u'3', u'Virginia', u'60', u'A.J. Cann', u'J', u'24', u'6-3', u'317', u'2', u'South Carolina', u'65', u'Brandon Linder', u'J', u'24', u'6-6', u'309', u'3', u'Miami', u'77', u'Patrick Omameh', u'J', u'26', u'6-4', u'316', u'4', u'Michigan', u'64', u'Chris Reed', u'J', u'24', u'6-5', u'310', u'1', u'Minnesota State', u'69', u'Tyler Shatley', u'J', u'25', u'6-3', u'306', u'2', u'Clemson', u'68', u'Kelvin Beachum', u'TE', u'27', u'6-3', u'316', u'5', u'SMU', u'76', u'Luke Joeckel', u'TE', u'24', u'6-6', u'312', u'4', u'Texas A&M', u'62', u'Jeffrey Linkenbach', u'TE', u'29', u'6-6', u'317', u'7', u'Cincinnati', u'78', u'Jermey Parnell', u'TE', u'30', u'6-6', u'323', u'6', u'Ole Miss', u'72', u'Josh Wells', u'TE', u'25', u'6-6', u'310', u'3', u'James Madison', u'Defensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'93', u'Tyson Alualu', u'DE', u'29', u'6-3', u'304', u'7', u'California', u'56', u'Dante Fowler Jr.', u'DE', u'22', u'6-3', u'250', u'2', u'Florida', u'91', u'Yannick Ngakoue', u'DE', u'21', u'6-2', u'246', u'D', u'Maryland', u'98', u'Chris Smith', u'DE', u'24', u'6-1', u'262', u'3', u'Arkansas', u'66', u'Jonathan Woodard', u'DE', u'22', u'6-5', u'271', u'D', u'Central Arkansas', u'96', u'Michael Bennett', u'DT', u'23', u'6-2', u'298', u'2', u'Ohio State', u'92', u'Sheldon Day', u'DT', u'22', u'6-1', u'285', u'D', u'Notre Dame', u'90', u'Malik Jackson', u'DT', u'26', u'6-5', u'300', u'5', u'Tennessee', u'95', u'Abry Jones', u'DT', u'25', u'6-4', u'318', u'4', u'Georgia', u'99', u"Sen'Derrick Marks", u'DT', u'29', u'6-2', u'309', u'8', u'Auburn', u'97', u'Roy Miller', u'DT', u'29', u'6-2', u'318', u'8', u'Texas', u'75', u'Jared Odrick', u'DL', u'28', u'6-5', u'298', u'7', u'Penn State', u'59', u'Arthur Brown', u'LB', u'26', u'6-0', u'240', u'4', u'Kansas State', u'44', u'Myles Jack', u'LB', u'21', u'6-1', u'247', u'D', u'UCLA', u'51', u'Paul Posluszny', u'LB', u'31', u'6-2', u'232', u'10', u'Penn State', u'52', u'Hayes Pullard III', u'LB', u'24', u'6-0', u'233', u'2', u'USC', u'55', u'Dan Skuta', u'LB', u'30', u'6-2', u'252', u'8', u'Grand Valley State', u'50', u'Telvin Smith', u'LB', u'25', u'6-3', u'218', u'3', u'Florida State', u'21', u'Prince Amukamara', u'CB', u'27', u'6-0', u'202', u'6', u'Nebraska', u'22', u'Aaron Colvin', u'CB', u'24', u'6-0', u'195', u'3', u'Oklahoma', u'27', u'Dwayne Gratz', u'CB', u'26', u'5-11', u'199', u'4', u'Connecticut', u'31', u'Davon House', u'CB', u'27', u'6-0', u'200', u'6', u'New Mexico State', u'29', u'Josh Johnson', u'CB', u'26', u'5-10', u'195', u'1', u'Purdue', u'20', u'Jalen Ramsey', u'CB', u'21', u'6-2', u'211', u'D', u'Florida State', u'37', u'Johnathan Cyprien', u'S', u'26', u'6-0', u'217', u'4', u'Florida Intl', u'39', u'Tashaun Gipson', u'S', u'26', u'5-11', u'210', u'5', u'Wyoming', u'23', u'James Sample', u'S', u'24', u'6-2', u'215', u'2', u'Louisville', u'25', u'Peyton Thompson', u'S', u'25', u'5-10', u'189', u'2', u'San Jos\xe9 State', u'47', u'Jarrod Wilson', u'S', u'22', u'6-2', u'209', u'D', u'Michigan', u'Equipos especiales', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'2', u'Jason Myers', u'PK', u'25', u'5-10', u'195', u'2', u'Marist', u'3', u'Brad Nortman', u'P', u'27', u'6-2', u'218', u'5', u'Wisconsin', u'46', u'Carson Tinker', u'LS', u'26', u'6-0', u'239', u'4', u'Alabama']]
[u'Ofensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD']
 
 
 OFENSIVA
[[u'10', u'Brandon Allen', u'QB', u'24', u'6-2', u'219', u'D', u'Arkansas'], [u'5', u'Blake Bortles', u'QB', u'24', u'6-5', u'239', u'3', u'UCF'], [u'7', u'Chad Henne', u'QB', u'31', u'6-3', u'219', u'9', u'Michigan'], [u'30', u'Corey Grant', u'RB', u'24', u'5-11', u'204', u'2', u'Auburn'], [u'33', u'Chris Ivory', u'RB', u'28', u'6-0', u'224', u'7', u'Tiffin University'], [u'16', u'Denard Robinson', u'RB', u'25', u'6-0', u'213', u'4', u'Michigan'], [u'24', u'T.J. Yeldon', u'RB', u'22', u'6-1', u'223', u'2', u'Alabama'], [u'17', u'Arrelious Benn', u'RM', u'28', u'6-2', u'222', u'6', u'Illinois'], [u'14', u'Justin Blackmon', u'RM', u'26', u'6-1', u'210', u'2', u'Oklahoma State'], [u'13', u'Rashad Greene', u'RM', u'23', u'5-11', u'190', u'2', u'Florida State'], [u'88', u'Allen Hurns', u'RM', u'24', u'6-3', u'201', u'3', u'Miami'], [u'11', u'Marqise Lee', u'RM', u'24', u'6-0', u'200', u'3', u'USC'], [u'15', u'Allen Robinson', u'RM', u'23', u'6-3', u'218', u'3', u'Penn State'], [u'81', u'Bryan Walters', u'RM', u'28', u'6-0', u'195', u'5', u'Cornell'], [u'83', u'Ben Koyack', u'TE', u'23', u'6-5', u'269', u'1', u'Notre Dame'], [u'89', u'Marcedes Lewis', u'TE', u'32', u'6-6', u'280', u'11', u'UCLA'], [u'87', u'Neal Sterling', u'TE', u'24', u'6-4', u'254', u'2', u'Monmouth'], [u'80', u'Julius Thomas', u'TE', u'28', u'6-5', u'256', u'6', u'Portland State'], [u'70', u'Luke Bowanko', u'C', u'25', u'6-6', u'313', u'3', u'Virginia'], [u'60', u'A.J. Cann', u'J', u'24', u'6-3', u'317', u'2', u'South Carolina'], [u'65', u'Brandon Linder', u'J', u'24', u'6-6', u'309', u'3', u'Miami'], [u'77', u'Patrick Omameh', u'J', u'26', u'6-4', u'316', u'4', u'Michigan'], [u'64', u'Chris Reed', u'J', u'24', u'6-5', u'310', u'1', u'Minnesota State'], [u'69', u'Tyler Shatley', u'J', u'25', u'6-3', u'306', u'2', u'Clemson'], [u'68', u'Kelvin Beachum', u'TE', u'27', u'6-3', u'316', u'5', u'SMU'], [u'76', u'Luke Joeckel', u'TE', u'24', u'6-6', u'312', u'4', u'Texas A&M'], [u'62', u'Jeffrey Linkenbach', u'TE', u'29', u'6-6', u'317', u'7', u'Cincinnati'], [u'78', u'Jermey Parnell', u'TE', u'30', u'6-6', u'323', u'6', u'Ole Miss'], [u'72', u'Josh Wells', u'TE', u'25', u'6-6', u'310', u'3', u'James Madison']]
 
 
 Defensiva
[[u'93', u'Tyson Alualu', u'DE', u'29', u'6-3', u'304', u'7', u'California'], [u'56', u'Dante Fowler Jr.', u'DE', u'22', u'6-3', u'250', u'2', u'Florida'], [u'91', u'Yannick Ngakoue', u'DE', u'21', u'6-2', u'246', u'D', u'Maryland'], [u'98', u'Chris Smith', u'DE', u'24', u'6-1', u'262', u'3', u'Arkansas'], [u'66', u'Jonathan Woodard', u'DE', u'22', u'6-5', u'271', u'D', u'Central Arkansas'], [u'96', u'Michael Bennett', u'DT', u'23', u'6-2', u'298', u'2', u'Ohio State'], [u'92', u'Sheldon Day', u'DT', u'22', u'6-1', u'285', u'D', u'Notre Dame'], [u'90', u'Malik Jackson', u'DT', u'26', u'6-5', u'300', u'5', u'Tennessee'], [u'95', u'Abry Jones', u'DT', u'25', u'6-4', u'318', u'4', u'Georgia'], [u'99', u"Sen'Derrick Marks", u'DT', u'29', u'6-2', u'309', u'8', u'Auburn'], [u'97', u'Roy Miller', u'DT', u'29', u'6-2', u'318', u'8', u'Texas'], [u'75', u'Jared Odrick', u'DL', u'28', u'6-5', u'298', u'7', u'Penn State'], [u'59', u'Arthur Brown', u'LB', u'26', u'6-0', u'240', u'4', u'Kansas State'], [u'44', u'Myles Jack', u'LB', u'21', u'6-1', u'247', u'D', u'UCLA'], [u'51', u'Paul Posluszny', u'LB', u'31', u'6-2', u'232', u'10', u'Penn State'], [u'52', u'Hayes Pullard III', u'LB', u'24', u'6-0', u'233', u'2', u'USC'], [u'55', u'Dan Skuta', u'LB', u'30', u'6-2', u'252', u'8', u'Grand Valley State'], [u'50', u'Telvin Smith', u'LB', u'25', u'6-3', u'218', u'3', u'Florida State'], [u'21', u'Prince Amukamara', u'CB', u'27', u'6-0', u'202', u'6', u'Nebraska'], [u'22', u'Aaron Colvin', u'CB', u'24', u'6-0', u'195', u'3', u'Oklahoma'], [u'27', u'Dwayne Gratz', u'CB', u'26', u'5-11', u'199', u'4', u'Connecticut'], [u'31', u'Davon House', u'CB', u'27', u'6-0', u'200', u'6', u'New Mexico State'], [u'29', u'Josh Johnson', u'CB', u'26', u'5-10', u'195', u'1', u'Purdue'], [u'20', u'Jalen Ramsey', u'CB', u'21', u'6-2', u'211', u'D', u'Florida State'], [u'37', u'Johnathan Cyprien', u'S', u'26', u'6-0', u'217', u'4', u'Florida Intl'], [u'39', u'Tashaun Gipson', u'S', u'26', u'5-11', u'210', u'5', u'Wyoming'], [u'23', u'James Sample', u'S', u'24', u'6-2', u'215', u'2', u'Louisville'], [u'25', u'Peyton Thompson', u'S', u'25', u'5-10', u'189', u'2', u'San Jos\xe9 State'], [u'47', u'Jarrod Wilson', u'S', u'22', u'6-2', u'209', u'D', u'Michigan']]
 
 
 Equipos especiales
[[u'2', u'Jason Myers', u'PK', u'25', u'5-10', u'195', u'2', u'Marist'], [u'3', u'Brad Nortman', u'P', u'27', u'6-2', u'218', u'5', u'Wisconsin'], [u'46', u'Carson Tinker', u'LS', u'26', u'6-0', u'239', u'4', u'Alabama']]

Y listo ya con esta información que analice para que no me de ningún error luego podemos comenzar con el siguiente paso que es la Base de Datos, para el Jueves la tendré lista :D, Saludos y que Dios les Bendiga

 

 

 

Pensando en Python, Diferentes Formas de hacer las cosas [parte1]

Bueno por hay he visto muy buenas practicas para programar en python y estaré comentándoles sobre ellas en la semana, pero lo que realmente me ha motivado a crear esta entrada es la serie de Python Scraping NFL y es que de verdad me he visto muy motivado, ya que he visto que aun lo que no tiene nada que ver con este proyecto me ha ayudado y se en Dios que seguirá ayudándome en los proyectos que he emprendido, he comenzado a mejorar el código de la serie Python Scraping NFL y estaba viendo que hay 8 Divisiones en la NFL o Conferencias, y hay 32 equipos, 4 en cada división, y necesito sacar por lo pronto los nombres de las divisiones para agregarlo a la tabla principal Tabla_Divisiones, luego buscar los equipos y agregarlos a la Tabla Equipos_NFL, lo pensé hacer con dos bucles uno para cada tabla y creo que es lo mas lógico… Aquí el Código hasta ahora:

import requests, urllib2
from bs4 import BeautifulSoup
import re

import math

### Pagina primaria para buscar los datos
url_1er = 'http://www.espn.com.ve/futbol-americano/nfl/equipos'

            
page_1era = urllib2.urlopen(url_1er)
            
soup_1er = BeautifulSoup(page_1era, 'lxml')

diviciones  = []


divicion_Diviciones = soup_1er.find_all('div',class_="mod-header stathead" )
for enlace in divicion_Diviciones:
    nombre_divicion = enlace.get_text()
    diviciones.append(nombre_divicion)

print diviciones

print len(diviciones)

print len(diviciones)

### Buscamos las estadisticas de los equipos con esta expresion regular
equipos_1era_tabla  = []

primer_enlace_equipos = soup_1er.find_all('a',class_="bi" )
for enlace in primer_enlace_equipos:
    nombre = enlace.get_text()
    equipos_1era_tabla.append(nombre)

print equipos_1era_tabla

print len(equipos_1era_tabla)

La salida del programa es esta:

[u'NFC Este', u'AFC Este', u'NFC Oeste', u'AFC Oeste', u'NFC Norte', u'AFC Norte', u'NFC Sur', u'AFC Sur']
8

[u'Dallas Cowboys', u'New York Giants', u'Philadelphia Eagles', u'Washington Redskins', u'Buffalo Bills', u'Miami Dolphins', u'New England Patriots', u'New York Jets', u'Arizona Cardinals', u'Los Angeles Rams', u'San Francisco 49ers', u'Seattle Seahawks', u'Denver Broncos', u'Kansas City Chiefs', u'Oakland Raiders', u'San Diego Chargers', u'Chicago Bears', u'Detroit Lions', u'Green Bay Packers', u'Minnesota Vikings', u'Baltimore Ravens', u'Cincinnati Bengals', u'Cleveland Browns', u'Pittsburgh Steelers', u'Atlanta Falcons', u'Carolina Panthers', u'New Orleans Saints', u'Tampa Bay Buccaneers', u'Houston Texans', u'Indianapolis Colts', u'Jacksonville Jaguars', u'Tennessee Titans']
32

El programa hasta aquí nos dice las Divisiones, cuantas son y los equipos y cuantos son, hasta aquí todo bien y ahora necesitaba tomar las 2 listas y fundirlas en una sola para luego saber a que división(con el ID  en la tabla) es a la que pertenece cada equipo, y lo primero que se me ocurrió fue esto:


count_primer = 0

for equipo_divicion in equipos_1era_tabla:
    if count_primer <=3:
        print diviciones[0]
        print equipo_divicion
        
    elif count_primer <=7:
        print diviciones[1]
        print equipo_divicion
        
    elif count_primer <=11:
        print diviciones[2]
        print equipo_divicion  
        
        
    elif count_primer <=15:
        print diviciones[3]
        print equipo_divicion   
        
    elif count_primer <=19:
        print diviciones[4]
        print equipo_divicion
        
    elif count_primer <=23:
        print diviciones[5]
        print equipo_divicion  
        
        
    elif count_primer <=27:
        print diviciones[6]
        print equipo_divicion    
        
    elif count_primer <=31:
        print diviciones[7]
        print equipo_divicion
    count_primer += 1
    

Y la verdad el programa hace lo que estaba pensando que hiciera con unos arreglos podríamos agregarle la Base de Datos y ya tendríamos parte de lo que estamos haciendo, y estaría bien… Pero yo normalmente me pongo a pensar mas allá, y ahora imaginaba tener que introducir código en cada if, y en el peor de los casos no en todo los if, pero se me ocurrió la siguiente idea para no tener que introducir los if…

Tenemos 32 equipos y 8 divisiones sabemos que cada 4 equipos pertenecen a una división, entonces me invente crear 2 contadores mas y dividirlos en 4 partes desde 0 a 0,75, el segundo contador es para redondear hacia abajo el valor del primero  y usarlo como entero ya que las listas no soportan flotantes o decimales, y así rebaje un código que ya se estaba haciendo muy largo a uno de unas pocas lineas que funciona:

Aquí el Código:


count_primer = 0
count_divicion = 0
count_redondeado = 0
for equipo_divicion in equipos_1era_tabla:

   print diviciones[count_redondeado]
   print equipos_1era_tabla[count_primer] 
   count_primer += 1
   count_divicion +=0.25
   count_redondeado = math.floor(count_divicion)
   count_redondeado = int(count_redondeado)

 Y esto era lo que quería compartir, el como un algoritmo bien pensado nos puede ayudar mucho a reducir el código y a mejorar el rendimiento…..

Saludos y que Dios te Bendiga….. Comentar es gratis