json 목록을 반복하고 각 json이 반환하는 사전 사전에서 일부 정보를 추출하려고합니다. 약 99 %의 시간 동안 각 json 사전의 세 번째 계층에는 5 개의 '이름'값이 포함되며이 중 2 개는 xml 파일 이름입니다. 그러나 파일은 매번 같은 순서로 나타나지 않고 몇 번 선택하면 xml 파일이 하나만 있습니다.
코드가 두 번째 루프로 진행되기 전에 검색 문자열을 사용하여 xml 파일 수를 계산하는 루프를 만들었습니다. 이렇게하면 xml_dict
각 루프에서 생성중인 값의 양이 정확합니다 (2).
"사전 카운터"는 작동하지만 실제로 실행 속도를 늦 춥니 다. 어쨌든 성능 속도를 높이기 위해 xml 카운터를 더 잘 통합 할 수 있습니까? 또한 'else : continue'가 필요한지 모르겠습니다.
예제 json 링크 : https://www.sec.gov/Archives/edgar/data/1736260/000173626020000004/index.json
json_list = [all_forms['Link'][x] for x in all_forms.index if all_forms['Form Type'][x] == '13F-HR']
link_list = []
lcounter = 0
for json in json_list:
decode = requests.get(json).json()
xml_dict = {}
xml_count = 0
for dic in decode['directory']['item'][0:]:
for v in dic.values():
if ".xml" in v.lower():
xml_count += 1
else:
continue
for dic in decode['directory']['item'][0:]:
if "primary_doc.xml" in dic['name'] and xml_count > 1:
xml_dict['doc_xml'] = json.replace('index.json', '') + dic['name']
elif ".xml" in dic['name'].lower() and "primary_doc" not in dic['name']:
xml_dict['hold_xml'] = json.replace('index.json', '') + dic['name']
else:
continue
if xml_dict:
link_list.append(xml_dict)
lcounter += 1
if lcounter % 100 == 0:
print("Processed {} forms".format(lcounter))
pandas
벡터화 된 함수 를 사용 하는 것이 더 쉽고 빠를 것이라고 생각합니다.
.xml
파일 의 경로를 사용할 수있게되면 XML 파일을 멋진 pandas 데이터 프레임으로 변환하는 방법을 살펴보십시오 . 해당 파일의 처리를 자동화합니다.import pandas as pd
# list to index.json for Archives
paths = ['https://www.sec.gov/Archives/edgar/data/1736260/000119312515118890/index.json',
'https://www.sec.gov/Archives/edgar/data/1736260/000173626020000004/index.json',
'https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/index.json']
# download and each json and join it into a single dataframe
# reset the index, so each row has a unique index number
df = pd.concat([pd.read_json(path, orient='index') for path in paths]).reset_index()
# item is a list of dictionaries that can be exploded to separate columns
dfe = df.explode('item').reset_index(drop=True)
# each dictionary now has a separate row
# normalize the dicts, so each key is a column name and each value is in the row
# rename 'name' to 'item_name', this is the column containing file names like .xml
# join this back to the main dataframe and drop the item row
dfj = dfe.join(pd.json_normalize(dfe.item).rename(columns={'name': 'item_name'})).drop(columns=['item'])
# find the rows with .xml in item_name
# groupby name, which is the archive path with CIK and Accession Number
# count the number of xml files
dfg = dfj.item_name[dfj.item_name.str.contains('.xml', case=False)].groupby(dfj.name).count().reset_index().rename(columns={'item_name': 'xml_count'})
# display(dfg)
name xml_count
0 /Archives/edgar/data/1736260/000173626020000004 2
1 /Archives/edgar/data/51143/000104746917001061 6
print(dfj[['name', 'item_name']][dfj.item_name.str.contains('.xml')].reset_index())
[out]:
index name item_name
0 43 /Archives/edgar/data/1736260/000173626020000004 cpia2ndqtr202013fhr.xml
1 44 /Archives/edgar/data/1736260/000173626020000004 primary_doc.xml
2 66 /Archives/edgar/data/51143/000104746917001061 FilingSummary.xml
3 74 /Archives/edgar/data/51143/000104746917001061 ibm-20161231.xml
4 76 /Archives/edgar/data/51143/000104746917001061 ibm-20161231_cal.xml
5 77 /Archives/edgar/data/51143/000104746917001061 ibm-20161231_def.xml
6 78 /Archives/edgar/data/51143/000104746917001061 ibm-20161231_lab.xml
7 79 /Archives/edgar/data/51143/000104746917001061 ibm-20161231_pre.xml
xml_files = dfj[dfj.item_name.str.contains('.xml', case=False)].copy()
# add a column that creates a full path to the xml files
xml_files['file_path'] = xml_files[['name', 'item_name']].apply(lambda x: f'https://www.sec.gov{x[0]}/{x[1]}', axis=1)
# disply(xml_files)
index name parent-dir last-modified item_name type size file_path
43 directory /Archives/edgar/data/1736260/000173626020000004 /Archives/edgar/data/1736260 2020-07-24 09:38:30 cpia2ndqtr202013fhr.xml text.gif 72804 https://www.sec.gov/Archives/edgar/data/1736260/000173626020000004/cpia2ndqtr202013fhr.xml
44 directory /Archives/edgar/data/1736260/000173626020000004 /Archives/edgar/data/1736260 2020-07-24 09:38:30 primary_doc.xml text.gif 1931 https://www.sec.gov/Archives/edgar/data/1736260/000173626020000004/primary_doc.xml
66 directory /Archives/edgar/data/51143/000104746917001061 /Archives/edgar/data/51143 2017-02-28 16:23:36 FilingSummary.xml text.gif 91940 https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/FilingSummary.xml
74 directory /Archives/edgar/data/51143/000104746917001061 /Archives/edgar/data/51143 2017-02-28 16:23:36 ibm-20161231.xml text.gif 11684003 https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/ibm-20161231.xml
76 directory /Archives/edgar/data/51143/000104746917001061 /Archives/edgar/data/51143 2017-02-28 16:23:36 ibm-20161231_cal.xml text.gif 185502 https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/ibm-20161231_cal.xml
77 directory /Archives/edgar/data/51143/000104746917001061 /Archives/edgar/data/51143 2017-02-28 16:23:36 ibm-20161231_def.xml text.gif 801568 https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/ibm-20161231_def.xml
78 directory /Archives/edgar/data/51143/000104746917001061 /Archives/edgar/data/51143 2017-02-28 16:23:36 ibm-20161231_lab.xml text.gif 1356108 https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/ibm-20161231_lab.xml
79 directory /Archives/edgar/data/51143/000104746917001061 /Archives/edgar/data/51143 2017-02-28 16:23:36 ibm-20161231_pre.xml text.gif 1314064 https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/ibm-20161231_pre.xml
# create a list of just the file paths
path_to_xml_files = xml_files.file_path.tolist()
print(path_to_xml_files)
[out]:
['https://www.sec.gov/Archives/edgar/data/1736260/000173626020000004/cpia2ndqtr202013fhr.xml',
'https://www.sec.gov/Archives/edgar/data/1736260/000173626020000004/primary_doc.xml',
'https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/FilingSummary.xml',
'https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/ibm-20161231.xml',
'https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/ibm-20161231_cal.xml',
'https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/ibm-20161231_def.xml',
'https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/ibm-20161231_lab.xml',
'https://www.sec.gov/Archives/edgar/data/51143/000104746917001061/ibm-20161231_pre.xml']
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다