Comenzando con Microsoft Azure

Compartimos el webinar realizado en el grupo de Meetup De 0 a 100 en cloud computing donde tratamos una introducción básica a los servicios cloud, un demo básico sobre Microsoft Azure aprovisionando servicios usando el marketplace, cursos y laboratorios de autoformación.

Advertisements

Análisis de Sentimientos sobre Twitter usando la librería TextBlob de Python

El análisis de sentimiento utiliza técnicas de procesamiento de lenguaje natural (NLP) para obtener conclusiones sobre textos producidos por personas y analizar en ellos rasgos de interés asociados a emociones positivas o negativas.  Se requiere un modelo que ya haya sido entrenado con textos que nos permita obtener valores cuantificables.

Hoy nos apoyaremos en la guía de Free Code Camp “Basic data analysis on Twitter with Python” para hacer Análisis de Sentimientos sobre Twitter usando la librería TextBlob de Python que dispone de modelos de NLP para diversos usos.

Primero debemos tener instalada la librería tweepy

#pip3 install tweepy

Si estás usando Python 3.7 tendrás un error al tratar de usar la librería que todavía no ha sido corregido en la última versión disponible (hoy, eso puede variar en poco tiempo) para resolverlo usamos la siguiente recomendación de StackOverFlow para reemplazar una palabra reservada Async en el archivo streaming.py de la librería.

La ubicación del archivo varía según tu sistema operativo, en Mac estará ubicado en /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tweepy/streaming.py edítala con un editor de texto plano y reemplaza todas las ocurrencias de async por async_ grabas y listo. Versiones anteriores a 3.7 de Python no requieren este cambio.

Procedemos a clonar la librería TextBlob y realizar su instalación

#git clone https://github.com/sloria/textblob
#cd textblob
#python3 setup.py install

Si quieres saber más sobre la librería puede visitar su sitio en GitHub, tiene más herramientas de análisis para texto en Inglés, si deseamos análisis en español es necesario utilizar otra diferente https://github.com/sloria/textblob Dentro del script analizaremos los tweets cuya propiedad “lang” = “en” es decir aquellos cuyo lenguaje fue identificado como inglés. Para otras propiedades del tweet pueden consultar la documentación de Twitter.

Tendremos las claves de aplicación de Twitter en un archivo separado, de modo que no queden en el mismo código que estamos empleando y puedan reusarse en otros scripts, llamaremos a este script de claves twkeys.py

Recientemente Twitter cambió su forma de usar credenciales y ahora debe aplicarse por una cuenta de desarrollador, el proceso para aplicar puedes verlo en https://apps.twitter.com

#Credenciales del Twitter API
def consumer_key():
	#API Key
	return "Add Consumer Key here"

def consumer_secret():
	#API Secret
	return "Add Consumer Secret here"

def access_key():
	#Access Key
	return "Add Access Token here"

def access_secret():
	#Access Secret
	return "Add Access Token Secret here"

Este es el código que usamos para realizar el análisis, el resultado nos mostrará las gráficas de dispersión de dos cuentas, el promedio simple y promedio ponderado de sentimiento de ambas

#Importar consumer API de Twitter https://github.com/tweepy/tweepy
import tweepy
#importar las credenciales de Twitter de un script
import twkeys
#Importar librería para Sentiment Analysis
from textblob import TextBlob
from time import sleep
from datetime import datetime
#Importar para graficar los Datos
import matplotlib.pyplot as plt
#Importar para calcular promedio ponderado
import numpy as np

#Credenciales del Twitter API que están el el script twkeys.py
consumer_key = twkeys.consumer_key()
consumer_secret = twkeys.consumer_secret()
access_key = twkeys.access_key()
access_secret = twkeys.access_secret()

