17 jun. 2018

Visualización de Árbol de decisión

Como en Noviembre del año pasado, escribí un artículo sobre árboles de decisión con Python, donde se tenía una serie de datos de entrada (altura, peso y talla)  y de salida si era hombre o mujer.  Para este artículo lo que se va a agregar es la visualización del árbol de decisión, para ello se usará dos librerías de Python pydot y graphviz .

Se da por sentado que ya se tiene instalado scikit-learn, se instala entonces pydot y graphviz:

#pip3 install pydot
#pip3 install graphviz

Ahora se muestra el código:



Ahora toca la visualización del árbol:

Para terminar se muestra el grafo del árbol:

Este grafo se genera a partir de la instancia de la clase que se usa para ingresar los datos, se entrena, y se usa para predecir con nuevos datos.
La información que muestra cada nodo de decisión:

  • Samples: La cantidad de muestras que se maneja.
  • gini: Es un indice que indica el costo de la evaluación de separar los datos.
  • value: Es un valor que se está evaluando en ese momento. 
El código de este artículo lo pueden ver en el notebook que se encuentra en el repositorio de gitlab.

En próximo artículo se hará otro ejemplo ya con un mayor conjunto de datos.

Sí tienes algun pregunta u observación, puedes hacerlo en los comentarios del post.

¡Haz tu donativo!
Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV
O Escaneando el código QR desde billetera:


10 jun. 2018

Análisis de Sentimiento de tweets con Python, TextBlob y tweepy

Existe el área de análisis de redes sociales, puedes hacer gráficos de tendencias, lograr cual fue el origen de un tweet. La idea es usar la librería tweepy para conectase a Twitter y de allí capturar los tweets para luego realizar un análisis de sentimiento y graficar el resultado.

El análisis de sentimiento se refiere al uso de procesamiento de lenguaje natural, análisis de texto y lingüistica computacional para identificar y extraer información subjetiva de los recursos (más información en wikipedia).

Se puede realizar análisis de sentimiento a cualquier texto, puede ser de correos, de páginas web, de publicaciones en redes sociales como twitter, facebook, google+, entre otros.  Con ello se puede lograr un aproximado de la evaluación emocional que tiene un tema o persona en algún momento en las redes sociales o contenidos evaluados.

La idea es obtener el tráfico de twitter sobre un tema o persona, aplicarle análisis de sentimiento y graficar los resultados.

Este artículo se basa en un artículo en inglés publicado en freecodecamp con título Basic data analysis on Twitter with Python . Este artículo se desarrolla una aplicación gráfica en TK para obtener la información y luego realizar la captura, cálculos y gráficos. El código fuente de la aplicación del artículo se encuentra en github.

Para tener acceso al API de twitter se tiene que crear una cuenta en la página para las aplicaciones que lo requieran.

Para autenticarse se usará el siguiente código:
consumer_key = 'consumer key'
consumer_secret = 'consumer secrets'
access_token = 'access token'
access_token_secret = 'access token secret'
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

En este caso se usará jupyer lab para mostrar la aplicación con ajustes en el código para su reutilización, por ejemplo, que realice el análisis en Español o Inglés.

La librería a usar será tweepy, la librería para análisis de texto TextBlob y matplotlib.

Para instalar tweepy se usará pip3:

pip3 install tweepy textblob


Revisemos primero las tendencias en twitter para Valencia (Venezuela), a continuación una imagen de las tendencias.



Se buscará el análisis de sentimiento de la tendencia Rafael Nadal, se buscará en 200 tweets y en español.

A continuación el código fuente:


El código fuente en el repositorio de gitlab lo pueden ver en el  enlace.




#!/usr/bin/env python3



#Se importa la librería tweepy

import tweepy

#Se importa sleep, datetime, TextBlob y matplotlib

from time import sleep

from datetime import datetime

from textblob import TextBlob 

import matplotlib.pyplot as plt 



#Se define las variables para el acceso al API de twitter

consumer_key = ''

consumer_secret = ''

access_token = ''

access_token_secret = ''



#Se autentica en twitter

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)

auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)



#se verifica que el usuario conectado en twitter es de uno

print(api.me().name)



#Se pregunta por la palabra a preguntar

palabra = input("Buscar: ")



#Se define la cantida de tweets a capturar

numero_de_Tweets = int(input(u"Número de tweets a capturar: "))



#Se define el idioma de los tweets a analizar

lenguaje = input("Idioma [es/en]:")





def ObtenerTweets(palabra="Trump",times=100,leguanje="en"):

    #Se define las listas que capturan la popularidad

    popularidad_list = []

    numeros_list = []

    numero = 1

    for tweet in tweepy.Cursor(api.search, palabra, lang=lenguaje).items(numero_de_Tweets):

        try:

            #Se toma el texto, se hace el analisis de sentimiento

            #y se agrega el resultado a las listas

            analisis = TextBlob(tweet.text)

            analisis = analisis.sentiment

            popularidad = analisis.polarity

            popularidad_list.append(popularidad)

            numeros_list.append(numero)

            numero = numero + 1



        except tweepy.TweepError as e:

            print(e.reason)



        except StopIteration:

            break

    return (numeros_list,popularidad_list,numero)





