Ganale a La Inflacion, primeros pasos Calculadora de Satoshis a Bolivares

Esta publicación la agregare a Steem quien sabe si saco por lo menos unos dolares allá con la serie de cálculos y gráficas que colocare aquí 😀

No pienso explicar que es un satoshi, segun wikipedia:

Es esa mínima expresión del bitcoin a la que se denomina satoshi, en honor a quien creara todo el sistema. Por lo tanto, cuando se habla de que te pagan 100 satoshis por ver una publicidad online, quiere decir que te pagan 0,00000100 bitcoin.

Y bueno como no te van a pagar en Bitcoin voy a hacer una calculadora sencilla con el valor del DolarToday y el Bitcoin Hoy, y a medida que vayamos avanzando iremos mejorandolo y agregándole proyecciones Gráficas y otras cosas..

 


# -*- coding: utf-8 -*-
# -*- encoding: utf-8 -*-

valor_bitcoin_en_dolares = 742
valor_dolar_bolivar = 2474
bolivar= 0

Bitcoin_en_satoshis = 100000000
cuantos_satoshis = int(input("Escribe la cantidad de Satoshis a calcular:") )

calculo_valor_BTC_en_bolivares = valor_bitcoin_en_dolares * valor_dolar_bolivar

print "Cuanto Vale un Bitcoin", calculo_valor_BTC_en_bolivares, "Bolivares Fuertes"
calculo_en_bolivares = (cuantos_satoshis * valor_bitcoin_en_dolares * valor_dolar_bolivar)*1.00000 / Bitcoin_en_satoshis

print "Cuanto es",cuantos_satoshis ,"Satoschis, Son", calculo_en_bolivares, "Bolivares Fuertes"

calculo_en_dolares = (cuantos_satoshis * valor_bitcoin_en_dolares)*1.00000 / Bitcoin_en_satoshis

print "Cuanto es",cuantos_satoshis ,"Satoschis, Son", calculo_en_dolares, "Dolares"

Bueno esta es la primera entrada y a medida que fui escribiendo me surgieron ideas, Dios les Bendiga hasta la próxima 😀

 

 

Derrotado a La Inflacion en Venezuela

Primero que nada siempre han habido tiempos malos en nuestra sociedad, quizá nunca hayamos tenido ningún tiempo como el presente pero eso es otra historia, en la biblia dice que aprovechemos el tiempo por que los días son malos… En conclusión Dios siempre esta al control de todo, y es por esto que debemos encomendar nuestros planes según su Buena Voluntad…

Bueno quizá estas pensando  que hacer con ese dinero que tienes de las utilidades o algún dinero extra que tengas y pensándolo bien con el Dolar subiendo mas y mas cada día si lo metes en el Banco es posible que lo absorba la inflación y por ejemplo 200BsF hoy mañana sean solo 190 y así cada día no estoy exagerando en 2 idas el dolar a pasado de 2100 a 2479 BsF según Dolar Today es terrible la situación que vivimos en Venezuela..

No me gusta suponer ni mucho menos decirte que hacer con tu dinero pero a mi me gusta arriesgar(confiando en que Dios ponga en mi corazón discernimiento, en realidad de arriesgar quizá tenga muy poco jejeje) y es por eso que voy a hablar de finanza en este Blog debido a la Gran Crisis de Venezuela, Recuerda que Dios tiene un plan para todos… y bueno imagina comprar 100 dolares hace 3 meses cuando el dolar valía cerca de 1200BsF habrías Gastado 120.000BsF y ahora mismo tendrías cerca de 240.000BsF en realidad no habrías ganado mucho ya que los precios de los productos van en aumento a medida que el dolar se va estabilizando… Dios lo puede todo, te invito a leer 2 Reyes 7 del 1 al 3, claro que nosotros debemos buscar la manera de no malgastar nuestro dinero y meterlo al banco es malgastarlo ahora mismo

Y bueno comprar dolares solo sirve para mantener tus activos pero que tal si te digo que podríamos agregar una variable mas aunque es ligeramente arriesgado, El Bitcoin, si el Bitcoin es una moneda Digital mas cara que el ORO por algo sera, mucha gente teme usar la moneda pero es una moneda mas peor son los billetes de Venezuela que tienen ídolos de la Santería y aun así debemos usarlos pero no adorarlos ojo…

Y bueno si hacemos la misma cuenta, pero ahora incluimos comprar Bitcoins con los dolares que teníamos hace 3 meses, hace 3 meses 1 Bitcoin costaba entre 500 y 600 dolares, es decir que por encima podriamos comprar 1/6 de Bitcoins o lo que es lo mismo 16.666.667 Satoshis y ahora mismo el Bitcoin cuesta 750 Dolares, es decir habríamos ganado con 1 Bitcoin 1/4 de lo invertido es decir 25 Dolares ahora si  te tome la atención 😀

Tu dirás el Hubiera es pasado ahora es que quiero invertir :S, hace poco empresas como BBVA, Movistar, Grupo Santander, hasta Google y Facebook segun rumores estan invirtiendo en esta tecnología y la buena noticia es que mientras vaya aumentando el comercio Digital el valor del Bitcoin sera mas alto, Claro si no Viene Nuestro Señor Jesucristo Antes, pero imagina que te pregunte que hiciste con el Dinero que te Dio? no lo donaste, no ofrendaste, ni nada, dejaste que se lo comiera la inflación…

Bueno yo espero que a finales del año que viene el Bitcoin se coloque en 1500 Dolares, y el Dolar Baje por lo menos en Venezuela a 1500BsF… y entonces Diras por que invertir en Dolares o Bitcoin entonces, simple no pienso en comprar y vender como hace la mayoría de la gente eso mas bien destruye el Pais, ya que las Divisas salen del País y no hay retorno… Lo que quiero hacer es invertir por ejemplo  en Minería en la nube para comenzar con planes de 1 año y asi como esta el retorno seria en 5 a 7 meses y lo demas es ganancia es decir ganarías si inviertes 100 Dolares como mínimo 70 dolares mas lo que pueda subir el Bitcoin… en la proxima entrada espero tener mi Cloud ya funcionando para mostrarle como invertir en las mejores y ams fiables Cloud como mover su dinero de Bitcoins a Dolares o Bolivares y un par de calculadoras de suposiciones que pienso hacer para ver la trazabilidad de LA INVERSION, dicen que lleva riesgos epro en el peor de los casos en 4 meses tendras casi toda tu inversion…

Hace 1 año exactamente le dije a un tío que dice el tiene mucho Dinero, pero para mi es realmente Pobre por que no sabe de números y lo mas importante no tiene a Dios en su Corazón, le dije que invirtiera 360$ en 1 Bitcoin con lo que podía comprar un AntMiner S5 y de 5 a 7 meses tendría el retorno y luego ganaría Dividendos hasta que el Antminer muera es decir de 3 a 5 años como mínimo, y estaba un poco dispuesto y todo el mundo no hubo uno solo le dijo que si estaba loco, bueno con el dolar a 700BsF mas o menos y el Bitcoin a 360$ imagínate cuanto no tendría ahora mismo de Retorno… Bueno cosas asi me han pasado por no tener Dinero jeje, pero ahora mismo Dios esta Bendiciendo mi vida y quiero invertir no para mi si no para ayudar a tanta gente que no tiene la visión que Dios me ha dado, no económicamente si no mas bien usar el dinero para cursos seminarios Teológicos y de Tecnología, para las misiones y otras cosas… Bueno es lo que quiero esperemos que Dios me lo permita según su Buena y perfecta Voluntad…

Saludos Dios les Bendiga

 

 

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 😀

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

 

 

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

Python Scraping NFL [Parte preliminar]

Les cuento que he estado codificando el programa que espero sea de mucho provecho para el que pase por aquí como lo es para mi el aprendizaje que me va quedando cada vez que intento hacer algo en python…. de verdad que estos Días han sido de mucho aprendizaje y re-aprendizaje, la verdad es que se me pasan tantas cosas por la mente cuando estoy escribiendo código que tengo que anotar muchas cosas y cada vez tengo mejores ideas para proyectos que he dejado a medio empezar…. Lo único malo es que cuando no tenemos un diseño Real o metódico de que vamos a hacer y cual es el alcance normalmente no llegamos a cumplir con nuestras expectativas, por eso siempre trato de mirar las cosas desde varios ángulos.

Es precisamente esto lo que me ha pasado con el programa que he estado haciendo en mis ratos libres para la NFL(Ojala trabajara para ellos jajaja), mas bien el programa estadístico sobre la NFL,  les cuento había planificado hacerlo así:

  1. entrar a la pagina resultados y buscar todos los equipos
  2. entrar a cada equipo, agregar los datos del Equipo a la Tabla Equipo
  3. entrar a estadísticas del Equipo agregar los Datos a la tabla estadísticas_equipo
  4. entrar a cada jugador y agregar los datos importantes a la Tabla Jugadores_NFL

Ya aquí ahí un problema por que no es natural que el flujo de los datos sea de esta manera, el paso 4 debería ir antes que el 3 si queremos hacer una BD Relacional, por lo que aunque voy a colocar el código interesante que cree hasta ahora para buscar a los jugadores es decir hasta el Paso 4 sin tocar el 3(ojo no he agregado los datos a la BD) este es el código:

import requests, urllib2
from bs4 import BeautifulSoup
import re

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


html = urllib2.urlopen(url).read()



equipos_para_estadisticas  = []

### Buscamos las estadisticas de los equipos con esta expresion regular
enlaces_2 = re.findall('http://www.espn.com.ve/futbol-americano/nfl/equipo/estadisticas/_/nombre/(\S+?)"', html)
for enlace in enlaces_2:
    equipos_para_estadisticas.append(enlace)

    





jugadores = []

### Entramos a las estadisticas y buscamos a los jugadores
for equipos in equipos_para_estadisticas:
      url2 = 'http://www.espn.com.ve/futbol-americano/nfl/equipo/estadisticas/_/nombre/' + equipos
      
      page2 = urllib2.urlopen(url2).read()
            
      enlaces = re.findall('href="(http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/.*?)"', page2)
      
      jugadores_americano = []
      datos_jugador = []
      
      ### Entramos a la URL de cada jugador y extraemos los datos 

      for enlace2 in enlaces:
            print enlace2
            url_new_3 = enlace2
            
            page3 = urllib2.urlopen(url_new_3)
            
            soup3 = BeautifulSoup(page3, 'lxml')
            
            tables3 = soup3.find_all('div',class_="player-bio" )

            datos_jugador_siempre = []

            for row in tables3:
	        
                print row.text.strip().replace('\n',' ').replace("\t", " ").replace("\r", " ")
                
                d_jugador = row.text.strip().replace('\n',' ').replace("\t", " ").replace("\r", " ")
                    
                datos_jugador_siempre.append(d_jugador)
                for lista in datos_jugador_siempre:
                        numero_camiseta = lista[0:3] 
                        
                        print "Num de camiseta:", numero_camiseta
                        
                        posicion_jugador = lista[4:6] 
                        
                        print "Posicion:", posicion_jugador                        
                        
                        altura_jugador = re.findall('#[0-9].+? [A-Z].([0-9]\' [0-9])',lista )
                        if altura_jugador == []:
			    print "Altura No especificado"
                        else:
                            print "Altura:", altura_jugador[0] 

                        
                        
                        peso_jugador = re.findall('([0-9]+? lbs)',lista )
                        if peso_jugador == []:
			    print "Peso No especificado"
                        else:
                            print "Peso:", peso_jugador[0] 
                        
                

                        
                        fecha_nac = re.findall('Nacimiento([0-9]+? [a-z]..+? [0-9]...)',lista )
                        if fecha_nac == []:
			    print "Fecha Nacimiento No especificado"
                        else:
                            print "Fecha Nacimiento:", fecha_nac[0] 
                        

                        
                        
                           
                        lugar_nac = re.findall('[0-9]... en ([A-z]+, ..)',lista ) 
                        if lugar_nac == []:
			    print "Lugar Nacimiento No especificado"
                        else:
                            print "Lugar Nacimiento:", lugar_nac[0] 
                        
                                                  
                        experiencia_jugador = re.findall('Experiencia(......+?)Universidad',lista )
                        if experiencia_jugador == []:
			    print "Experiencia No especificada"
                        else:
                            print "Experiencia:", experiencia_jugador[0] 
                        
                        
                        universidad_jugador = re.findall('Universidad([A-Za-z]+)',lista )
                        if universidad_jugador == []:
			    print "Universidad No especificado"
                        else:
                            print "Universidad:", universidad_jugador[0] 
                        
                        

La salida es la siguiente:

 
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/2511109/trevor-siemian
#13 QB6' 3", 220 lbsDenver BroncosFecha de Nacimiento26 dic, 1991 en Danbury, CT (Edad: 24)Reclutado  2015: 7ma Rnd, 250th por DENExperiencia2do TemporadaUniversidadNorthwestern
Num de camiseta: #13
Posicion: QB
Altura: 6' 3
Peso: 220 lbs
Fecha Nacimiento: 26 dic, 1991
Lugar Nacimiento: Danbury, CT
Experiencia: 2do Temporada
Universidad: Northwestern
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/2511109/trevor-siemian
#13 QB6' 3", 220 lbsDenver BroncosFecha de Nacimiento26 dic, 1991 en Danbury, CT (Edad: 24)Reclutado  2015: 7ma Rnd, 250th por DENExperiencia2do TemporadaUniversidadNorthwestern
Num de camiseta: #13
Posicion: QB
Altura: 6' 3
Peso: 220 lbs
Fecha Nacimiento: 26 dic, 1991
Lugar Nacimiento: Danbury, CT
Experiencia: 2do Temporada
Universidad: Northwestern
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/16040/c.j.-anderson
#22 RB5' 8", 224 lbsDenver BroncosFecha de Nacimiento10 feb, 1991 en Richmond, CA (Edad: 25)Experiencia4to TemporadaUniversidadCalifornia
Num de camiseta: #22
Posicion: RB
Altura: 5' 8
Peso: 224 lbs
Fecha Nacimiento: 10 feb, 1991
Lugar Nacimiento: Richmond, CA
Experiencia: 4to Temporada
Universidad: California
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/16040/c.j.-anderson
#22 RB5' 8", 224 lbsDenver BroncosFecha de Nacimiento10 feb, 1991 en Richmond, CA (Edad: 25)Experiencia4to TemporadaUniversidadCalifornia
Num de camiseta: #22
Posicion: RB
Altura: 5' 8
Peso: 224 lbs
Fecha Nacimiento: 10 feb, 1991
Lugar Nacimiento: Richmond, CA
Experiencia: 4to Temporada
Universidad: California
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/13295/emmanuel-sanders
#10 RM5' 11", 180 lbsDenver BroncosFecha de Nacimiento17 mar, 1987 en Bellville, TX (Edad: 29)Reclutado  2010: 3er Rnd, 82nd por PITExperiencia7ma TemporadaUniversidadSMU
Num de camiseta: #10
Posicion: RM
Altura: 5' 1
Peso: 180 lbs
Fecha Nacimiento: 17 mar, 1987
Lugar Nacimiento: Bellville, TX
Experiencia: 7ma Temporada
Universidad: SMU
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/13295/emmanuel-sanders
#10 RM5' 11", 180 lbsDenver BroncosFecha de Nacimiento17 mar, 1987 en Bellville, TX (Edad: 29)Reclutado  2010: 3er Rnd, 82nd por PITExperiencia7ma TemporadaUniversidadSMU
Num de camiseta: #10
Posicion: RM
Altura: 5' 1
Peso: 180 lbs
Fecha Nacimiento: 17 mar, 1987
Lugar Nacimiento: Bellville, TX
Experiencia: 7ma Temporada
Universidad: SMU
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/17497/todd-davis
#51 LB6' 1", 230 lbsDenver BroncosFecha de Nacimiento17 may, 1992 en Inglewood, CA (Edad: 24)Experiencia3er TemporadaUniversidadSacramento State
Num de camiseta: #51
Posicion: LB
Altura: 6' 1
Peso: 230 lbs
Fecha Nacimiento: 17 may, 1992
Lugar Nacimiento: Inglewood, CA
Experiencia: 3er Temporada
Universidad: Sacramento
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/17497/todd-davis
#51 LB6' 1", 230 lbsDenver BroncosFecha de Nacimiento17 may, 1992 en Inglewood, CA (Edad: 24)Experiencia3er TemporadaUniversidadSacramento State
Num de camiseta: #51
Posicion: LB
Altura: 6' 1
Peso: 230 lbs
Fecha Nacimiento: 17 may, 1992
Lugar Nacimiento: Inglewood, CA
Experiencia: 3er Temporada
Universidad: Sacramento
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/14398/chris-harris-jr.
#25 CB5' 10", 199 lbsDenver BroncosFecha de Nacimiento18 jun, 1989 en Bixby, OK (Edad: 27)Experiencia5to TemporadaUniversidadKansas
Num de camiseta: #25
Posicion: CB
Altura: 5' 1
Peso: 199 lbs
Fecha Nacimiento: 18 jun, 1989
Lugar Nacimiento: Bixby, OK
Experiencia: 5to Temporada
Universidad: Kansas
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/14398/chris-harris-jr.
#25 CB5' 10", 199 lbsDenver BroncosFecha de Nacimiento18 jun, 1989 en Bixby, OK (Edad: 27)Experiencia5to TemporadaUniversidadKansas
Num de camiseta: #25
Posicion: CB
Altura: 5' 1
Peso: 199 lbs
Fecha Nacimiento: 18 jun, 1989
Lugar Nacimiento: Bixby, OK
Experiencia: 5to Temporada
Universidad: Kansas
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/2511109/trevor-siemian
#13 QB6' 3", 220 lbsDenver BroncosFecha de Nacimiento26 dic, 1991 en Danbury, CT (Edad: 24)Reclutado  2015: 7ma Rnd, 250th por DENExperiencia2do TemporadaUniversidadNorthwestern
Num de camiseta: #13
Posicion: QB
Altura: 6' 3
Peso: 220 lbs
Fecha Nacimiento: 26 dic, 1991
Lugar Nacimiento: Danbury, CT
Experiencia: 2do Temporada
Universidad: Northwestern
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/16040/c.j.-anderson
#22 RB5' 8", 224 lbsDenver BroncosFecha de Nacimiento10 feb, 1991 en Richmond, CA (Edad: 25)Experiencia4to TemporadaUniversidadCalifornia
Num de camiseta: #22
Posicion: RB
Altura: 5' 8
Peso: 224 lbs
Fecha Nacimiento: 10 feb, 1991
Lugar Nacimiento: Richmond, CA
Experiencia: 4to Temporada
Universidad: California
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/2974317/andy-janovich
#32 FB6' 1", 238 lbsDenver BroncosFecha de Nacimiento23 may, 1993 (Edad: 23)Reclutado  2016: 6to Rnd, 176th por DENExperiencia NOVATOUniversidadNebraska
Num de camiseta: #32
Posicion: FB
Altura: 6' 1
Peso: 238 lbs
Fecha Nacimiento: 23 may, 1993
Lugar Nacimiento No especificado
Experiencia:  NOVATO
Universidad: Nebraska
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/2511109/trevor-siemian
#13 QB6' 3", 220 lbsDenver BroncosFecha de Nacimiento26 dic, 1991 en Danbury, CT (Edad: 24)Reclutado  2015: 7ma Rnd, 250th por DENExperiencia2do TemporadaUniversidadNorthwestern
Num de camiseta: #13
Posicion: QB
Altura: 6' 3
Peso: 220 lbs
Fecha Nacimiento: 26 dic, 1991
Lugar Nacimiento: Danbury, CT
Experiencia: 2do Temporada
Universidad: Northwestern
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/3122866/devontae-booker
#23 RB5' 11", 219 lbsDenver BroncosFecha de Nacimiento27 may, 1992 en Sacramento, CA (Edad: 24)Reclutado  2016: 4to Rnd, 136th por DENExperiencia NOVATOUniversidadUtah
Num de camiseta: #23
Posicion: RB
Altura: 5' 1
Peso: 219 lbs
Fecha Nacimiento: 27 may, 1992
Lugar Nacimiento: Sacramento, CA
Experiencia:  NOVATO
Universidad: Utah
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/13295/emmanuel-sanders
#10 RM5' 11", 180 lbsDenver BroncosFecha de Nacimiento17 mar, 1987 en Bellville, TX (Edad: 29)Reclutado  2010: 3er Rnd, 82nd por PITExperiencia7ma TemporadaUniversidadSMU
Num de camiseta: #10
Posicion: RM
Altura: 5' 1
Peso: 180 lbs
Fecha Nacimiento: 17 mar, 1987
Lugar Nacimiento: Bellville, TX
Experiencia: 7ma Temporada
Universidad: SMU
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/13216/demaryius-thomas
#88 RM6' 3", 229 lbsDenver BroncosFecha de Nacimiento25 dic, 1987 en Montrose, GA (Edad: 28)Reclutado  2010: 1er Rnd, 22avo por DENExperiencia7ma TemporadaUniversidadGeorgia Tech
Num de camiseta: #88
Posicion: RM
Altura: 6' 3
Peso: 229 lbs
Fecha Nacimiento: 25 dic, 1987
Lugar Nacimiento: Montrose, GA
Experiencia: 7ma Temporada
Universidad: Georgia
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/16040/c.j.-anderson
#22 RB5' 8", 224 lbsDenver BroncosFecha de Nacimiento10 feb, 1991 en Richmond, CA (Edad: 25)Experiencia4to TemporadaUniversidadCalifornia
Num de camiseta: #22
Posicion: RB
Altura: 5' 8
Peso: 224 lbs
Fecha Nacimiento: 10 feb, 1991
Lugar Nacimiento: Richmond, CA
Experiencia: 4to Temporada
Universidad: California
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/14085/virgil-green
#85 TE6' 5", 255 lbsDenver BroncosFecha de Nacimiento3 ago, 1988 en San Bernardino, CA (Edad: 28)Reclutado  2011: 7ma Rnd, 204th por DENExperiencia6to TemporadaUniversidadNevada
Num de camiseta: #85
Posicion: TE
Altura: 6' 5
Peso: 255 lbs
Fecha Nacimiento: 3 ago, 1988
Lugar Nacimiento No especificado
Experiencia: 6to Temporada
Universidad: Nevada
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/16969/kapri-bibbs
^CTraceback (most recent call last):

