Pythonの基本#

Hide code cell content
# sysモジュールのインポート(詳細後述)
import sys

# pythonのバージョンを表示
sys.version
'3.11.6 | packaged by conda-forge | (main, Oct  3 2023, 11:57:02) [GCC 12.3.0]'

基本データ型#

ブール値#

Hide code cell content
# アニメ化されたかどうかを管理するフラグ
is_animated = True
Hide code cell content
is_animated
True
Hide code cell content
# 二つの文字列が等しいかどうかを判定
"工藤新一" == "江戸川コナン"
False

整数#

Hide code cell content
# 加算
1 + 1
2
Hide code cell content
# 減算
3 - 1
2
Hide code cell content
# 乗算
5 * 4
20
Hide code cell content
# 除算
5 / 4
1.25
Hide code cell content
# 整数除算
5 // 4
1
Hide code cell content
# 余り
5 % 4
1
Hide code cell content
# 特定のマンガ雑誌巻号の発売年を設定
year = 1991
# 単位年を設定
unit_years = 10

# 単位年で整数除算し、更に単位年を乗算することで年代にまとめる
year // unit_years * unit_years
1990
Hide code cell content
# ゲームパッケージの発売価格
price = 5800

# 1000で割った余りを算出
price % 1000
800

浮動小数点#

Hide code cell content
# マンガ各話の開始ページ数
page_start = 10

# マンガ雑誌巻号の最後のマンガ作品の終了ページ数
page_end_max = 468

# マンガ雑誌巻号内における開始ページの相対的な位置
page_start_position = page_start / page_end_max

# 変数の値を表示
page_start_position
0.021367521367521368

文字列#

Hide code cell content
# data/cm/input/cm_ce.csv内の例
mcname = "週刊少年ジャンプ"
miname = "週刊少年ジャンプ 2017年 表示号数33"
ccname = "鬼滅の刃"
cename = "第70話 人攫い"
Hide code cell content
# ccnameに格納されている文字列を確認
ccname
'鬼滅の刃'
Hide code cell content
# 改行も含めて文字列として格納できる
message = """
かんがえ
ると
いずれしけいになるか
てまねきしているあい
つにころされるだけだ。
しってい
る。おれは、キラのそんざいを。
えものにされる。
"""
Hide code cell content
# messageを縦読み(原作では横読み)
[x[0] for x in message.split()[::-1]]
['え', 'る', 'し', 'つ', 'て', 'い', 'る', 'か']
Hide code cell content
# 元の長すぎる列名、これでは図内に収まらない
col = "8話目までの平均掲載位置"

# {元の文字列}.replace({置換対象の文字列}, {置換後の文字列})
# 以下の例では、「8話目までの」という部分を「」と置換、つまり削除している
col.replace("8話目までの", "")
'平均掲載位置'
Hide code cell content
# 可視化対象とする各話数
min_nce = 8

# X軸のラベル名
x_label = f"{min_nce}話までの平均掲載位置"
# X軸のラベル名を表示
x_label
'8話までの平均掲載位置'
Hide code cell content
# 可視化対象とする各話数を変更
min_nce = 10

# X軸のラベル名
x_label = f"{min_nce}話までの平均掲載位置"
# X軸のラベル名を表示
x_label
'10話までの平均掲載位置'

データ構造#

リスト#

Hide code cell content
# 分析対象とするマンガ雑誌名一覧
MCNAMES = [
    "週刊少年ジャンプ",
    "週刊少年マガジン",
    "週刊少年サンデー",
    "週刊少年チャンピオン",
]
Hide code cell content
# MCNAMESに`週刊少年キング`を追加
MCNAMES.append("週刊少年キング")
# 更新後のMCNAMESを表示
MCNAMES
['週刊少年ジャンプ', '週刊少年マガジン', '週刊少年サンデー', '週刊少年チャンピオン', '週刊少年キング']
Hide code cell content
# MCNAMESから`週刊少年キング`を除外
MCNAMES.remove("週刊少年キング")
# 更新後のMCNAMESを表示
MCNAMES
['週刊少年ジャンプ', '週刊少年マガジン', '週刊少年サンデー', '週刊少年チャンピオン']
Hide code cell content
# MCNAMESと[`週刊少年キング`]を結合
MCNAMES + ["週刊少年キング"]
['週刊少年ジャンプ', '週刊少年マガジン', '週刊少年サンデー', '週刊少年チャンピオン', '週刊少年キング']
Hide code cell content
# 2番目の要素を取得
MCNAMES[1]
'週刊少年マガジン'

