【初心者向け】Pythonライブラリの仕組み

2023年5月21日 広告

ライブラリは何も意識せずとも利用できる素晴らしいツールです。

更にステップアップできるよう、普段使っている代表的なコードを使ってライブラリの仕組みを解説しました。

初心者向けとはいえ、何となくでもpip installfrom sklearn importimport matplotlib.pyplot as pltなど使ってみたことがある方に向けて記載しています。

ライブラリの種類

ライブラリには標準ライブラリと外部ライブラリの2種類があります。

標準ライブラリ

標準ライブラリは、Pythonと同時にインストールされる公式のライブラリです。

例えば以下のようなライブラリがあります。

  • math:様々な数学計算ができるようになる
  • random:ランダムな値を生成できる
  • os:ファイル操作やディレクトリ操作ができる
  • datetime:日付や時間が操作できる

標準ライブラリは想像以上の数がありますので公式ドキュメントを確認してみてください。

外部ライブラリ

外部ライブラリは、コミュニティや企業によって開発された非公式のライブラリです。

例えば以下のようなライブラリがあります。

  • Numpy:高速な数値計算ができる
  • Pandas:テーブルデータを自由に扱える
  • Matplotlib:様々なグラフが描ける
  • scikit-learn:簡単に機械学習が実行できる

外部ライブラリを活用することで、より高度な機能や専門的な分野での開発が可能となり、Pythonの活用範囲が大幅に広がります。

Pythonの利用が盛んな理由に、この外部ライブラリの豊富さが挙げられます。

例に挙げたNumpyやPandas、Matplotlib、scikit-learnは当たり前のように使われていますが、実は外部ライブラリです。

後半で解説しますが、多くの外部ライブラリはPyPI(Python Package Index)からダウンロードできます。

(補足)そもそもライブラリって……?

ライブラリの定義は、実は明確なものがありません。

以降で紹介する関数やクラス、モジュール、パッケージのような、他のプログラムから呼び出されるものを総称してライブラリと表現する場合もあります。

一方で複数のパッケージを1つにまとめたものをライブラリと表現する場合もあります。

難しく考えず、「様々な機能を簡易に使える便利なもの」と考えるだけでも良いと思います。

ライブラリの構造

ライブラリはいくつかの要素に分解できます。

モジュール

モジュールはPythonファイル(.py)を意味します。

このモジュールを基本単位として意識すれば理解しやすくなります。

モジュールを別のpythonプログラムで使う場合はimportで呼び出して使うことができます。

例えばランダムな値を生成できるrandomモジュールを使う場合は以下のように記述します。

import random

このインポートしたrandomモジュールの参照元は以下のようにして調べられます。

random.__file__

例えば「C:\Users\……\lib\random.py」と出力されます。

つまり、「C:\Users\……\lib」に保存されたrandom.pyというPythonファイル(=モジュール)をインポートして別のPythonファイルで使えるようにしたと解釈できます。

ちなみにrandomモジュールは標準ライブラリですので、公式ドキュメントで解説を、GitHubでソースコードを読むことができます。

中身を見るとバージョン3.11においては904行で構成されています。

このコードを自分で書かなくて良いと考えると非常にありがたいですね。

(予備知識)関数、クラス

先に解説したモジュールはPythonファイルですので、関数やクラスで構成されています。

関数は特定のタスクを実行する一連のプログラムのまとめたものです。

Pythonではdefを用いて関数を定義し、例えば以下のように記載します。

def add_numbers(num1, num2):
    return num1 + num2

例ではnum1num2を足し算するadd_numbers関数を作りました。

このadd_numbers関数は以下のようにして利用できます。

result = add_numbers(3, 5)
print(result)  # 8が出力される

またクラスは特定の役割を持つ関数や変数を集めたものです。

Pythonではclassを用いてクラスを定義し、クラス内で定義された関数はメソッドと呼ばれます

今度は足し算の関数と引き算の関数をまとめたクラスを作成してみます。

class Calculator:
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def add(self):
        return self.num1 + self.num2

    def subtract(self):
        return self.num1 - self.num2

クラス内の関数はメソッドと呼びますので、Calculatorクラスにはaddメソッドとsubtractメソッドが含まれています。

詳細は割愛しますが、クラスが呼び出されたときに自動的に実行される__init__メソッドも含まれています。

このCalculatorクラスは以下のようにして利用します。

calculator = Calculator(7, 5)
add_result = calculator.add()
subtract_result = calculator.subtract()
print(add_result)      # 12が出力される
print(subtract_result) # 2が出力される

関数、クラスの例

例えばrandomモジュールのrandint関数は以下のように記載されています(ソースコード)。

class Random(_random.Random):

(省略)

    def randint(self, a, b):
        """Return random integer in range [a, b], including both end points.
        """
    
        return self.randrange(a, b+1)

整理すると、randomモジュール(random.py)の中にはRandomクラスがあり、そこにはrandintメソッド(≒関数)が定義されています

このrandintメソッドを使用しています。

モジュールで定義された関数や変数はモジュール名.関数名()で呼び出せます。

randomモジュールのrandint関数を使う場合は以下のように利用します。

# 1~10の数値がランダムで1つ出力される
import random
num = random.randint(1,10)
print(num)

randomモジュールのうち、randint関数のみ使いたい場合は以下のような形でインポートも可能です。

その場合は毎回random.randint()と入力する必要がなくなります。

from random import randint
num = randint(1,10)
print(num)

同様に考えると、random.random()とややこしい記載のコードでもrandomモジュールのrandom関数を利用していると理解できます。

# 0.0から1.0の範囲でfloat型の値が出力される
import random
num = random.random()
print(num)

ただし必ずしもrandomモジュール(random.py)の中で直接randomメソッド(≒関数)が定義されているわけではありません。

先と同様にソースコードを確認してみます。

import _random

(省略)

class Random(_random.Random):

Randomクラスの括弧内に_random.Randomと記載されています。

これはクラスの継承と呼ばれ、別のクラスから関数や変数を受け取っています。

実は、事前にimport _randomでインポートした_randomモジュールのRandomクラスからrandomメソッド(≒関数)を受け取っています。

そのためrandomモジュール(random.py)の中で直接randomメソッド(≒関数)が定義されていませんでした。

このあたりの話はややこしくて今は理解しづらいと思われます。

ひとまずは何がモジュールで何が関数なのかイメージ出来るようになっていれば問題ありません。

パッケージ

パッケージは、複数のモジュール(.py)をまとめたものです。

関連性のあるモジュールをひとまとめにすることで、プログラムの構造が整理され、再利用性やメンテナンス性が向上します。

パッケージ化するためには、「__init__.py」というファイルが必要で、インポート時に行うパッケージの初期化処理が記述されています。

この「__init__.py」ファイルがあることで、Pythonはそのディレクトリをパッケージとして認識します。

初期化の例として、パッケージ内で共通して利用する変数の設定や、パッケージ内の特定のモジュールを自動的にインポートする処理を記述することができます。

ライブラリ

ライブラリは、複数のパッケージをまとめたものです。

関数やクラス、モジュール、パッケージのような、他のプログラムから呼び出されるものを総称してライブラリと表現する場合もあります。

機械学習が扱えるscikit-learnを例に紹介します。

まずはファイルの場所を確認します。

import sklearn
sklearn.__file__

先のrandomモジュールにおいては「C:\Users\……\random.py」でしたが、scikit-learnなどパッケージでは初期化ファイルを指して「C:\Users\……\sklearn\__init__.py」と表示されます。

このsklearnフォルダ内を確認すると、普段よく使用するパッケージが見つかります。

  • datasets:データセットを読み込みできる
  • model_selection:学習データとテストデータに分割できる
  • preprocessing:データの前処理ができる

上記3つのパッケージのフォルダ内を見てみると、それぞれ初期化ファイルである__init__.pyが見つかります。

つまり、scikit-learnライブラリはdatasetsやmodel_selection、preprocessingといったパッケージを組み合わせたライブラリです。

データ量が多いことから、インポートするときはscikit-learn全てをインポートするのではなく、fromを使い一部のみを指定してインポートします。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

ライブラリの注意点

ライブラリを使用する際には、いくつかの注意点があります。

importの記述方法

ライブラリを使用する際、適切なインポート方法を用いることが重要です。

代表的なグラフ描画ライブラリのmatplotlibでは、よくインポート時に以下のコマンドでインポートします。

import matplotlib.pyplot as plt

import matplotlibではないのでしょうか?

それはimport matplotlibと記述しても、matplotlib内のpyplotモジュールは利用できないためです。

import matplotlibimport matplotlib.pyplot as pltで読み込み先を確認します。

import matplotlib
matplotlib.__file__

例えば「C:\Users\……\lib\site-packages\matplotlib\__init__.py」と出力されます。

import matplotlibでは__init__.pyファイルが読み込まれました。

import matplotlib.pyplot as plt
plt.__file__

例えば「C:\Users\……\lib\site-packages\matplotlib\pyplot.py」と出力されます。

import matplotlib.pyplot as pltではpyplot.pyファイルが読み込まれました。

基本的に多くのライブラリでは、__init__.pyファイルにパッケージ内の他のモジュールをインポートするようになっています。

これにより、パッケージをインポートしただけでも、必要なモジュールが自動的にインポートされます。

ここでmatplotlibの__init__.pyファイルを確認すると、様々なライブラリをインポートしていることが分かります(ソースコード)。

import atexit
from collections import namedtuple
from collections.abc import MutableMapping
import contextlib
import functools
import importlib
import inspect
from inspect import Parameter
import locale
import logging
import os
from pathlib import Path
import pprint
import re
import shutil
import subprocess
import sys
import tempfile
import warnings

import numpy
from packaging.version import parse as parse_version

# cbook must import matplotlib only within function
# definitions, so it is safe to import from it here.
from . import _api, _version, cbook, _docstring, rcsetup
from matplotlib.cbook import sanitize_sequence
from matplotlib._api import MatplotlibDeprecationWarning
from matplotlib.rcsetup import validate_backend, cycler

numpyやosなど見覚えのあるライブラリもあります。

しかしmatplotlibをインポートした際の__init__.pyファイルにはfrom . import pyplotimport matplotlib.pyplotの記述がありません。

そのためmatplotlib.pyplotと明示してインポートしなければ使用できません。

このように、パッケージ全体をimportしても読み込めないモジュールがあることは覚えておかなければなりません。

バージョン管理

Pythonライブラリを使用する際、バージョンに注意することが重要です。

ライブラリのバージョンが異なると、仕様が変わりプログラムが正常に動作しない場合があります。

様々なアプリケーションを作ってみるなどしてバージョン管理する場合には、仮想環境を使用することが推奨されます。

例えばvenvを使って簡単に仮想環境構築は可能です。

ライブラリの依存関係

実はライブラリには依存関係があります。

言い換えると、あるライブラリを使うとき、別のライブラリを裏では使っているということです。

matplotlibの__init__.pyファイルを確認したときにもnumpyはじめ多くのライブラリがインストールされていました。

注意してみると、pipでライブラリをインストールするときに、指定したライブラリ以外にも様々なライブラリが自動でインストールされています

当然、ライブラリ同士のバージョンには適合するものとしないものがあります。

意図しない不具合を避けるため、先に解説した仮想環境の構築などでライブラリのバージョンを管理します。

悪意のあるライブラリ

Pythonの豊富なライブラリが開発を容易にする一方で、悪意のあるライブラリにも注意が必要です。

悪意のあるライブラリとは、意図的にセキュリティ上のリスクを持ち込んだり、ユーザーのデータを盗んだりするような機能を含んでいるライブラリです。

これらのライブラリは、一見正規のライブラリに似せて作られることが多く、名前が似ていたり、説明文が正規のライブラリと同じだったりするため、見分けるのが難しい場合があります。

そのため、ライブラリを選択する際には以下の点に注意してください。

  • 公式ドキュメントや有名な技術ブログで推奨されているライブラリを利用する
  • ライブラリのダウンロード元が信頼できるか確認する(公式サイトやGitHubの公式リポジトリなど)
  • ライブラリのスター数やフォーク数、コミット履歴など、信頼できる開発者によってメンテナンスされていることを確認する

便利とはいえ、良し悪しが判断できない場合、マイナーなライブラリは使わない方が安全です。

参考資料

Python 3.11.3 ドキュメント

cpython GitHub Repository - lib directory​

Matplotlib GitHub Repository - lib directory

オススメ書籍

・化学のためのPythonによるデータ解析・機械学習入門

データ分析に必要な最低限の知識を解説したうえで、化学プラントで得られるデータの扱い方が紹介されています。
脱ブタン塔や排煙脱硝装置を例に取り上げられておりイメージしやすくなっています。

化学のためのPythonによるデータ解析・機械学習入門
化学のためのPythonによるデータ解析・機械学習入門

www.amazon.co.jp

・Pythonによる時系列分析: 予測モデル構築と企業事例

プロセス製造において時系列データの分析は欠かせません。
どのように時系列予測モデルを構築し、ビジネスへ活用していくかを詳細なPythonコードとともに解説してくれます。

Pythonによる時系列分析: 予測モデル構築と企業事例
Pythonによる時系列分析: 予測モデル構築と企業事例

www.amazon.co.jp

・PyCaretで学ぶ 機械学習入門

機械学習モデルを構築するのは想像以上に手間がかかります。
その一連の作業を自動化できるPyCaretというライブラリの使い方が分かりやすく解説されています。

PyCaretで学ぶ 機械学習入門
PyCaretで学ぶ 機械学習入門

www.amazon.co.jp

関連記事

仮想環境の作り方
Pythonプログラムの簡単な動かし方
記事への問い合わせはこちら

-データサイエンス
-

//