Jugando con la API de Twitter [Parte 4.1]


En esta entrada vamos a analizar el bucle nuevo que cree en la entrada anterior, pero recordemos que el programa no hacia exactamente lo que queríamos, para muestra aquí la salida:

Lista Ordenada [(u'#YoRio', 76), (u'#YoRioxESPN', 19), (u'#Rio2016', 11), (u'#yorio', 11), (u'#GraciasRioPor', 9), (u'para', 9), (u'#Tokio2020', 9), (u'hablar', 8), (u'@ESPNmx', 8), (u'@EPN', 8)]
  ############  
  ############  
Diccionario sin Ordenas {u'#Rio2016': 11, u'#YoRio': 76, u'para': 9, u'#GraciasRioPor': 9, u'#YoRioxESPN': 19, u'@EPN': 8, u'hablar': 8, u'#Tokio2020': 9, u'@ESPNmx': 8, u'#yorio': 11}
PrettyTable Sin Ordenar:
+----------------+-------+
|      key       | value |
+----------------+-------+
|    #Rio2016    |   11  |
|     #YoRio     |   76  |
|      para      |   9   |
| #GraciasRioPor |   9   |
|  #YoRioxESPN   |   19  |
|      @EPN      |   8   |
|     hablar     |   8   |
|   #Tokio2020   |   9   |
|    @ESPNmx     |   8   |
|     #yorio     |   11  |
+----------------+-------+
  ############  
  ############  
  ############  
  ############  
Lista Ordenada [(u'ESPNmx', 9), (u'joserra_espn', 7), (u'mexico', 6), (u'giss1209', 6), (u'Faitelson_ESPN', 6), (u'espn', 5), (u'TheMorrisMx', 3), (u'joapeca', 2), (u'chockoleiro', 2), (u'Deb_Estrella', 2)]
  ############  
  ############  
Diccionario sin Ordenas {u'espn': 5, u'mexico': 6, u'Deb_Estrella': 2, u'chockoleiro': 2, u'TheMorrisMx': 3, u'giss1209': 6, u'joapeca': 2, u'joserra_espn': 7, u'Faitelson_ESPN': 6, u'ESPNmx': 9}
PrettyTable Sin Ordenar:
+----------------+-------+
|      key       | value |
+----------------+-------+
|      espn      |   5   |
|     mexico     |   6   |
|  Deb_Estrella  |   2   |
|  chockoleiro   |   2   |
|  TheMorrisMx   |   3   |
|    giss1209    |   6   |
|    joapeca     |   2   |
|  joserra_espn  |   7   |
| Faitelson_ESPN |   6   |
|     ESPNmx     |   9   |
+----------------+-------+
  ############  
  ############  
  ############  
  ############  
Lista Ordenada [(u'YoRio', 80), (u'YoRioxESPN', 19), (u'yorio', 12), (u'Rio2016', 11), (u'GraciasRioPor', 9), (u'Tokio2020', 9), (u'CeremoniaDeClausura', 5), (u'YoR\xedo', 4), (u'Brasil', 4), (u'ESPN', 3)]
  ############  
  ############  
Diccionario sin Ordenas {u'Brasil': 4, u'ESPN': 3, u'CeremoniaDeClausura': 5, u'YoRio': 80, u'Tokio2020': 9, u'YoR\xedo': 4, u'yorio': 12, u'GraciasRioPor': 9, u'YoRioxESPN': 19, u'Rio2016': 11}
PrettyTable Sin Ordenar:
+---------------------+-------+
|         key         | value |
+---------------------+-------+
|        Brasil       |   4   |
|         ESPN        |   3   |
| CeremoniaDeClausura |   5   |
|        YoRio        |   80  |
|      Tokio2020      |   9   |
|        YoRío        |   4   |
|        yorio        |   12  |
|    GraciasRioPor    |   9   |
|      YoRioxESPN     |   19  |
|       Rio2016       |   11  |
+---------------------+-------+
  ############  
  ############  
  ############  
  ############  


Algo de suma importancia es que la primera lista si esta ordenada, recordemos que las listas podemos ordenarlas, mientras que los diccionarios no tienen método de ordenamiento es por esto que el diccionario se cambia a lista y luego se devuelve el cambio a Diccionario, esto por que recordemos que necesitamos un diccionario nuevo con mas de 4 caracteres para cada elemento, pero aun no vamos a analizar el programa que genera la salida anterior, ya que seria inútil lo que realmente necesitamos es que el PrettyTable este ordenado, y esto lo vamos a lograr con el siguiente código que es el que vamos a analizar(Lo voy  a colocar en bloques para una mayor comprensión):

for label, data in (( 'Word' , words), ( 'Screen Name' , screen_names), ( 'Hashtag' , hashtags)):  ### Bloque 1
    
    frecuencia = {}
    coleccion = {}
    lista_nueva=[]
    for palabra in data:  ### Bloque 2
        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): ### Bloque 3
        key = coleccion[i][0]
        value = coleccion[i][1]
        diccionario[key] = value
     
    print diccionario

    ### Bloque 4
    pt = PrettyTable(field_names=[label , "Count"])
    
    c = Counter(coleccion)
    [ pt.add_row(kv) for kv in coleccion[:10] ]
    pt.align[label], pt.align['Count'] = 'l' , 'r' # Alineacion en columnas como si de una hoja de calculos se tratara
    print pt
   

Podemos ver 4 Bloques que quiero explicar y que analicemos, quizá haya una forma mas interesante y rápida de hacer lo mismo pero a mi me gusto  esta, claro que pude tomar la lista y eliminar las claves o lista[n][0] que fueran menor de 4 caracteres y seria mas limpio, pero yo quise hacerlo asi para aprender y guardar esta forma de hacerlo 😀

Al grano, ahora el programa si hace lo que necesitamos, que hace???? El fin ultimo es que el PrettyTable imprima las 10 palabras con mas de 4 caracteres mas usadas en cada uno de los hilos usados (( ‘Word’ , words), ( ‘Screen Name’ , screen_names), ( ‘Hashtag’ , hashtags)) debemos visualizar los 4 bloques que  vamos a analizar, el bloque 1 en realidad es el bloque principal y contiene a el bloque 2,3 y 4 , lo coloque por que debeos interpretar la primera linea, las otras cosas que en el aparecen son variables y otros bloques, fijate:

 
for label, data in (( 'Word' , words), ( 'Screen Name' , screen_names), ( 'Hashtag' , hashtags)): ### Bloque 1 
    frecuencia = {} 
    coleccion = {} 
    lista_nueva=[] 

Este for parece que vamos a utilizar un diccionario o tuplas y es mas o menos así pero no :D, en realidad Label son las Etiquetas para PrettyTable que se encuentran entre comillas simples(“Word”, “Screen Name”, “Hashtag”) y data es cada item de la lista que ya teníamos antes(word, screen_name, hastags) son listas… Ahora el bloque 2:

    for palabra in data:  ### Bloque 2
        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()

 Es necesario entender que tenemos 3 listas y data va a cambiar 3 veces, entonces el bucle for “for palabra in data: ### Bloque 2” Va a repetirse 3 veces, y va a tomar cada palabra de data y va a ejecutar el código siempre y cuando palabra tenga mas de 4 caracteres “if len(palabra) >= 4 :” ahora fíjate que he creado 2 lineas 1 para contar las palabras y agregarlas a un diccionario “frecuencia[palabra]=frecuencia.get(palabra,0)+1” y la otra para crear una nueva lista  “lista_nueva.append(palabra)” para asi poder usar la libreria Counter “c=Counter(lista_nueva)” y tomar los 10 mas comunes “print c.most_common()[:10]”, ojo esto lo hice así para las palabras que tienen mas de 4 caracteres… solo imprime los 10 mas comunes….

    for i in range(0, frecuencia_10): ### Bloque 3
        key = coleccion[i][0]
        value = coleccion[i][1]
        diccionario[key] = value
     
    print diccionario

    ### Bloque 4
    pt = PrettyTable(field_names=[label , "Count"])
    
    c = Counter(coleccion)
    [ pt.add_row(kv) for kv in coleccion[:10] ]
    pt.align[label], pt.align['Count'] = 'l' , 'r' # Alineacion en columnas como si de una hoja de calculos se tratara
    print pt
   

Ahora el bloque 3 es simplemente tomar la lista generada “coleccion= c.most_common()[:10”  y agregarla a un diccionario, por que hacerlo??? por ejemplo yo he venido visualizando histogramas y otros tipos de gráficos y quiero utilizarlos con estos datos, para hacerlo prefiero usar Diccionarios a otra cosa y es por esto que lo hice…. es sencillo el código del bloque 3 y este es el código para entrada siguiente donde vamos de Json a Diccionario y creando histogramas 😀 haya lo explicare mas, esta es la salida del programa:

[(u'#YoRio', 75), (u'#YoRioxESPN', 19), (u'#yorio', 12), (u'#Rio2016', 11), (u'#GraciasRioPor', 9), (u'@ESPNmx', 9), (u'para', 9), (u'#Tokio2020', 9), (u'@EPN', 8), (u'Gracias', 8), (u'@joserra_espn', 7), (u'gran', 7), (u'desde', 6), (u'mejor', 6), (u'@Faitelson_ESPN', 5)]
  ############  
  ############  
{u'Gracias': 8, u'#Rio2016': 11, u'#YoRio': 75, u'para': 9, u'#GraciasRioPor': 9, u'#YoRioxESPN': 19, u'mejor': 6, u'desde': 6, u'@joserra_espn': 7, u'@EPN': 8, u'@Faitelson_ESPN': 5, u'#Tokio2020': 9, u'gran': 7, u'@ESPNmx': 9, u'#yorio': 12}
+----------------+-------+
| Word           | Count |
+----------------+-------+
| #YoRio         |    75 |
| #YoRioxESPN    |    19 |
| #yorio         |    12 |
| #Rio2016       |    11 |
| #GraciasRioPor |     9 |
| @ESPNmx        |     9 |
| para           |     9 |
| #Tokio2020     |     9 |
| @EPN           |     8 |
| Gracias        |     8 |
+----------------+-------+
[(u'ESPNmx', 10), (u'joserra_espn', 7), (u'mexico', 6), (u'Faitelson_ESPN', 6), (u'espn', 5), (u'TheMorrisMx', 3), (u'giss1209', 3), (u'joapeca', 2), (u'ClaroSports', 2), (u'chockoleiro', 2), (u'Deb_Estrella', 2), (u'Palomo_ESPN', 2), (u'AstroTerry', 2), (u'ElPrincipeDice', 1), (u'paugr', 1)]
  ############  
  ############  
{u'Palomo_ESPN': 2, u'ElPrincipeDice': 1, u'AstroTerry': 2, u'espn': 5, u'mexico': 6, u'Deb_Estrella': 2, u'chockoleiro': 2, u'TheMorrisMx': 3, u'giss1209': 3, u'joapeca': 2, u'ClaroSports': 2, u'joserra_espn': 7, u'Faitelson_ESPN': 6, u'paugr': 1, u'ESPNmx': 10}
+----------------+-------+
| Screen Name    | Count |
+----------------+-------+
| ESPNmx         |    10 |
| joserra_espn   |     7 |
| mexico         |     6 |
| Faitelson_ESPN |     6 |
| espn           |     5 |
| TheMorrisMx    |     3 |
| giss1209       |     3 |
| joapeca        |     2 |
| ClaroSports    |     2 |
| chockoleiro    |     2 |
+----------------+-------+
[(u'YoRio', 79), (u'YoRioxESPN', 19), (u'yorio', 13), (u'Rio2016', 11), (u'GraciasRioPor', 9), (u'Tokio2020', 9), (u'CeremoniaDeClausura', 5), (u'YoR\xedo', 4), (u'Brasil', 4), (u'ESPN', 3), (u'yoRio', 3), (u'GraciasRio', 3), (u'JuegosOlimpicos', 3), (u'RiodeJaneiro', 2), (u'Ol\xedmpicos', 2)]
  ############  
  ############  
{u'RiodeJaneiro': 2, u'JuegosOlimpicos': 3, u'Brasil': 4, u'ESPN': 3, u'CeremoniaDeClausura': 5, u'yoRio': 3, u'YoRio': 79, u'Tokio2020': 9, u'Ol\xedmpicos': 2, u'YoR\xedo': 4, u'yorio': 13, u'GraciasRioPor': 9, u'YoRioxESPN': 19, u'GraciasRio': 3, u'Rio2016': 11}
+---------------------+-------+
| Hashtag             | Count |
+---------------------+-------+
| YoRio               |    79 |
| YoRioxESPN          |    19 |
| yorio               |    13 |
| Rio2016             |    11 |
| GraciasRioPor       |     9 |
| Tokio2020           |     9 |
| CeremoniaDeClausura |     5 |
| YoRío               |     4 |
| Brasil              |     4 |
| ESPN                |     3 |
+---------------------+-------+

EL bloque 4 es el mismo codigo del original solo hice un cambio “[ pt.add_row(kv) for kv in coleccion[:10] ]” cambie esta linea, no creo que haya que explicar mucho, si necesitas entender mas no dudes en comentar, que Dios te Bendiga e Ilumine tu camino en todos los aspectos de tu Vida, gracias

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