如何:Python Pandas获取当前库存数据

时间:2013-06-03 18:30:02

标签: python pandas yahoo yahoo-finance

我用过:

data = DataReader("yhoo", "yahoo", datetime.datetime(2000, 1, 1),
                  datetime.datetime.today())
在pandas(python)中获取雅虎的历史数据,但它无法显示今天的价格(市场尚未关闭)如何解决此类问题,提前谢谢。

6 个答案:

答案 0 :(得分:5)

import pandas
import pandas.io.data
import datetime
import urllib2
import csv

YAHOO_TODAY="http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=sd1ohgl1vl1"

def get_quote_today(symbol):
    response = urllib2.urlopen(YAHOO_TODAY % symbol)
    reader = csv.reader(response, delimiter=",", quotechar='"')
    for row in reader:
        if row[0] == symbol:
            return row

## main ##
symbol = "TSLA"

history = pandas.io.data.DataReader(symbol, "yahoo", start="2014/1/1")
print history.tail(2)

today = datetime.date.today()
df = pandas.DataFrame(index=pandas.DatetimeIndex(start=today, end=today, freq="D"),
                      columns=["Open", "High", "Low", "Close", "Volume", "Adj Close"],
                      dtype=float)

row = get_quote_today(symbol)
df.ix[0] = map(float, row[2:])

history = history.append(df)

print "today is %s" % today
print history.tail(2)

只是为了完成近地点的答案,找到一种方法来追加数据需花费我一些时间。

             Open    High     Low   Close   Volume  Adj Close
Date
2014-02-04  180.7  181.60  176.20  178.73  4686300     178.73
2014-02-05  178.3  180.59  169.36  174.42  7268000     174.42

today is 2014-02-06

              Open    High     Low    Close   Volume  Adj Close
2014-02-05  178.30  180.59  169.36  174.420  7268000    174.420
2014-02-06  176.36  180.11  176.00  178.793  5199297    178.793

答案 1 :(得分:1)

因此,从尝试这个并查看数据框架来看,它看起来并不太可能。你告诉它从特定的一天到今天,但数据框停在2013年5月31日。这告诉我,雅虎可能还没有让你在过去几天使用它或不知何故熊猫只是没有拿起它。它不仅缺少1天,而且缺少3个。

如果我执行以下操作:

>>> df = DataReader("yhoo", "yahoo", datetime.datetime(2013, 6, 1),datetime.datetime.today())
>>> len(df)
0

它告诉我,到目前为止,根本没有数据可供选择。如果有一些解决方法,那么我无法理解,但似乎数据暂时无法使用,这很难相信。

答案 2 :(得分:1)

找到一种解决方法,只需使用urllib获取数据:

    http://download.finance.yahoo.com/d/quotes.csv?s=yhoo&f=sd1ohgl1l1v

然后将其添加到dataframe

答案 3 :(得分:1)

此代码使用pandas read_csv方法从yahoo获取新报价,并检查新报价是否是当前日期或新日期的更新,以便更新历史记录中的最后一条记录或附加新记录。 如果在new_quote部分添加while(true)循环和休眠,则可以让代码在白天刷新引号。 鉴于盘中收盘价和收盘价始终相同,它也有重复的最后交易价格以填写收盘价和调整收盘价。

import pandas as pd
import pandas.io.data as web

def get_quote_today(symbol):
    url="http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=d1t1ohgl1vl1"

    new_quote= pd.read_csv(url%symbol, 
                          names=[u'Date',u'time',u'Open', u'High', u'Low', 
                                 u'Close', u'Volume', u'Adj Close'])

    # generate timestamp: 
    stamp = pd.to_datetime(new_quote.Date+" "+new_quote.time)
    new_quote.index= stamp
    return new_quote.iloc[:, 2:]


if __name__ == "__main__":
    symbol = "TSLA"

    history = web.DataReader(symbol, "yahoo", start="2014/1/1")
    print history.tail()
    new_quote = get_quote_today(symbol)
    if new_quote.index > history.index[-1]:
        if new_quote.index[-1].date() == history.index[-1].date():
            # if both quotes are for the first date, update history's last record. 
            history.iloc[-1]= new_quote.iloc[-1]
        else:
            history=history.append(new_quote)
    history.tail()

答案 4 :(得分:0)

熊猫模块不再适用,因为google和yahoo不再提供支持。因此,您可以使用网址创建一个直接从Google财经获取数据的功能。以下是执行此操作的代码的一部分

import csv
import datetime
import re
import codecs
import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

您可以使用网址编写一个从Google财经获取数据的功能,您必须在下面缩进。

#You have to indent this part
def get_google_finance_intraday(ticker, period=60, days=1, exchange='NASD'):
"""
Retrieve intraday stock data from Google Finance.

Parameters
----------------
ticker : str
    Company ticker symbol.
period : int
    Interval between stock values in seconds.
    i = 60 corresponds to one minute tick data
    i = 86400 corresponds to daily data
days : int
    Number of days of data to retrieve.
exchange : str
    Exchange from which the quotes should be fetched

Returns
---------------
df : pandas.DataFrame
    DataFrame containing the opening price, high price, low price,
    closing price, and volume. The index contains the times associated with
    the retrieved price values.
"""
# build url
url = 'https://finance.google.com/finance/getprices?p={days}d&f=d,o,h,l,c,v&q={ticker}&i={period}&x={exchange}'.format(ticker=ticker, period=period, days=days, exchange=exchange)

page = requests.get(url)
reader = csv.reader(codecs.iterdecode(page.content.splitlines(), "utf-8"))
columns = ['Open', 'High', 'Low', 'Close', 'Volume']
rows = []
times = []
for row in reader:
    if re.match('^[a\d]', row[0]):
        if row[0].startswith('a'):
            start = datetime.datetime.fromtimestamp(int(row[0][1:]))
            times.append(start)
        else:
            times.append(start+datetime.timedelta(seconds=period*int(row[0])))
        rows.append(map(float, row[1:]))
if len(rows):
    return pd.DataFrame(rows, index=pd.DatetimeIndex(times, name='Date'), columns=columns)
else:
    return pd.DataFrame(rows, index=pd.DatetimeIndex(times, name='Date'))

现在您可以使用您想要的票证调用该函数,在我的案例中是AAPL,结果是包含开盘价,高价,低价,收盘价和交易量的pandas DataFrame。

ticker = 'AAPL'
period = 60
days = 1
exchange = 'NASD'

df = get_google_finance_intraday(ticker, period=period, days=days)
df

答案 5 :(得分:0)

将印度股票价格数据提取到Python中的最简单方法是使用nsepy库。 如果您没有nsepy库,请执行以下操作:

lcd = character_lcd.Character_LCD_I2C(i2c, 16, 2, address=0x27)

以下代码可让您提取10年的HDFC股票价格。

pip install nsepy

到目前为止,这是我找到的最简单的代码。