Jugando con la API de Twitter [Parte 4]


En esta entrada vamos a ver nuestras primeras tablas, no te emociones aun, vamos a ver como python le da formato a datos sencillos, aunque en la siguiente entrada si vamos a ver gráficos de lo que hemos ido haciendo hasta ahora con la otra serie que te recuerdo va paralela a esta Manejando los datos de la API Twitter en Python [Parte 1]  ademas aquí te tengo mi nuevo repositorio de GitHub que hasta ahora solo tiene 2 de las series del Blog pero las voy a ir subiendo poco a poco y para este año espero tener de 10 a 15 series en el repo, solo voy a subir repositorios míos no voy a hacer fork de ningún repo de otra persona, así que aquí esta mi nuevo repo: https://github.com/Seth-Root No me entusiasma mucho los 2 repos que he subido pero son los mas completos y el código esta interesante.

Bueno a lo que nos interesa, “PrettyTable es una biblioteca de Python sencilla para visualizar fácilmente los datos tabulares en un formato de tabla ASCII visualmente atractivo.

PrettyTable es una biblioteca de Python simple diseñada para que sea fácil y rápido para representar datos tabulares en las tablas ASCII visualmente atractivos. Se inspira en las tablas ASCII utilizados en la cáscara de psql de PostgreSQL. PrettyTable permite la selección de las columnas que se van a imprimir, la alineación independiente de columnas (izquierda o derecha o centrado) y la impresión de “sub-tablas” especificando un rango fila.”

Información de aquí

Como aun estamos con nuestros programas en linea de comandos, tenemos que buscar la manera de ver la salida lo mas interesante, fácil y educativa posible y es por esto que me he permitido colocar este formato aquí, ademas en el libro que venimos siguiendo de minando las web sociales tienen un ejemplo de esto y lo coloque aquí 😀

Vamos a visualizar los datos que podemos ver con el siguiente código:


import twitter, json

from collections import Counter

from prettytable import PrettyTable


# Datos de autenticacion
CONSUMER_KEY = 'Datos de A'

CONSUMER_SECRET = 'Datos de B'

OAUTH_TOKEN = 'Datos de C'

OAUTH_SECRET = 'Datos de D'



auth = twitter.oauth.OAuth( OAUTH_TOKEN , OAUTH_SECRET, CONSUMER_KEY , CONSUMER_SECRET )

api = twitter.Twitter(auth=auth)

q =  '#yorio' # Coloca aqui la cuenta a estudiar


count = 100

search_results = api.search.tweets(q=q, count =count)

statuses = search_results['statuses']


  
retweet_counts = [status['retweet_count']
	 for status in statuses ]

status_texts = [status['text']
	 for status in statuses ]


screen_names = [user_mention['screen_name']
	 for status in statuses 
	     for user_mention in status ['entities']['user_mentions'] ]


hashtags = [hashtag['text']
	 for status in statuses 
	     for hashtag in status ['entities']['hashtags'] ]

words = [ w
	 for t in status_texts
	    for w in t.split()
  ]

for item in [words, screen_names, hashtags]:
    c = Counter(item)
    print c.most_common()[:20]
    print



for label, data in (('Word', words), ('Screen Name', screen_names), ('Hashtag', hashtags)):
    pt = PrettyTable(field_names=[label, 'Count'])
    c = Counter(data)
    [ pt.add_row(kv) for kv in c.most_common()[:20] ]
    pt.align[label], pt.align['Count'] = 'l', 'r' # Set column alignment
    print pt


    

La salida de este programa es sumamente importante, y consta de 2 partes interesantes para nosotros y debemos estudiarlas a fondo aunque aquí solo diré que las vamos a estudiar a fondo en la otra serie, lo que si me interesa tocar es los bloques de código del bucle for que generan esta salida


[(u'en', 103), (u'de', 76), (u'#YoRio', 73), (u'del', 62), (u'a', 61), (u'RT', 53), (u'Diego', 52), (u'Tendremos', 40), (u'a\xf1os', 40), (u'4to', 40), (u'lugar', 40), (u'NOCHE', 40), (u'22', 40), (u'fue', 40), (u'Con', 40), (u'lanzamiento', 40), (u'ESTA', 40), (u'Real.', 40), (u'#YoRioxESPN', 39), (u'martillo.', 34)]

[(u'Leonlec', 33), (u'ACC_Castillo', 8), (u'EPN', 6), (u'CONADE', 4), (u'joserra_espn', 4), (u'ESPNmx', 4), (u'PaolaEspinosaOf', 2), (u'Faitelson_ESPN', 2), (u'gobmx', 1), (u'mexico', 1), (u'yllenhot1', 1), (u'aristeguicnn', 1), (u'AnaGGuevara', 1), (u'INEMexico', 1), (u'PresidenciaMX', 1), (u'merizemborain', 1), (u'apmakeup', 1), (u'matsinfronteras', 1), (u'Pajaropolitico', 1), (u'Valencia_Guzman', 1)]

[(u'YoRio', 80), (u'YoRioxESPN', 40), (u'YoR\xedo', 15), (u'Rio2016', 3), (u'HondurasLlora', 2), (u'NoTeMuerasNunca', 2), (u'MePongoDePie', 2), (u'YoLloro', 2), (u'Idolo', 2), (u'Grandisima', 2), (u'lupitadeoro', 2), (u'YoRIO', 2), (u'EllaRie', 1), (u'TodosReimos', 1), (u'yorio', 1), (u'COL', 1), (u'Olimpiadas2016', 1), (u'Plata', 1), (u'LupitaMentality', 1), (u'yoRio', 1)]

+-------------+-------+
| Word        | Count |
+-------------+-------+
| en          |   103 |
| de          |    76 |
| #YoRio      |    73 |
| del         |    62 |
| a           |    61 |
| RT          |    53 |
| Diego       |    52 |
| Tendremos   |    40 |
| años        |    40 |
| 4to         |    40 |
| lugar       |    40 |
| NOCHE       |    40 |
| 22          |    40 |
| fue         |    40 |
| Con         |    40 |
| lanzamiento |    40 |
| ESTA        |    40 |
| Real.       |    40 |
| #YoRioxESPN |    39 |
| martillo.   |    34 |
+-------------+-------+
+-----------------+-------+
| Screen Name     | Count |
+-----------------+-------+
| Leonlec         |    33 |
| ACC_Castillo    |     8 |
| EPN             |     6 |
| CONADE          |     4 |
| joserra_espn    |     4 |
| ESPNmx          |     4 |
| PaolaEspinosaOf |     2 |
| Faitelson_ESPN  |     2 |
| gobmx           |     1 |
| mexico          |     1 |
| yllenhot1       |     1 |
| aristeguicnn    |     1 |
| AnaGGuevara     |     1 |
| INEMexico       |     1 |
| PresidenciaMX   |     1 |
| merizemborain   |     1 |
| apmakeup        |     1 |
| matsinfronteras |     1 |
| Pajaropolitico  |     1 |
| Valencia_Guzman |     1 |
+-----------------+-------+
+-----------------+-------+
| Hashtag         | Count |
+-----------------+-------+
| YoRio           |    80 |
| YoRioxESPN      |    40 |
| YoRío           |    15 |
| Rio2016         |     3 |
| HondurasLlora   |     2 |
| NoTeMuerasNunca |     2 |
| MePongoDePie    |     2 |
| YoLloro         |     2 |
| Idolo           |     2 |
| Grandisima      |     2 |
| lupitadeoro     |     2 |
| YoRIO           |     2 |
| EllaRie         |     1 |
| TodosReimos     |     1 |
| yorio           |     1 |
| COL             |     1 |
| Olimpiadas2016  |     1 |
| Plata           |     1 |
| LupitaMentality |     1 |
| yoRio           |     1 |
+-----------------+-------+

Los 2 bucles son estos:


### Bloque 1

for item in [words, screen_names, hashtags]:
    c = Counter(item)
    print c.most_common()[:20]
    print


