NameError:名称'all_df'未定义帮助,请]

问题描述 投票:0回答:1
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 14 2017
Modified on Wed Aug 16 2017
Author: Yanfei Wu
Get the past 500 S&P 500 stocks data
"""

from bs4 import BeautifulSoup
import requests
from datetime import datetime
import pandas as pd
import pandas_datareader.data as web

def get_ticker_and_sector(url='https://en.wikipedia.org/wiki/List_of_S%26P_500_companies'):
    """ 
    get the s&p 500 stocks from Wikipedia:
    https://en.wikipedia.org/wiki/List_of_S%26P_500_companies

    ---
    return: a dictionary with ticker names as keys and sectors as values 
    """

    r = requests.get(url)
    data = r.text
    soup = BeautifulSoup(data, 'lxml')

    # we only want to parse the first table of this wikipedia page
    table = soup.find('table')

    sp500 = {}
    # loop over the rows and get ticker symbol and sector name
    for tr in table.find_all('tr')[1:]: 
        tds = tr.find_all('td')
        ticker = tds[0].text
        sector = tds[3].text
        sp500[ticker] = sector

    return sp500

def get_stock_data(ticker, start_date, end_date):
    """ get stock data from google with stock ticker, start and end dates """
    data = web.DataReader(ticker, 'google', start_date, end_date)
    return data

if __name__ == '__main__':

    """ get the stock data from the past 5 years """
    # end_date = datetime.now()
    end_date = datetime(2017, 8, 14)
    start_date = datetime(end_date.year - 5, end_date.month , end_date.day)

    sp500 = get_ticker_and_sector()
    sp500['SPY'] = 'SPY' # also include SPY as reference
    print('Total number of tickers (including SPY): {}'.format(len(sp500))) 

    bad_tickers =[]
    for i, (ticker, sector) in enumerate(sp500.items()):
        try:
            stock_df = get_stock_data(ticker, start_date, end_date)
            stock_df['Name'] = ticker
            stock_df['Sector'] = sector
            if stock_df.shape[0] == 0:
                bad_tickers.append(ticker)
            #output_name = ticker + '_data.csv'
            #stock_df.to_csv(output_name)
            if i == 0:
                all_df = stock_df
            else:
                all_df = all_df.append(stock_df)
        except:
            bad_tickers.append(ticker)
    print(bad_tickers)

    all_df.to_csv('./data/all_sp500_data_2.csv')

    """ Write failed queries to a text file """
    if len(bad_tickers) > 0:
        with open('./data/failed_queries_2.txt','w') as outfile:
            for ticker in bad_tickers:
                outfile.write(ticker+'\n')
python pandas undefined nameerror
1个回答
0
投票

您的问题在try/except块中。总是捕获特定的异常是good style,而不仅仅是在一长段代码之后盲目地抛出except语句。如您的问题所示,这种方法的问题在于,如果您有不相关的或意外的错误,您将一无所知。在这种情况下,这是我从运行代码中得到的例外:

NotImplementedError: data_source='google' is not implemented

我不确定这是什么意思,但是pandas_datareader.data.DataReader docs似乎具有有关如何正确使用DataReader的良好信息。


-1
投票

您可以通过在附加Df之前收集它们来改善这一点

    bad_tickers =[]
    all_df_list = []
    for i, (ticker, sector) in enumerate(sp500.items()):
        try:
            stock_df = get_stock_data(ticker, start_date, end_date)
            stock_df['Name'] = ticker
            stock_df['Sector'] = sector
            if stock_df.shape[0] == 0:
                bad_tickers.append(ticker)
            else:
                all_df_list.append(stock_df)
        except:
            bad_tickers.append(ticker)
    print(bad_tickers)
    if all_df_list:
        all_df = pd.concat(all_df_list)
        all_df.to_csv('./data/all_sp500_data_2.csv')
    else:
        print("Unable to download any data")

而且是的,您不应该进行广泛的尝试/抓住很有可能所有迭代都会打破常规。

© www.soinside.com 2019 - 2024. All rights reserved.