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.
3 Réponses :
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]
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
Ce n'est pas aussi simple que «appliquer est rapide que ça va», mais c'est dans la bonne direction. stackoverflow.com/questions/24870953/… < / a>
@ sanster9292 ah je pensais que vous faisiez principalement dans les opérations de dataframe. Si les performances sont extrêmement lentes, j'envisagerais de trouver un moyen de paralléliser ces opérations, bien que j'aie une expérience limitée dans ce domaine, et cela pourrait être une suggestion idiote. Bonne chance.
@robbwh la vitesse est bonne, je voulais juste une représentation visuelle de la distance parcourue car je vais explorer près de 700000 URL
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é.
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:
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.
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