Retos 2017IIT FP



Retos 2017IIT Economía

Propuesta de solución, usando conceptos básicos.

Referencia: http://programacion.espol.edu.ec/static/media/uploads/reto_econom%C3%ADa_enero_2018_.pdf

Pyweekend banner
Pyweekend banner Economía

Usted cuenta con una base de datos de accionistas que ha sido proporcionada por un organismo de control ecuatoriano https://goo.gl/5kD5A2 .

Esta base contiene información relacionada con la participación accionaria (local y extranjera) de empresas radicadas en el Ecuador. Sin embargo, existe un inconveniente: en algunas de las empresas el porcentaje total de accionistas supera el 100%.

Por lo tanto, se pide:

1. Identifique el número total de y las empresas cuya suma total de acciones excede el 100%

Propuesta de solución: Para encontrar esta respuesta es necesario leer el archivo y procesar cada registro (línea). Sin embargo, al leer el archivo, se determina que hay errores en línea por falta de datos.

Se propone inicialmente separar los registros entre los validados y con errores

# Reto Economia

# Lectura de Archivo
# Separa registros validos, que tengan todos los campos

# narchivo = input('nombre del archivo: ')
narchivorecibido = 'accionistas_nuevo'
narchivorecibido = narchivorecibido+'.csv'
narchivovalidado = 'accionista_validado.txt'
narchivoerrores  = 'accionista_errores.txt'

leidos  = 0
validos = 0
errores = 0

# Abre archivos de trabajo
archivorecibido = open(narchivorecibido, encoding="utf8")
archivovalidado = open(narchivovalidado, 'w')
archivoerrores  = open(narchivoerrores, 'w')

# línea encabezado
linea  = archivorecibido.readline()
partes = linea.split(';')
# columnas en cada registro
campos = len(partes) 
archivovalidado.write(linea)
archivoerrores.write(linea)

while not(linea==''):
    linea  = archivorecibido.readline()
    leidos = leidos + 1
    sinsaltos = linea.strip('\n')
    partes  = sinsaltos.split(';')
    tamano  = len(partes)
    unerror = 0 
    if (tamano == campos):
        # Revisa que exista ruc
        truc = len(partes[0])
        tparticipa = len(partes[4])
        if (truc>0 and tparticipa>0):
            archivovalidado.write(linea)
            validos = validos +1
        else:
            unerror = 1
        
    if (unerror == 1):
        archivoerrores.write(linea)
        errores = errores +1

archivorecibido.close()
archivovalidado.close()
archivoerrores.close()

print('registros leidos: ', leidos)
print('validos: ', validos)
print('errores: ', errores)
print('revisar archivo de errores.txt generado')

obteniendo los siguientes resultados de los archivos separados:

registros leidos:  437228
validos:  427575
errores:  9646
revisar archivo de errores.txt generado

Se procesa los registros en 'accionista_validado.txt'

# RETO ECONOMIA 02

# Procesa los registros validos, que tengan todos los campos

# narchivo = input('nombre del archivo: ')
narchivo = 'accionista_validado.txt'

leidos   = 0
# Abre archivos de trabajo
archivo  = open(narchivo, 'r')
acciones = {}

# línea encabezado
linea  = archivo.readline()
partes = linea.split(';')

# columnas en cada registro
campos = len(partes) 
while not(linea==''):
    linea  = archivo.readline()
    leidos = leidos + 1
    # linea = linea.strip('\n')
    partes = linea.split(';')
    tamano = len(partes)
    unruc  = partes[0]
    participa = partes[4]
    if (len(participa)>0):
        if not(unruc in acciones):
            acciones[unruc] = 0
        if (unruc in acciones):
            acciones[unruc] = acciones[unruc] + float(participa)
    linea = archivo.readline()

archivo.close()
print('El número de empresas encontrado es:')
print(len(acciones))

excede = []
for unruc in acciones:
    if (acciones[unruc]>100.00000000000001):
        excede.append([unruc,acciones[unruc]])
n = len(excede)
print('Empresas que exceden el 100.00000000000001 % de acciones:',n)
for i in range(0,n,1):
    print(excede[i])

con lo que las empresas con exceso de registro de accionistas es:

El número de empresas encontrado es:
60946
Empresas que exceden el 100.00000000000001 % de acciones: 14
['0991317791001', 200.0]
['0992297492001', 100.00000000000003]
['0990261431001', 900.0]
['0992829222001', 487.5]
['0992719125001', 1575.0]
['0992718641001', 1200.0]
['1291750156001', 114.875]
['0991282017001', 187.5]
['0992685549001', 21350.0]
['1792040833001', 2331.795]
['1790084949001', 1250.0]
['1792232929001', 112.5]
['1791249704001', 115.0]
['1791909038001', 200.0]
>>> 

2. ¿Podría indicar los motivos por los cuales esta suma excede el 100%? ¿Existe duplicación de registros por ejemplo?

duplicación de registros,
errores en la escritura de los valores
registros por venta de acciones sin marcar el cambio de propietario

3. ¿Podría solucionar el problema con la información disponible? De ser positiva la respuesta, desarrolle el procedimiento para realizarlo y muestre los resultados.

Una vez determinadas las empresas, se presenta sus registros para analizar caso por caso

# RETO ECONOMIA 03

# Procesa los registros validos, que tengan todos los campos

# narchivo = input('nombre del archivo: ')
narchivo = 'accionista_validado.txt'
buscado  = '0991317791001'

leidos = 0
# Abre archivos de trabajo
archivo =  open(narchivo, 'r')
acciones = []

# línea encabezado
linea  = archivo.readline()
partes = linea.split(';')

# columnas en cada registro
campos = len(partes) 
while not(linea==''):
    linea  = archivo.readline()
    leidos = leidos + 1
    # linea = linea.strip('\n')
    partes = linea.split(';')
    tamano = len(partes)
    unruc  = partes[0]
    participa = partes[4]
    if unruc == buscado:
        acciones.append(linea)
    linea = archivo.readline()

archivo.close()
print('El número de accionistas de empresa encontrado es:')
print(len(acciones))
print(acciones)

con lo que se puede observar que:

El número de accionistas de empresa encontrado es:
2
['0991317791001;CENTRO DE ASESORAMIENTO Y SEGURIDAD EMPRESARIAL (CENASE) CIA. LTDA.;0701547267;ECUADOR;50.0000000000000000000000000\n', '0991317791001;CENTRO DE ASESORAMIENTO Y SEGURIDAD EMPRESARIAL (CENASE) CIA. LTDA.;1715182604;ECUADOR;150.0000000000000000000000000\n']
>>> 

donde se ve que hay problemas en el registro del segundo accionista con 150%.

se observa otro caso como ejemplo:

El número de accionistas de empresa encontrado es:
2
['0990261431001;SERVISEGUROS S.A.;0901692822;ECUADOR;855.0000000000000000000000000\n', '0990261431001;SERVISEGUROS S.A.;0991448012001;ECUADOR;45.0000000000000000000000000\n']

donde se determina que el primer registro está fuera de rango.
se puede continuar con los otros casos.


Adicionalmente, varios de los accionistas están ubicados en jurisdicciones de menor imposición o paraísos fiscales (paraisosfiscales.csv).
Con esta información adicional se pide:

4. ¿Cuántas empresas ecuatorianas tienen al menos un accionista en paraísos fiscales?

5. ¿Cuántas empresas ecuatorianas tienen accionistas con más del 51% en paraísos fiscales?

6. Genere un ranking de empresas ecuatorianas con accionistas en paraísos fiscales.

7. ¿Cuál es el porcentaje de accionistas que están ubicados en paraísos fiscales?

8. Genere un gráfico para mostrar la proporción del total de empresas con accionistas en paraísos fiscales y aquellas que no.

9. Genere otro gráfico para mostrar la proporción de empresas únicamente con accionistas locales vs aquellas que tienen al menos un accionista extranjero.

Finalmente, se le adjunta una base adicional con los sectores económicos (sectoreseconomicos.csv) a los cuales pertenecen de las empresas en Ecuador.
Con esa información:

10. ¿Qué sectores económicos son los que mayor cantidad de accionistas tienen en paraísos fiscales? Genere un ranking de estos sectores.

Entregables

Subir en la dirección https://goo.gl/_______ un archivo rar con el formato NombreGrupo_Paralelo.rar lo siguiente:

1. Código utilizado para responder a las preguntas

2. Una presentación en Power Point de sus hallazgos para ser presentada en 5 min. Utilice gráficos descriptivos (barras, pastel, etc) para crear una buena presentación.



Retos 2017IIT Genética

Referencia: http://programacion.espol.edu.ec/static/media/uploads/reto_genetica_(3).pdf

Pyweekend banner
Pyweekend01 banner Genética

En este desafío usted trabajará con secuencias de ADN.
Puede consultar más información acerca del ADN, sobre cómo está compuesto, y algunas otras consideraciones en el siguiente link .

Es posible representar información acerca de los nucleótidos del ADN representadas como texto:

“CTCCCAAACCCAATGTGAACGTTA”

Donde C: Citosina; T. Timina; A: Adenina; G: Guanina.

Usted posee una colección de archivos de ADN en formato FASTA. Una secuencia bajo formato FASTA comienza con una descripción en una única línea (línea de cabecera), seguida por líneas de datos de secuencia.

La línea de descripción se distingue de los datos de secuencia por un símbolo '>' (mayor que) en la primera columna. La palabra siguiente a este símbolo es el identificador de la secuencia, y el resto de la línea es la descripción (ambos son opcionales). No debería existir espacio entre el '>' y la primera letra del identificador.

Se recomienda que todas las líneas de texto sean menores de 80 caracteres. La secuencia termina si aparece otra línea comenzando con el símbolo '>'; esto indica el comienzo de otra secuencia. Un ejemplo simple de una secuencia en el formato FASTA puede ser:

>cytochrome_b
GCGTCGCAGCCCCNNACCAAGGCGCCCGCCGGAGGACCAACCAAAACTCTTTTTGTATACCCCCTCGCGGGTTTTTTATAATCTGAGCCTTCTCGGCGCCTCTCGTAGGCGTTTCGAAAATGAATCAAAACTTTCAACAACGGATCTCTTGGTTCTGGCATCGATGAAGAACGCAGCGAAATGCGATAAGTAATGTGAATTGCAGAATTCAGTGAATCATCGAATCTTTGAACGCACATTGCGCCCGCCAGTATTCTGGCGGGCATGCCTGTCCGAGCGTCATTTCAACCCTCGAACCCC

Un ejemplo de archivo FASTA con secuencias genéticas perteneciente a un ser humano se encuentra en https://goo.gl/n1S8dN .

Un investigador de BioIngeniería de la ESPOL, posee una base datos de Genes en Formato FASTA. Los archivos están ubicados en la siguiente dirección:

https://goo.gl/PyeuaA

Este investigador necesita automatizar algunas tareas, las cuales se describen a continuación:

Actividad 1

Se desea obtener un nuevo archivo con la secuencia original de la cadena genética, la cadena reversa, la complementaria y la reversa complementaria.

Para conocer cómo realizar esta tarea, puede consultar información en internet. En los siguientes links ( link 1, link 2) puede encontrar alguna información útil.

Ud debe realizar esto para todos los archivos de genes disponibles en el repositorio de Genes.

Ejemplo del nuevo archivo Sample1_full.fasta :

>Sample1
GGGGAAAAAAAATTTATATAT
>Sample1_complement
CCCCTTTTTTTTAAATATATA
>Sample1_reverse
TATATATTTAAAAAAAAGGGG
>Sample1_reverse_complement
ATATATAAATTTTTTTTCCCC

Fig. 1 Ejemplo de un archivo fasta con cadenas reversa, complementaria y reversa complementaria

Puede encontrar un ejemplo de un archivo completo en https://goo.gl/DAVUYa .

Actividad 2

En la actualidad existen herramientas online que pueden identificar a qué especie de ser vivo pertenece una determinada cadena de un gen. El Centro Nacional para la Información Biotecnológica (NCBI) provee una interfaz para realizar esta tarea utilizando genes en formato FASTA a través de su herramienta BLAST.

BLAST (Basic Local Alignment Search Tool), posee una interfaz web que permite realizar identificación de especies. Las siguientes imágenes describen el proceso:

1. Copiar el gen de la cadena original del gen en formato FASTA. Ejm. Fig 2

Pyweekend Reto Genética archivo en txt

Fig 2. Ejemplo de un archivo fasta con un Gen desconocido

