Я новичок в питоне. Я пытаюсь проанализировать около 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).
Спасибо
@jasonharper Мне действительно нужны URL-ссылки всех моих файлов, чтобы я мог использовать их для загрузки всех 10 тысяч файлов с помощью функции download_sec_filing
в модуле sec-parsers
.
@jasonharper прав. Используйте x
как в x.document.url
.
for x in filings:
перебирает объекты, содержащиеся в filings
, а не индекс в filings
. Пытаться
for filing in filings:
filing.document.url
Вы уже сделали это с циклом for
в своей функции print_first_n_lines
.
В документации от edgartools говорится: «Данные о файлах хранятся в классе Filings
как pyarrow.Table
.». Можем ли мы по-прежнему перебирать их с помощью for .. in ..
или нам нужен другой способ ?
Я не уверен. Я не знаю, какой тип класса в filings
. В вашем примере, где вы используете filings[5]
, это своего рода тип контейнера (возможно, даже просто list
), и обычно контейнер, который индексируется, также выполняет итерацию. Итак, это всего лишь вопрос, но проверить, работает ли это, несложно.
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)
В этом коде:
Это должно помочь вам достичь цели — создать DataFrame с текстом из «Элемента 1c» в документах 10-K.
С.Деветт, Привет, я немного отредактировал свой вопрос. Мне нужно добавить текст элемента C во фрейм данных под названием filings_df
. Можете ли вы пролить свет на то, как я могу это сделать? На самом деле, при анализе элемента IC мне также нужно сохранить переменную CIK и Filing_date документа, и это поможет нам объединить набор данных с filings_df
. Спасибо
Привет, когда я пытаюсь запустить код для создания фрейма данных, используя функцию цикла for в вашем коде, появляется ошибка — list index out of range
. Вы хоть представляете, что происходит?
Вот несколько шагов, которые вы можете предпринять. Преобразуйте объект файлов в DataFrame. Переберите каждую заявку, извлеките URL-адрес, загрузите и проанализируйте заявку. Извлеките текст из «Пункта 1c». Добавьте извлеченный текст в качестве нового столбца в DataFrame filings_df.
Обновлен ответ, который также будет обрабатывать этот случай.
Большое спасибо. Он работает отлично.
@С. Дьюитт, я вижу, что у edgartools
есть такая функция, как tenK = filings[0].obj()
для анализа. Я пытался использовать некоторые коды, такие как tenK.items
, tenK.doc.chunks_for_item
, tenK.doc.chunks_for_item
и tenK.doc.show_items
, чтобы получить элемент 1C, но безуспешно. Можете ли вы пролить свет на это? Спасибо
Пожалуйста, задайте новый вопрос, так как нецелесообразно снова редактировать код для вопроса с другим контекстом.
Этот ответ выглядит как копипаст из ChatGPT - stackoverflow.com/help/ai-policy
@S.Dewett Я разместил вопрос здесь - stackoverflow.com/questions/78773176/…. Можете ли вы проверить? Спасибо
for x in filings:
будет перебирать сами элементыfilings
— вам просто нужно использоватьx
в дальнейшем коде, а неfilings[x]
.