【问题标题】:Python - Pulling from Google Finance with PandasPython - 使用 Pandas 从 Google Finance 中提取数据
【发布时间】:2018-07-31 10:04:23
【问题描述】:

我正在尝试使用 Pandas 和 Pandas Datareader 从 Google 财经中提取数据。 这是我的代码:

#Importing libraries needed for pulls from Google
from pandas_datareader import data
import pandas as pd
import datetime
from datetime import date

#Define the instruments to download.  In this case: Apple, Microsoft, and 
the S&P500 index
tickers = ['APPL', 'MSFT', 'SPY']
start_date = datetime.datetime(2017, 12, 1)
end_date = datetime.datetime(2017, 12, 31)

#Use pandas_reader.data.DataReader to load the desired data
panel_data = data.DataReader('SPY', 'google', start_date, end_date)
#Getting just the adjusted closing prices.  This will return a Pandas DataFrame
#The index in this DataFrame is the major index of the panel_data.
close = panel_data.ix['Close']

#Getting all weekdays within date range.
all_weekdays = pd.date_range(start=start_date, end=end_date, freq='B')

#How do we align the existing prices in the adj_close with out new set of dates?
#All we need to do is reindex close using all_weekdays as the new index.
close = close.reindex(all_weekdays)

close.head(10)

这是控制台输出:

runfile('C:/Users/kjohn_000/.spyder-py3/temp.py', wdir='C:/Users/kjohn_000/.spyder-py3')
C:\Users\kjohn_000\Anaconda3\lib\site-packages\pandas_datareader\base.py:201: SymbolWarning: Failed to read symbol: 
'APPL', replacing with NaN.
  warnings.warn(msg.format(sym), SymbolWarning)
C:\Users\kjohn_000\Anaconda3\lib\site-
packages\pandas_datareader\base.py:201: SymbolWarning: Failed to read 
symbol: 'MSFT', replacing with NaN.
  warnings.warn(msg.format(sym), SymbolWarning)
C:\Users\kjohn_000\Anaconda3\lib\site-packages\pandas_datareader\base.py:201: SymbolWarning: Failed to read symbol: 
'SPY', replacing with NaN.
  warnings.warn(msg.format(sym), SymbolWarning)
Traceback (most recent call last):

  File "<ipython-input-2-0ddd75de0396>", line 1, in <module>
    runfile('C:/Users/kjohn_000/.spyder-py3/temp.py', 
wdir='C:/Users/kjohn_000/.spyder-py3')

  File "C:\Users\kjohn_000\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\Users\kjohn_000\Anaconda3\lib\site-
packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/kjohn_000/.spyder-py3/temp.py", line 14, in <module>
    panel_data = data.DataReader(tickers, dataSource, start_date, end_date)

  File "C:\Users\kjohn_000\Anaconda3\lib\site-packages\pandas_datareader\data.py", line 137, in DataReader
session=session).read()

  File "C:\Users\kjohn_000\Anaconda3\lib\site-
packages\pandas_datareader\base.py", line 186, in read
    df = self._dl_mult_symbols(self.symbols)

  File "C:\Users\kjohn_000\Anaconda3\lib\site-
packages\pandas_datareader\base.py", line 206, in _dl_mult_symbols
    raise RemoteDataError(msg.format(self.__class__.__name__))

RemoteDataError: No data fetched using 'GoogleDailyReader'

为什么 Pandas Datareader 无法读取“股票代码”列表中的股票代码?我已经四处寻找答案几个小时了,但是许多答案都是关于雅虎 API 的回答问题,其余的答案要么是针对另一种语言,要么只是在编码过程中超出了我的深度(我相对Python 新手)。提前感谢您的帮助和反馈。

【问题讨论】:

  • This github issue 是最近与雅虎无关的问题。也许它在谷歌重组他们的 API 期间正在进行?或者您可能需要更新 pandas。
  • 我明白了。非常有用的链接。据 Anaconda 所知,我的 Pandas 版本是最新的,但它尝试调用的 url 是“google.com/finance/historical”而不是“finance.google.com/finance/historical”。后一个 url 在 API 重组时是正确的。 Anaconda 用户要更改的文件的路径是 Anaconda3\Lib\site-packages\pandas_datareader\google\。感谢您的帮助!

标签: python python-3.x pandas google-finance pandas-datareader


【解决方案1】:

def 库存(纸,直径): 纸=纸 直径 = 直径 “从 YF 中提取历史” url =“https://query1.finance.yahoo.com/v7/finance/download/”+论文+“.SA”+“?” + "period1=1597805534&period2=1629341534&interval=1d&events=history&includeAdjustedClose=true" 基础 = 纸张 + “.SA.csv” 文件= r'D:\Users\repo\' 文件 2 = 文件 + 基础 如果 os.path.exists(file2): os.remove(file2) 别的: print("不在这儿") wget.download(网址) base2 = pd.read_csv(base) pd.options.display.max_rows = 14000 #base2.tail(15) 返回 base2.tail(dias)

【讨论】:

  • 您可以尝试重新格式化吗?看起来应该有多行。
【解决方案2】:

这不是使用 Google,但是如果您使用 python YahooFinancials 模块,您可以轻松地将财务数据加载到 pandas 中。 YahooFinancials 通过散列相关的 Yahoo Finance Page 的数据存储对象来获取财务数据,因此它非常快,构建良好,并且不依赖于旧的停产 api,或者像网络爬虫那样的网络驱动程序。数据以 JSON 格式返回。

$ pip install yahoofinancials

用法示例:

from yahoofinancials import YahooFinancials
import pandas as pd

# Select Tickers and stock history dates
ticker = 'AAPL'
ticker2 = 'MSFT'
ticker3 = 'INTC'
index = '^NDX'
freq = 'daily'
start_date = '2012-10-01'
end_date = '2017-10-01'


# Function to clean data extracts
def clean_stock_data(stock_data_list):
    new_list = []
    for rec in stock_data_list:
        if 'type' not in rec.keys():
            new_list.append(rec)
    return new_list

# Construct yahoo financials objects for data extraction
aapl_financials = YahooFinancials(ticker)
mfst_financials = YahooFinancials(ticker2)
intl_financials = YahooFinancials(ticker3)
index_financials = YahooFinancials(index)

# Clean returned stock history data and remove dividend events from price history
daily_aapl_data = clean_stock_data(aapl_financials.get_historical_stock_data(start_date, end_date, freq)[ticker]['prices'])
daily_msft_data = clean_stock_data(mfst_financials.get_historical_stock_data(start_date, end_date, freq)[ticker2]['prices'])
daily_intl_data = clean_stock_data(intl_financials.get_historical_stock_data(start_date, end_date, freq)[ticker3]['prices'])
daily_index_data = index_financials.get_historical_stock_data(start_date, end_date, freq)[index]['prices']
stock_hist_data_list = [{'NDX': daily_index_data}, {'AAPL': daily_aapl_data}, {'MSFT': daily_msft_data}, {'INTL': daily_intl_data}]


# Function to construct data frame based on a stock and it's market index
def build_data_frame(data_list1, data_list2, data_list3, data_list4):
    data_dict = {}
    i = 0
    for list_item in data_list2:
        if 'type' not in list_item.keys():
            data_dict.update({list_item['formatted_date']: {'NDX': data_list1[i]['close'], 'AAPL': list_item['close'],
                                                            'MSFT': data_list3[i]['close'],
                                                            'INTL': data_list4[i]['close']}})
            i += 1
    tseries = pd.to_datetime(list(data_dict.keys()))
    df = pd.DataFrame(data=list(data_dict.values()), index=tseries,
                      columns=['NDX', 'AAPL', 'MSFT', 'INTL']).sort_index()
    return df

【讨论】:

    【解决方案3】:

    这适用于我的 Python 3.6.1

    from pandas_datareader import data
    import fix_yahoo_finance as yf
    yf.pdr_override() 
    
    symbol = 'AMZN'
    data_source='google'
    start_date = '2010-01-01'
    end_date = '2016-01-01'
    df = data.get_data_yahoo(symbol, start_date, end_date)
    print(df)
    df.head()
    

    这对我也有用。

    from urllib.request import urlopen
    from bs4 import BeautifulSoup as bs
    
    def get_historical_data(name, number_of_days):
        data = []
        url = "https://finance.yahoo.com/quote/" + name + "/history/"
        rows = bs(urlopen(url).read()).findAll('table')[0].tbody.findAll('tr')
    
        for each_row in rows:
            divs = each_row.findAll('td')
            if divs[1].span.text  != 'Dividend': #Ignore this row in the table
                #I'm only interested in 'Open' price; For other values, play with divs[1 - 5]
                data.append({'Date': divs[0].span.text, 'Open': float(divs[1].span.text.replace(',',''))})
    
        return data[:number_of_days]
    
    #Test
    for i in get_historical_data('googl', 25):   
        print(i)
    

    【讨论】:

    • 我知道这已经很久了,但是我让我的代码使用 URL 更新工作,然后一个月左右后,它再次停止工作,没有进行任何更改。从那以后,我开始使用 Morningstar API,并且没有遇到任何问题。无论如何,感谢您抽出宝贵时间回复。
    猜你喜欢
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多