2. Ir al sitio: https://blast.ncbi.nlm.nih.gov/Blast.cgi
3. Seleccionar el link Nucleotide Blast
4. Pegar la cadena FASTA en el área de texto correspondiente. Ejem. Fig.3
5. Seleccionar el botón BLAST al final de la página web

Pyweekend Reto Genética sitio fuente

Fig. 3 Interfaz de la herramienta BLAST de NCBI

6. La página se redirecciona, después de algunos segundos, se muestra una pantalla como la de la figura 4.

Pyweekend Reto Genética 03

7. En el apartado de Descripción, existe una lista de las posibles especies que contengan el gen consultado en su código genético. En el ejemplo anterior se observa que la especie corresponde a Trichoderma Harzianum con una posible identidad del 100%.

8. Si necesita observar un video detallado de todo el proceso descrito, lo puede observar en la siguiente dirección: https://goo.gl/qWSoVJ .

El investigador desea conocer la lista de especies a la que pertenecen los genes de los que se tiene registros en archivos ubicados en https://goo.gl/PyeuaA . Su tarea consiste en automatizar todo el proceso de búsqueda de identidad de especies a través de BLAST. Se conoce de la existencia de una librería llamada BioPython, la cual hace posible realizar la consulta BLAST a través de este lenguaje de programación. Para esta tarea, ud debe identificar las especies utilizando BLAST a través de BioPython.

Actividad 3

Se desea contar con un diagrama de barras o pastel de la cantidad de Nucleótidos (Timina, Adenina, Guanina, Citosina) de las cadenas pertenecientes a cada especie.
Colocar 3 ejemplos de estos gráficos en su presentación.

Entregables

Subir en la dirección https://goo.gl/4j4Tjn un archivo rar con el formato NombreGrupo_Paralelo.rar lo siguiente:

1. Código utilizado y archivos generados.
2. Una presentación en Power Point de sus hallazgos para ser presentada en 5 min.

En la presentación
● Explicar el algoritmo que utilizaron para utilizar Python y Blast.
● Mostrar los gráficos de la actividad 3.



Retos 2017IIT Robótica

Pyweekend banner
Pyweekend 01 banner Robótica

Referencia: http://programacion.espol.edu.ec/static/media/uploads/reto_rob%C3%B3tica_(2).pdf
El reto simula un cuarto de dimensiones 1200 x 700.

Dentro del cuarto se encuentra un robot en la esquina inferior izquierda y una meta en la esquina superior derecha, tal como se muestra en la Figura 1.

El objetivo del reto consiste en mover el robot desde su punto inicial hasta la meta, evitando los obstáculos que se puedan encontrar en el cuarto.

Pyweekend Reto Robótica 01

Figura 1. Ambiente de pruebas del reto.

El robot tiene forma circular (diámetro = 51) y cuenta con los siguientes métodos (funciones):

Percepción

robot.get_pos()

Retorna un tupla indicando la ubicación del centro del robot dentro del cuarto, según el sistema de coordenadas de la Figura 2.

Por ejemplo, en su posición inicial robot.get_pos() retorna: (35, 665).

Pyweekend Reto Robótica 02

Figura 2. Sistema de Coordenadas

robot.get_angle()

Retorna el ángulo en el que se encuentra orientado el robot. El robot puede retornar valores positivos o negativos dependiendo de hacia dónde realizó el giro partiendo desde cero.

El valor cero representa que el robot se encuentra orientado hacia arriba, a partir de esta posición se consideran como positivos los giros hacia la izquierda y como negativos los giros hacia la derecha (Figura 3). Los valores de ángulo siempre se mantienen entre -360 y +360.

Pyweekend Reto Robótica 03
Pyweekend Reto Robótica 03a


Figura 3. Valor de ángulo del robot cuando realiza: giro a la derecha (fila superior), giro a la izquierda (fila inferior)

robot.get_collision()

Retorna un valor booleano que indica si el robot ha chocado contra algún obstáculo.

robot.read_sensors()

El robot consta de un anillo de sonares que le permiten conocer la distancia a los objetos en su ambiente. El anillo se sonares está compuesto por 13 sensores de distancia ubicados cada 15 grados, comenzando desde la izquierda del robot y finalizando a la derecha. El máximo alcance de cada sensor es de 200.

