Archivo

Truco Python. Seleccionar o eliminar variables de un data frame en base a un prefijo, sufijo o si contienen un caracter

A la hora de seleccionar las características de un data frame es posible que nos encontremos con la necesidad de seleccionar o eliminar características del data frame y que el nombre de esas características tenga un determinado patrón. Esta labor la podemos realizar mediante selección de elementos en listas, en esta entrada del blog vamos a tener 3 tipos de selecciones:

1. Seleccionar o eliminar aquellas variables que empiezan por un determinado prefijo
2. Seleccionar o eliminar aquellas variables que contienen una cadena de caracteres
3. Seleccionar o eliminar aquellas variables que finalizan con un sufijo

Para ilustrar este trabajo generamos un data frame con datos aleatorios y 10 columnas:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(0,100,size=(100, 10)),
columns=['A1','A2','A3','B1','B2','B3','C1','C2','C3','DA'])

El primero de los filtros a realizar es identificar que variables de nuestro data frame contienen el string 'A':

col = list(df.columns)
#Filtro 1: Columnas que tienen una A
filtro1 = [col for col in df if col.find('A')>=0]
#Eliminar
df1_drop = df.drop(columns=filtro1)
#Seleccionar
df1_keep = df[filtro1]

Siempre vamos a hacer el mismo proceso, las características de nuestro data frame irán en una lista, después recorremos la lista y seleccionamos aquellos donde el método .find('A') sea mayor o igual a 0, con esto hemos creado una sublista con aquellas características que tienen el string 'A' mediante .drop(columns=) eliminamos del data frame los elementos contenidos en una lista Sigue leyendo Truco Python. Seleccionar o eliminar variables de un data frame en base a un prefijo, sufijo o si contienen un caracter

Truco Python. Agrupar variable en función de la frecuencia

Me ha surgido la necesidad de crear una nueva variable en un data frame a partir de la frecuencia de otra, es decir, quedarme con los valores más frecuentes y aplicar una categoría resto para aquellos valores que no estén en los más frecuentes. Para realizar esto se me ha ocurrido la siguiente función en Python:

def agrupa_frecuencia (var_origen, var_destino, df, grupos, valor_otros):
    df_grp= df[var_origen].value_counts()
    list_grp = list(df_grp.iloc[0:grupos,].index)
    df[var_destino] = df[var_origen].map(lambda x: x if x in list_grp else valor_otros, na_action='ignore')

Es una función con más parámetros que líneas, pero necesitamos una variable de origen, una variable de destino que será la que calcularemos, el data frame sobre el que realizamos la tarea, el número de grupos más otro que será el "resto" y dar un valor a ese "resto". La función lo que hace es una tabla de frecuencias ordenada descendentemente con .value_counts() y creamos una lista con el número de grupos que deseamos. Por último mediante lambdas si la variable origen está en la lista generada anteriormente le asignamos el mismo valor, en caso contrario asignamos el valor "resto". Es una programación sencilla, seguramente haya una función específica en sckitlearn para agrupar variables en base a la frecuencia, pero no la he encontrado y he tardado más en buscarla que en hacerla.

Como es habitual os pongo un ejemplo de uso para que podáis ver como funciona:

personas = 1000
grupo = pd.DataFrame(np.random.poisson(15,personas))
grupo['clave']=0
valor = pd.DataFrame(np.random.uniform(100,10000,personas))
valor['clave']=0
df = pd.merge(grupo,valor,on='clave')
del df['clave']
df.columns = ['grupo', 'valor']
df['grupo'].value_counts()

Vemos que grupo crea muchos valores y vamos a agrupar la variable del data frame de forma que los 10 más frecuentes toman su valor y los demás serán un resto:

agrupa_frecuencia('grupo', 'grupo_nuevo', df, 10, 99)
df['grupo_nuevo'].value_counts()

Parece que funciona, si mejoráis, actualizáis o encontráis pegas...

Libro de R de Carlos Gil

Muchos de los lectores de esta bitácora conocéis https://www.datanalytics.com/ el blog de Carlos Gil. En él ha publicado un libro/manual de R de acceso libre para todos aquellos que necesitéis una guía que abarque desde lo más básico al tratamiento de datos con R pasando por Shiny y análisis estadísticos de esos viejunos tan denostados últimamente.

De todas formas no sé como no deja este mundillo y se dedica plenamente a su faceta hostelera. En palabras de mi hijo: "El mejor brunch de Madrid, un 10".

