Приложение Streamlit обрабатывает только первый PDF-файл при извлечении данныхPython

Программы на Python
Ответить
Anonymous
 Приложение Streamlit обрабатывает только первый PDF-файл при извлечении данных

Сообщение Anonymous »

Я создаю приложение Streamlit, которое извлекает финансовые данные из нескольких загруженных PDF-файлов с годовыми отчетами и выводит результаты в один файл Excel. Предполагается, что приложение должно:
  • извлекать код компании и финансовый год (финансовый год) из имена загруженных файлов (например, NASDAQ_AAPL_2023 для Apple Inc., 2023 финансовый год).
  • Парсить каждый PDF-файл последовательно: извлекать текст, разбивать на управляемые фрагменты, генерировать вложения и получать финансовую информацию с помощью модели.
  • Добавляйте извлеченную информацию для каждого PDF-файла в совокупный DataFrame (

    Код: Выделить всё

    final_df
    ).
  • Создать один файл Excel, содержащий объединенные результаты для всех обработанных PDF-файлов.
Однако приложение обрабатывает только первый загруженный PDF-файл, а данные для последующих PDF-файлов не включаются в окончательный файл Excel.

Рабочий процесс кода
Имя файла Формат:
Каждый загруженный файл имеет имя в формате: NASDAQ__.pdf. Код_компании и финансовый год извлекаются непосредственно из имени файла с помощью регулярного выражения.
Основные этапы рабочего процесса:
  • Загрузка PDF-файлов. Пользователи могут загружать несколько PDF-файлов с помощью st.file_uploader.
  • Последовательная обработка PDF-файлов:
    • Извлеките код компании и финансовый год из имени файла.
    • Проанализируйте PDF-файл, чтобы извлечь финансовые данные (например, business_segment, валюта, доход).
    • Добавьте извлеченные данные в совокупный DataFrame (

      Код: Выделить всё

      final_df
      ).
  • Создать файл Excel: объединить все извлеченные данные в файл один файл Excel со столбцами:
    • Код: Выделить всё

      company_code
      , business_segment, валюта, доход, финансовый год.
Проблема
Приложение обрабатывает только первый PDF-файл и добавляет его данные в Final_df. Данные из последующих PDF-файлов игнорируются, хотя код проходит через все загруженные PDF-файлы.

Я включил некоторые важные разделы своего кода:
Извлечение кода компании и финансового года

Код: Выделить всё

def extract_company_code_and_fy(file_name):
match = re.match(r"NASDAQ_([A-Z]+)_(\d{4})", file_name)
if match:
return match.group(1), match.group(2)
return None, None
Обработка каждого PDF-файла

Код: Выделить всё

def process_pdf_and_extract_data(user_question, text_chunks):
embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
vector_store = FAISS.from_texts(text_chunks, embedding=embeddings)
docs = vector_store.similarity_search(user_question)
chain = get_conversational_chain()
response = chain({"input_documents": docs}, return_only_outputs=True)
del vector_store  # Clear memory
gc.collect()
return response["output_text"]
Основная функция

Код: Выделить всё

def main():
if "final_df" not in st.session_state:
st.session_state["final_df"] = pd.DataFrame(columns=["company_code", "business_segment", "currency", "revenue", "FY"])

pdf_docs = st.file_uploader("Upload your Annual Reports (PDF Files)", accept_multiple_files=True)
if st.button("Submit & Process"):
if pdf_docs:
for pdf in pdf_docs:
file_name = os.path.basename(pdf.name)
company_code, fy = extract_company_code_and_fy(file_name)
if not company_code or not fy:
st.error(f"Invalid file name format: {file_name}.  Skipping...")
continue

raw_text = get_pdf_text(pdf)
text_chunks = get_text_chunks(raw_text)
extracted_data = process_pdf_and_extract_data("Extract business segments and financial data.", text_chunks)
if extracted_data:
rows = []
for line in extracted_data.split("\n"):
if "|" in line and not line.strip().startswith(("business_segment", "currency", "revenue", "---")):
parsed_row = line.split("|")[1:-1]
if len(parsed_row) == 3:
rows.append([field.strip() for field in parsed_row])

temp_df = pd.DataFrame(rows, columns=["business_segment", "currency", "revenue"])
temp_df["company_code"] = company_code
temp_df["FY"] = fy
temp_df = temp_df[["company_code", "business_segment", "currency", "revenue", "FY"]]

st.session_state["final_df"] = pd.concat([st.session_state["final_df"], temp_df], ignore_index=True)
else:
st.error("Please upload at least one PDF file.")
  • Приложение правильно обрабатывает первый PDF-файл и добавляет его данные в Final_df.
  • Однако последующие PDF-файлы игнорируются, и их данные не добавляются в Final_df.
  • Я пробовал использовать st.session_state["final_df"]< /code>, чтобы сохранить DataFrame на всех итерациях, но проблема сохраняется.
Ожидаемый результат
Один файл Excel, содержащий объединенные результаты для всех PDF-файлов, например:


< tr>
код_компании
бизнес_сегмент
валюта
выручка
ФГ




AAPL
Продукты
USD
298085.00
2023


AAPL
УслугиUSD
85200,00
2023


MSFT
Интеллектуальное облако
USD
87907,00
2023


MSFT
Больше персональных компьютеров
долларов США
54734,00
2023




Фактический результат
Файл Excel содержит данные только для первого PDF-файла. Данные для последующих PDF-файлов отсутствуют.
  • Обеспечение постоянства Final_df:
    • Использовал st.session_state["final_df"] для сохранения DataFrame.
    • Подтверждено этот Final_df инициализируется только один раз.
  • Извлечение отладочных данных:
    • Проверено, что данные извлекаются правильно для первого PDF-файла.
    • Добавлено ведение журнала для подтверждения того, что цикл выполняется по всем PDF-файлам.
  • Память Управление:

    Удалены временные переменные (

    Код: Выделить всё

    text_chunks
    , извлеченные_данные) после обработки каждого PDF-файла.
  • Использовал gc.collect() для освобождения памяти.
    < /ul>
Вопрос
Почему мой Streamlit приложение обрабатывает только первый PDF-файл и пропускает остальные? Как я могу гарантировать, что данные из всех PDF-файлов будут добавлены в файл Final_df и включены в окончательный файл Excel?


Подробнее здесь: https://stackoverflow.com/questions/792 ... cting-data
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»