- извлекать код компании и финансовый год (финансовый год) из имена загруженных файлов (например, NASDAQ_AAPL_2023 для Apple Inc., 2023 финансовый год).
- Парсить каждый PDF-файл последовательно: извлекать текст, разбивать на управляемые фрагменты, генерировать вложения и получать финансовую информацию с помощью модели.
- Добавляйте извлеченную информацию для каждого PDF-файла в совокупный DataFrame ().
Код: Выделить всё
final_df - Создать один файл Excel, содержащий объединенные результаты для всех обработанных PDF-файлов.
Рабочий процесс кода
Имя файла Формат:
Каждый загруженный файл имеет имя в формате: NASDAQ__.pdf. Код_компании и финансовый год извлекаются непосредственно из имени файла с помощью регулярного выражения.
Основные этапы рабочего процесса:
- Загрузка PDF-файлов. Пользователи могут загружать несколько PDF-файлов с помощью st.file_uploader.
- Последовательная обработка PDF-файлов:
- Извлеките код компании и финансовый год из имени файла.
- Проанализируйте PDF-файл, чтобы извлечь финансовые данные (например, business_segment, валюта, доход).
- Добавьте извлеченные данные в совокупный DataFrame ().
Код: Выделить всё
final_df
- Создать файл Excel: объединить все извлеченные данные в файл один файл Excel со столбцами:
- , business_segment, валюта, доход, финансовый год.
Код: Выделить всё
company_code
Приложение обрабатывает только первый 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
Код: Выделить всё
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-файлам.
- Память Управление:
Удалены временные переменные (, извлеченные_данные) после обработки каждого PDF-файла.Код: Выделить всё
text_chunks - Использовал gc.collect() для освобождения памяти.
< /ul>
Почему мой Streamlit приложение обрабатывает только первый PDF-файл и пропускает остальные? Как я могу гарантировать, что данные из всех PDF-файлов будут добавлены в файл Final_df и включены в окончательный файл Excel?
Подробнее здесь: https://stackoverflow.com/questions/792 ... cting-data
Мобильная версия