¿Cómo crear un gráfico de barras y guardarlo en pptx usando Python?

World Wide Web tiene grandes cantidades de datos disponibles que crecen constantemente tanto en cantidad como en forma fina. La API de Python nos permite recopilar datos/información de interés de la World Wide Web. La API es una herramienta muy útil para científicos de datos, desarrolladores web e incluso cualquier persona ocasional que quiera encontrar y extraer información mediante programación.

API frente a web scraping

Bueno, la mayoría de los sitios web proporcionan API para compartir datos en un formato estructurado, sin embargo, normalmente restringen los datos que están disponibles y también pueden poner un límite a la frecuencia con la que se puede acceder a ellos. Además, un desarrollador de sitios web puede cambiar, eliminar o restringir la API de back-end.

Por otro lado, hay sitios web que no proporcionan API para compartir los datos. El equipo de desarrollo del sitio web en cualquier momento puede cambiar, eliminar o restringir la API de back-end. En resumen, no podemos confiar en las API para acceder a los datos en línea que deseemos. Por lo tanto, es posible que debamos confiar en técnicas de web scraping.

Versión de Python

Cuando se trata de una API efectiva, Python suele ser el lenguaje de programación elegido. Es un lenguaje de programación fácil de usar que tiene un ecosistema muy rico de herramientas para muchas tareas. Si programa en otros lenguajes, le resultará fácil retomar Python y es posible que nunca regrese.

La Python Software Foundation ha anunciado que Python 2 dejará de desarrollarse y admitirse gradualmente en 2020. Por este motivo, utilizaremos Python 3 y el cuaderno Jupyter en la publicación. Para ser más específicos, mi versión de python es:

Python3

from platform import python_version
 
 
print(python_version())
Producción

3.6.10

Estructura del sitio web de Target

Antes de intentar acceder al contenido de un sitio web mediante API o rastreo web, siempre debemos comprender la estructura de nuestro sitio web de destino. El mapa del sitio y el archivo robots.txt de un sitio web nos ayudan con información vital además de herramientas externas como la Búsqueda de Google y WHOIS.

Validación del archivo robots.txt

Bueno, los sitios web (la mayoría de ellos) definen un archivo robots.txt para informar a los usuarios sobre las restricciones al acceder a su sitio web. Sin embargo, estas restricciones son solo pautas y recomendamos encarecidamente respetar sus pautas. Siempre debe validar y respetar los contenidos dentro de robots.txt para comprender la estructura del sitio web y minimizar la posibilidad de ser bloqueado.

El archivo robots.txt es un recurso valioso para validar antes de tomar la decisión de escribir un programa de rastreo web o usar una API.

Entendiendo el problema

En esta publicación, ahora reúna los repositorios de JavaScript con las estrellas más altas de Developers Facebook, conocido como Github, así que primero permítanme revisar su archivo robots.txt.

El siguiente contenido (solo las primeras líneas) proviene del archivo robots.txt del sitio web: https://github.com/robots.txt .

Del archivo está claro, Github quiere usar su contenido usando una API. Una forma de resolver nuestro problema es poniendo nuestros criterios de búsqueda en el cuadro de búsqueda de Github y presionando enter, sin embargo, es una actividad manual.

Afortunadamente, Github expone esta capacidad de búsqueda como una API que podemos consumir desde nuestras propias aplicaciones. La API de búsqueda de Github nos da acceso a la función de búsqueda integrada. Esto incluye el uso de operadores lógicos y de alcance, como «o» y «usuario».

Antes de pasar al código, hay algo que debe saber sobre los repositorios públicos, los repositorios privados y las restricciones de acceso. Los repositorios públicos suelen estar abiertos al público sin restricciones, mientras que los repositorios privados están restringidos solo a los propietarios y los colaboradores que ellos elijan.

Paso 1: Validación con cURL.

Ahora validemos rápidamente el acceso a Github antes de esforzarnos en escribir una API. Entonces, para hacer eso, cURL, una herramienta HTTP simple de línea de comandos, encaja perfectamente. cURL generalmente se instala en la mayoría de las máquinas Linux; de lo contrario, puede hacerlo fácilmente usando. – mmm instalar rizo 

Para Windows, obtenga una copia de » https://curl.haxx.se/download.html «.

Ahora ejecute el comando como se muestra a continuación:

La cURL nos ha dado mucha información:

  1. HTTP/1.1 200 OK – código Cuando la URL de destino de su solicitud y los parámetros asociados sean correctos, GitHub responderá con un estado 200 (Éxito).
  2. X-RateLimit-Limit : el número máximo de requests que puede realizar por hora.
  3. X-RateLimit-Remaining : la cantidad de requests restantes en la ventana de límite de velocidad actual.
  4. X-RateLimit-Reset : la hora a la que se restablece la ventana de límite de velocidad actual en segundos de época UTC.
  5. repository_search_url ”: Este es el que usaremos en esta publicación para consultar los repositorios.