El método read_sensors() retorna una lista con los valores de cada uno de los sensores. Por ejemplo, para el robot de la Figura 4, robot.read_sensors() retorna [170, 175, 195, 200, 200, 200, 200, 200, 200, 200, 115, 135, 200]

Pyweekend Reto Robótica 04

Figura 4. Lectura de sonares del robot

robot.get_traces()

Retorna una lista de tuplas con las posiciones recorridas por el robot. En la Figura 5 se representa esta lista por medio de puntos en azul.

Pyweekend Reto Robótica 05

Figura 5. Recorrido del robot (traces)

Actuadores

En el reto se simula a un robot de manejo diferencial (2 motores, uno de cada lado) sin embargo se ha limitado el control de los motores, por lo cual el movimiento del robot se puede realizar por medio de 2 funciones solamente.

robot.spin(r_step_theta)

Permite girar al robot un número de grados determinados a partir de su orientación actual. Si el parámetro es negativo, el robot girará hacia la derecha (horario), y si es positivo girará hacia la izquierda (anti horario).

La variable global r_step_theta tiene un valor por defecto de 7.5 grados.

robot.move_fwd()

Permite mover al robot hacia adelante (en la orientación a la cual se encuentra actualmente). El robot se desplazará 5 unidades en la pantalla.

Implementación de la solución

Al iniciar el reto se proveerá a su equipo de un código que carga la simulación y un ambiente de prueba.

Su misión es implementar la función start() que se encarga de mover el robot para que logre llegar a la meta.

El programa se detendrá automáticamente cuando el robot alcance la meta y llamará a la función report().

En la función report, su equipo puede almacenar todos los datos que crea necesarios para ser utilizados en la exposición de su respuesta. Además, puede realizar optimizaciones de la ruta generada.

Pyweekend Reto Robótica 06

En la exposición de la solución se requiere que se describa el algoritmo que utilizaron para lograr el objetivo y que muestren una gráfica del camino que el robot debe seguir para llegar a la meta en base a la ejecución de su programa.

La meta se encuentra en las coordenadas (1150,20).

Código del Proyecto

El código para ejecutar el simulador del robot lo puede encontrar en: https://goo.gl/FzkFmi .

Para ejecutarlo, previamente debe tener instalado Pygame. Si no lo tiene instalado en su máquina, por favor instalarlo utilizando el siguiente comando: pip install pygame.

Entregables

Subir en la dirección https://goo.gl/QCexV4 un archivo rar con el formato NombreGrupo_Paralelo.rar lo siguiente:

1. Código utilizado

2. Una presentación visual para ser presentada en 5 min (Ejm: Power Point). Esta presentación, además de la descripción del algoritmo que presentó, debe incluir:

a. Capturas de 2 escenarios en los que se utiliza su algoritmo (traces y tiempo).

En la presentación Además de lo solicitado, realizar una demo del robot simulado utilizando su algoritmo.



Retos 2017IIT Video Juegos

Referencia: http://programacion.espol.edu.ec/static/media/uploads/reto_videjuegos_(2).pdf

Pyweekend banner
Pyweekend 01 Videojuegos

Ud posee una versión de Super Mario Bros. implementada en Pygame.

EL código se lo puede descargar en https://goo.gl/8xvKgZ .

Esta versión de Mario en Python muestra el primer mundo de este juego clásico.

Para que este demo funcione, ud debe instalar Pygame previamente.

Pyweekend Reto Videojuego 01

Su tarea para este reto consiste en:

1. Modernizar la apariencia de los personajes del juego (Mario, Goomba, etc). Pues esta versión cuenta con la apariencia de los personajes tradicionales. Para realizar esta tarea, considere el concepto de Sprite Templates ( link ).

2. Modificar el mundo de Mario. Es decir, crear nuevos obstáculos, colocar enemigos en nuevos lugares. No existen limitantes al respecto, puede crear el mundo que ud considere más divertido.

La evaluación de este reto, tomará en cuenta ´la creatividad de su grupo en el diseño del mundo y la actualización de los personajes.

Entregables

Subir en la dirección https://goo.gl/ywTNPq un archivo rar con el formato NombreGrupo_Paralelo.rar lo siguiente:

1. Código desarrollado.

2. Una presentación visual rápida de 2min de lo más relevante que modificó o añadió al código.

Nota: En la presentación de su solución Ud. debe mostrar una demo del juego.




Unidades FP