def GraficarDatos(numeros_list,popularidad_list,numero):

    axes = plt.gca()

    axes.set_ylim([-1, 2])

    

    plt.scatter(numeros_list, popularidad_list)

    popularidadPromedio = (sum(popularidad_list))/(len(popularidad_list))

    popularidadPromedio = "{0:.0f}%".format(popularidadPromedio * 100)

    time  = datetime.now().strftime("A : %H:%M\n El: %m-%d-%y")

    plt.text(0, 1.25, 

             "Sentimiento promedio:  " + str(popularidadPromedio) + "\n" + time, 

             fontsize=12, 

             bbox = dict(facecolor='none', 

                         edgecolor='black', 

                         boxstyle='square, pad = 1'))

    

    plt.title("Sentimientos sobre " + palabra + " en twitter")

    plt.xlabel("Numero de tweets")

    plt.ylabel("Sentimiento")

    plt.show()





numeros_list,popularidad_list,numero = ObtenerTweets(palabra,numero_de_Tweets,lenguaje)

GraficarDatos(numeros_list,popularidad_list,numero)

Al ejecutar el programa se tiene la siguiente gráfica.

Para el caso de Nadal, tiene un valor promedio positivo, habrá casos donde el sentimiento sea de un valor negativo, pero para este caso, lo mejor es ampliar la cantidad de tweets a capturar para tener una mejor aproximación del sentimiento de la gente de lo que habla en twitter de Nadal.

Sí tienes algun pregunta u observación, puedes hacerlo en los comentarios del post.

¡Haz tu donativo!
Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 197vyJ3KSCj287nLqhb7FSJpJUDayDoTMP 

O Escaneando el código QR desde billetera:
Para el caso de paypal, tienes el botón del lado derecho de la página.

6 jun. 2018

Visualizando series de tiempo de precios del mercado con pandas y matplotlib

En este artículo la fuente de datos  se usará la librería de Quandl directamente. La idea es obtener los precios de mercado de 3 Aerolineas (Delta con código DAL, Jet Blue con código JBLU y Southwest con código LUV).  Se gráfica  el historico de los precios de cierre, el volumen de ventas y movimientos promedios de estas tres aerolineas.


Continuando con los artículos sobre Pandas y Ciencia de Datos, en el artículo anterior se mostró como trabajar con Series de tiempo obteniendo datos desde Quandl.

Este artículo se basa en un artículo en inglés que se títula Visualizing Time Series Data of Stock Prices (en este artículo usan la librería pandas_datareader, pero está dando errores, así que se usará la librería Quandl).


El código del ejercicio se muestra a continuación:



Visualizando




El raw del notebook lo pueden bajar del repositorio gitlab.

Si tienes alguna sugerencia o idea de como se puede aplicar este artículo, lo puedes dejar en los comentarios.

¡Haz tu donativo!
Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 197vyJ3KSCj287nLqhb7FSJpJUDayDoTMP 

O Escaneando el código QR desde billetera:
Para el caso de paypal, tienes el botón del lado derecho de la página.

25 may. 2018

Como obtener datos Financieros de Quandl con Python y Pandas

La idea de este artículo es explicar de manera básica el uso de Pandas para obtener datos financieros, en este caso el valor de las divisas de Países como Argentina, Brasil, Chile, Mexico y Venezuela.
Quandl es una plataforma financiera y económica de datos alternativos que sirve para inversores profesionales. El API de Quandl permite el acceso a sus datos por medio de Lenguaje R, Python, Matlab, Maple y Stata. Más información en wikipedia y en su página.
Para este caso se accederá a los datos vía Python y se visualizará por medio de Pandas y matplotlib.
La información de Quandl para los países:
El proceso sería el siguiente:
  1. Importar librerias
  2. Acceso a los datos de los países en Quandl
  3. Ordenar las columnas, eliminar NaN.
  4. Crear portafolio
  5. Visualizar los datos
Los códigos para acceder a los datos los pueden ver por ejemplo para Mexico en la siguiente imagen.

Página de Quandl de la información del Dolar para Mexico

  1. Se importan las librerías pandas, quandl y matplotlib


2. Se define las fechas de inicio y fin del analísis


3. Obtener datos de quandl


4. Se visualiza los datos de Dicom y Dolar today


5. Se crea el portafolio donde se agrupa todas las cotizaciones


6. Se descarta los campos NaN y se renombra las columnas


7. Se gráfica todas las cotizaciones


8. Gráfica de Argentina


9. Gráfica de Brasil


10. Gráfia de Chile


11. Gráfica de México


12. Gŕafica de Venezuela


13. Gráfica Dicom y Dolar Today por separado


El notebook lo pueden ver completo en:

21 abr. 2018

Algoritmo de Clasificación con scikit-learn

Continuando con los artículos sobre Inteligencia Artificial con Python.

La serie de artículos sobre Scikit-Learn han sido:

  1. Árbol de decisión hecho con Python (esté tendrá una segunda parte).
  2. Una red neuronal para aprendizaje supervisado usando scikit-learn.
  3. Funciones de activación para un perceptron.
El ejercicio que se explicará será el de algoritmo de clasificación usando scikit-learn por medio del ejemplo de la resolución de la tabla de la verdad de un Or exclusivo (XOR).

Scikit-learn es una librería de Machine Learning para Python que soporta algoritmos de clasificación, regresión y clustering (wikipedia).

A continuación el notebook de jupyter:


Se creará una red neuronal para clasificación

Se usará la tabla de la verdad de XOR
x y Salida
0 0 0
0 1 1
1 0 1
1 1 0

Para instalar scikit-learn se usa pip
pip3 install scikit-learn
In [4]:
##Se importa Numpy, MLPCCLassifier y KNeighborsClassifier
import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn.neighbors import KNeighborsClassifier
In [5]:
#un Arreglo con la tabla de la verdad
# 0 0
# 0 1
# 1 0
# 1 1
xs = np.array([
    0, 0,
    0, 1,
    1, 0,
    1, 1
]).reshape(4, 2)
xs
Out[5]:
array([[0, 0],
       [0, 1],
       [1, 0],
       [1, 1]])
In [6]:
#Se muestra un arreglo con el resultado de hacer un XOR
ys = np.array([0, 1, 1, 0]).reshape(4,)
ys
Out[6]:
array([0, 1, 1, 0])
In [7]:
#Se crea el clasificador con la función de activación relu,con 10k iteraciones y tiene capaz ocultas 4,2
model = MLPClassifier(activation='tanh', max_iter=10000, hidden_layer_sizes=(4,2))
model
Out[7]:
MLPClassifier(activation='tanh', alpha=0.0001, batch_size='auto', beta_1=0.9,
       beta_2=0.999, early_stopping=False, epsilon=1e-08,
       hidden_layer_sizes=(4, 2), learning_rate='constant',
       learning_rate_init=0.001, max_iter=10000, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=None,
       shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1,
       verbose=False, warm_start=False)
In [8]:
#Se entrena la red neuronal pasando los arreglos de entrada y de salida
model.fit(xs, ys)
Out[8]:
MLPClassifier(activation='tanh', alpha=0.0001, batch_size='auto', beta_1=0.9,
       beta_2=0.999, early_stopping=False, epsilon=1e-08,
       hidden_layer_sizes=(4, 2), learning_rate='constant',
       learning_rate_init=0.001, max_iter=10000, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=None,
       shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1,
       verbose=False, warm_start=False)
In [9]:
print('prediccion:', model.predict(xs)) # salida 0110
prediccion: [0 1 1 0]
In [10]:
print('Se espera:', np.array([0, 1, 1, 0]))
Se espera: [0 1 1 0]

Otro ejercicio

Entrada Salida
001 0
111 1
101 1
011 0
100 ?
In [11]:
#Se importa de numpy array
from numpy import array
In [12]:
#Datos de entrada y de salida
datos_entrada = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]]).reshape(4, 3)
datos_salida = array([[0, 1, 1, 0]]).reshape(4, )
print(datos_entrada)
print ("-"*4)
print(datos_salida)
[[0 0 1]
 [1 1 1]
 [1 0 1]
 [0 1 1]]
----
[0 1 1 0]
In [13]:
#En este caso se usa KNeighborsClassifier con 2 capaz
KNC = KNeighborsClassifier(n_neighbors= 2)
In [14]:
KNC.fit(datos_entrada,datos_salida)
Out[14]:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=2, p=2,
           weights='uniform')
In [15]:
#Se predice el valor de 1,0,0 que da como resultado el mismo del artículo anterior.
print(KNC.predict([[1, 0,0]]))
[1]
In [16]:
#Se crea la red de nuevo pero ahora con PLPCCLassifier.
#Se crea el clasificador con la función de activación relu,con 10k iteraciones y tiene capaz ocultas 4,2
KNC = MLPClassifier(activation='tanh', max_iter=10000, hidden_layer_sizes=(4,2))
In [17]:
#Se entrena la red neuronal pasando los arreglos de entrada y de salida
KNC.fit(datos_entrada, datos_salida)
Out[17]:
MLPClassifier(activation='tanh', alpha=0.0001, batch_size='auto', beta_1=0.9,
       beta_2=0.999, early_stopping=False, epsilon=1e-08,
       hidden_layer_sizes=(4, 2), learning_rate='constant',
       learning_rate_init=0.001, max_iter=10000, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=None,
       shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1,
       verbose=False, warm_start=False)
