2016-11-24 116 views
0

我正在使用一个tableau web连接器来下载股票价格。源代码如下:如何让雅虎财务YQL查询超过1年的股票数据?

<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年(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年的休息时间内执行相同的操作。但是这个代码使得我坚持下去。我必须使代码适用于画面,这使我无法继续进行,因为缺乏关于js和画面的知识。

任何人都可以就这个问题提出建议吗?我的目标是让代码在AAPL这样的股票代码中可用10年以上。

在此先感谢。

回答

0

我不相信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的v1分页文档可以在这里找到:http://onlinehelp.tableau.com/current/api/wdc/en-us/help.htm#WDC/wdc_paging.htm%3FTocPath%3DAdditional%2520Concepts%7C_____2

此外,如果您能够使用v2 of the WDC API(可在Tableau 10及更高版本中使用),我会强烈推荐它。 V2中的分页模型更加灵活和易于使用。