タプル#

Hide code cell content
# ポケットモンスター赤緑青で最初に選択できるポケモン一覧
starters = ("フシギダネ", "ヒトカゲ", "ゼニガメ")
Hide code cell content
# モンスター一覧を表示
starters
('フシギダネ', 'ヒトカゲ', 'ゼニガメ')
Hide code cell content
# startersにappendできるか挑戦
starters.append("ピカチュウ")
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[28], line 2
      1 # startersにappendできるか挑戦
----> 2 starters.append("ピカチュウ")

AttributeError: 'tuple' object has no attribute 'append'
Hide code cell content
# startersからフシギダネを除去できるか挑戦
starters.remove("フシギダネ")
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[29], line 2
      1 # startersからフシギダネを除去できるか挑戦
----> 2 starters.remove("フシギダネ")

AttributeError: 'tuple' object has no attribute 'remove'
Hide code cell content
# startersの2番目のポケモンを表示
starters[1]
'ヒトカゲ'
Hide code cell content
# startersの2番目のポケモンをリザードに変更
starters[1] = "リザード"
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[31], line 2
      1 # startersの2番目のポケモンをリザードに変更
----> 2 starters[1] = "リザード"

TypeError: 'tuple' object does not support item assignment

辞書#

Hide code cell content
# 列名の変更前後を対応付ける辞書を定義
cols_rename = {
    "mcname": "マンガ雑誌名",
    "ccname": "マンガ作品名",
    "crtname": "マンガ作者名",
}
Hide code cell content
# 辞書の中身を表示
cols_rename
{'mcname': 'マンガ雑誌名', 'ccname': 'マンガ作品名', 'crtname': 'マンガ作者名'}
Hide code cell content
# キーmcnameに対応する値を取得
cols_rename["mcname"]
'マンガ雑誌名'
Hide code cell content
# キーmcnameに対応する値を雑誌名に更新
cols_rename["mcname"] = "雑誌名"
# 更新結果を表示
cols_rename
{'mcname': '雑誌名', 'ccname': 'マンガ作品名', 'crtname': 'マンガ作者名'}
Hide code cell content
# {"cename": "マンガ各話名"}を追加
cols_rename["cename"] = "マンガ各話名"
# 更新結果を表示
cols_rename
{'mcname': '雑誌名', 'ccname': 'マンガ作品名', 'crtname': 'マンガ作者名', 'cename': 'マンガ各話名'}
Hide code cell content
# cols_renameと{"date": "発売日", "page_start_position": "掲載位置"}を結合
cols_rename.update({"date": "発売日", "page_start_position": "掲載位置"})
# 更新結果を表示
cols_rename
{'mcname': '雑誌名',
 'ccname': 'マンガ作品名',
 'crtname': 'マンガ作者名',
 'cename': 'マンガ各話名',
 'date': '発売日',
 'page_start_position': '掲載位置'}

集合#

Hide code cell content
# 勇者ヒンメル一行
himmels_party = {"ヒンメル", "ハイター", "アイゼン", "フリーレン", "フリーレン"}
# フリーレン一行
frierens_party = {"フリーレン", "フェルン", "シュタルク"}
Hide code cell content
# 勇者ヒンメル一行の構成員を確認
himmels_party
{'アイゼン', 'ハイター', 'ヒンメル', 'フリーレン'}
Hide code cell content
# フリーレン一行の構成員を確認
frierens_party
{'シュタルク', 'フェルン', 'フリーレン'}
Hide code cell content
# 和集合(二つの集合の全ての要素)
himmels_party | frierens_party
{'アイゼン', 'シュタルク', 'ハイター', 'ヒンメル', 'フェルン', 'フリーレン'}
Hide code cell content
# 積集合(二つの集合の両方に属する要素)
himmels_party & frierens_party
{'フリーレン'}
Hide code cell content
# 差集合(前者の集合に属する要素のうち、後者の集合に属さない要素)
himmels_party - frierens_party
{'アイゼン', 'ハイター', 'ヒンメル'}
Hide code cell content
# 対象差(二つの集合のうち片方にのみ属する要素)
himmels_party ^ frierens_party
{'アイゼン', 'シュタルク', 'ハイター', 'ヒンメル', 'フェルン'}

文法#

#によるコメント#

Hide code cell content
# これはコメントです
print("コメントは出力されません")

# print("このコードは実行されません")
print("このコードは実行されます")
コメントは出力されません
このコードは実行されます

条件分岐#

Hide code cell content
# マンガ作者数を表す変数
n_crt = 1
# 作業スタイルを保持する変数、初期値はNone
work_style = None

# もしクリエイター数が1ならば、単独制作と判断
if n_crt == 1:
    work_style = "単独制作"
# もしクリエイター数が1より大きければ、共同制作と判断
elif n_crt > 1:
    work_style = "共同制作"
# 上記の条件に当てはまらない場合(予期しない値の場合)は、エラーを発生させる
else:
    raise ValueError("不正なマンガ作者数です。")

# 作業スタイルを確認
work_style
'単独制作'

反復処理#

Hide code cell content
# forループを使って0から4までの数字を出力
for counter in range(5):
    # 現在のカウンターの値を出力
    print(counter)
0
1
2
3
4
Hide code cell content
# マンガ雑誌名を格納するリストを定義
mcnames = [
    "週刊少年ジャンプ",
    "週刊少年マガジン",
    "週刊少年サンデー",
    "週刊少年チャンピオン",
]

# mcnameの要素を一つずつ取り出して実行
for mcname in mcnames:
    # mcnameごとに集計し可視化
    # (実際には様々な処理を行うがprintで割愛)
    print(f"{mcname}に関する可視化")
週刊少年ジャンプに関する可視化
週刊少年マガジンに関する可視化
週刊少年サンデーに関する可視化
週刊少年チャンピオンに関する可視化
Hide code cell content
# 列数と行数の設定
cols = 2
rows = 2

# mcnamesの各要素に対してenumerateを使ってループ処理
for i, mcname in enumerate(mcnames):
    # 現在の要素の行位置を計算(1から始まるように+1)
    row = i // cols + 1
    # 現在の要素の列位置を計算(1から始まるように+1)
    col = i % cols + 1
    # mcnameとその位置(行と列)を含むテキストを作成
    text = f"{mcname}{row}行目, {col}列目):"

    # 最後の行であれば、X軸ラベル・目盛追加のメッセージを追加
    if row == rows:
        # (実際には様々な処理を行うがtextで割愛)
        text += "X軸ラベル・目盛追加、"
    # 最初の列であれば、Y軸ラベル目盛追加のメッセージを追加
    if col == 1:
        # (実際には様々な処理を行うがtextで割愛)
        text += "Y軸ラベル・目盛追加、"
    # 最終的なテキストを出力
    print(text)
週刊少年ジャンプ(1行目, 1列目):Y軸ラベル・目盛追加、
週刊少年マガジン(1行目, 2列目):
週刊少年サンデー(2行目, 1列目):X軸ラベル・目盛追加、Y軸ラベル・目盛追加、
週刊少年チャンピオン(2行目, 2列目):X軸ラベル・目盛追加、
Hide code cell content
# whileループの開始
# カウンター変数を0で初期化
counter = 0

# カウンター変数が5未満の間、ループを続ける
while counter < 5:
    # 現在のカウンターの値を出力
    print(counter)
    # カウンターの値を1増やす(これがないと無限ループになってしまう)
    counter += 1