In [18]:
#Se predice el valor de 1,0,0 que da como resultado el mismo del artículo anterior.
print(KNC.predict([[1, 0,0]]))
[1]


En el siguiente artículo se explicará otro ejemplo de Árbol de decisión usando scikit-learn.

19 abr. 2018

WebScraping (extracción de datos) de wikipedia con Pandas

Continuando con la serie de artículos sobre Pandas, en este artículo se muestra un proceso de extracción de datos web de la página que contiene información sobre  los Estados de Venezuela de Wikipedia.

En los procesos anteriores de WebScraping se trabajaba practicamente a mano para indentificar  las secciones del código html donde se encuentra la información útil, para el caso con Pandas este abstrae ese proceso.

A continuación se muestra una captura de pantalla de la página donde se quiere extraer la información:


La información que maneja la página son los estados con sus capitales, densidad poblacional, superficie, año de admisión, población, densidad, región y código ISO, la parte de la bandera ni del mapa no se muestra por que son imágenes y no se obtiene información útil de ellas.

A continuación todo el proceso de extracción de información de la página:

In [1]:
#Se importa pandas como pd
import pandas as pd
#Se lee los datos de wikipedia de los estados de venezuela, este devuelve una lista
estados=   pd.read_html('https://es.wikipedia.org/wiki/Estados_de_Venezuela') 
estados
Out[1]:
[    0                                                  1
 0 NaN  Este artículo o sección necesita referencias q...,
                                                    0
 0                     Estados Federales de Venezuela
 1  Bolívar Amazonas Apure Zulia Táchira Barinas M...,
           0                       1                       2           3  \
 0   Bandera         Entidad federal                 Capital  Código ISO   
 1       NaN                Amazonas         Puerto Ayacucho        VE-Z   
 2       NaN              Anzoátegui               Barcelona        VE-B   
 3       NaN                   Apure   San Fernando de Apure        VE-C   
 4       NaN                  Aragua                 Maracay        VE-D   
 5       NaN                 Barinas                 Barinas        VE-E   
 6       NaN                 Bolívar          Ciudad Bolívar        VE-F   
 7       NaN                Carabobo                Valencia        VE-G   
 8       NaN                 Cojedes              San Carlos        VE-H   
 9       NaN           Delta Amacuro                Tucupita        VE-Y   
 10      NaN        Distrito Capital                 Caracas        VE-A   
 11      NaN                  Falcón                    Coro        VE-I   
 12      NaN                 Guárico  San Juan de Los Morros        VE-J   
 13      NaN                    Lara            Barquisimeto        VE-K   
 14      NaN                  Mérida                  Mérida        VE-L   
 15      NaN                 Miranda              Los Teques        VE-M   
 16      NaN                 Monagas                 Maturín        VE-N   
 17      NaN           Nueva Esparta             La Asunción        VE-O   
 18      NaN              Portuguesa                 Guanare        VE-P   
 19      NaN                   Sucre                  Cumaná        VE-R   
 20      NaN                 Táchira           San Cristóbal        VE-S   
 21      NaN                Trujillo                Trujillo        VE-T   
 22      NaN                  Vargas               La Guaira        VE-X   
 23      NaN                 Yaracuy              San Felipe        VE-U   
 24      NaN                   Zulia               Maracaibo        VE-V   
 25      NaN  Dependencias Federales              Gran Roque        VE-W   
 
                   4                                 5  \
 0   Año de admisión              Población (2011)[2]​   
 1              1992    &&&&&&&&&0161844.&&&&&0161 844   
 2              1909  &&&&&&&&02179838.&&&&&02 179 838   
 3              1864    &&&&&&&&&0501404.&&&&&0501 404   
 4              1909  &&&&&&&&01819630.&&&&&01 819 630   
 5              1937    &&&&&&&&&0853949.&&&&&0853 949   
 6              1901  &&&&&&&&02069064.&&&&&02 069 064   
 7              1865  &&&&&&&&02342665.&&&&&02 342 665   
 8              1864    &&&&&&&&&0367020.&&&&&0367 020   
 9              1992    &&&&&&&&&0180363.&&&&&0180 363   
 10             1999  &&&&&&&&04033186.&&&&&04 033 186   
 11             1872  &&&&&&&&01064615.&&&&&01 064 615   
 12             1864    &&&&&&&&&0746174.&&&&&0746 174   
 13             1909  &&&&&&&&01892439.&&&&&01 892 439   
 14             1909    &&&&&&&&&0903955.&&&&&0903 955   
 15             1909  &&&&&&&&03112851.&&&&&03 112 851   
 16             1909    &&&&&&&&&0938185.&&&&&0938 185   
 17             1909    &&&&&&&&&0525139.&&&&&0525 139   
 18             1909    &&&&&&&&&0897104.&&&&&0897 104   
 19             1909    &&&&&&&&&0892990.&&&&&0892 990   
 20             1899  &&&&&&&&01277241.&&&&&01 277 241   
 21             1864    &&&&&&&&&0901239.&&&&&0901 239   
 22             1998    &&&&&&&&&0419928.&&&&&0419 928   
 23             1899    &&&&&&&&&0645688.&&&&&0645 688   
 24             1864  &&&&&&&&04694856.&&&&&04 694 856   
 25             1938       &&&&&&&&&&&02155.&&&&&02155   
 
                                  6                              7  \
 0                 Superficie (km²)             Densidad (hab/km²)   
 1   &&&&&&&&&0177617.&&&&&0177 617    &&&&&&&&&&&&&&00.9900000,99   
 2    &&&&&&&&&&043300.&&&&&043 300    &&&&&&&&&&&&&033.90000033,9   
 3    &&&&&&&&&&076500.&&&&&076 500     &&&&&&&&&&&&&&06.&&&&&06,0   
 4      &&&&&&&&&&&07014.&&&&&07014   &&&&&&&&&&&&0235.600000235,6   
 5    &&&&&&&&&&035200.&&&&&035 200    &&&&&&&&&&&&&023.20000023,2   
 6   &&&&&&&&&0240528.&&&&&0240 528    &&&&&&&&&&&&&&07.8700007,87   
 7      &&&&&&&&&&&04650.&&&&&04650  &&&&&&&&&&&&0713.&10000713,01   
 8    &&&&&&&&&&014800.&&&&&014 800    &&&&&&&&&&&&&021.80000021,8   
 9    &&&&&&&&&&040200.&&&&&040 200    &&&&&&&&&&&&&&04.6500004,65   
 10      &&&&&&&&&&&&0433.&&&&&0433  &&&&&&&&&&&07246.4000007246,4   
 11   &&&&&&&&&&024800.&&&&&024 800    &&&&&&&&&&&&&036.40000036,4   
 12   &&&&&&&&&&064986.&&&&&064 986    &&&&&&&&&&&&&011.50000011,5   
 13   &&&&&&&&&&019800.&&&&&019 800    &&&&&&&&&&&&&089.60000089,6   
 14   &&&&&&&&&&011300.&&&&&011 300    &&&&&&&&&&&&&092.80000092,8   
 15     &&&&&&&&&&&07950.&&&&&07950   &&&&&&&&&&&&0336.500000336,5   
 16   &&&&&&&&&&028900.&&&&&028 900    &&&&&&&&&&&&&031.30000031,3   
 17     &&&&&&&&&&&01150.&&&&&01150  &&&&&&&&&&&&0480.&10000480,01   
 18   &&&&&&&&&&015200.&&&&&015 200    &&&&&&&&&&&&&057.70000057,7   
 19   &&&&&&&&&&011800.&&&&&011 800    &&&&&&&&&&&&&076.&&&&&076,0   
 20   &&&&&&&&&&011100.&&&&&011 100   &&&&&&&&&&&&0105.300000105,3   
 21     &&&&&&&&&&&07400.&&&&&07400    &&&&&&&&&&&&&092.80000092,8   
 22     &&&&&&&&&&&01497.&&&&&01497   &&&&&&&&&&&&0235.800000235,8   
 23     &&&&&&&&&&&07100.&&&&&07100    &&&&&&&&&&&&&084.60000084,6   
 24   &&&&&&&&&&063100.&&&&&063 100    &&&&&&&&&&&&&073.70000073,7   
 25      &&&&&&&&&&&&0120.&&&&&0120    &&&&&&&&&&&&&018.&&&&&018,0   
 
                     8     9  
 0              Región  Mapa  
 1             Guayana   NaN  
 2      Nor - Oriental   NaN  
 3              Llanos   NaN  
 4             Central   NaN  
 5              Andina   NaN  
 6             Guayana   NaN  
 7             Central   NaN  
 8             Central   NaN  
 9             Guayana   NaN  
 10            Capital   NaN  
 11  Centro-Occidental   NaN  
 12             Llanos   NaN  
 13  Centro-Occidental   NaN  
 14             Andina   NaN  
 15            Capital   NaN  
 16     Nor - Oriental   NaN  
 17            Insular   NaN  
 18  Centro-Occidental   NaN  
 19     Nor - Oriental   NaN  
 20             Andina   NaN  
 21             Andina   NaN  
 22            Capital   NaN  
 23  Centro-Occidental   NaN  
 24            Zuliana   NaN  
 25            Insular   NaN  ]