Facebook y su Facebookgate son buenas noticias para el data scientist y para el oficio en general

En todo el lío de Facebook y su Facebookgate o Facegate ha aparecido el nombre de Cambridge Analytica empresa dedicada al análisis de datos para el desarrollo de campañas. Probablemente en la mente de todos está la forma de operar de esta compañía con estorsiones, prostitutas y malas artes varias. Sin embargo yo me quedo con lo que se supone que ha hecho esta empresa con los datos de millones de usuarios de Facebook, los análisis llevados a cabo por Cambridge Analytica han influido en la campaña presidencial de Estados Unidos y en el referéndum por el Brexit. Es decir, gestión de grandes volúmenes de datos y métodos de análisis (no sé si avanzados o no) son capaces de poner y quitar presidentes de la democracia más importante del mundo.

Si una muestra de datos, una muestra de usuarios de Facebook (porque sólo es una pequeña parte) provoca ese tipo de “terremotos” electorales ¿os imagináis que se puede hacer con nuestros datos de Facebook? Pues eso, inimaginable. Pueden hacer series a nuestro gusto, saber si pueden darnos un préstamo, determinar el precio de nuestro seguro de vida, pueden saber lo que necesitamos incluso antes de necesitarlo. Una pequeña parte de lo que sabe Facebook de nosotros porque somos nosotros los que hacemos Facebook. En el momento de escribir estas líneas Facebook está bajando su cotización bursátil, y yo opino que debería subir porque acaba de demostrar su potencial: Una red social que puede sacar a millones de británicos de la Unión Europea para hacer más grande a los enemigos de la Unión.

Podemos pensar que es el momento de poner control, de regular, que estamos trabajando en directrices del tipo GDPR que protege nuestra privacidad, que las multas pueden poner coto a este tipo de actuaciones. ¿Poner control a la publicación libre de una opinión? Podemos poner control al uso de esa información, pero ese concepto de “uso” es el que puede ser más difuso desde el momento en el que entra en juego el uso de datos anónimos. Ejemplo, si no das tu consentimiento expreso para que tu información pueda ser usada te cobro por el servicio, si das ese consentimiento el servicio será gratuito, yo te garantizo que eres un elemento anónimo. Y muchos anónimos han puesto como presidente del gobierno de Estados Unidos a Donald Trump.

Para mi todo esto no son malas noticias, se acaba de demostrar que mi trabajo y el de otros muchos mineros de datos, data scientist, gestores de la información… funciona ¡y de qué manera! Yo ya lo sabía porque ya son años haciendo que grandes compañías gasten menos o ganen más con datos. Y por cierto, no estaría mal que Cambridge Analytica compartiera su trabajo en github.

Notebook para empezar (y probar) en spark y scala

No debo enseñar Spark a nadie, no soy ni un usuario avanzado, ni le veo mucho recorrido. Sin embargo tengo que hacer diversos procesos con dataframes en spark y realizar modelos con MLlib y tengo que "perder tiempo" probando cosas, necesitaba un entorno sencillo en casa. En un primer momento exploré máquinas virtuales y alguna sandbox. Ninguna me convencía y le  pedí a un compañero mío, Juanvi, que sabe mucho que me montara un entorno con un notebook de spark para poder jugar con scala y MLlib de modo sencillo. En vez de montarme el entorno en 20 minutos me escribió un correo con 3 direcciones que me están siendo de mucha utilidad y quería compartirlas con vosotros.

La primera dirección es el repositorio donde está alojado este desarrollo del notebook de spark: https://github.com/spark-notebook/spark-notebook Lo primero que debemos estudiar es la documentación y por último generar o seleccionar el notebook que deseamos.  Aquí me gustaría hacer una anotación, no he sido capaz de hacer funcionar en Windows ninguna distribución que no sea de docker, sin ningún problema las dos distribuciones que he probado en Ubuntu y en el Apple sin problema con docker, al final, por temas profesionales, he optado por una versión con Hive-parquet y spark 2.0.1:

 docker pull andypetrella/spark-notebook:0.7.0-scala-2.10.6-spark-2.0.1-hadoop-2.7.2-with-hive
 docker run -p 9001:9001 andypetrella/spark-notebook:0.7.0-scala-2.10.6-spark-2.0.1-hadoop-2.7.2-with-hive

