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

in #spanish8 years ago (edited)

Si has seguido el curso hasta aquí, ya dominas gran parte del conocimiento necesario en Python para jugar con las APIs que proveen información sobre monedas. Ahora vas a enfrentarte a un reto mayor: crear una base de datos con indicadores diarios y mensuales con la información que nos provee coinmarketcap. Con ella podremos monitorear grandes cantidades de datos en poco tiempo, lo que puede ser útil para crear bots de trading, por ejemplo.

Con este objetivo vamos a aprender de forma práctica a definir funciones con entrada de parámetros y retorno de datos, a utilizar los bucles for, a utilizar las condicionales if/elif/else, a escribir archivos de texto con Python... etc. Lo haremos paso a paso para ir entendiendo todo lo que iremos haciendo, así que... ¡manos a la obra!

Descomponer el problema

Para realizar cualquier script, por muy complicado que parezca a priori, es recomendable partir el problema que se nos presenta en pequeños problemas más pequeños. En esta ocasión, nuestro gran problema es coger información de coinmarketcap para las primeras 250 monedas en el ranking e información general del ecosistema bitcoin. Para simplificarlo la guardaremos ordenada en archivos de texto que podremos consultar por fechas.

Para entender qué queremos hacer vamos a la documentación de la API de coinmarketcap. Esta API nos provee dos tipos de datos: la información de las monedas y la información global de todo el ecosistema bitcoin. Vamos a 'Global Data' y vemos la respuesta que nos entrega la API sobre los datos globales.

De estos datos, yo estoy interesado en seleccionar únicamente 4: la capitalización total del ecosistema bitcoin en dólares, el porcentaje de bitcoin en la capitalización del mercado, las monedas activas, y los mercados activos. Los otros dos no me interesan.

Así que creamos una carpeta y dentro insertamos la [envoltura de coinmarketcap]https://pypi.python.org/pypi/coinmarketcap/), la cual aprendimos a utilizar en una lección anterior. Luego creamos un archivo con el nombre que más nos guste, con la terminación .py, yo le llamaré recopilador.py, pues se va a encargar de recopilar datos.

Para empezar, vamos a importar la envoltura coinmarketcap y la librería ast que necesitamos para convertir los datos que coinmarketcap nos provee en forma de cadena de texto a listas y diccionarios, como explicamos en el proyecto anterior. Para ello escribimos el siguiente código.

import ast
from coinmarketcap import Market()

Más adelante iremos importando otras librerías a medida que las necesitemos. Ahora vamos a renombrar la clase Market() para saber que nos estamos refiriendo a una llamada a coinmarketcap, escribimos:

coinmarketcap = Market()

Funciones sin entrada de parámetros

Entonces es momento de adentrarnos en las funciones. Como adelantamos en una clase anterior, las funciones son conjuntos de órdenes que le damos a Python para que procese información y nos devuelva ciertos datos. Las funciones pueden necesitar de parámetros de entrada o no.

Ahora vamos a crear una función sin parámetros de entrada que servirá para recopilar los datos globales de coinmarketcap. Estos datos vamos a guardarlos en un diccionario con la siguiente estructura:

{'total_market_cap_usd': ___, 'bitcoin_percentage_of_market_cap': ___, 'active_markets': ___, 'active_currencies': ___}

Donde en ___ irá el dato que recogeremos. Para empezar, vamos a definir la función. Añadimos al código lo siguiente:

def get_datos_global():

Así se define una función, con def, paréntesis tras el nombre y : al final. Si hubiera parámetros de entrada los colocaríamos entre los paréntesis, pero ya lo veremos en la siguiente lección. Tras esto, pasamos a escribir:

def get_datos_global():
    global = ast.literal_eval(coinmarketcap.stats())

Con esto usamos la librería ast para convertir los datos tipo cadena de texto que nos manda coinmarketcap en dicccionarios. Tengamos en cuenta que esta nueva línea hay que escribirla con una indentación o 4 caracteres de espacio. Así indicamos a Python que la información está contenida dentro de la función.

Entonces vamos a crear el diccionario donde guardaremos los datos globales que nos interesan. Lo haremos así:

def get_datos_global():
    global = ast.literal_eval(coinmarketcap.stats())
    datos_mensual = {}

Con esto lo que hacemos es crear un diccionario vacío que se llama 'datos_mensual'. Yo le he puesto este nombre porque son los datos que recojo una vez al mes. Ahora procedemos a insertarle a este diccionario lo datos que nos interesan. Añadimos cuatro líneas más de código:

def get_datos_global():
    global = ast.literal_eval(coinmarketcap.stats())
    datos_mensual = {}
    datos_mensual['total_market_cap_usd'] = global['total_market_cap_usd']
    datos_mensual['bitcoin_percentage_of_market_cap'] = global['bitcoin_percentage_of_market_cap']
    datos_mensual['active_markets'] = global['active_markets']
    datos_mensual['active_currencies'] = global['active_currencies']

Lo que estamos haciendo aquí es agregar datos al diccionario. Lo que va antes de = son las claves del diccionario y lo que va detrás son los valores. Aquí puedes consultar más información sobre cómo agregar pares de claves-valor a un diccionario.

Para terminar esta función agregamos return datos_mensual. Comprueba que está bien hecho escribiendo abajo de la función, sin dejar espacios de indentación: print get_datos_global. Te deberá salir algo como esto:

Si es así estupendo, si no repasa tu código. El código completo es el siguiente:

import ast
from coinmarketcap import Market()

coinmarketcap = Market()

def get_datos_global():
    global = ast.literal_eval(coinmarketcap.stats())
    datos_mensual = {}
    datos_mensual['total_market_cap_usd'] = global['total_market_cap_usd']
    datos_mensual['bitcoin_percentage_of_market_cap'] = global['bitcoin_percentage_of_market_cap']
    datos_mensual['active_markets'] = global['active_markets']
    datos_mensual['active_currencies'] = global['active_currencies']
    return datos_mensual

Hasta aquí el primer capítulo sobre recopilar grandes cantidades de datos. En siguientes clases seguiremos construyendo nuestro bot paso a paso. Cualquier duda no olvides en comentarla, ¡un saludo y hasta la próxima!


Í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)

Coin Marketplace

STEEM 0.16
TRX 0.13
JST 0.027
BTC 58440.50
ETH 2618.70
USDT 1.00
SBD 2.39