def get_all_tweets(screen_name,graph_id):
    #Este método solo tiene permitido descargar máximo los ultimos 3240 tweets del usuario
    #Especificar aquí durante las pruebas un número entre 200 y 3240
    limit_number =  3240
    
    #autorizar twitter, inicializar tweepy
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)
    
    #inicializar una list to para almacenar los Tweets descargados por tweepy
    alltweets = []    
    
    #Hacer una petición inicial por los 200 tweets más recientes (200 es el número máximo permitido)
    new_tweets = api.user_timeline(screen_name = screen_name,count=200)
    
    #guardar los tweets más recientes
    alltweets.extend(new_tweets)
    
    #guardar el ID del tweet más antiguo menos 1
    oldest = alltweets[-1].id - 1
    
    #recorrer todos los tweets en la cola hasta que no queden más
    while len(new_tweets) > 0 and len(alltweets) <= limit_number:
        print ("getting tweets before" + str(oldest))
        
        #en todas las peticiones siguientes usar el parámetro max_id para evitar duplicados
        new_tweets = api.user_timeline(screen_name = screen_name,count=200,max_id=oldest)
        
        #guardar los tweets descargados
        alltweets.extend(new_tweets)
        
        #actualizar el ID del tweet más antiguo menos 1
        oldest = alltweets[-1].id - 1
        
        #informar en la consola como vamos
        print (str(len(alltweets)) + " tweets descargados hasta el momento")
    
    #Realizar el análisis de sentimiento de los tweets descargados

    #Crear las listas de polaridad polarity_list y frecuencia de polaridad numbers_list
    polarity_list = []
    numbers_list = []
    number = 1

    for tweet in alltweets:
        if tweet.lang == "en":
            try:
                analysis = TextBlob(tweet.text)
                analysis = analysis.sentiment
                #Guardar la polaridad
                polarity = analysis.polarity
                polarity_list.append(polarity)
                #Contar las veces que esa polaridad ha ocurrido
                numbers_list.append(number)
                number = number + 1
            except tweepy.TweepError as e:
                print(e.reason)
            except StopIteration:
                break

    #Crear eje cartesiano
    plt.figure(graph_id)
    axes = plt.gca()
    axes.set_ylim([-1, 2])
    plt.scatter(numbers_list, polarity_list)
    
    #Calcular el promedio de polaridad, NOTA: No es promedio ponderado
    averagePolarity = (sum(polarity_list))/(len(polarity_list))
    averagePolarity = "{0:.0f}%".format(averagePolarity * 100)
    time  = datetime.now().strftime("At: %H:%M\nOn: %m-%d-%y")

    #Calcular el promedio ponderado
    weighted_avgPolarity = np.average(polarity_list, weights=numbers_list)
    weighted_avgPolarity = "{0:.0f}%".format(weighted_avgPolarity * 100)

    #Agregar texto con el promedio de sentimiento
    plt.text(10, 1.25, "Average Sentiment:  " + str(averagePolarity) + "\n" + " Weighted Average Sentiment:  " + str(weighted_avgPolarity) + "\n" + time, fontsize=12, bbox = dict(facecolor='none', edgecolor='black', boxstyle='square, pad = 1'))

    #Título
    plt.title("Sentiment of " + screen_name + " on Twitter")
    plt.xlabel("Number of Tweets")
    plt.ylabel("Sentiment")       
    pass

if __name__ == '__main__':
    #especificar el nombre de usuario de la cuenta a la cual se descargarán los tweets
    get_all_tweets("Add_account_1",200)
    get_all_tweets("Add_account_2",300)
    #Mostrar las gráfica
    plt.show()

El siguiente video explica todo el proceso.

Descargar tweets a .csv usando Python

Explicamos como acceder a los tweets públicos de un usuario por medio de Python, para almacenarlos en un archivo .csv que posteriormente pueda ser cargado en un DataFrame.

Se requiere instalar la librería tweepy (El manejador de paquetes pip ya debe estar instalado, para instalar pip puedes consultar como Aquí)

pip3 install tweepy

Obtener tokens de acceso para conectarse a Twitter

  1. Ir a la página de Administración de Aplicaciones de Twitter, hacer sesión.
  2. Usar el botón de “Crear nueva app”
  3. Llenar los campos mandatorios de nombre, descripción y sitio web. Este último puede no ser una página activa dado que nuestra conexión será de solo lectura
  4. Aceptar los términos y condiciones y dar click en “Crear twitter app”
  5. Una vez creada la aplicación ir a la pestaña de “Permisos” y cambiarlos por “Solo lectura”, esto es importante pues solo la usaremos para descarga de datos, no para publicar nada en tu cuenta.
  6. Recibirás una alerta de que debes esperar a que los permisos se actualicen, una vez actualizados ve a la pestaña “Tokens de acceso”
  7. Dar click sobre “Crear Tokens de acceso” para generar las credenciales que la aplicación usará.  Estos datos son privados, cualquiera que los tenga podrá conectarse a twitter a nombre de tu aplicación.
  8. Usa el código a continuación y guárdalo en un archivo de script Python tweets.py
import tweepy #https://github.com/tweepy/tweepy
import csv

#Credenciales del Twitter API
consumer_key = "Agregar Consumer Key"
consumer_secret = "Agregar Consumer Secret"
access_key = "Agregar Access Key"
access_secret = "Agregar Access Secret"

#Remover los caracteres no imprimibles y los saltos de línea del texto del tweet
def strip_undesired_chars(tweet):
    stripped_tweet = tweet.replace('\n', ' ').replace('\r', '')
    char_list = [stripped_tweet[j] for j in range(len(stripped_tweet)) if ord(stripped_tweet[j]) in range(65536)]
    stripped_tweet=''
    for j in char_list:
        stripped_tweet=stripped_tweet+j
    return stripped_tweet

def get_all_tweets(screen_name):
    #Este método solo tiene permitido descargar máximo los ultimos 3240 tweets del usuario
    #Especificar aquí durante las pruebas un número entre 200 y 3240
    limit_number = 3240
    
    #autorizar twitter, inicializar tweepy
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)
    
    #inicializar una list to para almacenar los Tweets descargados por tweepy
    alltweets = []    
    
    #Hacer una petición inicial por los 200 tweets más recientes (200 es el número máximo permitido)
    new_tweets = api.user_timeline(screen_name = screen_name,count=200)
    
    #guardar los tweets más recientes
    alltweets.extend(new_tweets)
    
    #guardar el ID del tweet más antiguo menos 1
    oldest = alltweets[-1].id - 1
    
    #recorrer todos los tweets en la cola hasta que no queden más
    while len(new_tweets) > 0 and len(alltweets) <= limit_number:
        print ("getting tweets before" + str(oldest))
        
        #en todas las peticiones siguientes usar el parámetro max_id para evitar duplicados
        new_tweets = api.user_timeline(screen_name = screen_name,count=200,max_id=oldest)
        
        #guardar los tweets descargados
        alltweets.extend(new_tweets)
        
        #actualizar el ID del tweet más antiguo menos 1
        oldest = alltweets[-1].id - 1
        
        #informar en la consola como vamos
        print (str(len(alltweets)) + " tweets descargados hasta el momento")
    
    #transformar los tweets descargados con tweepy en un arreglo 2D array que llenará el csv
    outtweets = [(tweet.id_str, tweet.created_at, strip_undesired_chars(tweet.text),tweet.retweet_count,str(tweet.favorite_count)+'') for tweet in alltweets]
    
    #escribir el csv    
    with open('%s_tweets.csv' % screen_name, "w", newline='') as f:       
        writer = csv.writer(f, quoting=csv.QUOTE_ALL)
        writer.writerow(['id','created_at','text','retweet_count','favorite_count'''])
        writer.writerows(outtweets)    
    pass

if __name__ == '__main__':
    #especificar el nombre de usuario de la cuenta a la cual se descargarán los tweets
    get_all_tweets("Agregar TwitterUser")

Ejecutar el script según se indica a continuación, esto creará un archivo llamado TwitterUser_tweets.csv

python3 tweets.py

Fuente original del código Aquí, se hicieron cambios para compatibilidad con Python 3, para garantizar que todas las columnas quedan entre “”, eliminar los saltos de línea de los tweets y los emoticones que pueden generar problemas al leer el archivo .csv resultante desde python.

Para cargar el archivo .csv en un Dataframe de Python

import pandas as pd

archivo_csv = pd.read_csv("ruta/username_tweets.csv", index_col = 0)
tweetsDF = pd.DataFrame(archivo_csv)
print(tweetsDF)

Más info en How to extract Twitter tweets data and followers to Excel

Sobre otras características que pueden extraerse de los tweets consulta How to Download Twitter data in JSON – Twitter API Python examples

Y finalmente un video explicando el mismo código que presentamos

Actualidad Cloud – Junio 8 2018

Compendio de temas Cloud de diversas fuentes de información

Por: Isabel Yepes

Noticias

Webinar

Cómo Trimono LDA, compañía de suministro de sistemas eléctricos y de vigilancia, implementó su solución de Backup usando AWS y Veritas
Fecha: Junio 12, 2018 10:00 am
Idioma: Inglés

Recurso Técnico

Beneficios de la Computación en la nube en las variables del negocio

Por: Isabel Yepes

Uno de los elementos más importantes que las empresa consideran al momento de tomar decisiones sobre la adopción de nuevas tecnologías, es la relación costo/beneficio entre la inversión de implementación, el valor de la operación y las retribuciones económicas que produzcan, ya sea en términos de ahorros en la operación o en mejoras en la eficiencia.