De verdad que el programa hace lo que tiene que hacer pero no es totalmente funcional desde mi punto de vista para diseñar este programa fui entendiendo que el flujo de los datos debe ser lo mas real posible ademas que el programa debe constar de 2 fases o dos programas y una sola BD, por que hay una fase estática o de recolección de datos estáticos y luego tengo la fase Dinámica donde debemos ver quien jugo con quien como le fue, las estadísticas para cada jugador de ese juego, y otras muchas cosas interesantes…

Por ahora nos vamos a centrar en el diseño y en cuales son los datos que vamos a extraer 1 sola vez cada cierto tiempo, por ejemplo el diseño puede ser:

  1. Extraer el nombre del equipo y la división de la pagina Equipos, extraer los URLs de cada Equipo
  2. ingresar a la Plantilla de cada equipo, extraer los URLs de cada jugador, extraer algunos datos de aquí
  3. ingresar a cada jugador y extraer los datos interesantes, unificar los datos con los datos extraídos anteriormente.
  4. ingresar a Estadisticas por Equipo y  extraer los datos de cada jugador, aqui tendría que crear varias bases de datos o unificar por 1 numero para ver los defensa y las ofensivas de cada equipo
  5. Los siguientes pasos serian las parte dinámica, por ejemplo los score contra cada equipo, juego a juego, las estadísticas de cada juego para el equipo y para cada jugador

Hasta aquí vamos a llegar con esta interesante aventura, que Dios les Bendiga

 

 

Scraping con Python, Buscar todas las href

En estos días que he estado  trabajando con Scraping de ESPN específicamente NFL, me he dado cuenta que una de las cosas que voy a hacer siempre es revisar las URLs que hay en la pagina para conectarme a otras paginas de interés, claro queda a cada diseño de aplicación cuales datos guardar y cuales no….

No quise seguir con el Scraping a el fútbol soccer ya que me di cuenta que no contaban con tantas estadísticas por jugador, y a mi lo que me interesa es esto para implementar la Sabermetria de Jugadores y cuanto ayudan al equipo esta o aquella rotación o esta o aquella batería(en Béisbol) en NFL se manejan muchas otras cosas aunque se tratan con mayor sencillez y creo que esto puede cambiar….

Como ejemplo podemos tomar la NFL, donde tenemos los partidos jugados y de aquí podemos hacer clics en el equipo y entrar a plantillas o estadísticas o a la ficha del juego, pero para poder hacer un robot que consuma todos estos datos necesitamos decirle busca las URLs y ya luego decirle cuales visitar y que datos buscar, así de sencillo es…

Vamos a tomar como ejemplo en lo que estoy trabajando Equipos de la NFL vamos a verificar cuales son todas las paginas a las que hace referencia esta pagina simplemente mirando los href que son los hipervinculos a otras paginas :D, ojo en el camino nos vamos a encontrar con partes de la paginas con sus prefijos en las mismas pero esto es otra historia….

Para buscar las URLs tenemos 2 opciones usar Expresiones Regulares y usar BeautifulSoup que es mas o menos lo mismo pero creo que la que consume menos recursos es Expresiones regulares aquí vamos a ver los 2 ejemplos, aquí el primero con Expresiones Regulares:

import urllib2, re

    
url = ("http://www.espn.com.ve/futbol-americano/nfl/equipos")
html = urllib2.urlopen(url).read()
enlaces = re.findall('href="(http://.*?)"', html)
for enlace in enlaces:
    print enlace

la salida de este programa es la siguiente:

http://espndeportes.espn.com/futbol-americano/nfl/equipos
http://www.espn.com.mx/futbol-americano/nfl/equipos
http://www.espn.com.co/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://www.espn.cl/futbol-americano/nfl/equipos
http://www.espn.com.ar/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://buscar.espn.go.com/s/opensearch_es
http://a.espncdn.com/combiner/c?v=201105061640&css=global_reset.r1.css,base.r236.css,modules.r453.css,global_header.r41.css,modules/global_nav.r47.css,mem2010/mem.r5.css,mem2010/mem_espn360.r2.css,warvertical12e.css,universal_overlay/universal_overlay.css,universal_overlay/media_overlay.css,universal_overlay/video_overlay.css,universal_overlay/photo_overlay.css,universal_overlay/dyk_overlay.css,modules_deportes.201004281136.css,/espn/espn/styles/frontpage_scoreboard_10,base.deportes.r21.css,soccer.base.r31.css
http://a.espncdn.com/combiner/c?css=sprites/teamlogos.r15.css
http://a.espncdn.com/prod/styles/modules/master_tables_09.r3.css
http://a.espncdn.com/players/web-player-bundle/latest/espn-web-player-bundle.css
http://a.espncdn.com/legacy/transitionalHeader/1.0.10/css/transitional-header.css
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/dal/dallas-cowboys
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyg/new-york-giants
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/phi/philadelphia-eagles
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/wsh/washington-redskins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/buf/buffalo-bills
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/mia/miami-dolphins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ne/new-england-patriots
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyj/new-york-jets
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ari/arizona-cardinals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/la/los-angeles-rams
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sf/san-francisco-49ers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sea/seattle-seahawks
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/den/denver-broncos
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/kc/kansas-city-chiefs
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/oak/oakland-raiders
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sd/san-diego-chargers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/chi/chicago-bears
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/det/detroit-lions
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/gb/green-bay-packers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/min/minnesota-vikings
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/bal/baltimore-ravens
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cin/cincinnati-bengals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cle/cleveland-browns
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/pit/pittsburgh-steelers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/atl/atlanta-falcons
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/car/carolina-panthers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/no/new-orleans-saints
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/tb/tampa-bay-buccaneers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/hou/houston-texans
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ind/indianapolis-colts
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/jax/jacksonville-jaguars
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ten/tennessee-titans
http://www.espnrun.com/
http://espnplay.com
http://www.espn.com.ve
http://guia.espn.com/
http://www.espn.com.ve/videohub/video/indexDeportes
http://www.espn.com.ve/futbol-americano/nfl/estadisticas
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/jugadores
Home
http://preferences.truste.com/2.0/?type=espn&affiliateId=148 http://www.espn.com/espn/news/story?page=patents http://www.espn.bumeran.com.ar http://www.joinourteam.espn.com/joinourteam/
Spanish – Latin American / Español – Latinoamérica – Disney Terms of Use
Spanish

Ahora si solo queremos los equipos deberíamos hacer algo como esto:

import urllib2, re

    
url = ("http://www.espn.com.ve/futbol-americano/nfl/equipos")
html = urllib2.urlopen(url).read()
enlaces = re.findall('href="(http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre.*?)"', html)
for enlace in enlaces:
    print enlace

Y la salida seria algo como lo siguiente:


http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/dal/dallas-cowboys
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyg/new-york-giants
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/phi/philadelphia-eagles
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/wsh/washington-redskins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/buf/buffalo-bills
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/mia/miami-dolphins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ne/new-england-patriots
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyj/new-york-jets
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ari/arizona-cardinals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/la/los-angeles-rams
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sf/san-francisco-49ers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sea/seattle-seahawks
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/den/denver-broncos
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/kc/kansas-city-chiefs
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/oak/oakland-raiders
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sd/san-diego-chargers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/chi/chicago-bears
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/det/detroit-lions
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/gb/green-bay-packers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/min/minnesota-vikings
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/bal/baltimore-ravens
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cin/cincinnati-bengals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cle/cleveland-browns
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/pit/pittsburgh-steelers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/atl/atlanta-falcons
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/car/carolina-panthers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/no/new-orleans-saints
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/tb/tampa-bay-buccaneers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/hou/houston-texans
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ind/indianapolis-colts
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/jax/jacksonville-jaguars
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ten/tennessee-titans

Ahora si queremos sacar el short-name de cada equipo  seria algo como lo siguiente:

import urllib2,re
url = ("http://www.espn.com.ve/futbol-americano/nfl/equipos")
html = urllib2.urlopen(url).read()
enlaces = re.findall('href="http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/([a-z]+?)/', html)

nombres_short = []
for enlace in enlaces:
    nombres_short.append(enlace)    

print nombres_short

y la salida algo como esto:

['dal', 'nyg', 'phi', 'wsh', 'buf', 'mia', 'ne', 'nyj', 'ari', 'la', 'sf', 'sea', 'den', 'kc', 'oak', 'sd', 'chi', 'det', 'gb', 'min', 'bal', 'cin', 'cle', 'pit', 'atl', 'car', 'no', 'tb', 'hou', 'ind', 'jax', 'ten']

La verdad no esta mal hacerlo con Expresiones regulares si buscamos cosas muy especificas en el HTML digo, por que casi siempre vamos a tener que hacer uso de ellas, muchos piensan que por que usan librerías externas no están usando RE y les cuento que muchas librerías de búsqueda están programadas en RE básicamente, Para hacer búsquedas a fondo necesitamos librerías especiales para HTML y para esto usaremos BeautifulSoup nada mas miremos como queda nuestro código que busca URLs con esta librería:

from BeautifulSoup import BeautifulSoup
import urllib2
import re

html_page = urllib2.urlopen("http://www.espn.com.ve/futbol-americano/nfl/equipos")
soup = BeautifulSoup(html_page)
for link in soup.findAll('a'):
    print link.get('href')
    
    
print 


La salida contiene en parte esto(no la voy a colocar completa):