In [2]:
#Tipo de los estados
type(estados)
Out[2]:
list
In [3]:
#Tipo del primer elemento es un dataframe
type(estados[0])
Out[3]:
pandas.core.frame.DataFrame
In [4]:
#Se listan del dataframe estados y capitales (elementos 1 y 2 del dataframe, y se recorre)
for i in range(1,26):
    print(estados[2][1][i],estados[2][2][i])
Amazonas Puerto Ayacucho
Anzoátegui Barcelona
Apure San Fernando de Apure
Aragua Maracay
Barinas Barinas
Bolívar Ciudad Bolívar
Carabobo Valencia
Cojedes San Carlos
Delta Amacuro Tucupita
Distrito Capital Caracas
Falcón Coro
Guárico San Juan de Los Morros
Lara Barquisimeto
Mérida Mérida
Miranda Los Teques
Monagas Maturín
Nueva Esparta La Asunción
Portuguesa Guanare
Sucre Cumaná
Táchira San Cristóbal
Trujillo Trujillo
Vargas La Guaira
Yaracuy San Felipe
Zulia Maracaibo
Dependencias Federales Gran Roque
In [5]:
#Ahora se crea una lista de diccionarios donde estará la información de cada estado
lista = []
for i in range(1,26):
    lista.append({'Estado':estados[2][1][i],
                  'Capital': estados[2][2][i],
                  'codigo_iso': estados[2][3][i],
                  u'año_admision': estados[2][4][i],
                  'Poblacion': int(estados[2][5][i].split(".")[0].split("&")[-1]),
                  'Superficie': int(estados[2][6][i].split(".")[0].split("&")[-1]),
                  'Densidad': float(estados[2][7][i].split(",")[0].split("&")[-1]),
                  'Region': estados[2][8][i]
                 })
    
print(lista)
[{'Region': 'Guayana', 'Densidad': 0.99, 'Superficie': 177617, 'Estado': 'Amazonas', 'codigo_iso': 'VE-Z', 'Poblacion': 161844, 'Capital': 'Puerto Ayacucho', 'año_admision': '1992'}, {'Region': 'Nor - Oriental', 'Densidad': 33.90000033, 'Superficie': 43300, 'Estado': 'Anzoátegui', 'codigo_iso': 'VE-B', 'Poblacion': 2179838, 'Capital': 'Barcelona', 'año_admision': '1909'}, {'Region': 'Llanos', 'Densidad': 6.0, 'Superficie': 76500, 'Estado': 'Apure', 'codigo_iso': 'VE-C', 'Poblacion': 501404, 'Capital': 'San Fernando de Apure', 'año_admision': '1864'}, {'Region': 'Central', 'Densidad': 235.600000235, 'Superficie': 7014, 'Estado': 'Aragua', 'codigo_iso': 'VE-D', 'Poblacion': 1819630, 'Capital': 'Maracay', 'año_admision': '1909'}, {'Region': 'Andina', 'Densidad': 23.20000023, 'Superficie': 35200, 'Estado': 'Barinas', 'codigo_iso': 'VE-E', 'Poblacion': 853949, 'Capital': 'Barinas', 'año_admision': '1937'}, {'Region': 'Guayana', 'Densidad': 7.8700007, 'Superficie': 240528, 'Estado': 'Bolívar', 'codigo_iso': 'VE-F', 'Poblacion': 2069064, 'Capital': 'Ciudad Bolívar', 'año_admision': '1901'}, {'Region': 'Central', 'Densidad': 10000713.0, 'Superficie': 4650, 'Estado': 'Carabobo', 'codigo_iso': 'VE-G', 'Poblacion': 2342665, 'Capital': 'Valencia', 'año_admision': '1865'}, {'Region': 'Central', 'Densidad': 21.80000021, 'Superficie': 14800, 'Estado': 'Cojedes', 'codigo_iso': 'VE-H', 'Poblacion': 367020, 'Capital': 'San Carlos', 'año_admision': '1864'}, {'Region': 'Guayana', 'Densidad': 4.6500004, 'Superficie': 40200, 'Estado': 'Delta Amacuro', 'codigo_iso': 'VE-Y', 'Poblacion': 180363, 'Capital': 'Tucupita', 'año_admision': '1992'}, {'Region': 'Capital', 'Densidad': 7246.4000007246, 'Superficie': 433, 'Estado': 'Distrito Capital', 'codigo_iso': 'VE-A', 'Poblacion': 4033186, 'Capital': 'Caracas', 'año_admision': '1999'}, {'Region': 'Centro-Occidental', 'Densidad': 36.40000036, 'Superficie': 24800, 'Estado': 'Falcón', 'codigo_iso': 'VE-I', 'Poblacion': 1064615, 'Capital': 'Coro', 'año_admision': '1872'}, {'Region': 'Llanos', 'Densidad': 11.50000011, 'Superficie': 64986, 'Estado': 'Guárico', 'codigo_iso': 'VE-J', 'Poblacion': 746174, 'Capital': 'San Juan de Los Morros', 'año_admision': '1864'}, {'Region': 'Centro-Occidental', 'Densidad': 89.60000089, 'Superficie': 19800, 'Estado': 'Lara', 'codigo_iso': 'VE-K', 'Poblacion': 1892439, 'Capital': 'Barquisimeto', 'año_admision': '1909'}, {'Region': 'Andina', 'Densidad': 92.80000092, 'Superficie': 11300, 'Estado': 'Mérida', 'codigo_iso': 'VE-L', 'Poblacion': 903955, 'Capital': 'Mérida', 'año_admision': '1909'}, {'Region': 'Capital', 'Densidad': 336.500000336, 'Superficie': 7950, 'Estado': 'Miranda', 'codigo_iso': 'VE-M', 'Poblacion': 3112851, 'Capital': 'Los Teques', 'año_admision': '1909'}, {'Region': 'Nor - Oriental', 'Densidad': 31.30000031, 'Superficie': 28900, 'Estado': 'Monagas', 'codigo_iso': 'VE-N', 'Poblacion': 938185, 'Capital': 'Maturín', 'año_admision': '1909'}, {'Region': 'Insular', 'Densidad': 10000480.0, 'Superficie': 1150, 'Estado': 'Nueva Esparta', 'codigo_iso': 'VE-O', 'Poblacion': 525139, 'Capital': 'La Asunción', 'año_admision': '1909'}, {'Region': 'Centro-Occidental', 'Densidad': 57.70000057, 'Superficie': 15200, 'Estado': 'Portuguesa', 'codigo_iso': 'VE-P', 'Poblacion': 897104, 'Capital': 'Guanare', 'año_admision': '1909'}, {'Region': 'Nor - Oriental', 'Densidad': 76.0, 'Superficie': 11800, 'Estado': 'Sucre', 'codigo_iso': 'VE-R', 'Poblacion': 892990, 'Capital': 'Cumaná', 'año_admision': '1909'}, {'Region': 'Andina', 'Densidad': 105.300000105, 'Superficie': 11100, 'Estado': 'Táchira', 'codigo_iso': 'VE-S', 'Poblacion': 1277241, 'Capital': 'San Cristóbal', 'año_admision': '1899'}, {'Region': 'Andina', 'Densidad': 92.80000092, 'Superficie': 7400, 'Estado': 'Trujillo', 'codigo_iso': 'VE-T', 'Poblacion': 901239, 'Capital': 'Trujillo', 'año_admision': '1864'}, {'Region': 'Capital', 'Densidad': 235.800000235, 'Superficie': 1497, 'Estado': 'Vargas', 'codigo_iso': 'VE-X', 'Poblacion': 419928, 'Capital': 'La Guaira', 'año_admision': '1998'}, {'Region': 'Centro-Occidental', 'Densidad': 84.60000084, 'Superficie': 7100, 'Estado': 'Yaracuy', 'codigo_iso': 'VE-U', 'Poblacion': 645688, 'Capital': 'San Felipe', 'año_admision': '1899'}, {'Region': 'Zuliana', 'Densidad': 73.70000073, 'Superficie': 63100, 'Estado': 'Zulia', 'codigo_iso': 'VE-V', 'Poblacion': 4694856, 'Capital': 'Maracaibo', 'año_admision': '1864'}, {'Region': 'Insular', 'Densidad': 18.0, 'Superficie': 120, 'Estado': 'Dependencias Federales', 'codigo_iso': 'VE-W', 'Poblacion': 2155, 'Capital': 'Gran Roque', 'año_admision': '1938'}]
In [6]:
#Luego se crea un dataframe de la lista de diccionarios
df = pd.DataFrame(lista)
df
Out[6]:

Capital Densidad Estado Poblacion Region Superficie año_admision codigo_iso
0 Puerto Ayacucho 9.900000e-01 Amazonas 161844 Guayana 177617 1992 VE-Z
1 Barcelona 3.390000e+01 Anzoátegui 2179838 Nor - Oriental 43300 1909 VE-B
2 San Fernando de Apure 6.000000e+00 Apure 501404 Llanos 76500 1864 VE-C
3 Maracay 2.356000e+02 Aragua 1819630 Central 7014 1909 VE-D
4 Barinas 2.320000e+01 Barinas 853949 Andina 35200 1937 VE-E
5 Ciudad Bolívar 7.870001e+00 Bolívar 2069064 Guayana 240528 1901 VE-F
6 Valencia 1.000071e+07 Carabobo 2342665 Central 4650 1865 VE-G
7 San Carlos 2.180000e+01 Cojedes 367020 Central 14800 1864 VE-H
8 Tucupita 4.650000e+00 Delta Amacuro 180363 Guayana 40200 1992 VE-Y
9 Caracas 7.246400e+03 Distrito Capital 4033186 Capital 433 1999 VE-A
10 Coro 3.640000e+01 Falcón 1064615 Centro-Occidental 24800 1872 VE-I
11 San Juan de Los Morros 1.150000e+01 Guárico 746174 Llanos 64986 1864 VE-J
12 Barquisimeto 8.960000e+01 Lara 1892439 Centro-Occidental 19800 1909 VE-K
13 Mérida 9.280000e+01 Mérida 903955 Andina 11300 1909 VE-L
14 Los Teques 3.365000e+02 Miranda 3112851 Capital 7950 1909 VE-M
15 Maturín 3.130000e+01 Monagas 938185 Nor - Oriental 28900 1909 VE-N
16 La Asunción 1.000048e+07 Nueva Esparta 525139 Insular 1150 1909 VE-O
17 Guanare 5.770000e+01 Portuguesa 897104 Centro-Occidental 15200 1909 VE-P
18 Cumaná 7.600000e+01 Sucre 892990 Nor - Oriental 11800 1909 VE-R
19 San Cristóbal 1.053000e+02 Táchira 1277241 Andina 11100 1899 VE-S
20 Trujillo 9.280000e+01 Trujillo 901239 Andina 7400 1864 VE-T
21 La Guaira 2.358000e+02 Vargas 419928 Capital 1497 1998 VE-X
22 San Felipe 8.460000e+01 Yaracuy 645688 Centro-Occidental 7100 1899 VE-U
23 Maracaibo 7.370000e+01 Zulia 4694856 Zuliana 63100 1864 VE-V
24 Gran Roque 1.800000e+01 Dependencias Federales 2155 Insular 120 1938 VE-W
In [7]:
#Si se quiere la información de Carabobo
mascara = df["Estado"] == "Carabobo"
df[mascara]
Out[7]:

Capital Densidad Estado Poblacion Region Superficie año_admision codigo_iso
6 Valencia 10000713.0 Carabobo 2342665 Central 4650 1865 VE-G
In [8]:
#Otra forma de traer la información de Carabobo
df.iloc[6]
Out[8]:
Capital            Valencia
Densidad        1.00007e+07
Estado             Carabobo
Poblacion           2342665
Region              Central
Superficie             4650
año_admision           1865
codigo_iso             VE-G
Name: 6, dtype: object
In [9]:
#Para obtener la capital del estado
df.iloc[6]["Capital"]
Out[9]:
'Valencia'
In [ ]:
 
El proceso de eliminar la basura dentro del texto de algunos campos no se muestra, pero se usa en la construcción del diccionario.

15 abr. 2018

PDF Scraping para Pandas usando tabula-py

Hace un tiempo quería hacer pruebas de extracción de datos de PDF que publica la Administración Pública en Venezuela, ya que el concepto de Datos Abiertos no está muy claro por acá, lo más que se logra son documentos en PDF donde pegan gráficas y tablas como capturas de pantalla.

Artículos sobre webscraping.

Por cierto, existe un evento del día de los datos abiertos. Ese día fue el 3 de Marzo en este año. si le dan clic al mapa, aparece la lista de eventos de ese día por países.


Este artículo se basa en un artículo en inglés publicado en Medium sobre tabula-py.

Para el caso de Venezuela, no aparece en la lista de eventos de la fecha del 3 de Marzo.


Alianza para el gobierno Abierto.


Iniciativas de sitios de Datos Abiertos.


Que tal que pueda hacer un scraping y de una usar Pandas (Introducción a pandas) para Ciencia de Datos.

Existe una librería para Python llamada tabula-py, en el github de tabula-py se encuentra un archivo llamado data.pdf, ese será el archivo pdf que se va a extraer la información.


Para usar tabula-py se puede instalar vía pip:

pip install tabula-py

A continuación se muestra en jupyter como usar tabula-py:

In [1]:
#Se importa read_pdf de tabula
from tabula import read_pdf
In [2]:
#Se lee el archivo data.pdf y se muestra el encabezado del dataframe
df = read_pdf('./Data/data.pdf')
df.head()
Out[2]:
Unnamed: 0 mpg cyl disp hp drat wt qsec vs am gear carb
0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
3 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
4 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
In [3]:
#También se puede mostrar los datos en formato json
js = read_pdf('./Data/data.pdf',output_format='json')
In [4]:
#También se puede guardar un archivo en JSON, CSV,TSV
from tabula import convert_into
convert_into('./Data/data.pdf',"./Data/data.json",output_format='json')
#!cat ./Data/data.json
In [5]:
convert_into('./Data/data.pdf',"./Data/data.tsv",output_format='tsv')
#!cat ./Data/data.tsv
In [6]:
convert_into('./Data/data.pdf',"./Data/data.csv",output_format='csv')
#!cat ./Data/data.csv


A continuación se muestra la figura del editor que muestra data.csv:


Ahora se muestra el contenido del archivo data.tsv:



Al tener los datos en un dataframe se puede realizar toda la analítica de datos que se puede hacer con Pandas.