Я задал предыдущий вопрос здесь Какой приемлемый способ отбросить первые пару строк текста? , который получил два интересных ответа, которые заставили меня переосмыслить подход к проблеме. Если циклы данных в пандасе не намного медленнее, чем в цикле текстовых строк, я не вижу причин, чтобы не использовать кадр данных.
Код, на котором я изначально остановился, был такой:
try:
for year in range(start_year, current_year + 1):
url = 'https://www.sec.gov/Archives/edgar/full-index/%s/%s/master.idx' %(year, quarter)
r = requests.get(url)
lines = r.text.splitlines(True)
for line in lines[0:]:
row = line.split('|')
if len(row) == 5:
cik, company_name, filling_type, filling_date, edgar_url = row[0:5]
except requests.exceptions.HTTPError as e:
print(e)
Однако я подумал, что конечному пользователю будет проще использовать панды в других методах (надеюсь, за исключением огромного снижения производительности). Я изменил свой код на это:
df = pd.DataFrame()
try:
for year in range(start_year, current_year + 1):
url = 'https://www.sec.gov/Archives/edgar/full-index/%s/%s/master.idx' %(year, quarter)
r = requests.get(url)
lines = r.text.splitlines(True)
for line in lines[0:]:
row = line.split('|')
if len(row) == 5:
df.append(row)
print(df.head(10))
что я считаю, дает мне то, что я хочу. Однако есть способ сократить это еще больше до чего-то вроде:
df = pd.DataFrame()
try:
for year in range(start_year, current_year + 1):
url = 'https://www.sec.gov/Archives/edgar/full-index/%s/%s/master.idx' %(year, quarter)
r = requests.get(url)
lines = r.text.splitlines(True)
df = pd.DataFrame([line.split('|') for line in lines if len(line.split('|') == 4])
Я не могу сказать, что видел, если раньше использовался в конструкторе кадра данных, и хотя код компилируется, я, кажется, получил пустой кадр данных. Я предполагаю, что 1) вызов line.split ('|') дважды означает, что строки не возвращаются. Есть ли способ сохранить это как одну строку? Это представление так же хорошо, как использование огромного списка?
Спасибо за ввод.