http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/estadisticas/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/calendario/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/plantel/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/profundidad/_/nombre/dal/dallas-cowboys
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/estadisticas/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/calendario/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/plantel/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/profundidad/_/nombre/nyg/new-york-giants
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/estadisticas/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/calendario/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/plantel/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/profundidad/_/nombre/phi/philadelphia-eagles
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/estadisticas/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/calendario/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/plantel/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/profundidad/_/nombre/wsh/washington-redskins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/estadisticas/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/calendario/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/plantel/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/profundidad/_/nombre/buf/buffalo-bills

Podemos visualizar URLs que antes no veíamos, y ahora si podemos usar nuestras RE para buscar cosas especificas :D, hasta aquí lo vamos a dejar no quiero ser repetitivo, Dios les Bendiga… Hasta la próxima

 

 

Scraping con Python la Liga BBVA de ESPN [Parte 4]

Bueno esta semana estuve un poco de aquí para alla, por lo que no había tenido tiempo de postear el Código para extraer los datos de ESPN de las tablas De posiciones así como las estadísticas de cada equipo, les cuento que se nos viene la NFL y la LVBP(Liga Venezolana de Béisbol Profesional), por lo que me voy a ver obligado a dar otro rumbo a las tablas de jugadores en ESPN y los voy a cambiar a NFL y LVBP, ojo si vamos a crear la tabla de jugadores para cada semana, pero no vamos a hacer mucho esfuerzo, por lo que les prometo una entrada mas de esta Serie donde tendremos los jugadores y sus estadísticas en las diferentes ligas de fútbol, y mas adelante seguiremos aprendiendo con python y ESPN pero en otros deportes…

También les quería comentar que como actualmente tengo bastante trabajo en ODOO v9 voy a tener redireccionar un poco y nos vamos a olvidar un rato de SQLITE3 y los siguientes scraping que voy a hacer van a ser para ODOO… sin mas nada que decir por ahora, manos a la obra….

Aquí tenemos el código que he venido preparando el cual voy a comentar brevemente dentro del mismo y luego voy a ir comentando las salidas, no voy ahondar mucho por que es muy largo mas de 200 lineas funcionales que bien se pueden rebajar a 110 mas o menos pero prefiero dejarlo así :D, este es el código:

### Autor Cesar Chirinos 
### Autor WordPress Orfeo
### Licencia GPL
### Publicado en stickybitshell.Wordpress

import sqlite3

import urllib2, re
from bs4 import BeautifulSoup
import re
from prettytable import PrettyTable

### Creamos la base de datos Ligas_varias_futbol

conn = sqlite3.connect('Final_Ligas_varias_futbol.sqlite3')

cur = conn.cursor()

### Agregue esto por que la pagina no me dice en que jornada o semana estamos
### Lo bueno de los otros deportes es que tienen mucha mas informacion de los jugadores
### y al hacerlo por partido vamos agregando los datos si existen a diferentes tablas 😀
liga_fecha_1 = int(input("Escriba El numero de la fecha a ingresar: "))

### Podemos comentar estas lineas cuando ya la tengamos en produccion
#cur.execute('''DROP TABLE IF EXISTS Ligas''')
#cur.execute('''DROP TABLE IF EXISTS Equipos_Ligas''')
#cur.execute('''DROP TABLE IF EXISTS Posiciones_por_Fechas''')

## Tabla para las ligas
cur.execute('''CREATE TABLE IF NOT EXISTS Ligas (id_liga INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, nombre_liga TEXT UNIQUE,  pais_liga TEXT UNIQUE)''')

### Tabla para todos los equipos involucrados
cur.execute('''CREATE TABLE IF NOT EXISTS Equipos_Ligas (id_equipo INTEGER PRIMARY KEY, nombre_equipo TEXT UNIQUE,  id_equipo_ESPN INTEGER UNIQUE, id_liga INTEGER)''')


### Creamos la tabla para guardar losd atos de cada jornada o semana 
cur.execute('''
 CREATE TABLE IF NOT EXISTS Posiciones_por_Fechas (id_posiciones INTEGER PRIMARY KEY, id_equipo INTEGER NOT NULL,id_liga INTEGER NOT NULL , posicion INTEGER NOT NULL,
                                                    part_jugado  INTEGER NOT NULL, p_gan INTEGER NOT NULL ,p_emp INTEGER NOT NULL, p_per INTEGER NOT NULL, 
                                                    gol_favor INTEGER NOT NULL, gol_contra INTEGER NOT NULL, Dif_Gol INTEGER NOT NULL,
                                                    p_gan_casa INTEGER NOT NULL, p_emp_casa INTEGER NOT NULL, p_per_casa INTEGER NOT NULL, gol_favor_casa INTEGER NOT NULL ,
                                                    gol_contra_casa INTEGER NOT NULL, p_gan_vis INTEGER NOT NULL, p_emp_vis INTEGER NOT NULL, p_per_vis INTEGER NOT NULL,
                                                    gol_contra_vis  INTEGER NOT NULL, gol_favor_vis INTEGER NOT NULL, Puntos_tot INTEGER NOT NULL ,
                                                    liga_fecha INTEGER NOT NULL UNIQUE)''')
### HAY q arreglar la tabla asi como se colocan los datos, se imprimen 😀

        ### podemos agragar otras ligas
urls_ligas = [ "spanish-primera-division/15/table" , "english-premier-league/23/table" ,  "italian-serie-a/12/table", "german-bundesliga/10/table" ]

tabla_formateada =[]
contador = 0
liga_para_id = 1

### creamos un bucle for para recorrer las ligas que queremos
for liga in urls_ligas:
  url =  "http://www.espnfc.us/" +  liga 
  
  ### Sacamos los nombres haciendo uso de expresiones regulares
  sacar_nombre =  re.findall('^(\S+?)/', liga)
  nombre_liga = sacar_nombre[0]
  ### Sacamos el pais haciendo uso de expresiones regulares
  sacar_pais =  re.findall('^(\S+?)-', liga)
  pais_liga = sacar_pais[0]
    
    
  ### Ahora agregamos los datos extraidos a la tabla Ligas
  cur.execute('''INSERT OR IGNORE INTO Ligas (nombre_liga, pais_liga) VALUES ( ?,? )''',(nombre_liga,pais_liga )) # Agregamos los datos a las ligas que queremos estudiar
    
    
  ### Antes habiamos hecho uso de expresiones regulares, ahora vamos a usar beautiful soup para dar un mejor formato que nos permita hacer scrap sobre la pagina
  page = urllib2.urlopen(url)
  
  
  ### Formateamos las pagina a lxml con beautifulsoup
  soup = BeautifulSoup(page, "lxml")

  ### Buscamosla primera table y las agregamos a table
  table = soup.find('table')
  
  ### buscamos todas las tr o table row, y las agregamso a row
  rows = table.find_all('tr')

  results = []
  

  Equipos = []
  ids_ESPN = []
  
  ### Creamos un bucle para buscar en cada row
  for row in rows:
        ### 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]
            


  ### Ahora eliminamos los 2 primeros elementos de la lista, en realidad eliminamos las  2  primeras listas que  hay en results con el este bucle y el if
  i = 0
  for datos  in results:
  
    if i >= 2:
        ### Ahora vamos a eliminar el ruido o las columnas que no nos dicen nada
        while ( u'\xa0'  or u'\n' or u'' )  in datos:
            if (u'')  in datos :
                datos.remove(u'')
            elif  u'\n'  in datos:
	       datos.remove(u'\n')
	    elif  u'\xa0'  in datos:
	       datos.remove(u'\xa0')
	       
        
        
        ### Agregamos la salida a una nueva lista
        tabla_formateada.append(datos)

    i += 1        

  
  
  ### Ahora llega la parte divertida
  ### Buscamos los nombres de los equipos y sus ids, esto para crear la relacion entre la tabla 2 y 3
  ### Asi como tambien para en un futuro cuando necesitemos buscar los jugadores de cada equipo usar el id para ingresar a ESPN
  ###Buscamos todas las td que contienen la class team
  elementos_equipos = soup.find_all("td", class_="team")

  ids_espn =  []
  for element in elementos_equipos:
    
    ### Ahi equipos mal formateados que nos daran error, normalmente son los mas nuevos, si necesitara explicar mas a fondo este codigo, haria uso de print para que vayamos 
    ### viendo las salidas de cada linea importante y asi ir moviendonos por python y html e ir tomando lo que necesitamos
    if "\n\t\t\t\t\t\t\t\t\t\t\t\t\tLeganes\n\t\t\t\t\t\t\t\t\t\t\t\t" in element:
        equipo = "Leganes"
        id_espn = "17534"
      
        Equipos.append(equipo)
        ids_espn.append(id_espn)
    elif "\n\t\t\t\t\t\t\t\t\t\t\t\t\tRB Leipzig\n\t\t\t\t\t\t\t\t\t\t\t\t" in element:
        equipo = "RB Leipzig "
        id_espn = "11420"
      
        Equipos.append(equipo)
        ids_espn.append(id_espn)
        
    ### Este else se ejecutara siempre que no sean ninguno de los 2 equipos raros de arriba es decir el 99% de las veces 😀
    else:
      
        ### Busca las href en las etiquetas a
        id_espn_sin_formato= element.a["href"]
        ### hacemos uso de RE para extraer el id de la url
        id_espn_sin = re.findall('http://www.espnfc.us/club/\S+?/([0-9]+?)/', id_espn_sin_formato)
        
        ### sacamos el id de la lista
        id_espn = id_espn_sin[0]
        
        ### Extraemos el nombre del equipo
        equipo = element.get_text()
        Equipos.append(equipo)
        
        ids_espn.append(id_espn)
        
  #print  Equipos
  
  #print ids_espn
  
  
  #print len(ids_espn)
  #print len(Equipos)
  
  ### Este bucle es innecesario pero decidi hacerlo asi
  count_eq = 0              
  for equipo in Equipos:
        nombre_equipo= equipo.strip()
        id_equipo_ESPN = ids_espn[count_eq]
        id_liga = liga_para_id
        cur = conn.cursor()
        cur.execute('''INSERT OR IGNORE INTO Equipos_Ligas (nombre_equipo, id_equipo_ESPN, id_liga) VALUES ( ?,?,? )''',(nombre_equipo,id_equipo_ESPN ,id_liga)) # Agregamos los datos a las ligas que queremos estudiar
        
        
        count_eq +=1

  liga_para_id += 1  
  contador += 1

### Imprimimos las ligas que tenemos

SQLSTR = "SELECT  *  FROM Ligas"


Equipos_Liga =  "SELECT  *  FROM Equipos_Ligas"
print
print
for word in cur.execute(SQLSTR):
    print str(word[0]),"La liga:", word[1] ,"Es de :",  word[2]
  
print
print
print

###Generamos los equipos de la liga con su id liga para saber a cual corresponden en un futuro

print "Equipos de la liga"
join_liga =  "SELECT * FROM Equipos_Ligas"


