Как вы можете показать индикатор выполнения при итерации по кадру данных pandas - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь перебрать кадр данных Pandas с почти миллионом записей. Я использую for l oop, чтобы перебирать их. Рассмотрим следующий код в качестве примера

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

Я хотел знать, как я могу использовать индикатор выполнения, чтобы добавить визуальное представление о том, как далеко я продвинулся. Буду признателен за любую помощь. Пожалуйста, дайте мне знать, если вам нужны пояснения.

Ответы [ 3 ]

1 голос
/ 19 июня 2020

Вы можете попробовать TQDM

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

Это в первую очередь для индикатора выполнения командной строки. Есть и другие решения, если вы ищете более GUI. На ум приходит PySimple GUI, но это определенно немного сложнее.

0 голосов
/ 22 июня 2020

PySimple GUI делает эту проблему максимально простой для решения, если вы заранее знаете, какие элементы у вас есть в вашем списке. Возможны неопределенные индикаторы прогресса, но это немного сложнее.

Перед вашим l oop настройка не требуется. Специального итератора делать не нужно. Единственное, что вам нужно сделать, это добавить 1 строку кода внутри l oop.

Внутри l oop добавить вызов - one_line_progress_meter. Название резюмирует, что это такое. Добавьте этот вызов вверху вашего l oop, внизу, это не имеет значения ... просто добавьте его где-нибудь в цикле.

Вы передаете 4 параметра:

  • Название для счетчика (подойдет любая строка)
  • Где вы сейчас - текущий счетчик
  • Какое максимальное значение счетчика
  • Клавиша A " "- уникальная строка, число, все, что угодно.

Вот al oop, демонстрирующий итерацию по списку целых чисел.

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' )

Код итерации списка будет быть тем, что у вас есть код l oop. Строка кода, на которой нужно сосредоточиться, которую вы добавите, следующая:

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

Эта строка кода покажет вам окно ниже. Он содержит статистическую информацию, например, как долго вы используете l oop, и примерное количество времени, которое вам нужно go.

введите описание изображения здесь

0 голосов
/ 19 июня 2020

Хотел бы прокомментировать, но причина, по которой вам может понадобиться индикатор выполнения, заключается в том, что он занимает много времени, потому что iterrows () - медленный способ выполнять операции в pandas.

Я бы посоветовал вам применить / избежать использования iterrows ().

Если вы хотите продолжить использование iterrows, просто включите счетчик, который считает до количества строк, df.shape [0]

...