Paso 2: Autenticación

Por lo general, hay un par de formas de autenticarse al realizar una solicitud a la API de Github: usar nombre de usuario y contraseñas (HTTP básico) y usar tokens OAuth. Los detalles de autenticación no se cubrirán en esta publicación.

Dado que Github nos permite acceder al contenido público sin ninguna autenticación, nos limitaremos a buscar repositorios públicos sin API. Significa que vamos a escribir una API que no requiere autenticación, por lo que solo buscaremos en repositorios públicos.

Paso 3: Respuesta de Github con Python

Python3

# 1 - imports
import requests
 
# 2 - set the siteurl
site_url = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars'
 
# 3 - set the headers
headers = {'Accept': 'application/vnd.github.v3+json'}
 
# 4 - call the url with headers and save the response
response = requests.get(site_url, headers=headers)
 
# 5 - Get the response
print(f"Response from {site_url} is {response.status_code} ")

 Producción:

Comenzamos con la importación de requests (si falta la instalación usando requests de instalación de pip) y luego asignamos una variable site_url con la URL de nuestro interés. Si desea buscar repositorios de JavaScript con una clasificación (descendente) en estrellas máximas.

Github se encuentra actualmente en la tercera versión de su API, por lo que definió encabezados para la llamada API que solicitan explícitamente usar la tercera versión de la API. No dude en consultar siempre la última versión aquí: https://docs.github.com/en/free-pro-team@latest/developers/overview/about-githubs-apis .

Luego llame a get() y pásele site_url y el encabezado, el objeto de respuesta se asigna a la variable de respuesta. La respuesta de Github siempre es un JSON. El objeto de respuesta tiene un atributo status_code, que indica si la respuesta es exitosa (200) o no.

Paso 4: Convertir la respuesta JSON al diccionario de Python 

Python3

response_json = response.json()
print(f"keys in the Json file : {response_json.keys()}")
print(f"Total javascript repositories in GitHub : {response_json['total_count']}" )

Producción:

Como se mencionó anteriormente, la respuesta es JSON. Nuestro JSON tiene tres claves de las cuales podemos ignorar «incomplete_results» para una API tan pequeña. Una salida del programa mostró el total de repositorios en Github devueltos para nuestra búsqueda con response_json[‘total_count’].

Paso 5: Mirando nuestro primer repositorio

Python3

repositories = response_json['items']
first_repo   = repositories[0]
 
print(f"Output \n  *** Repository information keys total - {len(first_repo)} - values are -\n")
for keys in sorted(first_repo.keys()):
    print(keys)
     
     
print(f" *** Repository name - {first_repo['name']}, Owner - {first_repo['owner']['login']},  total watchers - {first_repo['watchers_count']} ")

Producción: 

El código anterior se explica por sí mismo. Lo que estamos haciendo es mostrar todas las claves dentro del diccionario y luego mostrar información en nuestro primer repositorio.

Paso 6: Bucle para obtener más…

Hemos mirado un repositorio, para que sea más obvio que necesitamos pasar por el bucle. 

Python3

for repo_info in repositories:
    print(f"\n *** Repository Name: {repo_info['name']}")
    print(f" *** Repository Owner: {repo_info['owner']['login']}")
    print(f" *** Repository Description: {repo_info['description']}")

 Producción:
 

Paso 7: Visualización con Plotly

Es hora de visualizar usando los datos que tenemos ahora para mostrar la popularidad de los proyectos de JavaScript en Github. Digerir la información visualmente siempre es útil.

Antes de usar, debe instalar el paquete Plotly. Para la instalación, ejecute este comando en la terminal. 

pip install plotly

Código: 

Python3

# imports
import requests
from plotly.graph_objs import Bar
from plotly import offline
 
# siteurl and headers
site_url = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars'
headers = {'Accept': 'application/vnd.github.v3+json'}
 
# response and parsing the response.
response = requests.get(site_url, headers=headers)
response_json = response.json()
 
repositories = response_json['items']
 
# loop the repositories
repo_names, repo_stars = [], []
for repo_info in repositories:
    repo_names.append(repo_info['name'])
    repo_stars.append(repo_info['stargazers_count'])
 
# graph plotting   
data_plots = [{'type' : 'bar', 'x':repo_names , 'y': repo_stars}]
layout = {'title': 'GItHubs Most Popular Javascript Projects',
          'xaxis': {'title': 'Repository'},
          'yaxis': {'title': 'Stars'}}
 
