2016-11-24 7 views
0

私は株価をダウンロードするためにタブローのWebコネクタを使用しています。私達はちょうど1つのデータをダウンロードしたいときyahoo finance 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クエリーから来た:startDate = "2014-08-24" and endDate = "2016-11-23"が15月よりとき

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 

、YQLはnullを返します。私はこの問題を解決しようとしています。 PythonやJavaの場合、問題は難しくありません。まず、期間が1年より長いかどうかをチェックし、そうであれば1年の結果を得て、残りのn-1年も同じことをします。しかし、このテーブルコードは私にそれをつかまえています。コードをtableauで実行可能にする必要があります。これにより、jsとtableauの両方についての知識が不足しているため、処理が進まなくなります。

この問題についてアドバイスできますか?私の目的は、AAPLのような株式記号のためのコードを> 10年間実行可能にすることです。

ありがとうございます。

答えて

0

私はYQLが15ヶ月以上のクエリをサポートしているとは思いません。 APIを使って作業する場合、これらの制限はかなり一般的です。 Webデータ・コネクターの観点からは、ページングを実装する必要があります。

あなたのWDCのgetTableData関数が複数回実行され、そのたびに1ページ分のデータが収集され、それが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機能の2つの追加パラメータを使用しています。 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以降で使用可能)を使用できる場合は、私は強くお勧めします。ウェブデータコネクタAPIのv1でページングするためのドキュメントはこちらをご覧ください。 V2のページングモデルは、より柔軟で使いやすいものです。

関連する問題