source

큰 xlsx 파일에서 판다 DataFrame을 로드하기 위한 진행 표시줄을 만들려면 어떻게 해야 합니까?

gigabyte 2023. 4. 14. 21:47
반응형

큰 xlsx 파일에서 판다 DataFrame을 로드하기 위한 진행 표시줄을 만들려면 어떻게 해야 합니까?

https://pypi.org/project/tqdm/ 에서:

import pandas as pd
import numpy as np
from tqdm import tqdm

df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))
tqdm.pandas(desc="my bar!")p`
df.progress_apply(lambda x: x**2)

이 코드를 사용하여 랜덤 번호를 사용하는 대신 load_excel에서 Data Frame을 생성하도록 편집했습니다.

import pandas as pd
from tqdm import tqdm
import numpy as np

filename="huge_file.xlsx"
df = pd.DataFrame(pd.read_excel(filename))
tqdm.pandas()
df.progress_apply(lambda x: x**2)

이로 인해 오류가 발생하여 df.progress_apply를 다음과 같이 변경했습니다.

df.progress_apply(lambda x: x)

최종 코드는 다음과 같습니다.

import pandas as pd
from tqdm import tqdm
import numpy as np

filename="huge_file.xlsx"
df = pd.DataFrame(pd.read_excel(filename))
tqdm.pandas()
df.progress_apply(lambda x: x)

이렇게 하면 진행 표시줄이 생성되지만 실제로는 진행 상황을 보여주지 않고 막대를 로드하고 작업이 완료되면 목적을 무시하고 100%로 뛰어오릅니다.

제 질문은 다음과 같습니다.이 프로그레스 바를 작동시키려면 어떻게 해야 합니까?
progress_apply 내의 함수는 실제로 어떤 역할을 합니까?
더 나은 방법이 있을까요?tqdm의 대안으로?

어떤 도움이라도 대단히 감사합니다.

동작하지 않습니다. pd.read_excel파일을 읽을 때까지 차단하고 실행 중에 이 함수에서 진행 상황에 대한 정보를 얻을 수 없습니다.

다음과 같이 청크 와이즈를 실행할 수 있는 읽기 작업에 사용할 수 있습니다.

chunks = []
for chunk in pd.read_csv(..., chunksize=1000):
    update_progressbar()
    chunks.append(chunk)

하지만 내가 알기론tqdm또, 사전에 청크의 수가 필요하기 때문에, 프로퍼의 진척 상황 리포트의 경우는, 우선 파일 전체를 읽어 둘 필요가 있습니다.

다음은 tqdm을 이용한 원라이너 솔루션입니다.

import pandas as pd
from tqdm import tqdm

df = pd.concat([chunk for chunk in tqdm(pd.read_csv(file_name, chunksize=1000), desc='Loading data')])

로드되는 총 라인을 알고 있는 경우 매개 변수를 사용하여 해당 정보를 추가할 수 있습니다.totaltqdm 기능에 접속하여 퍼센티지 출력을 얻을 수 있습니다.

이것은 비슷한 문제를 가진 사람들에게 도움이 될 것이다.여기서 도움을 받을 수 있다

예를 들어 다음과 같습니다.

for i in tqdm(range(0,3), ncols = 100, desc ="Loading data.."): 
    df=pd.read_excel("some_file.xlsx",header=None)
    LC_data=pd.read_excel("some_file.xlsx",'Sheet1', header=None)
    FC_data=pd.read_excel("some_file.xlsx",'Shee2', header=None)    
print("------Loading is completed ------")

면책사항: 이 기능은xlrd완전히 테스트되지 않은 엔진입니다.

어떻게 작동합니까?원숭이를 잡아먹다xlrd.xlsx.X12Sheet.own_process_stream파일형 스트림에서 시트를 로드하는 메서드입니다.진행 표시줄을 포함하는 자체 스트림을 제공합니다.각 시트에는 자체 진행 표시줄이 있습니다.

진행 표시줄이 필요할 때load_with_progressbar()다음 작업을 수행합니다.pd.read_excel('<FILE.xlsx>').

import xlrd
from tqdm import tqdm
from io import RawIOBase
from contextlib import contextmanager


class progress_reader(RawIOBase):
    def __init__(self, zf, bar):
        self.bar = bar
        self.zf = zf

    def readinto(self, b):
        n = self.zf.readinto(b)
        self.bar.update(n=n)
        return n


@contextmanager
def load_with_progressbar():

    def my_get_sheet(self, zf, *other, **kwargs):
        with tqdm(total=zf._orig_file_size) as bar:
            sheet = _tmp(self, progress_reader(zf, bar), **kwargs)
        return sheet

    _tmp = xlrd.xlsx.X12Sheet.own_process_stream

    try:
        xlrd.xlsx.X12Sheet.own_process_stream = my_get_sheet
        yield
    finally:
        xlrd.xlsx.X12Sheet.own_process_stream = _tmp


import pandas as pd

with load_with_progressbar():
    df = pd.read_excel('sample2.xlsx')

print(df)

진행률 바 스크린샷:

여기에 이미지 설명 입력

다음은 이용자의 암벽포트로커의 탁월한 답변에 기초하고 있습니다.

  • 나는 파이썬 초보자야!
  • 아래에 사용자 rocksportrocker의 추천을 사용한 첫 번째 버전을 찾아주세요.

import pandas as pd

print("Info: Loading starting.")

# https://stackoverflow.com/questions/52209290
temp = [];
myCounter = 1;
myChunksize = 10000;
# https://stackoverflow.com/questions/24251219/
for myChunk in pd.read_csv('YourFileName.csv', chunksize = myChunksize, low_memory = False):
    print('# of rows processed: ', myCounter*myChunksize)
    myCounter = myCounter + 1;
    temp.append(myChunk)
    
print("Info: Loading complete.")

# https://stackoverflow.com/questions/33642951
df = pd.concat(temp, ignore_index = True)
df.head()

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/52209290/how-do-i-make-a-progress-bar-for-loading-pandas-dataframe-from-a-large-xlsx-file

반응형