No es un secreto que las velocidades de conexión de internet residencial rara vez son constantes. El otro dia me preguntaba: ¿Si pago 50mbps de internet, cuanto tiempo realmente tengo esa velocidad?

La pregunta viene a que, si realmente me están dando la velocidad que pago la mayoría del tiempo, o si debo considerar cambiarme a un proveedor que este menos saturado en mi area.

Comencemos

Usaremos dos paquetes geniales en Python: speedtest y matplotlib. speedtest nos proporcionará la información sobre nuestra conexión a Internet y matplotlib nos permitirá generar gráficos basados en esta información.

Ya sea que esté en un entorno virtual o no use uno, tendrá que instalar speedtest y matplotlib.

pip install matplotlib
pip install speedtest-cli

También usaremos algunos paquetes de Python integrados datetime y csv. CSV (o valores separados por comas) son una forma rápida de almacenar datos. Usaremos esto para almacenar la información sobre nuestras velocidades de Internet y luego usaremos matplotlib para hacer que esta información sea visual.

Obteniendo datos

Para obtener los datos de velocidades de bajada y de subida de internet, tenemos el siguiente bloque:

import speedtest
 s = speedtest.Speedtest()
 while True:
     print(s.download(), s.upload())

lo cual genera la siguiente salida hasta que salgamos del bucle infinito presionando ctrl + C .

75020309.22943133 24381170.373616524 
105192450.00822952 40653433.153288215

Entonces, al crear una nueva instancia de speedtest as s y probar la velocidad de carga y descarga, obtenemos la velocidad de carga y descarga en bits por segundo. Para convertir esto a megabits por segundo (Mb / s) podemos hacer lo siguiente para incluir también el tiempo de la prueba:

import speedtest
 import datetime
 s = speedtest.Speedtest()
 while True:
   time = datetime.datetime.now().strftime("%H:%M:%S")
   downspeed = round((round(s.download()) / 1048576), 2)
   upspeed = round((round(s.upload()) / 1048576), 2)
   print(f"time: {time}, downspeed: {downspeed} Mb/s, upspeed: {upspeed} Mb/s")

Con lo cual obtenemos:

time: 12:44:15, downspeed: 95.04 Mb/s, upspeed: 32.85 Mb/s
time: 12:44:35, downspeed: 99.46 Mb/s, upspeed: 38.76 Mb/s
time: 12:44:56, downspeed: 100.59 Mb/s, upspeed: 38.94 Mb/s

Ahora pasaremos a grabar esto en un archivo CSV. Los CSV son archivos de texto de gran tamaño cuyos valores están separados por comas. Aquí hay un ejemplo de uno de los míos:

time,downspeed,upspeed
 12:17:01,100.05,38.28
 12:17:21,100.53,37.85
 12:17:42,74.87,25.92

Para grabar en un archivo csv en python, necesitamos importar el paquete CSV y ‘abrir’ un archivo CSV (si no existe uno, creará uno).

s = speedtest.Speedtest()

with open('test.csv', mode='w', newline='') as speedcsv:
    csv_writer = csv.DictWriter(speedcsv,
                                fieldnames=['time', 'downspeed', 'upspeed'])
    csv_writer.writeheader()
    while True:
        print('iterating')
        time = datetime.datetime.now().strftime("%H:%M:%S")
        downspeed = round((round(s.download()) / 1048576), 2)
        upspeed = round((round(s.upload()) / 1048576), 2)
        print(downspeed)
        print(upspeed)
        csv_writer.writerow({
            'time': time,
            'downspeed': downspeed,
            "upspeed": upspeed
        })
        speedcsv.flush()

Entonces, mientras deja que este código se ejecute durante 4-5 minutos, podemos discutir lo que está sucediendo. La línea 7 con open esencialmente crea un archivo csv con el nombre test.csv con el nombre de los encabezados, downspeed y uppeed y los escribe en el csv. Luego comienza el ciclo y cada vez que speedtest realiza una prueba, escribe una nueva fila en el csv con el tiempo, la velocidad de descarga y la velocidad de carga que especificamos antes. Así que vayamos y veamos eso ahora.

Genial, ahora estamos recopilando información y almacenándola en un csv. Podrías hacer todo tipo de cosas inteligentes con el nombre de archivo, como nombrarlo como fecha de hoy usando datetime, pero por ahora lo mantendré como prueba.

También puede configurar una verificación para ver si ha pasado una cierta cantidad de tiempo y detener la aplicación después de eso, pero dejaré eso a su propia creatividad.

Generando reportes

Hagamos otro archivo de Python para generar el gráfico de nuestra conexión a Internet. Aquí es donde usaremos matplotlib y agreguemos el siguiente código.

import matplotlib.pyplot as plt
import csv
import matplotlib.ticker as ticker
times = []
download = []
upload = []

La forma más sencilla de generar un gráfico es mediante una matriz. Para poblar nuestras matrices tendremos que iterar a través de nuestro nuevo archivo csv

with open('test.csv', 'r') as csvfile:
     plots = csv.reader(csvfile, delimiter=',')
     next(csvfile)
     for row in plots:
         times.append(str(row[0]))
         download.append(float(row[1]))
         upload.append(float(row[2]))
 print(times, "\n", download, "\n", upload)

Esto daría como resultado lo siguiente:

['12:51:16', '12:51:37', '12:51:57', '12:52:17', '12:52:38']  
[99.29, 100.67, 99.7, 92.89, 99.4]  
[38.66, 38.79, 38.79, 31.99, 38.96]

¡Así que ahora estamos analizando nuestros datos! El siguiente (csvfile) esencialmente omite la fila de encabezados (que eran solo para nuestro beneficio, no para Python). Ahora pasamos a usar matplotlib.

plt.figure('speedtest', [30, 30])
plt.plot(times, download, label='download', color='r')
plt.plot(times, upload, label='upload', color='b')
plt.xlabel('time')
plt.ylabel('speed in Mb/s')
plt.title("internet speed")
plt.legend()
plt.savefig('test_graph.jpg', bbox_inches='tight')

Este código le dice a matplotlib o plt que cree una figura con las líneas etiquetadas como ‘download’ y ‘upload’ para ser trazadas contra sus respectivas matrices. Por lo tanto, para cada elemento de la descarga y la matriz de tiempo, se hará una marca en el gráfico contra él. Finalmente, los ejes x e y obtienen etiquetas y el gráfico se guarda.

Recursos

Si deseas puedes clonar el código en el siguiente repositorio y probarlo sin tener que escribirlo:

https://github.com/RicardoGeek/py-internet-speed

Categorized in: