Pythonのプログラム中で、kaggleパッケージをインポートして、コマンドラインではなくコードからKaggle APIにアクセスしてみます。役に立つかな?
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
前回は、Kaggleが提供するkaggleパッケージをインストールして、Visual Studio Code(以下、VS Code)の統合ターミナルからコマンドラインを使ってKaggle APIにアクセスしてみました。今回はkaggleパッケージを使ってPythonのコードからKaggle APIにアクセスしてみます。
と書いたのはよいのですが、正直、コマンドラインを使えば十分じゃないか? という気にはなります。なお、Kaggle APIのアクセスには何らかのリミットが設けられているようです。使いすぎにはご注意ください。[かわさき]
意見が違って面白いですが、私の場合は、結局、リーダーボードなど見たりするので、基本的な作業はKaggle Webサイト上で行うのが一番快適だと感じています。
一方で、「Submissionの自動化」だけに限定してKaggle APIが便利だと感じています。Submission時のメッセージもコードで自由にカスタマイズできるので、コマンドよりも扱いやすいです。Submissionは何度も行う作業ですが、データセットのダウンロードなどは一度切りの作業なので、Kaggle APIだけでなくコマンドを使うことにもあまりメリットを感じていないですね。
とはいえ、人によっては全く違う意見かもしれません。あくまで僕個人の感想なので、参考程度で見ていただけるとうれしいです。冒頭からコメントを書きすぎですね。ごめんなさい。[一色]
前回も述べましたが、Kaggle APIを使うには「pip3 install kaggle」などのコマンドを実行して、kaggleパッケージをインストールしておく必要があります。このときに、Windows環境でkaggleコマンドを使うのであれば、該当するコマンドにパスを通しておく必要があります。簡単なのは仮想環境を作り有効化した上で、そこにkaggleパッケージをインストールすることです。ここでは詳細な手順は省略します(今回はWindows環境で仮想環境を作成し、そこにkaggleパッケージをインストールしています)。
加えて、クレデンシャルを取得しておく必要もあります。これには、Kaggle公式サイトで自分のアカウントページを表示して、[API]セクションで[Create New API Token]ボタンをクリックします。
ボタンをクリックすると、kaggle.jsonファイルがダウンロードされるので、これを「~/.kaggle/kaggle.json」(macOSを含むUNIX系のOS)または「C:\Users\<ユーザー名>\.kaggle\kaggle.json」(Windows)として保存しておきましょう。
この手順については前回の記事でもう少し詳しく触れているので、そちらも参考にしてください。
PythonのコードからKaggle APIにアクセスするには、kaggleパッケージをインポートして、そこからKaggleAPIクラスのインスタンスメソッドを呼び出す形になります。簡単なのは次のように、kaggleパッケージが提供するapiオブジェクトをインポートすることです。
from kaggle import api
print(type(api)) # <class 'kaggle.api.kaggle_api_extended.KaggleApi'>
このapiオブジェクトはkaggleパッケージの__init__.pyファイルで定義されていて、認証まで済んでいます。
あるいは次のように明示的にKaggleApiクラスのインスタンスを生成してもよいでしょう。この場合にはauthenticateメソッドを呼び出して、アカウントの認証を行っておく必要があります。
from kaggle import KaggleApi
api = KaggleApi()
api.authenticate()
print(type(api)) # <class 'kaggle.api.kaggle_api_extended.KaggleApi'>
KaggleApiクラスのインスタンスを入手して認証が済めば、後はこのインスタンスのメソッドを呼び出すだけです。
よく使いそうなものをざっくりとまとめておきましょう。
メソッド | 説明 |
---|---|
competitions_list | コンペティション(以下、コンペ)一覧の取得 |
competition_list_files | 指定したコンペで用意されているデータファイル一覧の取得 |
competition_download_file | 指定したコンペの指定したデータファイルをダウンロード |
competition_download_files | 指定したコンペの全てのデータファイルをダウンロード |
competition_submit | 指定したファイルを推測結果としてKaggleにサブミット |
dataset_list | Kaggleに登録されたデータセットの一覧を取得 |
dataset_metadata | データセットのメタデータをダウンロード |
dataset_list_files | データセットに含まれるファイルの一覧を取得 |
dataset_download_files | 指定したデータセットの全ファイルをダウンロード |
dataset_download_file | 指定したデータセットの指定したファイルをダウンロード |
kernels_list | カーネル一覧の取得 |
kernels_pull | カーネルからファイルをダウンロード |
kernels_output | Kaggle上で直近にカーネルを実行した結果を取得 |
kernels_push | カーネルへファイルをアップロード |
KaggleApiクラスが提供するメソッド(一部) |
これらは主にkaggleコマンドに対応するものとなっていますが、competitionsとcompetitionのように単数形と複数形のメソッドがあることには注意してください(複数形は対象の数が不定の場合で、単数形は引数で対象を絞るといった違いがあるようです)。また、筆者の環境(macOS/Windows)ではkernels_pushメソッドは例外が発生したので動作の確認はできていません。
というわけで、これらのAPIをPythonコードから呼び出してみることにします。ここでは、以下に示すセルが3つだけのノートブックを用意しました(Kaggle APIにアクセスすることが重要であり、Kaggleのコードはどうでもいいですよね)。
Titanicコンペのデフォルトのデータセットと、それを基に自分が作成したデータセットがあることには注意してください。
では、Titanicコンペを検索して、そこで必要になるデフォルトのデータセットをダウンロードしてみましょう。
既に述べたように、コンペの一覧を取得するにはcompetitions_listメソッドを使います。
competitions_list(group=None, category=None, sort_by=None, page=1, search=None)
searchパラメーターには検索したコンペに含まれそうな綴(つづ)りを、categoryパラメーターにはgettingStarted/research/recruitment/masters/playgroundなどの語を与えます。以下に例を示します。
competitions = api.competitions_list(search='titanic')
for competition in competitions:
print(competition.ref)
VS Codeの統合ターミナル(REPL環境)で実行した結果を以下に示します。
Pythonコードを見ると、Pylanceが「ref」なんて属性ないよ、といっていますがあるんです。
competitions_listメソッドの戻り値はKaggle APIが提供するCompetitionクラスのインスタンスを要素とするリストです。「dir(competitions[0])」などを実行すれば分かりますが、このオブジェクトにはさまざまな属性があります(実際には以下のコードでアクセスしているよりも多くの属性があります)。そこで以下のようにして、「kaggle competitions list」コマンドと似た出力を得ることもできます。
result = [
'ref deadline category reward teamCount Entered',
'----------------- ---------- --------------- --------- --------- -------'
]
for competition in competitions:
r = competition.ref
d = str(competition.deadline).split(' ')[0]
c = competition.category
rw = competition.reward
t = competition.teamCount
u = competition.userHasEntered
s = f'{r:17} {d:10} {c:15} {rw:9} {t:9} {u:7}'
result.append(s)
print('\n'.join(result))
実行結果を以下に示します。
ここでも怒られていますが、大丈夫。それらの属性、ありますから。
wwww(わらわらわらわら)
コンペ情報で必要になるのは、ref属性です(上の一覧で一番左に表示されています)。コンペで用意されているデータセットをダウンロードするときには、これを指定します。というわけで、competition_list_filesメソッドでデータセットを検索してみましょう。このメソッドには、今述べたコンペを識別する名前を指定します。
competition = competitions[0].ref
file_list = api.competition_list_files(competition)
for file in file_list:
print(file.name)
実行結果を以下に示します。
おなじみの3つのファイルが得られました(戻り値はKaggleが提供するFileクラスのインスタンスを要素とするリストです)。
データファイルをダウンロードするには、competition_download_fileメソッドかcompetition_download_filesメソッドを使用します。個別にファイルをダウンロードするなら前者を、ZIPファイルにまとめてダウンロードするなら後者を使えばよいでしょう。ダウンロードするコードは以下の通りです。
# competition_download_fileメソッド
for file in file_list:
api.competition_download_file(competition, file.name, path='input/titanic')
# competition_download_filesメソッド
import shutil
api.competition_download_files(competition, path='input')
shutil.unpack_archive('input/titanic.zip', 'input/titanic')
どちらのメソッドでもコンペ名を最初に指定します。competition_download_fileメソッドでは次にダウンロードするファイルを指定しますが、これには上で見たcompetition_list_filesメソッドの戻り値であるFileオブジェクトのname属性が使えます。pathにはダウンロード先のディレクトリを指定します。Kaggleのファイル配置と同じになるように気を付けましょう。
Copyright© Digital Advantage Corp. All Rights Reserved.