YahooファイナンスAPIとPythonで簡単なデータ摂取チュートリアル


コードをクローン(と星を私たちに与える)➜➜ Tutorial Github Repo
データはどこにでもあります多くの企業は、すべての種類の意思決定、予測市場、将来の計画をするために、顧客のニーズを理解し、努力を再ターゲット化するデータに依存しています.何度も様々なアーキテクチャを使ってデータを扱うときには、データの取り込み部分が常に存在します.
それが何であるかを理解して、構築しましょう!
システムにデータを摂取するためのオプションの1つは'引き'です.我々が既存のデータを豊かにしたいとき、データを引くことはしばしば使われます.

プルデータは何を意味しますか?


プルデータは、スケジュールされた時間またはトリガされたときにリソースからデータを取得/要求します.
時間スケジュールのプルデータの例については、我々は10秒ごとにTwitterを照会することを決定することができます.引き金の例については、我々のシステムの他のプロセスについて考えることができます我々のプルデータプロセスを呼び出して、新しい/更新されたデータを引く要求でそれを起こしてください.この学期はもっと哲学的に見える.主な考えは、リクエストを待つオンラインのサーバが存在しないことです.
このサービスは要求を生成し、それが必要なデータをプル-私たちのケースでは、我々は、金融情報をプルするAPIを呼び出します.

何を使いますか。