formato_equipos = []
for word in cur.execute(join_liga):
    print word
    formato_equipos.append(word)


count = 0
for word in formato_equipos:  ### AQui debo modificar el cur.execute por otra cosa ya que tengo cur.execute abajo y rompe el for
    id_equipo = word[0]
    nombre_equipo = word[1]
    id_equipo_ESPN =  word[2]
    id_liga = word[3]
    if nombre_equipo in tabla_formateada[count][1]:
        posicion = tabla_formateada[count][0]
        #print posicion
        ###Totales
        part_jugado = tabla_formateada[count][2]
        #print part_jugado
        p_gan = tabla_formateada[count][3]
        #print p_gan
        p_emp = tabla_formateada[count][4]
        #print p_emp
        p_per = tabla_formateada[count][5]
        #print p_per
        
        gol_favor = tabla_formateada[count][6]
        #print p_per
        gol_contra = tabla_formateada[count][7]
        #print gol_contra
        ###casa

        p_gan_casa = tabla_formateada[count][8]
        #print p_gan_casa
        
        p_emp_casa = tabla_formateada[count][9]
        #print p_emp_casa
        
        p_per_casa = tabla_formateada[count][10]
        #print p_per_casa
        
        gol_favor_casa = tabla_formateada[count][11]
        #print gol_favor_casa
        
        gol_contra_casa = tabla_formateada[count][12]
        #print gol_contra_casa
        
        ###visita

        
        p_gan_vis = tabla_formateada[count][13]
        #print p_gan_vis
        p_emp_vis = tabla_formateada[count][14]
        #print p_emp_vis
        p_per_vis = tabla_formateada[count][15]
        #print p_per_vis
        gol_favor_vis = tabla_formateada[count][16]
        #print gol_favor_vis
        gol_contra_vis = tabla_formateada[count][17]
        #print gol_contra_vis
        
        
        
        Dif_Gol = tabla_formateada[count][18]
        #print Dif_Gol
        
        Puntos_tot = tabla_formateada[count][19]
        #print Puntos_tot
        liga_fecha = str(liga_fecha_1) + str(id_equipo)
	#print liga_fecha
	#print id_equipo, id_liga, id_equipo_ESPN, nombre_equipo, posicion, Dif_Gol, Puntos_tot, liga_fecha
	
        
        cur.execute('''INSERT OR IGNORE INTO Posiciones_por_Fechas (id_equipo,id_liga, posicion, part_jugado, p_gan, p_emp, p_per, gol_favor, gol_contra,  p_gan_casa, p_emp_casa, p_per_casa, gol_favor_casa, gol_contra_casa,  p_gan_vis, p_emp_vis, p_per_vis, gol_favor_vis, gol_contra_vis, Dif_Gol, Puntos_tot, liga_fecha ) VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? )''',(id_equipo,id_liga, posicion, part_jugado, p_gan, p_emp, p_per, gol_favor, gol_contra,  p_gan_casa, p_emp_casa, p_per_casa, gol_favor_casa, gol_contra_casa,  p_gan_vis, p_emp_vis, p_per_vis, gol_favor_vis, gol_contra_vis, Dif_Gol, Puntos_tot, liga_fecha )) # Agregamos los datos a las ligas que queremos estudiar
        
    count += 1

posiciones =  "SELECT * FROM Posiciones_por_Fechas"
print "Lo que nos interesa es esta salida"
for word in cur.execute(posiciones):
    print word

print "Salida combinada de 2 tablas"

formato_combinado = []

relacion_tablas = "select * from Equipos_Ligas A, Posiciones_por_Fechas B where A.id_equipo = B.id_equipo" 
for word in cur.execute(relacion_tablas):
    print word
    formato_combinado.append(word)
print "aqui la cosa se complica pero lo ue no podemos hacer con sql yo lo hago con python"
print "Salida combinada de 2 tablas con 1 sola liga :D"


formato_combinado_2 = []

relacion_tablas_con_liga = "select * from Equipos_Ligas AS C  JOIN Posiciones_por_Fechas  AS R ON C.id_equipo = R.id_equipo  AND R.id_liga = 2   " 
for word in cur.execute(relacion_tablas_con_liga):      

        print word


conn.commit()
cur.close()

Y esta es la Salida por partes:

Escriba El numero de la fecha a ingresar: 2


1 La liga: spanish-primera-division Es de : spanish
2 La liga: english-premier-league Es de : english
3 La liga: italian-serie-a Es de : italian
4 La liga: german-bundesliga Es de : german

La primera parte, debemos agregar manualmente la semana en la estamos, si lo hacemos mal y no tenemos guardada la base de datos, podemos tener una catástrofe, naaa solo con el mismo uso de sqlite y python podríamos arreglarlo al final 😀 quizá diga como en otra entrada algún día :D….

Ok agregamos la semana en este caso 2, pero luego también agregue 3 :S solo para hacer la prueba, debería colocar un guardián que si agrego 15 como semana y no se han jugado 15 juegos por equipo no me haga caso y me diga que deje de tomar(no tomo :D) o algo así, ok la primera data que recibimos es sobre la liga y el pais.

Equipos de la liga
(1, u'Las Palmas', 98, 1)
(2, u'Barcelona', 83, 1)
(3, u'Real Madrid', 86, 1)
(4, u'Sevilla FC', 243, 1)
(5, u'Sporting Gij\xf3n', 3788, 1)
(6, u'Deportivo La Coru\xf1a', 90, 1)
(7, u'Leganes', 17534, 1)
(8, u'Eibar', 3752, 1)
(9, u'Real Sociedad', 89, 1)
(10, u'M\xe1laga', 99, 1)
(11, u'Atletico Madrid', 1068, 1)
(12, u'Villarreal', 102, 1)
(13, u'Alav\xe9s', 96, 1)
(14, u'Espanyol', 88, 1)
(15, u'Osasuna', 97, 1)
(16, u'Granada', 3747, 1)
(17, u'Real Betis', 244, 1)
(18, u'Celta Vigo', 85, 1)
(19, u'Athletic Bilbao', 93, 1)
(20, u'Valencia', 94, 1)
(21, u'Manchester City', 382, 2)
(22, u'Chelsea', 363, 2)
(23, u'Manchester United', 360, 2)
(24, u'Everton', 368, 2)
(25, u'Hull City', 306, 2)
(26, u'Middlesbrough', 369, 2)
(27, u'Tottenham Hotspur', 367, 2)
(28, u'Arsenal', 359, 2)
(29, u'Leicester City', 375, 2)
(30, u'West Bromwich Albion', 383, 2)
(31, u'Liverpool', 364, 2)
(32, u'West Ham United', 371, 2)
(33, u'Burnley', 379, 2)
(34, u'Swansea City', 318, 2)
(35, u'Southampton', 376, 2)
(36, u'Sunderland', 366, 2)
(37, u'Crystal Palace', 384, 2)
(38, u'Watford', 395, 2)
(39, u'AFC Bournemouth', 349, 2)
(40, u'Stoke City', 336, 2)
(41, u'Genoa', 3263, 3)
(42, u'Juventus', 111, 3)
(43, u'Sampdoria', 2734, 3)
(44, u'AS Roma', 104, 3)
(45, u'US Pescara', 3290, 3)
(46, u'Napoli', 114, 3)
(47, u'Torino', 239, 3)
(48, u'Chievo Verona', 238, 3)
(49, u'Lazio', 112, 3)
(50, u'Fiorentina', 109, 3)
(51, u'AC Milan', 103, 3)
(52, u'Udinese', 118, 3)
(53, u'Sassuolo', 3997, 3)
(54, u'Bologna', 107, 3)
(55, u'Palermo', 2923, 3)
(56, u'Cagliari', 2925, 3)
(57, u'Internazionale', 110, 3)
(58, u'Atalanta', 105, 3)
(59, u'Crotone', 3173, 3)
(60, u'Empoli', 2574, 3)
(61, u'Bayern Munich', 132, 4)
(62, u'FC Cologne', 122, 4)
(63, u'VfL Wolfsburg', 138, 4)
(64, u'Borussia Dortmund', 124, 4)
(65, u'Hertha Berlin', 129, 4)
(66, u'Borussia Monchengladbach', 268, 4)
(67, u'Eintracht Frankfurt', 125, 4)
(68, u'TSG Hoffenheim', 7911, 4)
(69, u'RB Leipzig', 11420, 4)
(70, u'Hamburg SV', 127, 4)
(71, u'FC Ingolstadt 04', 6367, 4)
(72, u'SC Freiburg', 126, 4)
(73, u'Bayer Leverkusen', 131, 4)
(74, u'Mainz', 2950, 4)
(75, u'Schalke 04', 133, 4)
(76, u'SV Darmstadt 98', 3812, 4)
(77, u'FC Augsburg', 3841, 4)
(78, u'Werder Bremen', 137, 4)

Luego agregamos todos los equipo según las urls de cada liga, ojo al ejecutar el bucle generamos un contador en 1 que nos va agregando +1 y así generamos el id_liga para la tabla 1,2 y la tabla 3, podemos notar 78 equipos para las 4 ligas el ultimo numero es la id_liga a la que pertenece

Luego tenemos:

Lo que nos interesa es esta salida
(1, 1, 1, 1, 2, 2, 0, 0, 9, 3, 6, 1, 0, 0, 5, 1, 1, 0, 0, 2, 4, 6, 10003)
(2, 2, 1, 2, 2, 2, 0, 0, 7, 2, 5, 1, 0, 0, 6, 2, 1, 0, 0, 0, 1, 6, 20003)
(3, 3, 1, 3, 2, 2, 0, 0, 5, 1, 4, 1, 0, 0, 2, 1, 1, 0, 0, 0, 3, 6, 30003)
(4, 4, 1, 4, 2, 1, 1, 0, 6, 4, 2, 1, 0, 0, 6, 4, 0, 1, 0, 0, 0, 4, 40003)
(5, 5, 1, 5, 2, 1, 1, 0, 2, 1, 1, 1, 0, 0, 2, 1, 0, 1, 0, 0, 0, 4, 50003)
(6, 6, 1, 6, 2, 1, 1, 0, 2, 1, 1, 1, 0, 0, 2, 1, 0, 1, 0, 0, 0, 4, 60003)
(7, 7, 1, 7, 2, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 70003)
(8, 8, 1, 8, 2, 1, 0, 1, 2, 2, 0, 1, 0, 0, 1, 0, 0, 0, 1, 2, 1, 3, 80003)
(9, 9, 1, 9, 2, 1, 0, 1, 2, 3, -1, 0, 0, 1, 0, 3, 1, 0, 0, 0, 2, 3, 90003)
(10, 10, 1, 10, 2, 0, 2, 0, 3, 3, 0, 0, 1, 0, 1, 1, 0, 1, 0, 2, 2, 2, 100003)
(11, 11, 1, 11, 2, 0, 2, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 2, 110003)
(12, 12, 1, 12, 2, 0, 2, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 2, 120003)
(13, 13, 1, 13, 2, 0, 2, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 2, 130003)
(14, 14, 1, 14, 2, 0, 1, 1, 6, 8, -2, 0, 1, 0, 2, 2, 0, 0, 1, 6, 4, 1, 140003)
(15, 15, 1, 15, 2, 0, 1, 1, 1, 3, -2, 0, 0, 1, 0, 2, 0, 1, 0, 1, 1, 1, 150003)
(16, 16, 1, 16, 2, 0, 1, 1, 2, 6, -4, 0, 1, 0, 1, 1, 0, 0, 1, 5, 1, 1, 160003)
(17, 17, 1, 17, 2, 0, 1, 1, 2, 6, -4, 0, 1, 0, 0, 0, 0, 0, 1, 6, 2, 1, 170003)
(18, 18, 1, 18, 2, 0, 0, 2, 1, 3, -2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 0, 180003)
(19, 19, 1, 19, 2, 0, 0, 2, 1, 3, -2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 0, 190003)
(20, 20, 1, 20, 2, 0, 0, 2, 2, 5, -3, 0, 0, 1, 2, 4, 0, 0, 1, 1, 0, 0, 200003)
(21, 21, 2, 1, 3, 3, 0, 0, 9, 3, 6, 2, 0, 0, 5, 2, 1, 0, 0, 1, 4, 9, 210003)
(22, 22, 2, 2, 3, 3, 0, 0, 7, 2, 5, 2, 0, 0, 5, 1, 1, 0, 0, 1, 2, 9, 220003)
(23, 23, 2, 3, 3, 3, 0, 0, 6, 1, 5, 1, 0, 0, 2, 0, 2, 0, 0, 1, 4, 9, 230003)
(24, 24, 2, 4, 3, 2, 1, 0, 4, 2, 2, 1, 1, 0, 2, 1, 1, 0, 0, 1, 2, 7, 240003)
(25, 25, 2, 5, 3, 2, 0, 1, 4, 2, 2, 1, 0, 1, 2, 2, 1, 0, 0, 0, 2, 6, 250003)
(26, 26, 2, 6, 3, 1, 2, 0, 3, 2, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 2, 5, 260003)
(27, 27, 2, 7, 3, 1, 2, 0, 3, 2, 1, 1, 1, 0, 2, 1, 0, 1, 0, 1, 1, 5, 270003)
(28, 28, 2, 8, 3, 1, 1, 1, 6, 5, 1, 0, 0, 1, 3, 4, 1, 1, 0, 1, 3, 4, 280003)
(29, 29, 2, 9, 3, 1, 1, 1, 3, 3, 0, 1, 1, 0, 2, 1, 0, 0, 1, 2, 1, 4, 290003)
(30, 30, 2, 10, 3, 1, 1, 1, 2, 2, 0, 0, 1, 1, 1, 2, 1, 0, 0, 0, 1, 4, 300003)
(31, 31, 2, 11, 3, 1, 1, 1, 5, 6, -1, 0, 0, 0, 0, 0, 1, 1, 1, 6, 5, 4, 310003)
(32, 32, 2, 12, 3, 1, 0, 2, 3, 5, -2, 1, 0, 0, 1, 0, 0, 0, 2, 5, 2, 3, 320003)
(33, 33, 2, 13, 3, 1, 0, 2, 2, 4, -2, 1, 0, 1, 2, 1, 0, 0, 1, 3, 0, 3, 330003)
(34, 34, 2, 14, 3, 1, 0, 2, 2, 4, -2, 0, 0, 1, 0, 2, 1, 0, 1, 2, 2, 3, 340003)
(35, 35, 2, 15, 3, 0, 2, 1, 2, 4, -2, 0, 2, 0, 2, 2, 0, 0, 1, 2, 0, 2, 350003)
(36, 36, 2, 16, 3, 0, 1, 2, 3, 5, -2, 0, 0, 1, 1, 2, 0, 1, 1, 3, 2, 1, 360003)
(37, 37, 2, 17, 3, 0, 1, 2, 1, 3, -2, 0, 1, 1, 1, 2, 0, 0, 1, 1, 0, 1, 370003)
(38, 38, 2, 18, 3, 0, 1, 2, 3, 6, -3, 0, 0, 2, 2, 5, 0, 1, 0, 1, 1, 1, 380003)
(39, 39, 2, 19, 3, 0, 1, 2, 2, 5, -3, 0, 0, 1, 1, 3, 0, 1, 1, 2, 1, 1, 390003)
(40, 40, 2, 20, 3, 0, 1, 2, 2, 6, -4, 0, 0, 1, 1, 4, 0, 1, 1, 2, 1, 1, 400003)
(41, 41, 3, 1, 2, 2, 0, 0, 6, 2, 4, 1, 0, 0, 3, 1, 1, 0, 0, 1, 3, 6, 410003)
(42, 42, 3, 2, 2, 2, 0, 0, 3, 1, 2, 1, 0, 0, 2, 1, 1, 0, 0, 0, 1, 6, 420003)
(43, 43, 3, 3, 2, 2, 0, 0, 3, 1, 2, 1, 0, 0, 2, 1, 1, 0, 0, 0, 1, 6, 430003)
(44, 44, 3, 4, 2, 1, 1, 0, 6, 2, 4, 1, 0, 0, 4, 0, 0, 1, 0, 2, 2, 4, 440003)
(45, 45, 3, 5, 2, 1, 1, 0, 5, 2, 3, 0, 1, 0, 2, 2, 1, 0, 0, 0, 3, 4, 450003)
(46, 46, 3, 6, 2, 1, 1, 0, 6, 4, 2, 1, 0, 0, 4, 2, 0, 1, 0, 2, 2, 4, 460003)
(47, 47, 3, 7, 2, 1, 0, 1, 7, 4, 3, 1, 0, 0, 5, 1, 0, 0, 1, 3, 2, 3, 470003)
(48, 48, 3, 8, 2, 1, 0, 1, 2, 1, 1, 1, 0, 0, 2, 0, 0, 0, 1, 1, 0, 3, 480003)
(49, 49, 3, 9, 2, 1, 0, 1, 4, 4, 0, 0, 0, 1, 0, 1, 1, 0, 0, 3, 4, 3, 490003)
(50, 50, 3, 10, 2, 1, 0, 1, 2, 2, 0, 1, 0, 0, 1, 0, 0, 0, 1, 2, 1, 3, 500003)
(51, 51, 3, 11, 2, 1, 0, 1, 5, 6, -1, 1, 0, 0, 3, 2, 0, 0, 1, 4, 2, 3, 510003)
(52, 52, 3, 12, 2, 1, 0, 1, 2, 4, -2, 1, 0, 0, 2, 0, 0, 0, 1, 4, 0, 3, 520003)
(53, 53, 3, 13, 2, 1, 0, 1, 1, 3, -2, 0, 0, 1, 0, 3, 1, 0, 0, 0, 1, 3, 530003)
(54, 54, 3, 14, 2, 1, 0, 1, 2, 5, -3, 1, 0, 0, 1, 0, 0, 0, 1, 5, 1, 3, 540003)
(55, 55, 3, 15, 2, 0, 1, 1, 1, 2, -1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 550003)
(56, 56, 3, 16, 2, 0, 1, 1, 3, 5, -2, 0, 1, 0, 2, 2, 0, 0, 1, 3, 1, 1, 560003)
(57, 57, 3, 17, 2, 0, 1, 1, 1, 3, -2, 0, 1, 0, 1, 1, 0, 0, 1, 2, 0, 1, 570003)
(58, 58, 3, 18, 2, 0, 0, 2, 4, 6, -2, 0, 0, 1, 3, 4, 0, 0, 1, 2, 1, 0, 580003)
(59, 59, 3, 19, 2, 0, 0, 2, 1, 4, -3, 0, 0, 1, 1, 3, 0, 0, 1, 1, 0, 0, 590003)
(60, 60, 3, 20, 2, 0, 0, 2, 0, 3, -3, 0, 0, 1, 0, 1, 0, 0, 1, 2, 0, 0, 600003)
(61, 61, 4, 1, 1, 1, 0, 0, 6, 0, 6, 1, 0, 0, 6, 0, 0, 0, 0, 0, 0, 3, 610003)
(62, 62, 4, 2, 1, 1, 0, 0, 2, 0, 2, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 620003)
(63, 63, 4, 2, 1, 1, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 630003)
(64, 64, 4, 4, 1, 1, 0, 0, 2, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 3, 640003)
(65, 65, 4, 4, 1, 1, 0, 0, 2, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 3, 650003)
(66, 66, 4, 4, 1, 1, 0, 0, 2, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 3, 660003)
(67, 67, 4, 7, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 670003)
(68, 68, 4, 8, 1, 0, 1, 0, 2, 2, 0, 0, 1, 0, 2, 2, 0, 0, 0, 0, 0, 1, 680003)
(69, 69, 4, 8, 1, 0, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 1, 690003)
(70, 70, 4, 10, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 700003)
(71, 71, 4, 10, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 710003)
(72, 72, 4, 12, 1, 0, 0, 1, 1, 2, -1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 720003)
(73, 73, 4, 12, 1, 0, 0, 1, 1, 2, -1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 730003)
(74, 74, 4, 12, 1, 0, 0, 1, 1, 2, -1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 740003)
(75, 75, 4, 15, 1, 0, 0, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 750003)
(76, 76, 4, 16, 1, 0, 0, 1, 0, 2, -2, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 760003)
(77, 77, 4, 16, 1, 0, 0, 1, 0, 2, -2, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 770003)
(78, 78, 4, 18, 1, 0, 0, 1, 0, 6, -6, 0, 0, 0, 0, 0, 0, 0, 1, 6, 0, 0, 780003)

Aquí necesitamos observar que tenemos los campos tal como los agregamos al crear la tabla:

cur.execute('''
 CREATE TABLE IF NOT EXISTS Posiciones_por_Fechas (id_posiciones INTEGER PRIMARY KEY, id_equipo INTEGER NOT NULL,id_liga INTEGER NOT NULL , posicion INTEGER NOT NULL,
 part_jugado INTEGER NOT NULL, p_gan INTEGER NOT NULL ,p_emp INTEGER NOT NULL, p_per INTEGER NOT NULL, 
 gol_favor INTEGER NOT NULL, gol_contra INTEGER NOT NULL, Dif_Gol INTEGER NOT NULL,
 p_gan_casa INTEGER NOT NULL, p_emp_casa INTEGER NOT NULL, p_per_casa INTEGER NOT NULL, gol_favor_casa INTEGER NOT NULL ,
 gol_contra_casa INTEGER NOT NULL, p_gan_vis INTEGER NOT NULL, p_emp_vis INTEGER NOT NULL, p_per_vis INTEGER NOT NULL,
 gol_contra_vis INTEGER NOT NULL, gol_favor_vis INTEGER NOT NULL, Puntos_tot INTEGER NOT NULL ,
 liga_fecha INTEGER NOT NULL UNIQUE)''')

Debemos fijarnos que liga_fecha tiene una restricción de ser UNIQUE o única, pero para poder hacer esto, he tenido que hacer esta linea= “liga_fecha = str(id_equipo)+ ‘000’ + str(liga_fecha_1)” ya que no me entendí nunca por que el sqlite no me permite colocar varias columnas como PRIMARY  KEY y tampoco me permitia colocarle UNIQUE a varias columnas juntas por lo que decidí hacerlo con python así como un correlativo….

Luego tenemos esta ultima salida:

Salida combinada de 2 tablas
(1, u'Las Palmas', 98, 1, 1, 1, 1, 1, 2, 2, 0, 0, 9, 3, 6, 1, 0, 0, 5, 1, 1, 0, 0, 2, 4, 6, 10002)
(2, u'Barcelona', 83, 1, 2, 2, 1, 2, 2, 2, 0, 0, 7, 2, 5, 1, 0, 0, 6, 2, 1, 0, 0, 0, 1, 6, 20002)
(3, u'Real Madrid', 86, 1, 3, 3, 1, 3, 2, 2, 0, 0, 5, 1, 4, 1, 0, 0, 2, 1, 1, 0, 0, 0, 3, 6, 30002)
(4, u'Sevilla FC', 243, 1, 4, 4, 1, 4, 2, 1, 1, 0, 6, 4, 2, 1, 0, 0, 6, 4, 0, 1, 0, 0, 0, 4, 40002)
(5, u'Sporting Gij\xf3n', 3788, 1, 5, 5, 1, 5, 2, 1, 1, 0, 2, 1, 1, 1, 0, 0, 2, 1, 0, 1, 0, 0, 0, 4, 50002)
(6, u'Deportivo La Coru\xf1a', 90, 1, 6, 6, 1, 6, 2, 1, 1, 0, 2, 1, 1, 1, 0, 0, 2, 1, 0, 1, 0, 0, 0, 4, 60002)
(7, u'Leganes', 17534, 1, 7, 7, 1, 7, 2, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 70002)
(8, u'Eibar', 3752, 1, 8, 8, 1, 8, 2, 1, 0, 1, 2, 2, 0, 1, 0, 0, 1, 0, 0, 0, 1, 2, 1, 3, 80002)
(9, u'Real Sociedad', 89, 1, 9, 9, 1, 9, 2, 1, 0, 1, 2, 3, -1, 0, 0, 1, 0, 3, 1, 0, 0, 0, 2, 3, 90002)
(10, u'M\xe1laga', 99, 1, 10, 10, 1, 10, 2, 0, 2, 0, 3, 3, 0, 0, 1, 0, 1, 1, 0, 1, 0, 2, 2, 2, 100002)
(11, u'Atletico Madrid', 1068, 1, 11, 11, 1, 11, 2, 0, 2, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 2, 110002)
(12, u'Villarreal', 102, 1, 12, 12, 1, 12, 2, 0, 2, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 2, 120002)
(13, u'Alav\xe9s', 96, 1, 13, 13, 1, 13, 2, 0, 2, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 2, 130002)
(14, u'Espanyol', 88, 1, 14, 14, 1, 14, 2, 0, 1, 1, 6, 8, -2, 0, 1, 0, 2, 2, 0, 0, 1, 6, 4, 1, 140002)
(15, u'Osasuna', 97, 1, 15, 15, 1, 15, 2, 0, 1, 1, 1, 3, -2, 0, 0, 1, 0, 2, 0, 1, 0, 1, 1, 1, 150002)
(16, u'Granada', 3747, 1, 16, 16, 1, 16, 2, 0, 1, 1, 2, 6, -4, 0, 1, 0, 1, 1, 0, 0, 1, 5, 1, 1, 160002)
(17, u'Real Betis', 244, 1, 17, 17, 1, 17, 2, 0, 1, 1, 2, 6, -4, 0, 1, 0, 0, 0, 0, 0, 1, 6, 2, 1, 170002)
(18, u'Celta Vigo', 85, 1, 18, 18, 1, 18, 2, 0, 0, 2, 1, 3, -2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 0, 180002)
(19, u'Athletic Bilbao', 93, 1, 19, 19, 1, 19, 2, 0, 0, 2, 1, 3, -2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 0, 190002)
(20, u'Valencia', 94, 1, 20, 20, 1, 20, 2, 0, 0, 2, 2, 5, -3, 0, 0, 1, 2, 4, 0, 0, 1, 1, 0, 0, 200002)
(21, u'Manchester City', 382, 2, 21, 21, 2, 1, 3, 3, 0, 0, 9, 3, 6, 2, 0, 0, 5, 2, 1, 0, 0, 1, 4, 9, 210002)
(22, u'Chelsea', 363, 2, 22, 22, 2, 2, 3, 3, 0, 0, 7, 2, 5, 2, 0, 0, 5, 1, 1, 0, 0, 1, 2, 9, 220002)
(23, u'Manchester United', 360, 2, 23, 23, 2, 3, 3, 3, 0, 0, 6, 1, 5, 1, 0, 0, 2, 0, 2, 0, 0, 1, 4, 9, 230002)
(24, u'Everton', 368, 2, 24, 24, 2, 4, 3, 2, 1, 0, 4, 2, 2, 1, 1, 0, 2, 1, 1, 0, 0, 1, 2, 7, 240002)
(25, u'Hull City', 306, 2, 25, 25, 2, 5, 3, 2, 0, 1, 4, 2, 2, 1, 0, 1, 2, 2, 1, 0, 0, 0, 2, 6, 250002)
(26, u'Middlesbrough', 369, 2, 26, 26, 2, 6, 3, 1, 2, 0, 3, 2, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 2, 5, 260002)
(27, u'Tottenham Hotspur', 367, 2, 27, 27, 2, 7, 3, 1, 2, 0, 3, 2, 1, 1, 1, 0, 2, 1, 0, 1, 0, 1, 1, 5, 270002)
(28, u'Arsenal', 359, 2, 28, 28, 2, 8, 3, 1, 1, 1, 6, 5, 1, 0, 0, 1, 3, 4, 1, 1, 0, 1, 3, 4, 280002)
(29, u'Leicester City', 375, 2, 29, 29, 2, 9, 3, 1, 1, 1, 3, 3, 0, 1, 1, 0, 2, 1, 0, 0, 1, 2, 1, 4, 290002)
(30, u'West Bromwich Albion', 383, 2, 30, 30, 2, 10, 3, 1, 1, 1, 2, 2, 0, 0, 1, 1, 1, 2, 1, 0, 0, 0, 1, 4, 300002)
(31, u'Liverpool', 364, 2, 31, 31, 2, 11, 3, 1, 1, 1, 5, 6, -1, 0, 0, 0, 0, 0, 1, 1, 1, 6, 5, 4, 310002)
(32, u'West Ham United', 371, 2, 32, 32, 2, 12, 3, 1, 0, 2, 3, 5, -2, 1, 0, 0, 1, 0, 0, 0, 2, 5, 2, 3, 320002)
(33, u'Burnley', 379, 2, 33, 33, 2, 13, 3, 1, 0, 2, 2, 4, -2, 1, 0, 1, 2, 1, 0, 0, 1, 3, 0, 3, 330002)
(34, u'Swansea City', 318, 2, 34, 34, 2, 14, 3, 1, 0, 2, 2, 4, -2, 0, 0, 1, 0, 2, 1, 0, 1, 2, 2, 3, 340002)
(35, u'Southampton', 376, 2, 35, 35, 2, 15, 3, 0, 2, 1, 2, 4, -2, 0, 2, 0, 2, 2, 0, 0, 1, 2, 0, 2, 350002)
(36, u'Sunderland', 366, 2, 36, 36, 2, 16, 3, 0, 1, 2, 3, 5, -2, 0, 0, 1, 1, 2, 0, 1, 1, 3, 2, 1, 360002)
(37, u'Crystal Palace', 384, 2, 37, 37, 2, 17, 3, 0, 1, 2, 1, 3, -2, 0, 1, 1, 1, 2, 0, 0, 1, 1, 0, 1, 370002)
(38, u'Watford', 395, 2, 38, 38, 2, 18, 3, 0, 1, 2, 3, 6, -3, 0, 0, 2, 2, 5, 0, 1, 0, 1, 1, 1, 380002)
(39, u'AFC Bournemouth', 349, 2, 39, 39, 2, 19, 3, 0, 1, 2, 2, 5, -3, 0, 0, 1, 1, 3, 0, 1, 1, 2, 1, 1, 390002)
(40, u'Stoke City', 336, 2, 40, 40, 2, 20, 3, 0, 1, 2, 2, 6, -4, 0, 0, 1, 1, 4, 0, 1, 1, 2, 1, 1, 400002)
(41, u'Genoa', 3263, 3, 41, 41, 3, 1, 2, 2, 0, 0, 6, 2, 4, 1, 0, 0, 3, 1, 1, 0, 0, 1, 3, 6, 410002)
(42, u'Juventus', 111, 3, 42, 42, 3, 2, 2, 2, 0, 0, 3, 1, 2, 1, 0, 0, 2, 1, 1, 0, 0, 0, 1, 6, 420002)
(43, u'Sampdoria', 2734, 3, 43, 43, 3, 3, 2, 2, 0, 0, 3, 1, 2, 1, 0, 0, 2, 1, 1, 0, 0, 0, 1, 6, 430002)
(44, u'AS Roma', 104, 3, 44, 44, 3, 4, 2, 1, 1, 0, 6, 2, 4, 1, 0, 0, 4, 0, 0, 1, 0, 2, 2, 4, 440002)
(45, u'US Pescara', 3290, 3, 45, 45, 3, 5, 2, 1, 1, 0, 5, 2, 3, 0, 1, 0, 2, 2, 1, 0, 0, 0, 3, 4, 450002)
(46, u'Napoli', 114, 3, 46, 46, 3, 6, 2, 1, 1, 0, 6, 4, 2, 1, 0, 0, 4, 2, 0, 1, 0, 2, 2, 4, 460002)
(47, u'Torino', 239, 3, 47, 47, 3, 7, 2, 1, 0, 1, 7, 4, 3, 1, 0, 0, 5, 1, 0, 0, 1, 3, 2, 3, 470002)
(48, u'Chievo Verona', 238, 3, 48, 48, 3, 8, 2, 1, 0, 1, 2, 1, 1, 1, 0, 0, 2, 0, 0, 0, 1, 1, 0, 3, 480002)
(49, u'Lazio', 112, 3, 49, 49, 3, 9, 2, 1, 0, 1, 4, 4, 0, 0, 0, 1, 0, 1, 1, 0, 0, 3, 4, 3, 490002)
(50, u'Fiorentina', 109, 3, 50, 50, 3, 10, 2, 1, 0, 1, 2, 2, 0, 1, 0, 0, 1, 0, 0, 0, 1, 2, 1, 3, 500002)
(51, u'AC Milan', 103, 3, 51, 51, 3, 11, 2, 1, 0, 1, 5, 6, -1, 1, 0, 0, 3, 2, 0, 0, 1, 4, 2, 3, 510002)
(52, u'Udinese', 118, 3, 52, 52, 3, 12, 2, 1, 0, 1, 2, 4, -2, 1, 0, 0, 2, 0, 0, 0, 1, 4, 0, 3, 520002)
(53, u'Sassuolo', 3997, 3, 53, 53, 3, 13, 2, 1, 0, 1, 1, 3, -2, 0, 0, 1, 0, 3, 1, 0, 0, 0, 1, 3, 530002)
(54, u'Bologna', 107, 3, 54, 54, 3, 14, 2, 1, 0, 1, 2, 5, -3, 1, 0, 0, 1, 0, 0, 0, 1, 5, 1, 3, 540002)
(55, u'Palermo', 2923, 3, 55, 55, 3, 15, 2, 0, 1, 1, 1, 2, -1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 550002)
(56, u'Cagliari', 2925, 3, 56, 56, 3, 16, 2, 0, 1, 1, 3, 5, -2, 0, 1, 0, 2, 2, 0, 0, 1, 3, 1, 1, 560002)
(57, u'Internazionale', 110, 3, 57, 57, 3, 17, 2, 0, 1, 1, 1, 3, -2, 0, 1, 0, 1, 1, 0, 0, 1, 2, 0, 1, 570002)
(58, u'Atalanta', 105, 3, 58, 58, 3, 18, 2, 0, 0, 2, 4, 6, -2, 0, 0, 1, 3, 4, 0, 0, 1, 2, 1, 0, 580002)
(59, u'Crotone', 3173, 3, 59, 59, 3, 19, 2, 0, 0, 2, 1, 4, -3, 0, 0, 1, 1, 3, 0, 0, 1, 1, 0, 0, 590002)
(60, u'Empoli', 2574, 3, 60, 60, 3, 20, 2, 0, 0, 2, 0, 3, -3, 0, 0, 1, 0, 1, 0, 0, 1, 2, 0, 0, 600002)
(61, u'Bayern Munich', 132, 4, 61, 61, 4, 1, 1, 1, 0, 0, 6, 0, 6, 1, 0, 0, 6, 0, 0, 0, 0, 0, 0, 3, 610002)
(62, u'FC Cologne', 122, 4, 62, 62, 4, 2, 1, 1, 0, 0, 2, 0, 2, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 620002)
(63, u'VfL Wolfsburg', 138, 4, 63, 63, 4, 2, 1, 1, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 630002)
(64, u'Borussia Dortmund', 124, 4, 64, 64, 4, 4, 1, 1, 0, 0, 2, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 3, 640002)
(65, u'Hertha Berlin', 129, 4, 65, 65, 4, 4, 1, 1, 0, 0, 2, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 3, 650002)
(66, u'Borussia Monchengladbach', 268, 4, 66, 66, 4, 4, 1, 1, 0, 0, 2, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 3, 660002)
(67, u'Eintracht Frankfurt', 125, 4, 67, 67, 4, 7, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 670002)
(68, u'TSG Hoffenheim', 7911, 4, 68, 68, 4, 8, 1, 0, 1, 0, 2, 2, 0, 0, 1, 0, 2, 2, 0, 0, 0, 0, 0, 1, 680002)
(69, u'RB Leipzig', 11420, 4, 69, 69, 4, 8, 1, 0, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 1, 690002)
(70, u'Hamburg SV', 127, 4, 70, 70, 4, 10, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 700002)
(71, u'FC Ingolstadt 04', 6367, 4, 71, 71, 4, 10, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 710002)
(72, u'SC Freiburg', 126, 4, 72, 72, 4, 12, 1, 0, 0, 1, 1, 2, -1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 720002)
(73, u'Bayer Leverkusen', 131, 4, 73, 73, 4, 12, 1, 0, 0, 1, 1, 2, -1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 730002)
(74, u'Mainz', 2950, 4, 74, 74, 4, 12, 1, 0, 0, 1, 1, 2, -1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 740002)
(75, u'Schalke 04', 133, 4, 75, 75, 4, 15, 1, 0, 0, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 750002)
(76, u'SV Darmstadt 98', 3812, 4, 76, 76, 4, 16, 1, 0, 0, 1, 0, 2, -2, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 760002)
(77, u'FC Augsburg', 3841, 4, 77, 77, 4, 16, 1, 0, 0, 1, 0, 2, -2, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 770002)
(78, u'Werder Bremen', 137, 4, 78, 78, 4, 18, 1, 0, 0, 1, 0, 6, -6, 0, 0, 0, 0, 0, 0, 0, 1, 6, 0, 0, 780002)

