【问题标题】:Google Finance error: invalid literalGoogle 财经错误:文字无效
【发布时间】:2018-08-01 14:58:25
【问题描述】:

我正试图为学校做一个个人项目(股市预测),这时谷歌又开始行动了……

我意识到 Google 财经在过去一年里完全是垃圾,但直到今天早上它似乎仍然有些工作。 尽管昨天运行良好,但我第一次运行代码时遇到了错误。

所以我尝试从实际库页面运行示例代码:https://pypi.org/project/googlefinance.client/

!pip install googlefinance.client

from googlefinance.client import get_price_data, get_prices_data, get_prices_time_data

# Dow Jones
param = {
    'q': ".DJI", # Stock symbol (ex: "AAPL")
    'i': "86400", # Interval size in seconds ("86400" = 1 day intervals)
    'x': "INDEXDJX", # Stock exchange symbol on which stock is traded (ex: "NASD")
    'p': "1Y" # Period (Ex: "1Y" = 1 year)
}
# get price data (return pandas dataframe)
df = get_price_data(param)
print(df)

params = [
    # Dow Jones
    {
        'q': ".DJI",
        'x': "INDEXDJX",
    },
    # NYSE COMPOSITE (DJ)
    {
        'q': "NYA",
        'x': "INDEXNYSEGIS",
    },
    # S&P 500
    {
        'q': ".INX",
        'x': "INDEXSP",
    }
]
period = "1Y"
# get open, high, low, close, volume data (return pandas dataframe)
df = get_prices_data(params, period)
print(df)

还是得到了

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-df3429694fd0> in <module>()
      9 }
     10 # get price data (return pandas dataframe)
---> 11 df = get_price_data(param)
     12 print(df)
     13 

/usr/local/lib/python3.6/dist-packages/googlefinance/client.py in get_price_data(query)
     13                 cols = price.split(",")
     14                 if cols[0][0] == 'a':
---> 15                         basetime = int(cols[0][1:])
     16                         index.append(datetime.fromtimestamp(basetime))
     17                         data.append([float(cols[4]), float(cols[2]), float(cols[3]), float(cols[1]), int(cols[5])])

ValueError: invalid literal for int() with base 10: 'nd&nbsp;...</span><br></div></div><div class="g"><h3 class="r"><a href="/url?q=https://en.wikipedia.org/wiki/DJI_(company)&amp;sa=U&amp;ved=0ahUKEwiB-e_gjMzcAhUpwlkKHTTUC74QFghGMAw&amp;usg=AOvVaw1ugw

以前有没有人遇到过这种情况并知道问题出在哪里或如何解决?

或者,单独说明一下,有没有人知道 Google 财经的好替代品?

【问题讨论】:

  • 试试雅虎财经库
  • 嗯.. 好吧nd&amp;nbsp;...&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="g"&gt;&lt;h3 class="r"&gt;&lt;a href="/url?q=https://en.wikipedia.org/wiki/DJI_(company)&amp;amp;sa=U&amp;amp;ved=0ahUKEwiB-e_gjMzcAhUpwlkKHTTUC74QFghGMAw&amp;amp;usg=AOvVaw1ugw 绝对不是整数。在我看来,您正在错误地解析数据。您能否发布从 Google 获得的原始数据?
  • @NoahM。我在哪里可以找到那个?我只是从 google.finance 库页面复制粘贴代码,这就是它吐出的内容,而不是它应该在其页面上所说的内容。
  • @ᴡʜᴀᴄᴋᴀᴍᴀᴅᴏᴏᴅʟᴇ3000 yahoo Finance 也不起作用....YQLResponseMalformedError: Response malformed.
  • @ᴡʜᴀᴄᴋᴀᴍᴀᴅᴏᴏᴅʟᴇ3000 tho fix-yahoo-finance 似乎工作正常

标签: python google-finance stockquotes


【解决方案1】:

示例代码有问题。如果您访问GitHub Homepage,您将获得最新版本——甚至是小更新。

我稍微修改了client.py,输出没有问题。

#!/usr/bin/env python
# coding: utf-8
import requests
from datetime import datetime
import pandas as pd


def get_price_data(query):
    r = requests.get(
        "https://finance.google.com/finance/getprices", params=query)
    lines = r.text.splitlines()
    data = []
    index = []
    basetime = 0
    for price in lines:
        cols = price.split(",")
        if cols[0][0] == 'a':
            basetime = int(cols[0][1:])
            index.append(datetime.fromtimestamp(basetime))
            data.append([float(cols[4]), float(cols[2]), float(
                cols[3]), float(cols[1]), int(cols[5])])
        elif cols[0][0].isdigit():
            date = basetime + (int(cols[0]) * int(query['i']))
            index.append(datetime.fromtimestamp(date))
            data.append([float(cols[4]), float(cols[2]), float(
                cols[3]), float(cols[1]), int(cols[5])])
    return pd.DataFrame(data, index=index, columns=['Open', 'High', 'Low', 'Close', 'Volume'])


