Curso de programación de criptomonedas con Python - 9. Crear un bot recopilador de grandes cantidades de datos (parte 2/5)

in #spanish8 years ago (edited)

Vamos a continuar con la construcción de nuestro bot. En la clase anterior definimos la función para coger los datos globales de coinmarketcap.

Hoy vamos a construir el núcleo de nuestro script, pero antes que nada os he preparado una infografía para que entendamos cual será el funcionamiento general de nuestro bot:

Las palabras en azul son las funciones que crearemos, que se conectarán entre sí llamándose unas a otras y pasándose datos de entrada, señalados en rojo. La función get_datos_global() ya la hicimos en el capítulo anterior, hoy haremos get_info().

El objetivo de esta función es crear diccionarios anidados con la siguiente estructura:

{'BTC': {'available_supply': ____, 'total_supply': ____, 'rank': ____... etc}, 'STEEM': {...} etc}

Antes vamos a importar una librería que vamos a necesitar, la librería json. Añadimos a nuestra línea del comienzo: import ast, json.

Ahora voy a poner el resto del código completo y abajo lo comento para que el post no se haga eterno. Entendiéndolo vamos a aprender sobre bucles for y sentencias condicionales if/elif/else. Allá va:

def get_info(numero, tipo):
    dic1 = {}
    cont = 1
    for a in range(numero):
        clave = json.loads(coinmarketcap.ticker())[a]['symbol']
        dic2 = {}
        if tipo == 'diaria':
            parametros = ['available_supply', 'total_supply', 'rank','id','percent_change_1h', 'percent_change_24h', 'percent_change_7d', 'price_usd', 'price_btc', '24h_volume_usd', 'market_cap_usd', '24h_volume_usd']
            for b in range(12):
                clave2 = parametros[b]
                dic2[clave2] = json.loads(coinmarketcap.ticker())[a][parametros[b]]
        elif tipo == 'mensual':
            parametros = ['available_supply', 'total_supply', 'rank','id', 'percent_change_7d', 'price_usd', 'price_btc', '24h_volume_usd', 'market_cap_usd']
            for b in range(9):
                clave2 = parametros[b]
                dic2[clave2] =  json.loads(coinmarketcap.ticker())[a][parametros[b]]
        dic1[clave] = dic2
        print cont
        cont = cont + 1
    return dic1

Funciones con entrada de datos

La primera línea es una función que pide entrada de datos. Las entradas que pide esta función son dos. Para el parámetro 'número' podemos seleccionar la cantidad de monedas que nuestro bot recopilará contando desde el puesto 1 del ranking de coinmarketcap. 'Tipo' sólo admite dos entradas: 'diaria' o 'mensual', ya que nuestro bot cogerá dos secuencias de datos diferentes.

La segunda línea crea un diccionario vacío llamado dict1, que rellenaremos con las monedas como claves y la información de las monedas en otro diccionario anidado, tal y como mostrábamos en la estructura.

La tercera línea es un contador. Lo añadí a posteriori debido a que coinmarketcap admite pocas llamadas cada minuto. Por lo tanto, para recoger la información que necesito de 250 monedas, tarda media hora más o menos. Con este contador sé cuánto falta por recopilar. Los contadores son muy útiles para muchas cosas.

Los bucles for

En la cuarta línea empezamos un bucle for. Este tipo de bucles son muy útiles para recoger grandes cantidades de datos. Significa que el código indentado con 4 espacios bajo este bucle se repetirá siguiendo las condiciones. En esta ocasión vemos que dice: for a in range(numero):, lo que significa que el número de cada repetición va a estar denominado en la variable a y se va a repetir el número de veces de monedas que queramos recopilar. Más información sobre la función range().

En la línea 5 tenemos: clave = json.loads(coinmarketcap.ticker())[a]['symbol'], es decir, una variable llamada 'clave' que será el símbolo de la moneda sobre la cual estamos iterando durante la ejecución del bucle, por ejemplo BTC. [a] es la variable del bucle, y está colocada para indicar la posición de la lista de monedas de coinmarketcap, de la cual extraemos el dato del diccionario con ['symbol']. La función json.loads funciona como decodificador de la cadena de texto que nos devuelve coinmarketcap, más información aquí.

Luego creamos el diccionario anidado para la moneda que estamos iterando con dict2 = {}.

Las condicionales if/elif/else

Ahora nos adentramos en las condicionales. Sirven para establecer que el código indentado bajo ellas se ejecute sólo si se cumple la condición. En este caso se cumple si el dato de entrada tipo, en los parámetros de entrada de la función, es una cadena de texto formada por la palabra 'diaria'. El símbolo de == se usa para igualdad de cadenas de texto, para diferenciarlo de =, usado para números y booleanos.

Por lo tanto, si el tipo es 'diaria', los parámetros que escogeremos para recopilar serán esos. Están puestos en una lista sobre la que iteraremos para extraer esos parámetros y colocarlos como las claves de nuestro diccionario anidado. Los valores del diccionario serán la información sobre las monedas. Para hacerlo creamos un nuevo bucle con para iterar el número de veces como parámetros tenemos (12).

En la siguiente línea decimos a Python: "crea una nueva variable llamada 'clave2' y asociala al parámetro sobre el cual estamos iterando". A continuación viene dic2[clave2] = json.loads(coinmarketcap.ticker())[a][parametros[b]]. Significa que inserte en el diccionario anidado un par de claves valor: "para la clave usa la variable 'clave2' que acabamos de crear y para el valor recógelo de coinmarketcap, de la moneda donde estamos iterando el bucle principal [a]escoge el parámetro sobre el cual estamos iterando en el bucle anidado.

Esto es lo más complicado que encontrarás creando bucles, saber donde estás iterando y qué valores estás asociando a qué. Para no perderte sigue el flujo de ejecución. Con un poco de práctica dominarás el jugar con la variable que podemos crear al iniciar un bucle, en este caso [a] y [b].

Si el tipo que hemos insertado es 'mensual', se ejecutará la otra parte de la estructura if, que es muy parecida a la primera parte, pero con menos parámetros, así que me ahorro explicarla.

Sólo nos queda meterle al diccionario principal los pares de claves-valor, donde la clave será la moneda y el valor será el diccionario con la información de la misma. Lo hacemos con dic1[clave] = dic2. Para terminar imprimimos el número de moneda por el que vamos iterando, sumamos +1 al contador y devolvemos nuestro diccionario completo con return dict1.

Comentario adicional

Ya tenemos un nuevo módulo de nuestro bot construido. Espero que te haya sido fácil de entender. Puedes prescindir en tu código del tipo 'mensual', yo lo he hecho para crear dos bases de datos distintas, pero si lo que quieres es recoger la información diaria únicamente escribes cómo parámetro de entrada sólo 'numero' y te olvidas de hacer las condicionales.

Si tienes alguna duda coméntala aquí. En la próxima parte veremos como guardar los datos en un simple archivo de texto, que nos servirá como base de datos. ¡Hasta entonces!


Índice del curso:

1. Presentación
2. Cómo empezar: llamadas a APIs
3. Envolturas
4. Recopilar datos uno a uno: diccionarios
5. Recopilar datos uno a uno: listas
6. Funciones. Crear un bot informador de STEEM (parte 1/2)
7. Crear un bot informador de STEEM (parte 2/2)
8. Crear un bot recopilador de grandes cantidades de datos (parte 1/5)

Sort:  

Menudo curro compañero!! me da pereza pero esta tan bien explicado que creo que me voy a animar a intentarlo ;)

¡Me alegro que te inspire a iniciarte en este arte! Con un poco de paciencia y el placer de aprender se logra todo. Un saludo.

This post has been linked to from another place on Steem.

Learn more about and upvote to support linkback bot v0.5. Flag this comment if you don't want the bot to continue posting linkbacks for your posts.

Built by @ontofractal

Coin Marketplace

STEEM 0.27
TRX 0.13
JST 0.032
BTC 62683.02
ETH 2962.44
USDT 1.00
SBD 3.64