Instalado y arrancado el servicio nos conectamos a http://localhost:9001/ y ya tienes un entorno de pruebas más que digno que funciona mejor que las sandbox que he probado. Un tema, si alguien puede aportar más sobre la distribución del Notebook en Windows que comente la entrada. Espero que pueda ser de utilidad, saludos.

 

De actuario a científico de datos

De_actuario_a_cientifico_de_datos1

Si vemos las tendencias de búsqueda de Google Trends entre “actuary” y “data scientist” desde 2015 se aprecia que la segunda tendencia ha ido en aumento en los últimos tiempos hasta ser una búsqueda tan popular o más que la tendencia “actuary”. Aunque tengo formación como estadístico e informático he trabajado haciendo labores de actuario especializado en precios tanto de nuevo negocio como en renovación durante muchos años y ahora estoy evolucionando para convertirme en científico de datos. He hablado en algún evento de este cambio de paradigma que va más allá de quitarme la corbata y venir a trabajar en zapatillas. En mi opinión el origen de este cambio está en el trabajo en entornos colaborativos y por consiguiente en el uso y la extensión del software libre y los beneficios que esto supone.

El actuario es un tipo de la vieja escuela con mucha formación académica a sus espaldas, experto en su negocio, que sabe mucho de estadística y gurú en software comercial de precio alto que está expresamente pensado para su trabajo diario. Todo va medido al milímetro ya que suele moverse en entornos regulados y nada puede escapar a su control ¡su trabajo está sujeto a una supervisión!. Y ahora aparecen unos tipos que, a golpe de formación en Coursera, hacen modelos de todo tipo y de forma industrial basados en técnicas de aprendizaje automático con lenguajes de programación compuestos de librerías que cualquiera se puede descargar de la red y donde cada programador aporta su granito de arena. Un entorno con menor control que es más difícil de regular.

El cambio está ahí y es importante adaptarse, no podemos ser reaccionarios, de hecho el actuario ha trabajado en cambios tecnológicos y de negocio fundamentales. Algún actuario que esté leyendo esto habrá vivido una migración de una tarifa univariable a una tarifa multivariable ¿qué pasó? Se pasó de un dominio total de una tarifa por parte del equipo de negocio a una estructura más complicada pero ¿cuáles fueron los resultados? Mejoraron las ventas y mejoró la siniestralidad. Es así, personalmente lo he vivido. Y el actuario ha sido capaz de plasmarlo en una nota técnica. Optimización de precios en renovación, lo mismo, sólo que esto cuesta más dejarlo plasmado en una nota técnica, pero el actuario ha sido capaz. ¿No va a ser capaz el actuario de emplear nuevas técnicas de modelización y optimización? Cuidado, no mal interpretemos, no se trata de perder la cabeza con el deep learning (por ejemplo), que se están viviendo situaciones extremistas del tipo “no me fío de los modelos” a “sin el deep learning estamos fuera”, hay que hacer una transición. Y esta transición, en mi opinión, hay que basarla precisamente en las técnicas de modelización cimentadas en nuevos lenguajes de programación y desarrollos colaborativos.

El cambio es necesario y no debemos ser ajenos, yo personalmente lo estoy viviendo, en 9 meses me he actualizado tecnológicamente. Es verdad que aun me ruboriza comprobar como distintos motores que hacen MapReduce son capaces de dar resultados diferentes, sólo varían unos pocos cientos me dicen, a ver como se lo cuentas a un supervisor. O el caso en el que se busca el mejor modelo con miles de variables en base a bucles y donde sólo importa el AUC o se reclasifica un factor de forma automática en base a tal o cual algoritmo. Está siendo duro pero se abre un mundo de posibilidades donde nuestra creatividad ya no está limitada por el software, además esta nueva forma de trabajar la podemos adaptar a nuestras necesidades creando aceleradores que nos permiten centrarnos en el negocio y no tanto en la programación, no es necesario ser un gurú en programación ni trabajar con “pantallas negras” ya que se elaboran entornos más amigables y donde muchas tareas las puedes automatizar, te haces el software a medida. Por otro lado podemos resumir el comportamiento de modelos que van más allá de una clasificación lineal, no son cajas negras porque hay técnicas y medios para explicar como se comporta mi cliente dentro de un modelo, incluso podemos hacer un chatbot que te resuma el comportamiento cliente a cliente. Y cuando hacemos optimización matemática con la renovación de nuestra cartera… se acabó de depender del fabricante, ahora podemos usar la última técnica que ha implementado una universidad en cualquier lugar del mundo.