# saving graph to a Most_Popular_JavaScript_Repos.png
fig = {'data': data_plots, 'layout': layout}
offline.plot(fig, image = 'png', image_filename='Most_Popular_JavaScript_Repos')

El código anterior, cuando se ejecuta, guardará el gráfico de barras en un archivo png: Most_Popular_JavaScript_Repos en el repositorio actual.

Paso 8: Creación de una presentación… Introducción…

La producción de Microsoft, especialmente las hojas de cálculo y las presentaciones de PowerPoint, dominan el mundo. Así que vamos a crear una presentación de PowerPoint con el gráfico de visualización que acabamos de crear.

Para instalar python-pptx, ejecute este código en la terminal:

pip install python-pptx

Comenzaremos creando nuestra primera diapositiva con el título: «Repositorios populares de JavaScript en Github».

Python3

from pptx import Presentation
 
# create an object ppt
ppt = Presentation()
 
# add a new slide
slide = ppt.slides.add_slide(ppt.slide_layouts[0])
 
# Set the Text to
slide.shapes.title.text = "Popular JavaScript Repositories in GitHub"
 
# save the powerpoint
ppt.save('Javascript_report.pptx')

Producción:

Primero importamos la presentación desde ppt y luego creamos un objeto ppt usando la clase de presentación del módulo ppt. Se agrega una nueva diapositiva con el método add_slide(). El texto se agrega usando slide.shapes.

Paso 9: Guardar el gráfico en pptx.

Ahora que los conceptos básicos para crear un PowerPoint están cubiertos en los pasos anteriores. Ahora profundicemos en la última pieza de código para crear un informe.

Python3

from pptx import Presentation
from pptx.util import Inches
from datetime import date
 
# create an Object
ppt = Presentation()
first_slide = ppt.slides.add_slide(ppt.slide_layouts[0])
 
# title (included date)
title = "Popular JavaScript Repositories in GitHub - " + str(date.today())
 
 
# set the title on first slide
first_slide.shapes[0].text_frame.paragraphs[0].text = title
 
# slide 2 - set the image
img = 'Most_Popular_JavaScript_Repos.png'
second_slide = ppt.slide_layouts[1]
slide2 = ppt.slides.add_slide(second_slide)
 
# play with the image attributes if you are not OK with the height and width
pic = slide2.shapes.add_picture(img, left= Inches(2),top = Inches(1),height = Inches(5))
 
# save the powerpoint presentation
ppt.save('Javascript_report.pptx')

Producción: 

Finalmente, pondremos todos los pasos anteriores comentados en un solo programa. 

Python3

import requests
from plotly.graph_objs import Bar
from plotly import offline
from pptx import Presentation
from pptx.util import Inches
from datetime import date
 
def github_api():
    # siteurl and headers
    site_url = 'https://api.github.com/search/repositories?q=language:javascript&sort=stars'
    headers = {'Accept': 'application/vnd.github.v3+json'}
 
    # response and parsing the response.
    response = requests.get(site_url, headers=headers)
    response_json = response.json()
 
    repositories = response_json['items']
 
    # loop the repositories
    repo_names, repo_stars = [], []
    for repo_info in repositories:
        repo_names.append(repo_info['name'])
        repo_stars.append(repo_info['stargazers_count'])
 
    # graph plotting   
    data_plots = [{'type' : 'bar', 'x':repo_names , 'y': repo_stars}]
    layout = {'title': 'GItHubs Most Popular Javascript Projects',
              'xaxis': {'title': 'Repository'},
              'yaxis': {'title': 'Stars'}}
 
    # saving graph to a Most_Popular_JavaScript_Repos.png
    fig = {'data': data_plots, 'layout': layout}
    offline.plot(fig, image = 'png', image_filename='Most_Popular_JavaScript_Repos')
     
def create_pptx_report():
    # create an Object
    ppt = Presentation()
    first_slide = ppt.slides.add_slide(ppt.slide_layouts[0])
 
    # title (included date)
    title = "Popular JavaScript Repositories in GitHub - " + str(date.today())
 
 
    # set the title on first slide
    first_slide.shapes[0].text_frame.paragraphs[0].text = title
 
    # slide 2 - set the image
    img = 'Most_Popular_JavaScript_Repos.png'
    second_slide = ppt.slide_layouts[1]
    slide2 = ppt.slides.add_slide(second_slide)
 
    # play with the image attributes if you are not OK with the height and width
    pic = slide2.shapes.add_picture(img, left= Inches(2),top = Inches(1),height = Inches(5))
 
    # save the powerpoint presentation
    ppt.save('Javascript_report.pptx') 
     
if __name__ == '__main__':
    github_api()
    create_pptx_report()

Publicación traducida automáticamente

Artículo escrito por sasankac280689 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *