コース01-Python

017.外部ライブラリでの作業(Working with External Libraries)[Kaggle日本語訳]

  • LINEで送る

1,124 views

     

このレッスンでは、Pythonでのインポートについて説明し、不慣れなライブラリ(およびそれらが返すオブジェクト)を操作するためのヒントを提供し、演算子のオーバーロードについて少しだけPythonの本質を掘り下げます。

インポート

これまで、言語に組み込まれている型と関数について説明してきました。

しかし、Pythonの最も優れた点の1つ(特にデータサイエンティストの場合)は、Python用に作成された膨大な数の高品質のカスタムライブラリです。

これらのライブラリの一部は「標準ライブラリ」にあります。つまり、Pythonを実行しているどこにでもそれらを見つけることができます。 その他のライブラリは、常にPythonに同梱されていなくても、簡単に追加できます。
どちらの方法でも、インポートでこのコードにアクセスします。
例では、標準ライブラリから数学をインポートします。

数学はモジュールです。 モジュールは、他の誰かが定義した変数(必要に応じて名前空間)のコレクションです。 組み込み関数dir()を使用して、数学ですべての名前を確認できます。

これらの変数にはドット構文を使用してアクセスできます。 それらのいくつかは、math.piのような単純な値を参照します。

しかし、モジュールで見つけることのほとんどは、math.logのような関数です。

もちろん、math.logの内容がわからない場合は、help()を呼び出すことができます。

モジュール自体のhelp()を呼び出すこともできます。 これにより、モジュール内のすべての関数と値をまとめたドキュメント(およびモジュールの高レベルの説明)が得られます。 「出力」ボタンをクリックすると、数学のヘルプページ全体が表示されます。

その他のインポート構文

数学で関数を頻繁に使用することがわかっている場合は、短いエイリアスの下でそれをインポートして、入力を減らすことができます(ただし、この場合、「数学」はすでにかなり短くなっています)。

Pandas、Numpy、Tensorflow、またはMatplotlibなどの特定の一般的なライブラリでこれを行うコードを見たことがあるかもしれません。 たとえば、numpyをnpとしてインポートし、pandasをpdとしてインポートすることは一般的な規則です。

asは単にインポートされたモジュールの名前を変更します。 これは次のようなことと同じです。

mathモジュールのすべての変数を自分で参照できたら素晴らしいと思いませんか? つまり、math.piやmt.piの代わりにpiを参照するだけの場合はどうでしょうか。 良いニュース:私たちはそれを行うことができます。

import *は、モジュールのすべての変数に直接(ドット付きの接頭辞なしで)アクセスできるようにします。
悪い知らせ:何人かの純粋主義者はこれをすることについてあなたにつぶやくかもしれません。
さらに悪いことに、彼らは一種のポイントを持っています。

なに? しかし、それは以前に機能しました!
これらの種類の「スターのインポート」は、奇妙でデバッグが困難な状況につながる場合があります。
この場合の問題は、mathモジュールとnumpyモジュールの両方にlogと呼ばれる関数があるが、セマンティクスが異なることです。 numpy秒からインポートするため、そのログは数学からインポートしたログ変数を上書き(または「シャドウ」)します。

適切な妥協策は、各モジュールから必要な特定のものだけをインポートすることです。

サブモジュール

モジュールには、関数や値を参照できる変数が含まれていることがわかりました。 注意すべきことは、他のモジュールを参照する変数を持つこともできるということです。

したがって、上記のようにnumpyをインポートすると、ランダムな「サブモジュール」で関数を呼び出すには2つのドットが必要になります。

ああ行く場所、あなたが見るオブジェクト

したがって、6つのレッスンを終えると、int、float、bool、list、string、およびdictを使用したプロになります(正しいですか)。

それが本当だったとしても、それだけでは終わりません。 特殊なタスクのためにさまざまなライブラリを操作するとき、ライブラリは、操作するために学習する必要がある独自のタイプを定義していることがわかります。 たとえば、グラフ化ライブラリmatplotlibを操作する場合は、サブプロット、Figure、TickMarks、および注釈を表す、それが定義するオブジェクトと接触します。 パンダ関数はデータフレームとシリーズを提供します。

このセクションでは、奇妙な型を処理するためのサバイバルガイドを簡単に紹介します。

奇妙なオブジェクトを理解するための3つのツール

上のセルでは、numpy関数を呼び出すと「配列」が得られることがわかりました。 これまでにこのようなものを見たことはありません(とにかくこのコースにはありません)。 しかし、慌てないでください。ここで役立つ3つの使い慣れた組み込み関数があります。

1:type()(これは何ですか?)

2:dir()(それで何ができますか?)

3:help()(もっと教えてください)

(もちろん、オンラインドキュメントをチェックすることもできます)

演算子のオーバーロード

以下の式の値は何ですか?

なんてばかげた質問でしょう。 もちろん、それはエラーです。

しかし、どうですか…

Pythonは、インデックス作成とスライスのために、+、<、in、==、角かっこなど、コア構文の一部がどのように動作するかを厳密に監視していると考えるかもしれません。 しかし実際には、それは非常に実践的なアプローチを取ります。 新しい型を定義するときは、加算がどのように機能するか、またはその型のオブジェクトが他のオブジェクトと等しくなることの意味を選択できます。

リストの設計者は、リストを数値に追加することは許可されていないと判断しました。 numpy配列の設計者は、別の方法を採用しました(配列の各要素に番号を追加します)。

numpy配列がPython演算子と予期せず(または少なくともリストとは異なる方法で)相互作用する方法の例をさらにいくつか示します。

numpyのndarrayタイプは多次元データの操作に特化しているため、インデックス作成のための独自のロジックを定義し、タプルでインデックスを作成して各次元でインデックスを指定できるようにします。

1 + 1が2と等しくないのはいつですか?

物事はこれよりも奇妙になる可能性があります。 ディープラーニングに広く使用されているPythonライブラリであるtensorflowについて聞いたことがある(または使用している)かもしれません。 演算子のオーバーロードを多用します。

a + bは2ではなく、(tensorflowのドキュメントを引用するために)…

操作の出力の1つへのシンボリックハンドル。 その操作の出力の値を保持しませんが、代わりにTensorFlowtf.Sessionでそれらの値を計算する手段を提供します。

この種のことが可能であり、ライブラリは多くの場合、非自明または魔法のように見える方法で演算子のオーバーロードを使用するという事実に注意することが重要です。

Pythonの演算子がint、string、listに適用されたときにどのように機能するかを理解しても、tensorflow Tensor、numpy ndarray、またはpandasDataFrameに適用されたときにPythonの演算子がどのように機能するかをすぐに理解できるとは限りません。

たとえば、DataFrameを少し味わったら、次のような式が魅力的に直感的に見え始めます。

しかし、なぜそれが機能するのですか? 上記の例は、5つの異なるオーバーロードされた演算子のようなものを特徴としています。 それらの操作のそれぞれは何をしていますか? 物事がうまくいかなくなったときに答えを知るのに役立ちます。

それがすべてどのように機能するのか興味がありますか?

オブジェクトでhelp()またはdir()を呼び出して、二重アンダースコアが付いたこれらの名前が一体何なのか疑問に思ったことはありませんか?

これは、演算子のオーバーロードに直接関係していることがわかります。

Pythonプログラマーは、演算子が型に対してどのように動作するかを定義する場合、_ lt setattr_、またはcontainsなどの2つのアンダースコアで開始および終了する特別な名前のメソッドを実装します。一般に、この二重アンダースコア形式に従う名前は、Pythonにとって特別な意味を持ちます。

したがって、たとえば、[1、2、3]の式xは、実際にはリストメソッドcontainsを舞台裏で呼び出しています。これは(はるかに醜い)[1、2、3] ._ contains _(x)と同等です。

詳細を知りたい場合は、Pythonの公式ドキュメントを確認してください。このドキュメントには、これらの特別な「アンダースコア」メソッドの多くが記載されています。

これらのレッスンでは独自のタイプを定義することはしませんが(時間があれば!)、後で独自の素晴らしい、奇妙なタイプを定義する喜びを体験できることを願っています。

  • LINEで送る