Hay que cambiar o estamos fuera por más que creemos marcos regulatorios para garantizarnos el trabajo durante unos años.

Beatifulsoup. Web scraping con Python o como las redes sociales pueden estar cambiando la forma de escribir

Boxplot_BeatifulShop

Desde hace tiempo mis frases son más cortas. Creo que es un problema de las redes sociales, sobre todo twitter, que está cambiando mi comportamiento. Para analizar si esto está pasando se me ha ocurrido analizar la longitud de las frases de este blog desde sus inicios y de paso aprovechar para hacer web scraping con la librería Beatifulshop de Python. La idea es recorrer el blog y calcular la longitud de las frases y representar gráficamente como ha ido evolucionando esa longitud.

Podía haber trabajado directamente con la base de datos de wordpress pero he preferido leer las páginas de la web. Hay un problema, si véis el nombre de las páginas no tiene un orden cronológico, son el nombre de la propia entrada [http://analisisydecision.es/los-bancos-lo-llaman-transformacion-digital-yo-lo-llamo-me-da-miedo-facebook/] pero es cierto que se almacena una vista por mes de las entradas publicadas [http://analisisydecision.es/2017/02/] vamos a emplear esas vistas que no recogen la entrada entera pero si las primeras frases, con estas limitaciones vamos a medir la longitud de las frases.

Luego la analizamos paso a paso pero la función de Python que voy a emplear es:

import pandas as pd
from bs4 import BeautifulSoup
import requests
import re
import time 
import string

def extrae (anio, mes):
    url = "http://analisisydecision.es/" + anio + "/" + mes + "/"
    print (url)
    # Realizamos la petición a la web
    pagina = requests.get(url)
    soup = BeautifulSoup(pagina.content, 'html.parser')
    m = str(soup.find_all('p'))
    m = BeautifulSoup(m)
    m = str(m.get_text())
    frases = pd.DataFrame(m.split("."),columns=['frase'])
    frases['largo'] =  frases['frase'].str.len()
    frases['mes'] = anio + mes
    frases['frase'] = frases['frase'].apply(lambda x:''.join([i for i in x if i not in string.punctuation]))
    frases = frases.loc[frases.largo>10]
    time.sleep(60) 
    return frases

Os comento paso a paso, a la función le vamos a pasar el mes y el año y esa será la url que lee http://analisisydecision.es/2017/02/ esa es la web sobre la que vamos a hacer el scraping. Vía request obtenemos la web y BeatifulSoup sólo para quedarnos con el contenido en HTML de la web cargada Sigue leyendo Beatifulsoup. Web scraping con Python o como las redes sociales pueden estar cambiando la forma de escribir

Diagramas de Voronoi con spatial de python

En breve "mis cachorros", como llamo a un grupo de los mejores Data Scientist de Europa (de los que tengo que hablar algún día) se van a enfrentar a un problema que probablemente tengan que resolver con análisis geométricos muy complejos. Para despertarles la curiosidad (sé que me leen) hoy traigo al blog una entrada que nos aproxima al método de interpolación geométrica más sencillo, al diagrama de Voronoi. Con spatial de scipy podemos trabajar con estos diagramas:

seed(89)
df = pd.DataFrame(np.random.uniform(1,100,size=(20, 2)), columns=list('XY'))
plt.scatter(df.X, df.Y,marker=".")
show()

voronoi_python1

Estos puntos aleatorios en el espacio de 2 dimensiones pueden generar regiones por interpolación y representarlas con voronoi_2d_plot:

from scipy.spatial import Voronoi, voronoi_plot_2d
vor = Voronoi(df)
voronoi_plot_2d(vor)

voronoi_python2

Ahora si queremos determinar si un punto de espacio está dentro de una de las celdas que delimitan los diagramas de Voronoi que hemos creado podemos hacerlo por vecinos cercanos con la función cKDTree:

from scipy.spatial import cKDTree
vor_kdtree = cKDTree(df)
puntos = [[1,100],[100,1]]
test_point_dist, test_point_regions = vor_kdtree.query(puntos,k=1)
test_point_regions

Y ahora viene lo único interesante de esta entrada, ¿cómo identificamos las regiones? No empleéis .regions, emplead:

pd.concat([df,pd.DataFrame(vor.point_region)],axis=1)

Los puntos (1,100) y (100,1) aparecen en la región que nos identifica la posición 19 y 9... Me ha costado tiempo entenderlo, me hago viejo. Saludos.