### Bloque 2
for label, data in (('Word', words), ('Screen Name', screen_names), ('Hashtag', hashtags)):
    pt = PrettyTable(field_names=[label, 'Count'])
    c = Counter(data)
    [ pt.add_row(kv) for kv in c.most_common()[:20] ]
    pt.align[label], pt.align['Count'] = 'l', 'r' # Set column alignment
    print pt


    

Si analizamos bien el código anterior lo que estamos imprimiendo para el primer bloque es una lista con 1 diccionario adentro, esto debido a que la API nos proporciona una lista de muchos diccionarios y como estamos sobre esta, es decir no hemos creado diccionarios nuevos esto lo hacemos en la otra serie :D, la salida es lógica una lista de 1 diccionario con los items mas comunes que estamos evaluando.

Se me olvidaba también tenemos importada una librería llamada Counter que nos facilita el tener que contar los items mas comunes de una clase o método python como es nuestro caso tenemos 3 diccionario y el bloque 1 nos permite encontrar los mas comunes de cada diccionario, yo le coloque 20, aquí la linea en cuestión:


    print c.most_common()[:20]

El siguiente Bloque es mas interesante, nos permite visualizar los datos en una tabla para tener mejor percepción ademas los ordena 😀 de mayor a menor, podemos visualizar como para cada etiqueta tenemos 1 dato que vayamos agregando no sin antes contar con la librería Counter, Y a ti que se te ocurre hacer con estos datos 😀

Bueno a mi se me ocurrió que no me interesaban los datos con menos de 4 caracteres  y le coloque un condicional sencillo así:


for item in [words, screen_names, hashtags]:

    for palabra in item:
        if len(palabra) >= 4 :
            frecuencia[palabra] = frecuencia.get(palabra,0)+1 #esto nos cuenta todas las palabras
            
            
    print frecuencia
    print "  ############  "
    print "  ############  "
    print "  ############  "
    print "  ############  "



    

Que es lo que hice, simple crear un nuevo diccionario para imprimir en un diccionario las palabras que tengan mas de 4 caracteres y los agregue a un diccionario, con este mismo diccionario voy a imprimir lo que necesito, ojo pude usar el otro bloque que ya tenia pero me parece mas fácil de explicar así, puedes correr el siguiente programa y ver la salida(en la otra entrada):


for item in [words, screen_names, hashtags]:
    frecuencia = {}
    coleccion = {}
    lista_nueva=[]
    for palabra in item:
        if len(palabra) >= 4 :
	  frecuencia[palabra] = frecuencia.get(palabra,0)+1 #esto nos cuenta todas las palabras
	  lista_nueva.append(palabra)
    c = Counter(lista_nueva)
    print c.most_common()[:10]    
    print "  ############  "
    print "  ############  "    
    

    coleccion = c.most_common()[:10] 
    frecuencia_10 = len(coleccion)
    i = 0
    diccionario = dict()
    for i in range(0, frecuencia_10):
        key = coleccion[i][0]
        value = coleccion[i][1]
        diccionario[key] = value
     
    print diccionario


    t = PrettyTable(['key', 'value'])
    for key, val in diccionario.items():
        t.add_row([key, val])
    print t
            
            
    print "  ############  "
    print "  ############  "
    print "  ############  "
    print "  ############  "



    

Estaba tratando de hacer lo mas sencillo posible el código pasando por la librería operator hasta prettytables, pero me di cuenta que era mejor crear todo de nuevo o mejor dicho hacerlo lo mas sencillo pero largo posible, hoy no voy a comentar el código incluso falta colocarle las etiquetas al prettytable pero lo haré el lunes, ya a partir de ahora a descansar 😀

Fíjate que hay un solo ciclo FOR y para la siguiente entrada de la serie voy a dividirlos, incluso no se si la parte del prettytable quedara así, ya que a pesar de tener las 10 palabras mas usadas en cada Diccionario no están ordenados :S

Hasta la Próxima Feliz fin de Semana. Que Dios les Bendiga y le deje ver su Gloria en cada momento de Sus Vidas…

 

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s