Skip to content

ウェブソースとAPIからデータを取得する

Kotlin Notebookは、様々なウェブソースやAPIからデータにアクセスし、操作するための強力なプラットフォームを提供します。各ステップを可視化して明確にするための反復的な環境を提供することで、データ抽出と分析のタスクを簡素化します。これにより、慣れていないAPIを探索する際に特に役立ちます。

Kotlin DataFrameライブラリと組み合わせて使用すると、Kotlin NotebookはAPIへの接続やJSONデータの取得を可能にするだけでなく、包括的な分析と視覚化のためにこのデータを整形するのにも役立ちます。

Kotlin Notebookの例については、GitHubのDataFrameの例を参照してください。

始める前に

Kotlin NotebookはKotlin Notebookプラグインに依存しており、このプラグインはIntelliJ IDEAにデフォルトでバンドルされ、有効になっています。

Kotlin Notebookの機能が利用できない場合は、プラグインが有効になっていることを確認してください。詳細については、環境のセットアップを参照してください。

新しいKotlin Notebookを作成するには:

  1. File | New | Kotlin Notebook を選択します。

  2. Kotlin Notebookで、以下のコマンドを実行してKotlin DataFrameライブラリをインポートします。

    kotlin
    %use dataframe

APIからデータを取得する

Kotlin NotebookとKotlin DataFrameライブラリを使用してAPIからデータを取得するには、.read()関数を使用します。これは、CSVやJSONなどのファイルからデータを取得するのと似ています。ただし、ウェブベースのソースを扱う場合、生APIデータを構造化された形式に変換するために、追加のフォーマットが必要になる場合があります。

YouTube Data APIからデータを取得する例を見てみましょう。

  1. Kotlin Notebookファイル(.ipynb)を開きます。

  2. データ操作タスクに不可欠なKotlin DataFrameライブラリをインポートします。これはコードセルで以下のコマンドを実行して行います。

    kotlin
    %use dataframe
  3. YouTube Data APIへのリクエストを認証するために必要なAPIキーを新しいコードセルに安全に追加します。APIキーは認証情報タブから取得できます。

    kotlin
    val apiKey = "YOUR-API_KEY"
  4. パスを文字列として受け取り、DataFrameの.read()関数を使用してYouTube Data APIからデータを取得するロード関数を作成します。

    kotlin
    fun load(path: String): AnyRow = DataRow.read("https://www.googleapis.com/youtube/v3/$path&key=$apiKey")
  5. 取得したデータを各行に整理し、YouTube APIのページネーションをnextPageTokenで処理します。これにより、複数のページにわたってデータを収集できます。

    kotlin
    fun load(path: String, maxPages: Int): AnyFrame {
    
        // Initializes a mutable list to store rows of data.
        val rows = mutableListOf<AnyRow>()
    
        // Sets the initial page path for data loading.
        var pagePath = path
        do {
    
            // Loads data from the current page path.
            val row = load(pagePath)
            // Adds the loaded data as a row to the list.
            rows.add(row)
           
            // Retrieves the token for the next page, if available.
            val next = row.getValueOrNull<String>("nextPageToken")
            // Updates the page path for the next iteration, including the new token.
            pagePath = path + "&pageToken=" + next
    
            // Continues loading pages until there's no next page.
        } while (next != null && rows.size < maxPages) 
        
        // Concatenates and returns all loaded rows as a DataFrame.
        return rows.concat() 
    }
  6. 以前に定義したload()関数を使用してデータを取得し、新しいコードセルにDataFrameを作成します。この例では、Kotlinに関連するデータ、この場合は動画を、1ページあたり最大50件、最大5ページまで取得します。結果はdf変数に格納されます。

    kotlin
    val df = load("search?q=kotlin&maxResults=50&part=snippet", 5)
    df
  7. 最後に、DataFrameからアイテムを抽出し、連結します。

    kotlin
    val items = df.items.concat()
    items

データのクリーンアップと整形

データのクリーンアップと整形は、分析のためにデータセットを準備する上で非常に重要なステップです。Kotlin DataFrameライブラリは、これらのタスクに強力な機能を提供します。moveconcatselectparsejoinなどのメソッドは、データの整理と変換に役立ちます。

データがすでにYouTubeのData APIを使用して取得されている例を見てみましょう。目標は、詳細な分析のためにデータセットをクリーンアップし、再構築することです。

  1. データを再編成し、クリーンアップすることから始められます。これには、特定の列を新しいヘッダーの下に移動したり、明確にするために不要な列を削除したりすることが含まれます。

    kotlin
    val videos = items.dropNulls { id.videoId }
        .select { id.videoId named "id" and snippet }
        .distinct()
    videos
  2. クリーンアップされたデータからチャンクIDを抽出し、対応する動画の統計情報をロードします。これには、データをより小さなバッチに分割し、追加の詳細情報を取得することが含まれます。

    kotlin
    val statPages = clean.id.chunked(50).map {
        val ids = it.joinToString("%2C")
        load("videos?part=statistics&id=$ids")
    }
    statPages
  3. 取得した統計情報を連結し、関連する列を選択します。

    kotlin
    val stats = statPages.items.concat().select { id and statistics.all() }.parse()
    stats
  4. 既存のクリーンアップされたデータを新しく取得した統計情報と結合します。これにより、2つのデータセットが包括的なDataFrameにマージされます。

    kotlin
    val joined = clean.join(stats)
    joined

この例は、Kotlin DataFrameの様々な関数を使用してデータセットをクリーンアップ、再編成、および強化する方法を示しています。各ステップは、データを洗練し、詳細な分析により適したものにするように設計されています。

Kotlin Notebookでデータを分析する

Kotlin DataFrameライブラリの関数を使用して、データを正常に取得し、クリーンアップおよび整形した後、次のステップは、準備されたデータセットを分析して意味のある洞察を抽出することです。

データの分類にはgroupBy要約統計量の計算にはsummaxBy、データの順序付けにはsortByといったメソッドが特に役立ちます。これらのツールを使用すると、複雑なデータ分析タスクを効率的に実行できます。

groupByを使用して動画をチャンネル別に分類し、sumを使用してカテゴリごとの総視聴回数を計算し、maxByを使用して各グループで最新または最も視聴された動画を見つける例を見てみましょう。

  1. 参照を設定することで、特定の列へのアクセスを簡素化します。

    kotlin
    val view by column<Int>()
  2. groupByメソッドを使用して、channel列でデータをグループ化し、ソートします。

    kotlin
    val channels = joined.groupBy { channel }.sortByCount()

結果のテーブルでは、データをインタラクティブに探索できます。チャンネルに対応する行のgroupフィールドをクリックすると、その行が展開され、そのチャンネルの動画に関する詳細が表示されます。

行を展開して詳細を表示

左下のテーブルアイコンをクリックすると、グループ化されたデータセットに戻ることができます。

左下のテーブルアイコンをクリックして戻る

  1. aggregatesummaxByflattenを使用して、各チャンネルの総視聴回数とその最新または最も視聴された動画の詳細をまとめたDataFrameを作成します。

    kotlin
    val aggregated = channels.aggregate {
        viewCount.sum() into view
    
        val last = maxBy { publishedAt }
        last.title into "last title"
        last.publishedAt into "time"
        last.viewCount into "viewCount"
        // Sorts the DataFrame in descending order by view count and transform it into a flat structure.
    }.sortByDesc(view).flatten()
    aggregated

分析結果:

分析結果

より高度なテクニックについては、Kotlin DataFrameのドキュメントを参照してください。

次に行うこと