0
1
2
3
4

内包表記#

Hide code cell content
# リスト内包表記
squares = [x**2 for x in range(5)]
print(squares)  # 出力: [0, 1, 4, 9, 16]

# 辞書内包表記
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict)  # 出力: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 集合内包表記
squares_set = {x**2 for x in range(5)}
print(squares_set)  # 出力: {0, 1, 4, 9, 16}
[0, 1, 4, 9, 16]
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
{0, 1, 4, 9, 16}
Hide code cell content
# 合計各話数の多いマンガ作品上位5作品と、その作品が属するマンガ雑誌の対応け
ccname2mcname = {
    "こちら葛飾区亀有公園前派出所": "週刊少年ジャンプ",
    "はじめの一歩": "週刊少年マガジン",
    "名探偵コナン": "週刊少年サンデー",
    "ONE PIECE": "週刊少年ジャンプ",
    "MAJOR": "週刊少年サンデー",
}

# そのうち、週刊少年マガジンに属するマンガ作品のみを抽出
ccname_magazine = [
    # itemsメソッドでキーと値を一つずつ抽出するが、mcnameの条件を満たすもののみ列挙
    ccname
    for ccname, mcname in ccname2mcname.items()
    if mcname == "週刊少年マガジン"
]
# 抽出結果を確認
ccname_magazine
['はじめの一歩']

関数#

Hide code cell content
def calculate_kokusen_power(base_power: float) -> float:
    """
    マンガ「呪術廻戦」に登場する「黒閃」現象下の威力を計算する関数
    「黒閃」現象下では、通常の(平均)2.5乗の威力になると言われている

    Parameters
    ----------
    base_power : float
        通常時の威力

    Returns
    -------
    float
        「黒閃」現象下の威力の平均
    """
    kokusen_power = base_power ** 2.5
    return kokusen_power
Hide code cell content
# 黒閃現象下で、通常時50の威力がどう変化するか計算
calculate_kokusen_power(50)
17677.66952966369

クラス#

Hide code cell content
class Star:
    # Starクラスの初期化メソッド
    def __init__(self, name):
        # インスタンス変数nameにキャラクターの名前を格納
        self.name = name
        # インスタンス変数worksに、キャラクターが出演する作品のリストを格納するための空リストを初期化
        self.works = []

    # キャラクターの出演作品を追加するメソッド
    def add_works(self, year, title):
        # worksリストに辞書形式で作品の年とタイトルを追加
        self.works.append({"year": year, "title": title})

    # キャラクターの出演作品一覧を出力するメソッド
    def print_works(self):
        # 出演作品一覧のヘッダーを出力
        print("主な出演作品")
        # worksリストをループして、各作品の年とタイトルをフォーマットして出力
        for work in self.works:
            print(f"- {work['year']}年: {work['title']}")
        print("...")
Hide code cell content
# ブラックジャック(https://tezukaosamu.net/jp/character/647.html)
bj = Star("ブラック・ジャック")
bj.add_works(year=1973, title="ブラック・ジャック")
bj.add_works(year=1975, title="鉄腕アトム /アトム二世 (科学省)")
Hide code cell content
# ブラック・ジャックの出演作品を出力
bj.print_works()
主な出演作品
- 1973年: ブラック・ジャック
- 1975年: 鉄腕アトム /アトム二世 (科学省)
...
Hide code cell content
# アトム(https://tezukaosamu.net/jp/character/25.html)
atom = Star("アトム")
atom.add_works(year=1951, title="鉄腕アトム")
atom.add_works(year=1952, title="ロック冒険記 (鳥人との会議に参加)")
Hide code cell content
# アトムの出演作品を出力
atom.print_works()
主な出演作品
- 1951年: 鉄腕アトム
- 1952年: ロック冒険記 (鳥人との会議に参加)
...

import文によるインポート#

Hide code cell source
# plotlyの図を表示するための関数を定義
RENDERER = "plotly_mimetype+notebook"


def show_fig(fig):
    """
    所定のレンダラーを用いてplotlyの図を表示
    Jupyter Bookなどの環境での正確な表示を目的とする

    Parameters
    ----------
    fig : Figure
        表示対象のplotly図

    Returns
    -------
    None
    """

    # 図の周囲の余白を設定
    # t: 上余白
    # l: 左余白
    # r: 右余白
    # b: 下余白
    fig.update_layout(margin=dict(t=25, l=25, r=25, b=25))

    # 所定のレンダラーで図を表示
    fig.show(renderer=RENDERER)

importのみを使う場合#

Hide code cell content
# pandasパッケージ全体をインポート
import pandas

# pandasのバージョンを表示
pandas.__version__
'2.1.1'
Hide code cell source
# plotlyのうち、expressのみをインポート
import plotly.express

# 以下、散布図を描画するためのサンプルコード
# pandasでダミーのデータフレームを作成
df = pandas.DataFrame(
    {
        "X": [1, 2, 3, 4, 5, 6],
        "Y": [10, 15, 13, 17, 12, 18],
        "Category": ["A", "A", "B", "B", "A", "B"],
    }
)

# X軸としてX列、Y軸としてY列、Category列で色分けした散布図を作成
fig = plotly.express.scatter(
    df,
    x="X",
    y="Y",
    color="Category",
)

# 先に定義した関数で散布図を表示
show_fig(fig)

asで別名をつける場合#

Hide code cell source
# pandasをpdという名前でインポート
import pandas as pd

# plotly.expressをpxという名前でインポート
import plotly.express as px

# 以下、散布図を描画するためのサンプルコード
# pandasでダミーのデータフレームを作成
df = pd.DataFrame(
    {
        "X": [1, 2, 3, 4, 5, 6],
        "Y": [10, 15, 13, 17, 12, 18],
        "Category": ["A", "A", "B", "B", "A", "B"],
    }
)

# X軸としてX列、Y軸としてY列、Category列で色分けした散布図を作成
fig = px.scatter(df, x="X", y="Y", color="Category")

# 先に定義した関数で散布図を表示
show_fig(fig)

fromを使う場合#

Hide code cell source
# plotly.subplotsモジュールからmake_subplots関数をインポート
from plotly.subplots import make_subplots

# 以下、サブプロットを用いた散布図を描画するためのサンプルコード
# Category別に2列のサブプロットを持つ図を作成
fig = make_subplots(cols=2, subplot_titles=df["Category"].unique())

# df(DataFrame)を"Category"でグループ化し、各カテゴリごとに処理
for i, (cat, df_cat) in enumerate(df.groupby("Category")):
    # グループ化されたデータに対して散布図を作成
    subplot = px.scatter(df_cat, x="X", y="Y")
    # 散布図の各トレース(点の集まり)をfigに追加
    for trace in subplot.data:
        # add_traceメソッドを使用して、トレースを図に追加
        # i+1で列の位置を指定(列番号は1から始まるため)
        fig.add_trace(trace, col=i+1, row=1)

# 最終的に作成した図を表示
show_fig(fig)

標準ライブラリ#

pathlib#

Hide code cell content
from pathlib import Path

# カレントディレクトリのパスを取得
dir_current = Path.cwd()
print(dir_current)  

# ファイルパスを作成
path_new = dir_current / "data" / "input.csv"
print(path_new) 
/home/jovyan/work/book/vol1/05
/home/jovyan/work/book/vol1/05/data/input.csv

itertools#

Hide code cell content
import itertools

# リストの要素を組み合わせて全パターンを生成
colors = ["red", "blue", "green"]
sizes = ["small", "medium", "large"]

# 全ての組合せを順番に表示
for comb in itertools.product(colors, sizes):
    print(comb)
('red', 'small')
('red', 'medium')
('red', 'large')
('blue', 'small')
('blue', 'medium')
('blue', 'large')
('green', 'small')
('green', 'medium')
('green', 'large')