Как перезаписать датафрейм NaN соскребенными данными - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть df:

  Company Name  Symbol      CUSIP
0       Aa Inc     NaN   26874784
4       Cc Inc     NaN  16117M305
7       Bb Inc     NaN  30734W208

и я смотрю вверх Symbols из CUSIP через BeautifulSoup. Но когда я очищаю Symbols и пытаюсь записать в df, строки по-прежнему NaN, а не содержат очищенную Symbol, например:

  Company Name      Symbol      CUSIP
0       Aa Inc         AIG   26874784
4       Cc Inc   No Symbol  16117M305
7       Bb Inc      FPAC/U  30734W208

Как заменить NaN Symbol со соскобом Symbol?

import pandas as pd
from bs4 import BeautifulSoup as bs
import requests
import time

# Crawl Fidelity.com to find symbols for new CUSIPs
base_url = "https://quotes.fidelity.com/mmnet/SymLookup.phtml" \
           "?reqforlookup=REQUESTFORLOOKUP&productid=mmnet&isLoggedIn" \
           "=mmnet&rows=50&for=stock&by=cusip&criteria={}&submit=Search"

def read_symbol(cusip):
    r = requests.get(base_url.format(cusip))
    soup = bs(r.content, 'lxml')
    symbol = soup.select_one('[href*=SID_VALUE_ID]')
    return symbol.text if symbol is not None else None

for index, row in df.iterrows():
    cusip = row['CUSIP']
    company_name = row['Company Name']
    for zeroes in range(3):
        symbol = read_symbol(zeroes * "0" + cusip)
        row['Symbol'] = 'No Symbol' if symbol is None else symbol
        if symbol is not None:
            break
    print(str(symbol) + " is the symbol for " + str(company_name) + " (CUSIP #: " + str(cusip) + ")")
    time.sleep(3)

print(df)

1 Ответ

2 голосов
/ 07 апреля 2020

Столбец CUSIP должен быть явно прочитан как строковый столбец. Чтобы сохранить ведущие нули. Кроме того, вы можете использовать pandas .Series.str.zfill для заполнения нулей, так как CUSIP число всегда 9 di git.

df['CUSIP'] = df['CUSIP'].astype(str).str.zfill(9)

Remove l xml парсер из конструктора BeatifulSoup

def read_symbol(cusip):
    r = requests.get(base_url.format(cusip))
    soup = bs(r.content, 'html.parser')
    symbol = soup.select_one('[href*=SID_VALUE_ID]')
    return symbol.text if symbol is not None else np.nan

Использовать карту и заполнить

df['Symbol'] = df['CUSIP'].map(read_symbol).fillna('No Symbol')

Вывод

  Company Name     Symbol      CUSIP
0      Aa  Inc        AIG  026874784
4      Cc  Inc  No Symbol  16117M305
7      Bb  Inc     FPAC/U  30734W208
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...