Esta salida no es mas que la combinacion de 2 tablas que sabemos que tienen relación y es esta que le hemos dado ” relacion_tablas = “select * from Equipos_Ligas A, Posiciones_por_Fechas B where A.id_equipo = B.id_equipo” “, para poder ver lo que hemos visto arriba, luego si queremos ver 1 sola liga tenemos esta salida:

 

aqui la cosa se complica pero lo ue no podemos hacer con sql yo lo hago con python
Salida combinada de 2 tablas con 1 sola liga 😀
(21, u'Manchester City', 382, 2, 21, 21, 2, 1, 3, 3, 0, 0, 9, 3, 6, 2, 0, 0, 5, 2, 1, 0, 0, 1, 4, 9, 210002)
(22, u'Chelsea', 363, 2, 22, 22, 2, 2, 3, 3, 0, 0, 7, 2, 5, 2, 0, 0, 5, 1, 1, 0, 0, 1, 2, 9, 220002)
(23, u'Manchester United', 360, 2, 23, 23, 2, 3, 3, 3, 0, 0, 6, 1, 5, 1, 0, 0, 2, 0, 2, 0, 0, 1, 4, 9, 230002)
(24, u'Everton', 368, 2, 24, 24, 2, 4, 3, 2, 1, 0, 4, 2, 2, 1, 1, 0, 2, 1, 1, 0, 0, 1, 2, 7, 240002)
(25, u'Hull City', 306, 2, 25, 25, 2, 5, 3, 2, 0, 1, 4, 2, 2, 1, 0, 1, 2, 2, 1, 0, 0, 0, 2, 6, 250002)
(26, u'Middlesbrough', 369, 2, 26, 26, 2, 6, 3, 1, 2, 0, 3, 2, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 2, 5, 260002)
(27, u'Tottenham Hotspur', 367, 2, 27, 27, 2, 7, 3, 1, 2, 0, 3, 2, 1, 1, 1, 0, 2, 1, 0, 1, 0, 1, 1, 5, 270002)
(28, u'Arsenal', 359, 2, 28, 28, 2, 8, 3, 1, 1, 1, 6, 5, 1, 0, 0, 1, 3, 4, 1, 1, 0, 1, 3, 4, 280002)
(29, u'Leicester City', 375, 2, 29, 29, 2, 9, 3, 1, 1, 1, 3, 3, 0, 1, 1, 0, 2, 1, 0, 0, 1, 2, 1, 4, 290002)
(30, u'West Bromwich Albion', 383, 2, 30, 30, 2, 10, 3, 1, 1, 1, 2, 2, 0, 0, 1, 1, 1, 2, 1, 0, 0, 0, 1, 4, 300002)
(31, u'Liverpool', 364, 2, 31, 31, 2, 11, 3, 1, 1, 1, 5, 6, -1, 0, 0, 0, 0, 0, 1, 1, 1, 6, 5, 4, 310002)
(32, u'West Ham United', 371, 2, 32, 32, 2, 12, 3, 1, 0, 2, 3, 5, -2, 1, 0, 0, 1, 0, 0, 0, 2, 5, 2, 3, 320002)
(33, u'Burnley', 379, 2, 33, 33, 2, 13, 3, 1, 0, 2, 2, 4, -2, 1, 0, 1, 2, 1, 0, 0, 1, 3, 0, 3, 330002)
(34, u'Swansea City', 318, 2, 34, 34, 2, 14, 3, 1, 0, 2, 2, 4, -2, 0, 0, 1, 0, 2, 1, 0, 1, 2, 2, 3, 340002)
(35, u'Southampton', 376, 2, 35, 35, 2, 15, 3, 0, 2, 1, 2, 4, -2, 0, 2, 0, 2, 2, 0, 0, 1, 2, 0, 2, 350002)
(36, u'Sunderland', 366, 2, 36, 36, 2, 16, 3, 0, 1, 2, 3, 5, -2, 0, 0, 1, 1, 2, 0, 1, 1, 3, 2, 1, 360002)
(37, u'Crystal Palace', 384, 2, 37, 37, 2, 17, 3, 0, 1, 2, 1, 3, -2, 0, 1, 1, 1, 2, 0, 0, 1, 1, 0, 1, 370002)
(38, u'Watford', 395, 2, 38, 38, 2, 18, 3, 0, 1, 2, 3, 6, -3, 0, 0, 2, 2, 5, 0, 1, 0, 1, 1, 1, 380002)
(39, u'AFC Bournemouth', 349, 2, 39, 39, 2, 19, 3, 0, 1, 2, 2, 5, -3, 0, 0, 1, 1, 3, 0, 1, 1, 2, 1, 1, 390002)
(40, u'Stoke City', 336, 2, 40, 40, 2, 20, 3, 0, 1, 2, 2, 6, -4, 0, 0, 1, 1, 4, 0, 1, 1, 2, 1, 1, 400002)

Esta salida es un poco mas complicada y se logra con el siguiente comando “relacion_tablas_con_liga = “select * from Equipos_Ligas AS C  JOIN Posiciones_por_Fechas  AS R ON C.id_equipo = R.id_equipo  AND R.id_liga = 2   ”  “ es necesario acotar que si quitamos la clausula WHERE obtenemos la salida anterior 😀

Hasta aquí esta entrada espero que se hayan divertido, ya que seguiré trabajando en una ultima entrada para entrar con ODOO y scraping mas otras cosas si Dios lo permite, por lo pronto que Dios siga bendiciendo sus vidas y nos de fuerzas par resistir al mal así el huirá de nosotros…