Итерация объекта в Python

Я новичок в питоне. Я пытаюсь проанализировать около 10-K от Эдгара, используя модули Python и edgartools и sec-parsers. Вот мой код -

import pandas as pd
# pip install edgartools
from edgar import *

# Tell the SEC who you are
set_identity("Your Name [email protected]")

filings = get_filings( form = "10-K", filing_date = "2023-12-15:2024-07-16",amendments=False )

filings_df = filings.to_pandas() # all filings info now in a data frame 

filings[5].document.url # to get the url of a individual document

Но когда я запускаю следующий код -

for x in filings:
    filings[x].document.url

Ошибка показывает: объект 'Filing не может интерпретироваться как целое число.

Я не уверен, почему это происходит. Мне нужен результат функции цикла for, указанный выше, в списке, чтобы позже я мог использовать его в sec-parsers вот так:

from sec_parsers import Filing, download_sec_filing, set_headers

def print_first_n_lines(text, n):
    lines = text.split('\n')
    for line in lines[:n]:
        print(line)

html = download_sec_filing(filings[6070].document.url) # for example I need the url for filings index 6070

filing = Filing(html)
filing.html

filing.parse() # parses filing
filing.xml


item1c = filing.find_nodes_by_title('item 1c') [0]
item1c_text = filing.get_node_text(item1c)
print_first_n_lines(item1c_text,50)

Моя цель — создать фрейм данных для всех заявок с текстом из элемента C в 10-K и добавить этот текст элемента C в фрейм данных filings_df в качестве дополнительного столбца. Обратите внимание: чтобы добавить текст элемента C во фрейм данных filings_df в виде столбца, мы можем использовать CIK и переменную года (из переменной filing_date).

Спасибо

for x in filings: будет перебирать сами элементы filings — вам просто нужно использовать x в дальнейшем коде, а не filings[x].
jasonharper 17.07.2024 18:18

@jasonharper Мне действительно нужны URL-ссылки всех моих файлов, чтобы я мог использовать их для загрузки всех 10 тысяч файлов с помощью функции download_sec_filing в модуле sec-parsers.

Sharif 17.07.2024 18:21

@jasonharper прав. Используйте x как в x.document.url.

tdelaney 17.07.2024 18:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
91
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

for x in filings: перебирает объекты, содержащиеся в filings, а не индекс в filings. Пытаться

for filing in filings:
    filing.document.url

Вы уже сделали это с циклом for в своей функции print_first_n_lines.

В документации от edgartools говорится: «Данные о файлах хранятся в классе Filings как pyarrow.Table.». Можем ли мы по-прежнему перебирать их с помощью for .. in .. или нам нужен другой способ ?

hc_dev 17.07.2024 19:03

Я не уверен. Я не знаю, какой тип класса в filings. В вашем примере, где вы используете filings[5], это своего рода тип контейнера (возможно, даже просто list), и обычно контейнер, который индексируется, также выполняет итерацию. Итак, это всего лишь вопрос, но проверить, работает ли это, несложно.

tdelaney 18.07.2024 00:39
for x in filings:
    filings[x].document.url

в этом коде, когда вы перебираете заявки, x является объектом «регистрация», но затем вы пытаетесь использовать его в качестве индекса здесь, filings[x].document.url

из-за чего вы получаете ошибку, поэтому вы, вероятно, можете просто сделать это

for x in filings:
    x.document.url
Ответ принят как подходящий

Проблема возникает из-за того, что вы пытаетесь использовать целое число в качестве индекса для вашего списка заявок в цикле for, что не является необходимым, поскольку заявки уже являются итерируемым объектом. Кроме того, объект Filings выглядит как список объектов Filing, и вам следует перебирать объекты напрямую, а не индексировать их.

import pandas as pd
# pip install edgartools
from edgar import *
from sec_parsers import Filing, download_sec_filing, set_headers