def get_closing_data(queries, period):
    closing_data = []
    for query in queries:
        query['i'] = 86400
        query['p'] = period
        r = requests.get(
            "https://finance.google.com/finance/getprices", params=query)
        lines = r.text.splitlines()
        data = []
        index = []
        basetime = 0
        for price in lines:
            cols = price.split(",")
            if cols[0][0] == 'a':
                basetime = int(cols[0][1:])
                date = basetime
                data.append(float(cols[1]))
                index.append(datetime.fromtimestamp(date).date())
            elif cols[0][0].isdigit():
                date = basetime + (int(cols[0]) * int(query['i']))
                data.append(float(cols[1]))
                index.append(datetime.fromtimestamp(date).date())
        s = pd.Series(data, index=index, name=query['q'])
        closing_data.append(s[~s.index.duplicated(keep='last')])
    return pd.concat(closing_data, axis=1)


def get_open_close_data(queries, period):
    open_close_data = pd.DataFrame()
    for query in queries:
        query['i'] = 86400
        query['p'] = period
        r = requests.get(
            "https://finance.google.com/finance/getprices", params=query)
        lines = r.text.splitlines()
        data = []
        index = []
        basetime = 0
        for price in lines:
            cols = price.split(",")
            if cols[0][0] == 'a':
                basetime = int(cols[0][1:])
                date = basetime
                data.append([float(cols[4]), float(cols[1])])
                index.append(datetime.fromtimestamp(date).date())
            elif cols[0][0].isdigit():
                date = basetime + (int(cols[0]) * int(query['i']))
                data.append([float(cols[4]), float(cols[1])])
                index.append(datetime.fromtimestamp(date).date())
        df = pd.DataFrame(data, index=index, columns=[
                          query['q'] + '_Open', query['q'] + '_Close'])
        open_close_data = pd.concat(
            [open_close_data, df[~df.index.duplicated(keep='last')]], axis=1)
    return open_close_data


def get_prices_data(queries, period):
    prices_data = pd.DataFrame()
    for query in queries:
        query['i'] = 86400
        query['p'] = period
        r = requests.get(
            "https://finance.google.com/finance/getprices", params=query)
        lines = r.text.splitlines()
        data = []
        index = []
        basetime = 0
        for price in lines:
            cols = price.split(",")
            if cols[0][0] == 'a':
                basetime = int(cols[0][1:])
                date = basetime
                data.append([float(cols[4]), float(cols[2]), float(
                    cols[3]), float(cols[1]), int(cols[5])])
                index.append(datetime.fromtimestamp(date).date())
            elif cols[0][0].isdigit():
                date = basetime + (int(cols[0]) * int(query['i']))
                data.append([float(cols[4]), float(cols[2]), float(
                    cols[3]), float(cols[1]), int(cols[5])])
                index.append(datetime.fromtimestamp(date).date())
        df = pd.DataFrame(data, index=index, columns=[
                          query['q'] + '_Open', query['q'] + '_High', query['q'] + '_Low', query['q'] + '_Close', query['q'] + '_Volume'])
        prices_data = pd.concat(
            [prices_data, df[~df.index.duplicated(keep='last')]], axis=1)
    return prices_data


def get_prices_time_data(queries, period, interval):
    prices_time_data = pd.DataFrame()
    for query in queries:
        query['i'] = interval
        query['p'] = period
        r = requests.get(
            "https://finance.google.com/finance/getprices", params=query)
        lines = r.text.splitlines()
        data = []
        index = []
        basetime = 0
        for price in lines:
            cols = price.split(",")
            if cols[0][0] == 'a':
                basetime = int(cols[0][1:])
                date = basetime
                data.append([float(cols[4]), float(cols[2]), float(
                    cols[3]), float(cols[1]), int(cols[5])])
                index.append(datetime.fromtimestamp(date))
            elif cols[0][0].isdigit():
                date = basetime + (int(cols[0]) * int(query['i']))
                data.append([float(cols[4]), float(cols[2]), float(
                    cols[3]), float(cols[1]), int(cols[5])])
                index.append(datetime.fromtimestamp(date))
        df = pd.DataFrame(data, index=index, columns=[
                          query['q'] + '_Open', query['q'] + '_High', query['q'] + '_Low', query['q'] + '_Close', query['q'] + '_Volume'])
        prices_time_data = pd.concat(
            [prices_time_data, df[~df.index.duplicated(keep='last')]], axis=1)
    return prices_time_data

片段

params = {
    'q': ".DJI",  # Stock symbol (ex: "AAPL")
    'i': "86400",  # Interval size in seconds ("86400" = 1 day intervals)
    # Stock exchange symbol on which stock is traded (ex: "NASD")
    'x': "INDEXDJX",
    'p': "1Y"  # Period (Ex: "1Y" = 1 year)
}
df = get_price_data(params)
print(df)

输出

成交量高开...收盘
328405532 2017-08-01 15:00:00 21961.42 21990.96 ... 21963.92
328405532 2017-08-02 15:00:00 22004.36 22036.10 ... 22016.24
336824836 2017-08-03 15:00:00 22007.58 22044.85 ... 22026.10
278731064 2017-08-04 15:00:00 22058.39 22092.81 ... 22092.81
253635270 2017-08-07 15:00:00 22100.20 22121.15 ... 22118.42
213012378 2017-08-08 15:00:00 22095.14 22179.11 ... 22085.34

【讨论】:

  • 抱歉没有跟进。你想清楚了吗?如果没有,我相信还有其他解决方案。
  • 不,我切换到雅虎财经:\ ...他们都偶尔工作,但雅虎似乎更一致。
【解决方案2】:

在过去的 48 小时左右,".INX" 没有在我的谷歌表格上更新。 .DJI.IXIC 仍在更新中,尽管我认为其中一个最近没有更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    相关资源
    最近更新 更多