Есть ли способ использовать цикл if и for в той же строке, что и кадр данных pandas? - PullRequest
1 голос
/ 09 апреля 2019

Я задал предыдущий вопрос здесь Какой приемлемый способ отбросить первые пару строк текста? , который получил два интересных ответа, которые заставили меня переосмыслить подход к проблеме. Если циклы данных в пандасе не намного медленнее, чем в цикле текстовых строк, я не вижу причин, чтобы не использовать кадр данных. Код, на котором я изначально остановился, был такой:

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 ('|') дважды означает, что строки не возвращаются. Есть ли способ сохранить это как одну строку? Это представление так же хорошо, как использование огромного списка? Спасибо за ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...