# Tell the SEC who you are
set_identity("Your Name [email protected]")

# Fetch filings
filings = get_filings(form = "10-K", filing_date = "2023-12-15:2024-07-16", amendments=False)

# Convert filings to a DataFrame
filings_df = filings.to_pandas()

# Create a list to store the Item 1c text
item1c_texts = []

# Iterate over each filing
for filing in filings:
    url = filing.document.url
    cik = filing.cik
    filing_date = filing.filing_date
    
    # Download and parse the filing
    html = download_sec_filing(url)
    sec_filing = Filing(html)
    sec_filing.parse()
    
    # Extract the text for Item 1c
    item1c_nodes = sec_filing.find_nodes_by_title('item 1c')
    if item1c_nodes:
        item1c_text = sec_filing.get_node_text(item1c_nodes[0])
    else:
        item1c_text = None
    
    item1c_texts.append({
        'CIK': cik,
        'Filing Date': filing_date,
        'Item 1c Text': item1c_text
    })

# Create a DataFrame from the Item 1c text data
item1c_df = pd.DataFrame(item1c_texts)

# Merge the Item 1c text DataFrame with the filings DataFrame
filings_df = filings_df.merge(item1c_df, on=['CIK', 'Filing Date'])

# Print the final DataFrame
print(filings_df)

В этом коде:

  1. Вы создаете список URL-адресов для всех заявок, используя понимание списка.
  2. Вы используете этот список URL-адресов для загрузки и анализа документов.
  3. Вы извлекаете текст «Пункта 1c» из каждого файла и сохраняете его в списке. 4 . Вы создаете DataFrame из списка текстов «Элемент 1c».

Это должно помочь вам достичь цели — создать DataFrame с текстом из «Элемента 1c» в документах 10-K.

С.Деветт, Привет, я немного отредактировал свой вопрос. Мне нужно добавить текст элемента C во фрейм данных под названием filings_df. Можете ли вы пролить свет на то, как я могу это сделать? На самом деле, при анализе элемента IC мне также нужно сохранить переменную CIK и Filing_date документа, и это поможет нам объединить набор данных с filings_df. Спасибо

Sharif 17.07.2024 18:38

Привет, когда я пытаюсь запустить код для создания фрейма данных, используя функцию цикла for в вашем коде, появляется ошибка — list index out of range. Вы хоть представляете, что происходит?

Sharif 17.07.2024 18:44

Вот несколько шагов, которые вы можете предпринять. Преобразуйте объект файлов в DataFrame. Переберите каждую заявку, извлеките URL-адрес, загрузите и проанализируйте заявку. Извлеките текст из «Пункта 1c». Добавьте извлеченный текст в качестве нового столбца в DataFrame filings_df.

S.Dewett 17.07.2024 18:49

Обновлен ответ, который также будет обрабатывать этот случай.

S.Dewett 17.07.2024 18:52

Большое спасибо. Он работает отлично.

Sharif 17.07.2024 19:09

@С. Дьюитт, я вижу, что у edgartools есть такая функция, как tenK = filings[0].obj() для анализа. Я пытался использовать некоторые коды, такие как tenK.items, tenK.doc.chunks_for_item, tenK.doc.chunks_for_item и tenK.doc.show_items, чтобы получить элемент 1C, но безуспешно. Можете ли вы пролить свет на это? Спасибо

Sharif 18.07.2024 17:14

Пожалуйста, задайте новый вопрос, так как нецелесообразно снова редактировать код для вопроса с другим контекстом.

S.Dewett 18.07.2024 23:40

Этот ответ выглядит как копипаст из ChatGPT - stackoverflow.com/help/ai-policy

DavidW 19.07.2024 14:42

@S.Dewett Я разместил вопрос здесь - stackoverflow.com/questions/78773176/…. Можете ли вы проверить? Спасибо

Sharif 20.07.2024 18:01

Другие вопросы по теме