Un estudio realizado por IDC en empresas a nivel mundial que hacen uso de los servicios en la nube de Amazon (AWS  por sus siglas en inglés), determinó que los beneficios percibidos por las empresas se centraron en cuatro factores:

  1. Crear entornos de TI más efectivos en costos
  2. Cambiar el foco del personal de TI
  3. Ofrecer aplicaciones confiables y de alto desempeño
  4. Brindarle agilidad a la operación de TI y del negocio en general
Factores Beneficio Cloud Computing
Source: IDC White Paper, sponsored by Amazon, Fostering Business and Organizational Transformation to Generate Business Value with Amazon Web Services, Doc #US43535718, February 2018

En resumen, la utilización de infraestructura en la nube le permite a las empresas enfocarse mejor en el eje central de su negocio, dejando que el departamento de TI se alinee con las estrategias de la compañía y facilitando la experimentación y escalabilidad de nuevos productos a costos menores y del tamaño adecuado para la oportunidad comercial detectada.

Estos beneficios que experimentan las empresas que adoptan la tecnología de computación en la Nube se expresan en términos económicos, pues en todo caso es la tecnología quien debe servir a la operación y optimización del negocio.  Según el estudio de IDC dichos beneficios se ven representados en los aspectos mostrados a continuación.

business-value-AWS
Source: IDC White Paper, sponsored by Amazon, Fostering Business and Organizational Transformation to Generate Business Value with Amazon Web Services, Doc #US43535718, February 2018

Las empresas estudiadas por IDC utilizaban la tecnología en la nube para operaciones muy diversas dependiendo del sector económico de la compañía.  La muestra correspondió a grandes corporaciones con 39.177 empleados en promedio. Listamos a continuación las necesidades que eran resueltas con computación en la nube en dichas empresas.

  • Minería de datos y Analítica de datos
  • Aseguramiento de la calidad y pruebas
  • Cargas de secuenciación de genoma
  • Aplicaciones de cara al cliente (SaaS, CRM, y ERP)
  • Comercio Electrónico
  • Espacios de trabajo virtual
  • Ventas en internet
  • Administración de bases de datos
  • Archivos compartidos
  • Modelamiento y simulación
  • Aplicaciones para los empleados
  • Archivo de código de desarrollo

De otro lado Intuit realizó un estudio donde identifica de las pequeñas y medianas empresas que usan infraestructura en la nube, en qué invierten sus propietarios la mayoría de su tiempo en línea.

uso-tiempo
Fuente: Intuit eBook The Appification of small business

Esto nos muestra que aunque la demanda de las empresas de menor tamaño corresponde a operaciones más simples, estas están íntimamente relacionadas con la existencia y crecimiento de la compañía. Podemos agrupar estas interacciones en  trabajo administrativo, legal y de ventas, gestión de los canales de comunicación con proveedores, clientes y empleados, y procesos de mercadeo digital. Todo esto en últimas conlleva a la realización de transacciones comerciales para fortalecer los ingresos de la compañía.

En conclusión, sin importar el tamaño de la empresa el beneficio de la computación en la nube reside en facilitarles las herramientas para apalancar el desarrollo del negocio, alineando la infraestructura de TI con las estrategias y tamaño de la organización.

Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY
Powered by Piktochart

Women Who Code Medellín – Python, generación de datos aleatorios – Mayo 2018

Continuamos con la temática de Ciencia de Datos para los Meetups de Women Who Code Medellín, este mes tratamos generación de datos aleatorios usando la librería Numpy de Python.

Reglas del juego que se presenta como ejemplo para ser resuelto simulando datos aleatorios para resolver la pregunta ¿Cuál es la probabilidad de Ganar este juego?

REGLAS

  • Se usa un dado para jugar, por lo cual los valores son de 1 a 6
  • Si tiramos 3 o menos devolvemos 1 peso al juego
  • Si tiramos más de 3 y hasta 5 nos dan 1 peso
  • Si tiramos 6, entonces tiramos de nuevo el dado y nos dan tantos pesos como el dado lo indique.
  • Jugamos con monedas, de modo que no hay valores de pesos negativos
  • El turno del jugador consiste en tirar el dado 100 veces
  • Se gana el juego si se obtiene más de 50 pesos al final del turno

Aquí el código que usamos en la presentación.

