1
votes

Comment afficher la barre de progression lors de l'itération sur une trame de données pandas

J'essaye d'itérer sur une trame de données Pandas avec près d'un million d'entrées. J'utilise une boucle for pour les parcourir. Considérez le code suivant comme exemple

import pandas as pd 
import os 
from requests_html import HTMLSession
from tqdm import tqdm
import time


df = pd.read_csv(os.getcwd()+'/test-urls.csv')
df = df.drop('Unnamed: 0', axis=1 )

new_df = pd.DataFrame(columns = ['pid', 'orig_url', 'hosted_url'])
refused_df = pd.DataFrame(columns = ['pid', 'refused_url'])

tic = time.time()

for idx, row in df.iterrows():

    img_id = row['pid']
    url = row['image_url']

    #Let's do scrapping 
    session = HTMLSession()
    r  = session.get(url)
    r.html.render(sleep=1, keep_page=True, scrolldown=1)

    count = 0 
    link_vals =  r.html.find('.zoomable')

    if len(link_vals) != 0 : 
        attrs = link_vals[0].attrs
        # print(attrs['src'])  
        embed_link = attrs['src']

    else: 
        while count <=7:
            link_vals =  r.html.find('.zoomable')
             count += 1
        else:
             print('Link refused connection for 7 tries. Adding URL to Refused URLs Data Frame')
            ref_val = [img_id,URL]
            len_ref = len(refused_df)
            refused_df.loc[len_ref] = ref_val
            print('Refused URL added')
            continue
    print('Got 1 link')

#Append scraped data to new_df
    len_df = len(new_df)
    append_value = [img_id,url, embed_link]
    new_df.loc[len_df] = append_value

Je voulais savoir comment pourrais-je utiliser une barre de progression pour ajouter une représentation visuelle de ma progression. J'apprécierai toute aide. Veuillez me faire savoir si vous avez besoin d'éclaircissements.


2 commentaires

Qu'essayez-vous de faire? vous pouvez simplement imprimer un pourcentage si votre index est ordonné index / forme. Je suis d'accord avec Robbwh, si vous l'utilisez, vous le faites probablement mal.


J'essaie de récupérer certaines données des URL. J'ai ajouté le code ci-dessus. S'il vous plaît laissez-moi savoir si vous pensez que je peux apporter des modifications


3 Réponses :


1
votes

Je ferais un commentaire, mais la raison pour laquelle vous voudrez peut-être une barre de progression est que cela prend beaucoup de temps car iterrows () est un moyen lent d'effectuer des opérations dans les pandas.

Je vous suggère d'utiliser apply / évitez d'utiliser iterrows ().

Si vous voulez continuer à utiliser iterrows, ajoutez simplement un compteur qui compte jusqu'au nombre de lignes, df.shape [0]



2
votes

Vous pouvez essayer TQDM

from tqdm import tqdm
for idx, row in tqdm(df.iterrows()):
      do something

C'est principalement pour une barre de progression en ligne de commande. Il existe d'autres solutions si vous recherchez davantage une interface graphique. PySimpleGUI vient à l'esprit, mais c'est certainement un peu plus compliqué.


0 commentaires

0
votes

PySimpleGUI simplifie autant que possible le problème à résoudre, en supposant que vous sachiez à l'avance comment les éléments que vous avez dans votre liste. Des indicateurs de progression indéterminés sont possibles, mais un peu plus compliqués.

Il n'y a pas de configuration requise avant votre boucle. Vous n'avez pas besoin de créer un itérateur spécial. Le seul besoin que vous avez à faire est d'ajouter 1 ligne de code dans votre boucle.

Dans votre boucle, ajoutez un appel à - one_line_progress_meter . Le nom résume ce que c'est. Ajoutez cet appel en haut de votre boucle, en bas, peu importe ... ajoutez-le simplement quelque part qui est en boucle.

Il y a 4 paramètres que vous passez sont:

  • Un titre à mettre sur le compteur (n'importe quelle chaîne fera l'affaire)
  • Où vous êtes maintenant - compteur actuel
  • Quelle est la valeur maximale du compteur
  • Une "clé" - une chaîne unique, un nombre, tout ce que vous voulez.

Voici une boucle qui parcourt une liste d'entiers à démontrer.

import PySimpleGUI as sg

items = list(range(1000))
total_items = len(items)
for index, item in enumerate(items):

    sg.one_line_progress_meter('My meter', index+1, total_items, 'my meter' )

Le code d'itération de la liste sera quel que soit le code de votre boucle. La ligne de code sur laquelle vous allez vous concentrer est celle-ci:

sg.one_line_progress_meter ('My meter', index + 1, total_items, 'my meter') code >

Cette ligne de code vous montrera la fenêtre ci-dessous. Il contient des informations statistiques comme depuis combien de temps vous avez exécuté la boucle et une estimation de combien de temps il vous reste.

 entrez la description de l'image ici


0 commentaires