Yahooファイナンス' Python '
今日はYahooファイナンス(YFinance)APIを使用して金融情報を読む方法を学び、Eventhubsにそれを書いてください.
これらはYFinance APIを選んだ理由です.
  • 無料です
  • それは株式市場のAPIのためのゴールド標準と見なされます
  • ODLC(オープンハイローチャート)株価データの毎日の歴史の5年へのアクセスを提供します
  • 私の使用Azure EventHubs データを格納するにはそれは非常にスケーラブルな発行購読サービスで、毎秒何百万ものイベントを摂取し、それらを複数の消費者に流すことができる.これは、バッチ処理とリアルタイム処理をサポートします.
    EventHubs Capture Azureデータ湖と雲で利用できる他のStorageの両方でデータを取り込むのを可能にします.

    チュートリアルへのドリルの時間


    必要条件:

  • Pythonインストール済み
  • Anaconda
  • Pythonの基礎知識
  • Want to learn Python? Here is a free online course for you!


    オプション( azureで動作したい場合)

  • 紺碧free account

  • Azure CLI インストール
  • オプション-イベントハブを使用したい場合は、まず最初に作成する必要がありますhow .
  • eventhubs接続文字列を取得するhow
  • キーvault -秘密鍵と証明書を保存するために
  • Want to learn Azure Cloud Fundamentals? Here is a free online course for you!


    Condaで環境を設定します
    conda create -n yahoofinance python=3.6 anaconda
    
    conda activate yahoofinance
    
    ライブラリのダウンロードとインストール
    # Install azure-eventhub:
    pip install azure-eventhub
    
    # Install azure:
    pip install azure
    
    # Install yfinance:
    pip install yfinance
    
    はい!環境設定を行う.
    コードのエディタについてはVS-Code , しかし、あなたのお気に入りのツールで動作することができます.

    あなたはコードを書く準備ができていますか?



    コード自体は短いですが、多くの概念を知っていると理解し、注意して従うことが重要です!
    ここでは、完全なコードは、私は最初にこれを追加したので、それはあなたのテキストエディタにコピーして、チュートリアルに従って変更しやすいです.
    import asyncio
    from azure.eventhub.aio import EventHubProducerClient
    from azure.eventhub import EventData
    import yfinance as yf
    
    from azure.keyvault.secrets import SecretClient
    from azure.identity import DefaultAzureCredential
    from datetime import datetime
    
    
    async def run(stocksCodesList):
        print('Start Batch for stocks: \n',stocksCodesList)
        # Get connection string from vault
    
        credential = DefaultAzureCredential()
        keyVaultName = "{your key vault name}"
        keyName = "{your key name}"
        KVUri = "https://" + keyVaultName + ".vault.azure.net"
    
        # Create a producer client to send messages to the event hub.
        producer = EventHubProducerClient.from_connection_string(conn_str_value)
    
        async with producer:
            # Create a batch.
            event_data_batch =  await producer.create_batch()
            for stockCode in stocksCodesList:
                #Get stock info
                stockInfo = yf.Ticker(stockCode).info
                # Add events to the batch.
                event_data_batch.add(EventData(stockInfo))
    
            # Send the batch of events to the event hub.
            await producer.send_batch(event_data_batch)
            printSentMessage()
    
    
    def printSentMessage():
        now = datetime.now()
        current_time = now.strftime("%H:%M:%S")
        print('Batch sent - Current Time =', current_time)
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run(["MSFT"]))
    loop.close()
    
    さあ!それを部品に分解して、それらを説明しましょう
    import asyncio
    
    async def run(stocksCodesList):
        # Get stock information and write them to Event Hubs
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run(["MSFT"]))
    loop.close()
    
    
    これは非同期ですpython コード.そのために、' asyncio 'ライブラリを使用します.loop = asyncio.get_event_loop() - を作成するか、既存のループを取る.loop.run_until_complete(run(["MSFT"])) - “イベントループ”を実行する機能を我々はクエリを希望する株式のリストを使用して-これは将来のオブジェクトを作成し、完了するまで待機します.loop.close() - ループを閉じます.async def run(stocksCodesList): asyncとwaitは2ですpython Coroutinesを定義するのに使用されるキーワード

    To learn more on on event_loop, read here.


    ここではどのようにYFinance APIを使用して情報を取得する:
    import asyncio
    import yfinance as yf
    
    async def run(stocksCodesList):
        for stockCode in stocksCodesList:
                #Get stock info
                stockInfo = yf.Ticker(stockCode).info
                print(stockInfo)
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run(["MSFT"]))
    loop.close()
    
    
    このコードは、受信したストックコード文字列のリストを反復して情報をプルします.yf.Ticker(stockCode).info このコマンドは、美しいUIと市場予測アルゴリズムを構築するために使用できる多くの情報を返します.
    私たちは、マイクロソフト株式シンボルのMSFTとヤフーファイナンスを問い合わせ、ここではJSON形式での応答です.それをすべて見るために右にスライド;長い!
    {'zip': '98052', 'sector': 'Technology', 'fullTimeEmployees': 144000,
     'longBusinessSummary': "Microsoft Corporation develops, licenses, and supports software, services, devices, and solutions worldwide. The company's Productivity and Business Processes segment offers Office, Exchange, SharePoint, Microsoft Teams, Office 365 Security and Compliance, and Skype for Business, as well as related Client Access Licenses (CAL); and Skype, Outlook.com, and OneDrive. It also provides LinkedIn that includes Talent and marketing solutions, and subscriptions; and Dynamics 365, a set of cloud-based and on-premises business solutions for small and medium businesses, large organizations, and divisions of enterprises. The company's Intelligent Cloud segment licenses SQL and Windows Servers, Visual Studio, System Center, and related CALs; GitHub that provides a collaboration platform and code hosting service for developers; and Azure, a cloud platform. It also provides support services and Microsoft consulting services to assist customers in developing, deploying, and managing Microsoft server and desktop solutions; and training and certification to developers and IT professionals on various Microsoft products. The company's More Personal Computing segment offers Windows OEM licensing and other non-volume licensing of the Windows operating system; Windows Commercial comprising volume licensing of the Windows operating system, Windows cloud services, and other Windows commercial offerings; patent licensing; Windows Internet of Things; and MSN advertising. It also provides Microsoft Surface, PC accessories, and other intelligent devices; Gaming, including Xbox hardware, and Xbox software and services; video games and third-party video game royalties; and Search, including Bing and Microsoft advertising. The company sells its products through distributors and resellers; and directly through digital marketplaces, online stores, and retail stores. It has strategic partnerships with Humana Inc. and Nokia. The company was founded in 1975 and is headquartered in Redmond, Washington.", 
    'city': 'Redmond', 'phone': '425-882-8080', 'state': 'WA', 'country': 'United States', 'companyOfficers': [], 'website': 
    'http://www.microsoft.com', 'maxAge': 1, 'address1': 'One Microsoft Way',
     'fax': '425-706-7329', 'industry': 'Software—Infrastructure', 'previousClose': 149.7, 'regularMarketOpen': 152.44, 
    'twoHundredDayAverage': 153.86584, 'trailingAnnualDividendYield': 0.012959252000000001, 'payoutRatio': 0.32930002, 
    'volume24Hr': None, 'regularMarketDayHigh': 158.25,
     'navPrice': None, 'averageDailyVolume10Day': 73927350,
     'totalAssets': None, 'regularMarketPreviousClose': 149.7, 'fiftyDayAverage': 162.70589, 'trailingAnnualDividendRate': 1.94,
     'open': 152.44, 'toCurrency': None, 'averageVolume10days': 73927350, 'expireDate': None, 'yield': None, 'algorithm': None, 
    'dividendRate': 2.04, 'exDividendDate': 1589932800, 
    'beta': 1.091844, 'circulatingSupply': None, 'startDate': None, 'regularMarketDayLow': 150.3, 'priceHint': 2, 'currency': 'USD', 'trailingPE': 27.509142, 'regularMarketVolume': 19627913,
     'lastMarket': None, 'maxSupply': None, 'openInterest': None, 'marketCap': 1201223368704, 'volumeAllCurrencies': None,
     'strikePrice': None, 'averageVolume': 47615782, 'priceToSalesTrailing12Months': 8.947727, 'dayLow': 150.3,
     'ask': 157.71, 'ytdReturn': None, 'askSize': 1800,
     'volume': 19627913, 'fiftyTwoWeekHigh': 190.7, 
    'forwardPE': 25.390675, 'fromCurrency': None,
     'fiveYearAvgDividendYield': 2, 'fiftyTwoWeekLow': 118.1, 'bid': 157.69, 'tradeable': True, 'dividendYield': 0.013099999000000001,
     'bidSize': 1100, 'dayHigh': 158.25, 'exchange': 'NMS',
     'shortName': 'Microsoft Corporation', 'longName': 'Microsoft Corporation', 'exchangeTimezoneName': 'America/New_York', 'exchangeTimezoneShortName': 'EDT',
     'isEsgPopulated': False, 'gmtOffSetMilliseconds': '-14400000', 'quoteType': 'EQUITY', 'symbol': 'MSFT',
     'messageBoardId': 'finmb_21835', 'market': 'us_market',
     'annualHoldingsTurnover': None, 'enterpriseToRevenue': 8.131, 'beta3Year': None, 'profitMargins': 0.33016,
     'enterpriseToEbitda': 17.817, '52WeekChange': 0.25777185, 'morningStarRiskRating': None,
     'forwardEps': 6.22, 'revenueQuarterlyGrowth': None,
     'sharesOutstanding': 7606049792, 'fundInceptionDate': None, 'annualReportExpenseRatio': None, 'bookValue': 14.467, 'sharesShort': 55155176, 'sharesPercentSharesOut': 0.0073, 'fundFamily': None, 'lastFiscalYearEnd': 1561852800,
     'heldPercentInstitutions': 0.74407, 'netIncomeToCommon': 44323000320, 'trailingEps': 5.741, 'lastDividendValue': None,
     'SandP52WeekChange': -0.11360252, 'priceToBook': 10.916568, 'heldPercentInsiders': 0.01421, 'nextFiscalYearEnd': 1625011200, 'mostRecentQuarter': 1577750400,
     'shortRatio': 0.91, 'sharesShortPreviousMonthDate': 1581638400, 'floatShares': 7495074784, 'enterpriseValue': 1091541204992,
     'threeYearAverageReturn': None, 'lastSplitDate': 1045526400, 'lastSplitFactor': '2:1', 'legalType': None,
     'morningStarOverallRating': None, 'earningsQuarterlyGrowth': 0.383, 'dateShortInterest': 1584057600, 
    'pegRatio': 1.88, 'lastCapGain': None,
     'shortPercentOfFloat': 0.0073, 'sharesShortPriorMonth': 56193866, 'category': None, 'fiveYearAverageReturn': None, 
    'regularMarketPrice': 152.44, 'logo_url': 'https://logo.clearbit.com/microsoft.com'}
    

    我々はデータを得た.次に、イベントハブでそれを保存🤩
    import asyncio
    from azure.eventhub.aio import EventHubProducerClient
    from azure.eventhub import EventData
    import yfinance as yf
    
    
    async def run(stocksCodesList):
        print('Start Batch for stocks: \n',stocksCodesList)
        # Connection string 
        conn_str_value = "EVENT HUBS CONNECTION STRING - bad security practice"
    
        # Create a producer client to send messages to the event hub.
        producer = EventHubProducerClient.from_connection_string(conn_str_value)
    
        async with producer:
            # Create a batch -  - notice the Await !
            event_data_batch =  await producer.create_batch()
            for stockCode in stocksCodesList:
                #Get stock info
                stockInfo = yf.Ticker(stockCode).info
                # Add events to the batch.
                event_data_batch.add(EventData(stockInfo))
    
            # Send the batch of events to the Event hubs. - notice the Await!
            await producer.send_batch(event_data_batch)
    
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run(["MSFT"]))
    loop.close()
    
    
    これを壊しましょう、ここで、我々は既存のeventhubsコンポーネントにリンクして、製作者にそれを尋ねました.conn_str_value = "EVENT HUBS CONNECTION STRING" - - 悪いセキュリティ練習!producer = EventHubProducerClient.from_connection_string(conn_str_value)

    NOTICE! Providing private links or any secure information in plaintext directly in code is a BAD security practice. The upcoming section demonstrates how to do it with security in mind.


    それから、async with producer: この呼び出しはコルーチンを作成し、このコードブロック内のすべてがコルーチンで発生します.Coroutineは非先取りマルチタスクのためのサブルーチンです.Eventhubsプロデューサーがアクションを返さないので、我々はそれを非同期通信を作成するために活用します.したがって、我々は同期通信の必要がないという事実を活用することができます.同期通信はシステムを遅くする傾向がある.event_data_batch = await producer.create_batch() - プロデューサーはWAITキーワードでバッチを作成します.現在のサブルーチンはバッチが作成されるのを待ち、次の行には続かないことを意味します.for stockCode in stocksCodesList: ストックリストのリスト上のこのループでは、情報を抽出し、バッチに追加します.await producer.send_batch(event_data_batch) - それがすべてのデータがeventhubsに蓄積したバッチを送るものであるので、この呼び出しは重要です.
    オーライ!私たちはほとんど終わった.
    最後の部分は、仕事をし、安全である間、すべてです.
    それを行うには、キーヴォールトを活用します.
    キーVaultを使用して、我々はAzureで動作するときに我々のために利用可能なハードウェアセキュリティでキー値、秘密、および証明書を格納します.
    まず最初に、文字列接続をキーVaultに格納します.Here クイック写真チュートリアルです.
    この段階の後に、キーVault名とキー秘密を識別するキー名-接続文字列があります.

    第二に、サービスプリンシパルを作成することです
    サービスの校長-我々は、キーのVaultと自分自身を識別するためにアイデンティティを持つアプリケーションを提供するためにこれを使用します.キーVault(または他のサービスを使用)このアプリケーションが持っている資格情報をチェックし、それが秘密にアクセスすることができれば、はい、それは安全な方法で秘密を使用してアプリケーションを提供します.そうでなければ、このプロセス全体が失敗する.
    どうやって?
    コマンドでサービスプリンシパル( SP )を作成します.
    az ad sp create-for-rbac --skip-assignment --name { Event Hubs Sender App SP }
    
    置換{ Event Hubs Sender App SP } 実際の名前で.
    あなたはこのような情報を保存し、この情報を保存します.
    {
      "appId": "00000000-0000-0000-0000-000000000000",
      "displayName": "{given name}",
      "name": "http://{given name}",
      "password": "00000000-0000-0000-0000-000000000000",
      "tenant": "00000000-0000-0000-0000-000000000000"
    }
    
    キーVault画面で、アクセスコントロールに移動します➡️ 役割課題➡️ 追加➡️ 役割の下で役割を選ぶ➡️ 以下の図を参照してください.

    すべてが動作するように、SP資格情報を使用して環境を設定する必要があります.
    export AZURE_CLIENT_ID="http://{given name}"
    export AZURE_CLIENT_SECRET="00000000-0000-0000-0000-000000000000"
    export AZURE_TENANT_ID="00000000-0000-0000-0000-000000000000"
    

    Remember n0t to store those credentials in source contr0l!


    コードを加えましょう!


    安全なコーディング部分、ここではキーVaultへの呼び出しを扱い、接続文字列を安全に取得します.
    from azure.keyvault.secrets import SecretClient
    from azure.identity import DefaultAzureCredential
    
    # Get connection string from vault
    credential = DefaultAzureCredential()
    keyVaultName = "{your key vault name}"
    keyName = "{your key name}"
    KVUri = "https://" + keyVaultName + ".vault.azure.net"
    
    client = SecretClient(vault_url=KVUri, credential=credential)
    conn_str_value = client.get_secret(keyName).value
    
    DefaultAzureCredential アプリケーションを識別するためのマシン上で有効な資格情報を検索すると、我々は以前に定義されたパラメータを探します.これはvaultのアクセストークンを提供できるオブジェクトを返します.client = SecretClient(vault_url=KVUri, credential=credential) - 暗号化されたキー値を要求する秘密のクライアントを作成します.conn_str_value = client.get_secret(keyName).value - 秘密を取得するためにクライアントを使用して、この時点ですべてが暗号化され、キーを印刷しようとしても、実際の値が表示されないことに注意してください.

    終わり。


    このチュートリアルでは、Yahoo Finance APIの呼び出し方法、コンダ環境の設定方法、イベントハブの作成者の作成、キーVaultのキーの確保方法を学びました.あなたは安全で、出版者/加入者サービスにデータを摂取する準備ができています!

    もっと学ぶ💡


  • Event-driven architecture スタイル
  • Lambda architecture
  • EventHubs Capture
  • Keyvault for python
  • すべての方法を読んでいただきありがとうございます!私はあなたが楽しんで、このチュートリアルから学んだと思います.

    何か考えはありますか。質問?懸念考え?私をpingします。