import numpy as np
import matplotlib.pyplot as plt
#Iniciar la semilla para garantizar que los datos serán iguales cada que se corra el algoritmo
np.random.seed(204)
todos_turnos = []
#Definir cuántas veces se corre la simulación
muestras = 600
for x in range(muestras) :
     #Comenzar el turno sin monedas
     monedas = 0
     turno_aleatorio = [0]
     for x in range(100) :
         dado = np.random.randint(1,7)
         if dado <= 3 :
              monedas = max(0,monedas - 1)
         elif dado < 6 :
               monedas = monedas + 1
         else :
               monedas = monedas + np.random.randint(1,7)
         #Registrar cuantas monedas tengo al final de cada tirada
         turno_aleatorio.append(monedas)
      #Guardar los resultados del turno
      todos_turnos.append(turno_aleatorio)

#Formatear el arreglo como numpy array 
np_todos_turnos = np.array(todos_turnos) 

#Trasponer filas por columnas para adaptar a la gráfica 
np_todos_turnos_t = np.transpose(np_todos_turnos) 

#Sacar la última fila - resultado final de todos los turnos 
ultimos = np_todos_turnos_t[-1,:] 

#Calcular probabilidad de ganar contando los valores del vector
#mayores o iguales a 50 y dividiendo por el número de turnos 
print('La probabilidad de ganar el juego es de ' + str(round(100*(ultimos >= 50).sum()/muestras,2)) + '%')

#Preparar la Gráfica del desarrollo de todos los turnos
plt.figure(200)
plt.xlabel('Cantidad lanzamientos del dado')
plt.ylabel('Monedas')
plt.title('Desarrollo de '+ str(muestras)+ ' turnos')
plt.plot(np_todos_turnos_t)

#Preparar la Gráfica de distribución de los turnos
plt.figure(300)
plt.xlabel('Total de monedas al final del turno')
plt.ylabel('Cantidad de turnos en el rango del total')
plt.title('Histograma para '+ str(muestras)+ ' turnos')
plt.hist(ultimos)

#Mostrar las gráficas
plt.show()

Exención de IVA para Cloud Computing en Colombia

Por: Isabel Yepes

La reforma tributaria de 2016 creó una serie de estímulos para la transformación digital de las empresas, permitiéndoles ahorros económicos al momento de hacer uso de ciertos servicios tecnológicos, uno de ellos consiste en la exención del IVA para los servicios de computación en la nube (cloud computing). La DIAN expidió un Concepto Unificado donde aclara cuando un proveedor de servicios tecnológicos puede aplicar la exención de IVA a sus clientes (empresas de cualquier tamaño o personas), beneficiándose tanto el proveedor como el cliente.

En el concepto se define que para ser  considerado como Cloud computing y por tanto ser exento de IVA, el servicio debe cumplir cinco características obligatorias, uno de tres modelos de servicio definidos y uno de cuatro modelos de implementación establecidos.

Para hacerlo más sencillo de entender en la siguiente gráfica detallamos los cinco requisitos definidos para que un servicio sea considerado Cloud Computing.

  1. Autoservicio bajo demanda
  2. Acceso amplio a la red
  3. Asignación común de recursos
  4. Rápida elasticidad
  5. Servicio medible

Condiciones Cloud Exención IVA

En la siguiente gráfica detallamos los tres modelos de servicio, de los cuales se debe cumplir con uno de ellos.

  1. Software como Servicio (SaaS)
  2. Plataforma como Servicio (PaaS)
  3. Infraestructura como Servicio (IaaS)

Modelos de Servicio Cloud

Y para terminar en la siguiente gráfica detallamos los cuatro modelos de implementación de los cuales se requiere cumplir con uno de ellos.

  1. Nube privada (Private Cloud)
  2. Nube comunitaria (Community Cloud)
  3. Nube Pública (Public Cloud)
  4. Nube Híbrida (Hybrid Cloud)

Modelos de Implementación Cloud

Para referencia consultar el artículo 187 de la Ley 1819 de 2016 que modifica el Estatuto tributario en su ARTICULO 476. SERVICIOS EXCLUIDOS DEL IMPUESTO SOBRE LAS VENTAS. 24. Suministro de páginas web, servidores (hosting), computación en la nube (cloud computing) y mantenimiento a distancia de programas y equipos.

Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY Icons made by Smashicons from www.flaticon.com is licensed by CC 3.0 BY Icons made by Vectors Market from www.flaticon.com is licensed by CC 3.0 BY Icons made by Gregor Cresnar from www.flaticon.com is licensed by CC 3.0 BY