繁体   English   中英

如何使Yahoo Finance YQL查询超过1年的库存数据?

[英]How to make yahoo finance YQL query more than 1 year stock data?

我正在使用Tableau Web连接器下载股票价格。 源代码如下:

<html>
<meta http-equiv="Cache-Control" content="no-store" />
<head>
  <title>Stock Quote Connector-Tutorial</title>
  <script src="https://connectors.tableau.com/libs/tableauwdc-1.1.1.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>

  <script type="text/javascript">
  (function() {

    function buildUri(tickerSymbol, startDate, endDate) {
      var startDateStr = getFormattedDate(startDate);
      var endDateStr   = getFormattedDate(endDate);
      var queryStatement = 'select * from yahoo.finance.historicaldata where symbol = "' +
                            tickerSymbol +
                           '" and startDate = "' + startDateStr +
                           '" and endDate = "' + endDateStr + '"';
      var uri = 'http://query.yahooapis.com/v1/public/yql?q=' +
                encodeURIComponent(queryStatement) +
                "&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json";
      return uri;
    }

    function getFormattedDate(date) {
        // Return a date in the format YYYY-MM-DD
        return date.getUTCFullYear()  +
               '-' +
               makeTwoDigits(date.getUTCMonth() + 1) +
               '-' +
               makeTwoDigits(date.getUTCDate());
    }

    function makeTwoDigits(num) {
       // Pad a digit to be two digits with leading zero
       return num <= 9 ? "0" + num.toString() : num.toString();
    }

    var myConnector = tableau.makeConnector();

    myConnector.getColumnHeaders = function() {
        var fieldNames = ['Ticker', 'Day', 'Close'];
        var fieldTypes = ['string', 'date', 'float'];
        tableau.headersCallback(fieldNames, fieldTypes);
    }

    myConnector.getTableData = function(lastRecordToken) {
        var dataToReturn = [];
        var hasMoreData = false;

        // Get parameter values and build YQL query
        var ticker = tableau.connectionData;
        var endDate = new Date();
        var startDate = new Date();
        startDate.setYear(endDate.getFullYear() - 1);
        //startDate.setYear(startDate.getFullYear() - 1);
        //startDate.setYear(startDate.getFullYear() - 1);
        //startDate.setYear(startDate.getFullYear() - 1);
        var connectionUri = buildUri(ticker, startDate, endDate);

        var xhr = $.ajax({
          url: connectionUri,
          dataType: 'json',
          success: function (data) {
              if (data.query.results) {
                var quotes = data.query.results.quote;
                var ii;
                for (ii = 0; ii < quotes.length; ++ii) {
                    var entry = {'Ticker': quotes[ii].Symbol,
                                 'Day': quotes[ii].Date,
                                 'Close': quotes[ii].Close};
                    dataToReturn.push(entry);
                }
                tableau.dataCallback(dataToReturn, lastRecordToken, false);
              }
              else {
                  tableau.abortWithError("No results found for ticker symbol: " + ticker);
              }
          },
          error: function (xhr, ajaxOptions, thrownError) {
              tableau.log("Connection error: " + xhr.responseText + "\n" + thrownError);
              tableau.abortWithError("Error while trying to connect to the Yahoo stock data source.");
          }
        });
      }
      tableau.registerConnector(myConnector);
  })();

  $(document).ready(function() {
    $("#submitButton").click(function() {
      var tickerSymbol = $('#ticker').val().trim();
      if (tickerSymbol) {
        tableau.connectionName = "Stock Data for " + tickerSymbol;
        tableau.connectionData = tickerSymbol;
        tableau.submit();
      }
    });
  });
</script>
</head>
<body>
  <p>Enter a stock ticker symbol: <input type="text" id="ticker" /></p>
  <p><button type="button" id="submitButton">Get the Data</button></p>
  </body>
</html>

当我们只想下载1年数据时,该代码可用,但是如果更改时间超过1年( enddate.year - startdate.year > 1 ),则该代码不可用。 调试代码后,我发现问题来自YQL查询:

http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.historicaldata where symbol = "AAPL" and startDate = "2014-08-24" and endDate = "2016-11-23"&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json

startDate = "2014-08-24" and endDate = "2016-11-23"超过15个月时,YQL将返回null。 我正在尝试解决此问题。 如果是python或java,问题并不难,请首先检查持续时间是否长于1年,如果是,则获得1年结果,其余的n-1年也是如此。 但是,这个表格代码使我无法自拔。 我必须使代码与tableau一起使用,由于缺乏对js和tableau的知识,这使我无法继续。

有人可以就这个问题提供建议吗? 我的目标是使该代码对于AAPL这样的股票代号而言可以使用超过10年。

提前致谢。

我认为YQL不支持查询超过15个月左右的时间。 使用API​​时,类似的限制相当普遍。 从Web数据连接器的角度来看,您要做的是实现分页。

高层的想法是WDC的getTableData函数将执行多次,并且每次它将收集单个数据页,然后将其传递给Tableau。 例如,下面是在示例中如何获取多年价值的数据的方法:

myConnector.getTableData = function(lastRecordToken) {
    var dataToReturn = [];
    var hasMoreData = false;

    // Get parameter values and build YQL query
    var ticker = tableau.connectionData;
    var endDate = new Date();
    var startDate = new Date();

    var maxYear = 5;        
    var yearOffset = lastRecordToken || 0;
    endDate.setYear(endDate.getFullYear() - (yearOffset));
    startDate.setYear(endDate.getFullYear() - 1);

    var connectionUri = buildUri(ticker, startDate, endDate);

    var xhr = $.ajax({
      url: connectionUri,
      dataType: 'json',
      success: function (data) {
          if (data.query.results) {
            var quotes = data.query.results.quote;
            var ii;
            for (ii = 0; ii < quotes.length; ++ii) {
                var entry = {'Ticker': quotes[ii].Symbol,
                             'Day': quotes[ii].Date,
                             'Close': quotes[ii].Close};
                dataToReturn.push(entry);
            }

            var hasMoreData = !(yearOffset == maxYear);
            tableau.dataCallback(dataToReturn, yearOffset + 1, hasMoreData)
          }
          else {
              tableau.abortWithError("No results found for ticker symbol: " + ticker);
          }
      },
      error: function (xhr, ajaxOptions, thrownError) {
          tableau.log("Connection error: " + xhr.responseText + "\n" + thrownError);
          tableau.abortWithError("Error while trying to connect to the Yahoo stock data source.");
      }
    });
  }
  tableau.registerConnector(myConnector);
  })();

本示例使用dataCallback函数的两个额外参数来实现分页。 可在以下位置找到Web数据连接器API的第1版中的分页文档: http : //onlinehelp.tableau.com/current/api/wdc/en-us/help.htm#WDC/wdc_paging.htm%3FTocPath%3DAdditional %2520Concepts%7C _____ 2

此外,如果您可以使用WDC API的v2 (在Tableau 10及更高版本中可用),则强烈建议您使用。 V2中的分页模型更灵活,更易于使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM