2016-11-24 123 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中的分頁模型更加靈活和易於使用。