サンプルコード集

サンプルコード集

◯こちらのサンプルコードは指導等にご自由にお使いください。


【サンプルコードの使い方】
◯サンプルコードを写す時はコピペをしないようにしましょう。
◯▶を押すと出力が表示されます。
◯Geminiボタンを押すとGemini(AI)による解説が表示されます。間違っていることもあるので、疑問に思った場合はご質問ください。


CODE: 0-1 (if文)

CODE: 0-2 (if文)

CODE: 0-3 (if文)

CODE: 0-4 (if文)

CODE: 1-1 (for文)

CODE: 1-2 (for文)

CODE: 1-3 (for文)

CODE: 1-4 (for文)

CODE: 1-5 (for文)

CODE: 1-6 (for文)

CODE: 2-1 (関数)

CODE: 2-2 (関数)

CODE: 2-3 (関数)

CODE: 2-4 (関数, for文)

CODE: 2-5 (関数, for文)

CODE: 2-6 (関数, for文)

CODE: 3-1 (配列)

CODE: 3-2 (配列)

CODE: 3-3 (配列)

CODE: 3-4 (配列, 関数)

CODE: 3-5 (配列, 関数)

CODE: 3-6 (配列, 関数)

CODE: 4-1 (関数, for文)

CODE: 4-2 (関数, for文)

CODE: 4-3 (配列, 関数)

CODE: 5-1 (関数, if文)

CODE: 5-2 (関数)

CODE: 5-3 (関数, if文)

CODE: 6-1 (openpyxl, 配列)

CODE: 6-2 (openpyxl, 関数)

CODE: 6-3 (openpyxl, 関数)

CODE: 7-1 (関数)

CODE: 7-2 (for文)

CODE: 7-3 (関数, if文)

CODE: 7-4 (正規表現, 関数)

CODE: 7-5 (正規表現, 関数)

CODE: 7-6 (正規表現, 関数)

CODE: 8-1 (ファイル入出力, 関数)

CODE: 8-2 (ファイル入出力, 関数)

CODE: 9-1 (ファイル入出力, 配列)

CODE: 9-2 (ファイル入出力, 配列)

CODE: a-1 (Numpy, 配列)

CODE: a-2 (Numpy, 配列)

CODE: a-3 (Matplotlib, Numpy)

CODE: a-4 (Matplotlib, Numpy)

CODE: b-1 (Pandas, Numpy)

CODE: b-2 (Pandas, Matplotlib)

CODE: c-1 (Biopython, ファイル入出力)

CODE: c-2 (Biopython, ファイル入出力)

CODE: c-3 (Biopython, ファイル入出力)

CODE: d-1 (scikit-learn, Pandas)

CODE: d-2 (scikit-learn, Pandas)

CODE: d-3 (scikit-learn, Pandas)

CODE: e-1 (seaborn, Pandas)

CODE: e-2 (Graphviz, 関数)



CODE: 0-1 (if文)


wake_up_time = 12

if ( wake_up_time==7 ):
    print("朝ごはんを食べる")
elif ( wake_up_time==12 ):
    print("昼ごはんを食べる")
else:
    print("何も食べない")




【ポイント】
◯elifで、「上のifの条件に当てはまらなかった時」という意味になる。
◯elseは、「上の全てのifとelifの条件に当てはまらなかった時」という意味になる。
◯ifに()をつけているが、つけなくてもOK。(個人的にはつけた方がわかりやすいと思っている。)
◯参考: https://www.kikagaku.co.jp/kikagaku-blog/python-if-else-elif/




CODE: 0-2 (if文)


wake_up_time = 7

is_hungry = True

if ( wake_up_time==7 ):
    if ( is_hungry==True ):
        print("朝ごはんを食べる")
    else:
        print("朝ごはんを食べない")
else:
    print("何も食べない")




【ポイント】
◯インデント(字下げ)が重要!! インデントでどこまでがそのifの中身かを判断する。
◯今回のようにifが入れ子構造になっているとわかりづらいが、一つずつ分解して考えていこう。




CODE: 0-3 (if文)


wake_up_time = 8
if ( wake_up_time == 7 ):
    print("たべる")
    print("おなかいっぱい")




CODE: 0-4 (if文)


wake_up_time = 8
if ( wake_up_time == 7 ):
    print("たべる")
print("おなかいっぱい")




CODE: 1-1 (for文)


for i in range(0, 3):
    print(i)




【for文のポイント】

◯for文はrange()と組み合わせることが多いが、
for i in range(0, 10):としたときのiの範囲は
「0〜10」ではなく
「0〜9」
であることに注意!!
◯forの後はインデントされている部分だけループが行われる。
◯参考: https://www.kikagaku.co.jp/kikagaku-blog/python-for-range/




CODE: 1-2 (for文)


a = 3
for i in range(0, 10):
    a += 4
print(a)




【ポイント】
◯forの後はインデントされている部分だけループが行われる。
◯+=という演算子は、左辺に右辺を足すという処理を表す。
a += 4 は
a = a + 4
と同じ。




CODE: 1-3 (for文)


s = 0
for i in range(3, 12):
    s += i
print(s)





CODE: 1-4 (for文)


for i in range(0, 5):
    print(i)
    print("Hello!")




CODE: 1-5 (for文)


s = 0

for i in range(0, 5):
    s += i * 2

print(s)




CODE: 1-6 (for文)


a = 1

for i in range(1, 6):
    a = a * i

print(a)




CODE: 2-1 (関数)


def print_name(name):
    print("私の名前は" + name + "です。")
    return

print_name("田中太郎")




【ポイント】
◯defで関数定義ができる。
◯この関数は何もreturnしない関数。
◯+で文字列の連結ができる。
◯参考: https://qiita.com/yam_dev/items/1665755f8266cb6965ab




CODE: 2-2 (関数)


def calc_mean(a, b, c):
    m = (a + b + c) / 3
    return(m)


m = calc_mean(3, 6, 9)
print(m)




【ポイント】
◯関数は「何を入れて(引数)」「何が出てくるか(返り値)」が重要!!
◯calc_mean()は、3つの数字を入れたら、その平均が出てくる関数。
◯今回のcalc_mean()の中にあるmは、calc_mean()の中だけで通用する変数。外にあるmとは「関係が無い」。




CODE: 2-3 (関数)


def print_hello():
    print("hello!")
    return


print_hello()




【ポイント】
◯このように、引数も返り値もない関数もあるが、特殊な場合を除いてあまり使われることはない。




CODE: 2-4 (関数, for文)


def calc3(x, y, z):
    a = (x * y * z) / 3
    return(a)

for i in range(0, 4):
    x = calc3(i, 3, 6)
    print(x)




【ポイント】
◯関数は「何を入れて(引数)」「何が出てくるか(返り値)」を考えるのが大事!!
◯今回のcalc3()はx, y, zを入れると、それぞれの値の積を3で割った値が出てくる。




CODE: 2-5 (関数, for文)


def calc3(x, y, z):
    a = (x * y * z) / 3
    return(a)

x = 0
for i in range(0, 4):
    x += calc3(i, 3, 6)

print(x)




【ポイント】
◯x += aでxにaを加算する意味となる。




CODE: 2-6 (関数, for文)


def calc3(x, y, z):
    a = (x * y * z) / 3
    return(a)

x = 0
for i in range(0, 5):
    x += calc3(i, 3, 6)

if ( x<100 ):
    print("OK")
else:
    print("NG")




CODE: 3-1 (配列)


a = [3, 4, 9, 2]
print(a[0])
print(a[3])




【ポイント】
◯a[n]で、配列のn番目の要素にアクセスすることができる。
◯配列のインデックスは0はじまりなことに注意!!
◯参考: https://qiita.com/gouwan/items/c83b47ce1b7c77cce7c5





CODE: 3-2 (配列)


a = [3, 5, 9, 0]
a[2] = 4
print(a)




【ポイント】
◯a[n] = xとすることで、n番目の要素をxに書き換えることができる。
◯print(配列)で配列全体を出力し、確認できる。




CODE: 3-3 (配列)


a = []
a.append(4)
a.append(2)
a.append(8)
a.pop(2)

print(a)




【ポイント】
◯a = []で空の配列を作成できる。これがないと後のappend()やpop()は使えない。
◯append()で配列に要素を追加できる。(頻出!!)
◯pop(n)で配列のn番目の要素を削除する。nという要素を探して削除するのではなく、nはインデックスであることに注意!!




CODE: 3-4 (配列, 関数)


def calc3(x, y, z):
    a = (x * y * z) / 3
    return(a)

a = [3, 5, 9, 10]
x = 0
for i in range(0, 4):
    b = a[i]
    x += calc3(b, 3, 6)

print(x)




【ポイント】
◯配列とfor文の組み合わせは頻出!!
◯for n in a:のように、配列をそのままfor文に入れることもできる。わかりやすい方で書けばOK。
◯今回のようにiを変化させてa[i]として配列の要素を取り出す方法は、後からデバッグがしやすいという利点がある。




CODE: 3-5 (配列, 関数)


def calc_tax(a):
    r = 1.1
    x = a * r
    return(x)

goods = [1000, 2000, 3000]
total = 0

for i in range(0, len(goods)):
    total += goods[i]

total = calc_tax(total)
print(int(total))




【ポイント】
◯calc_tax()は「商品の値段を入れて」「消費税込みの値段が返ってくる」関数。
関数が出てきたら「何を入れて」「何が出てくるか」を考えよう!!




CODE: 3-6 (配列, 関数)


def calc_tax(a):
    r = 1.1
    x = a * r
    return(x)

goods = []
goods.append(1000)
goods.append(2000)
goods.append(3000)
goods.append(4000)
total = 0

for i in range(0, len(goods)):
    total += calc_tax(goods[i])

print(int(total))




【ポイント】
◯append()は便利で非常によく使われるのでチェック!!
◯goods = []で空の配列を作成できる。これがないとappend()が使えないので注意。




CODE: 4-1 (関数, for文)


def calc_pow(x, n):
    y = 1
    for i in range(0, n):
        y = y * x
    return(y)


x = 4
n = 3
y = calc_pow(x, n)

print(y)




CODE: 4-2 (関数, for文)


def calc_pow(x, n):
    y = 1
    for i in range(0, n):
        y = y * x
    return(y)


x = 2
n = 5
y = calc_pow(x, n)

if ( y<40 ):
    print("OK")
else:
    print("NG")




CODE: 4-3 (配列, 関数)


def calc_pow(x, n):
    y = 1
    for i in range(0, n):
        y = y * x
    return(y)

x = 2
list0 = []

for i in range(0, 4):
    y = calc_pow(x, i)
    list0.append(y)

s = sum(list0)
print(s)





CODE: 5-1 (関数, if文)


def inch2cm(inch):
    cm = inch*2.54
    return(cm)


def main():
    inch = 15
    cm = inch2cm(inch)
    print(cm)
    return(0)

main()




【ポイント】
◯参考: https://coconala.com/blogs/1162327/532334
https://www.lifewithpython.com/2021/01/python-main-function.html




CODE: 5-2 (関数)


def inch2cm(inch):
    cm = inch*2.54
    return(cm)


def feet2cm(feet):
    cm = feet*30.48
    return(cm)


def main():
    inch = 15
    feet = 3
    cm = inch2cm(inch) + feet2cm(feet)
    print(cm)
    return(0)

main()






CODE: 5-3 (関数, if文)


def inch2cm(inch):
    cm = inch*2.54
    return(cm)


def feet2cm(feet):
    cm = feet*30.48
    return(cm)


def main():
    inch = 10
    feet = 2
    cm = inch2cm(inch) + feet2cm(feet)

    if ( cm>90 ):
        print("OK")
    else:
        print("NG")
    return(0)

main()






CODE: 6-1 (openpyxl, 配列)


import openpyxl as px

OUTPUT_FILE = "6-1_test.xlsx"

def main():
    wb = px.Workbook()
    ws = wb.active

    ws.cell(column=1, row=1).value = 3
    ws.cell(column=2, row=1).value = 5
    ws.cell(column=1, row=2).value = 9
    ws.cell(column=2, row=2).value = 2

    wb.save(OUTPUT_FILE)

main()




【ポイント】
◯pip install openpyxlが必要!
◯ws.cell()にてセルの値の取得と書き換えができる。
◯ws["A1"]のようにセルを参照してもよいが、基本的にはws.cell()の方が拡張性が高くおすすめ。
◯参考: https://note.nkmk.me/python-openpyxl-usage/
◯生成ファイル: https://python.hisakatano.com/data/6-1_test.xlsx




CODE: 6-2 (openpyxl, 関数)


import openpyxl as px

OUTPUT_FILE = "6-2_test.xlsx"

def main():
    wb = px.Workbook()
    ws = wb.active

    for i in range(1, 10):
        for j in range(1, 10):
            ws.cell(column=i, row=j).value = i * j

    wb.save(OUTPUT_FILE)


main()
    



【ポイント】
◯生成ファイル: https://python.hisakatano.com/data/6-2_test.xlsx




CODE: 6-3 (openpyxl, 関数)


import openpyxl as px

INPUT_FILE = "6-2_test.xlsx"

def main():
    wb = px.load_workbook(INPUT_FILE)
    ws = wb.active

    cell25 = ws.cell(column=2, row=5)
    print(cell25)

    cell38 = ws.cell(column=3, row=8)
    print(cell38)

    return(0)



main()




【ポイント】
◯エクセルファイルの読み込みはpx.load_workbook(ファイル名)とする。




CODE: 7-1 (関数)


def print_myinfo(first, last, age):
    print("私の名前は%s%sです。" % (first, last))
    print("私の年齢は%d歳です。" % (age))
    return

firstname = "山田"
lastname = "太郎"
age = 39

print_myinfo(firstname, lastname, age)





【ポイント】
◯この%記法(sprintfスタイル)を覚えておけばOK!
文字列は%s, 整数は%dだけは覚えておこう。
◯参考: https://www.javadrive.jp/python/string/index23.html




CODE: 7-2 (for文)


for i in range(0, 4):
    print("%04d.jpg" % (i))




【ポイント】
◯%04dとすることで、強制的に0埋めの4桁の整数を出力させることができる。




CODE: 7-3 (関数, if文)


def jpg2png(jpgname):
    if ( not(".jpg" in jpgname) ):
        print("Error: 拡張子が.jpgではありません")
        return("")
    else:
        pngname = jpgname.replace(".jpg", ".png")
        return(pngname)

fname = "sample.jpg"
pngname = jpg2png(fname)
print(pngname)





【ポイント】
◯"in"を使うことで、特定の文字列が含まれているかどうかを確かめることができる。
◯文字列の関数(メソッド)の中でもreplace()は頻出!




CODE: 7-4 (正規表現, 関数)


import re

def main():
    text = "名前:山田太郎、年齢:30歳、職業:エンジニア"
    pattern = r'名前:(.*)、年齢:(.*)歳、職業:(.*)'

    dates = re.findall(pattern, text)
    for name, age, job in dates:
        print("%s, %s, %s" % (name, age, job))
    return(0)


main()





【ポイント】
◯reモジュールにはいろいろな関数があるが、まずはfindall()を押さえておけばOK。
◯基本は()でくくって、そこの中に正規表現を入れる。
◯特に(.*)は頻出! これで数値/文字列関係なくマッチさせることができる。
◯参考: https://qiita.com/Tadataka_Takahashi/items/c687004c66a4b2b13f96
https://qiita.com/luohao0404/items/7135b2b96f9b0b196bf3





CODE: 7-5 (正規表現, 関数)


import re

def main():
    text = "イベントは2023年5月15日から2023年5月17日まで開催されます。"
    pattern = r'(\d{4})年(\d{1,2})月(\d{1,2})日'

    dates = re.findall(pattern, text)
    for year, month, day in dates:
        print("%04d/%02d/%02d" % (int(year), int(month), int(day)))
    return(0)


main()





【ポイント】
◯数値4桁のマッチは\d{4}, 数値1or2桁のマッチは\d{1,2}で表現できる。





CODE: 7-6 (正規表現, 関数)


import re

def main():
    text = "イベントは2023年5月15日から2023年5月17日まで開催されます。"
    pattern = r'(\d{4})年'

    text_sub = re.sub(pattern, "2025年", text)
    print(text_sub)
    return(0)


main()





【ポイント】
◯正規表現を利用した置換はre.sub()を用いる。
◯ただし正直replace()で十分なときが多い。
◯参考: https://note.nkmk.me/python-str-replace-translate-re-sub/#resub-resubn





CODE: 8-1 (ファイル入出力, 関数)


# ---- Config ----

FILE_NAME = "8-1_output.txt"


def main():
    s = "40 92 20 44 91"

    fname = FILE_NAME
    f = open(fname, mode="w")
    f.write(s)
    f.close()

    return(0)


main()




【ポイント】
◯open()は必ずmodeを指定しよう。(読み込みは"r", 書き込みは"w")
◯open()の後はclose()で必ず閉じること!
◯with open()を使ってもよい。
◯参考: https://note.nkmk.me/python-file-io-open-with/
◯生成ファイル: https://python.hisakatano.com/data/8-1_output.txt




CODE: 8-2 (ファイル入出力, 関数)


# ---- Config ----

FILE_NAME = "8-1_output.txt"


def main():
    fname = FILE_NAME
    f = open(fname, mode="r")
    s = f.read()
    f.close()
    s_list = s.split(" ")
    print(s_list)

    return(0)


main()




CODE: 9-1 (ファイル入出力, 配列)


import random

# ---- Config ----

FILE_NAME = "9-1_output.txt"
ROWS = 3
COLUMNS = 5


def make_rand_table(rows, cols):
    datalist = []
    for i in range(0, rows):
        d = []
        for j in range(0, cols):
            d.append(str(random.randint(1, 100)))
        datalist.append(d)

    return(datalist)


def write_file(datalist, fname):

    table_str = ""

    rows = len(datalist)
    for i in range(0, rows):
        table_str += " ".join(datalist[i]) + "\n"

    f = open(fname, mode="w")
    f.write(table_str)
    f.close()

    return(0)


def main():
    rows = ROWS
    cols = COLUMNS
    datalist = make_rand_table(rows, cols)
    print(datalist)

    fname = FILE_NAME
    write_file(datalist, fname)

    return(0)


main()





【ポイント】
◯グローバル変数は目立つように、全て大文字にする。
◯join()はsplit()と対になる関数。(頻出!!)
参考: https://qiita.com/conf8o/items/d57f74b4bcb67882be37

◯len(配列)とすることで、配列の大きさを取得することができる。

◯今回の配列は二次元配列といい、配列の要素の一つ一つが配列になっている。
参考: https://www.sejuku.net/blog/67215





CODE: 9-2 (ファイル入出力, 配列)


# ---- Config ----

FILE_NAME = "9-1_output.txt"


def read_file(fname):
    f  = open(fname, mode="r")
    table_str = f.read()
    f.close()

    datalist = []

    lines = table_str.split("\n")
    rows = len(lines)
    for i in range(0, rows):
        if ( lines[i]=="" ):
            continue
        d = lines[i].split(" ")
        datalist.append(d)

    return(datalist)


def main():
    fname = FILE_NAME

    datalist = read_file(fname)
    print(datalist)

    return(0)


main()





CODE: a-1 (Numpy, 配列)


import numpy as np


def main():
    a_arr = np.array([4, 6, 3, 1, 9])
    print(a_arr)
    print(a_arr.ndim)   # 次元
    print(a_arr.shape)  # 大きさ

    b_arr = np.zeros((4, 3))    # 4行3列の行列を作成(0埋め)
    print(b_arr)
    print(b_arr.ndim)   # 次元
    print(b_arr.shape)  # 大きさ

    c_arr = np.zeros((5, 8))    # 5行8列の行列を作成(0埋め)
    print(c_arr)        
    print(c_arr.ndim)   # 次元
    print(c_arr.shape)  # 大きさ

    return(0)


main()





【ポイント】
◯pip install numpyなどでライブラリのインストールが必要。
◯numpyはいろいろな処理ができるが、まずはnumpy arrayが扱えればOK!!
◯numpy arrayは通常の配列からパワーアップしたものだと考えればよい。特に二次元配列(行列)を得意としている。
◯np.zeros((m, n))でm行n列の0埋めの行列を作成できる。(頻出!!)
◯参考: https://qiita.com/yut-nagase/items/94b4798eb88de16b36be




CODE: a-2 (Numpy, 配列)


import numpy as np


def main():
    arr = np.array([4, 3, 5, 2, 9])
    print(np.min(arr))      # 最小値
    print(np.max(arr))      # 最大値
    print(np.mean(arr))     # 平均値
    print(np.std(arr))      # 標準偏差
    print(np.var(arr))      # 分散
    print(np.sum(arr))      # 合計値
    print(np.sort(arr))     # 並び替え

    # 九九の表を作成
    arr99 = np.zeros((9, 9))
    for i in range(0, 9):
        for j in range(0, 9):
            arr99[i][j] = (i+1) * (j+1)

    print(arr99)

    return(0)


main()





【ポイント】
◯numpyを使うと、各種計算が簡単にできる。
◯二次元配列(行列)の値を参照する時は、arr99[行][列]のように記述する。




CODE: a-3 (Matplotlib, Numpy)


import numpy as np
import matplotlib.pyplot as plt


# ---- Config ----

FILE_NAME = "a-3_output.png"


def main():
    fname = FILE_NAME

    x_arr = np.linspace(0, 10, 1000)
    y_arr = np.sin(x_arr)

    plt.plot(x_arr, y_arr)
    plt.savefig(fname)

    return(0)


main()




【ポイント】
◯pip install matplotlibを実行してインストールしておこう。
◯np.linspace(x1, x2, n)で、「x1からx2の範囲で、1000個分割した配列を作成する」という意味になる。
◯a_3-output.pngというファイルが作成されるのでチェック!!
◯参考: https://deepage.net/features/numpy-matplotlib.html
◯生成ファイル: https://python.hisakatano.com/data/a-3_output.png




CODE: a-4 (Matplotlib, Numpy)


import numpy as np
import matplotlib.pyplot as plt


# ---- Config ----

FILE_NAME = "a-4_output.png"


# y = ax^3 + bx^2 + cx + d
def cubic_equation(a, b, c, d, x):
    y = a * x**3 + b * x**2 + c * x + d
    return(y)


def main():
    a = 1
    b = -5
    c = -2
    d = 5
    fname = FILE_NAME

    x_arr = np.linspace(-10, 10, 1000)
    y_arr = cubic_equation(a, b, c, d, x_arr)

    plt.plot(x_arr, y_arr)
    plt.savefig(fname)

    return(0)


main()




【ポイント】
◯a-3のsin()とは異なり、今回は自作の関数(三次関数)を使用。
◯a_4-output.pngというファイルが作成されるのでチェック!!
◯生成ファイル: https://python.hisakatano.com/data/a-4_output.png




CODE: b-1 (Pandas, Numpy)


import pandas as pd


# ---- Config ----

FILE_NAME = "http://python.hisakatano.com/data/weight1.xlsx"


def main():
    fname = FILE_NAME
    df = pd.read_excel(fname, index_col=0, header=0)
    print("読み込んだデータ:")
    print(df)
    print()

    # "一日目"の列を抜き出す
    col1 = df[1]
    print("一日目の列:")
    print(col1)
    print()

    # "体重[kg]"の行を抜き出す
    weight_row = df[0:1]
    print("体重[kg]の行:")
    print(weight_row)
    print()

    # numpy arrayへ変換
    weight_arr = weight_row.to_numpy()
    print("numpy arrayへ変換された体重[kg]の行:")
    print(weight_arr)
    return(0)


main()





【ポイント】
◯pandasのread_excel, read_csvはオプションが大事! header=〇〇,
index_col=〇〇を必ず明記する。
◯データ構造が複雑なので、なるべくprint()で確認しながら進める癖をつける。
◯列の抜き出しはインデックスそのまま、行の抜き出しはスライス表記を用いる。
◯pandasのData Frameはわかりづらいため、最終的にnumpyに変換して用いることが多い。
◯参考: https://note.nkmk.me/python-pandas-read-excel/




CODE: b-2 (Pandas, Matplotlib)


import pandas as pd
import matplotlib.pyplot as plt


# ---- Config ----

FILE_NAME = "http://python.hisakatano.com/data/weight1.xlsx"
OUTPUT_FILE = "output_b-2.png"


def main():
    fname = FILE_NAME
    df = pd.read_excel(fname, index_col=0, header=0)

    # headerを抜き出す
    header = df.columns
    header_arr = header.to_numpy()
    print("header:")
    print(header_arr)
    print()


    # "歩数"の行を抜き出す
    hosu_row = df[1:2]
    print("歩数の行:")
    hosu_arr = hosu_row.to_numpy()[0]
    print(hosu_arr)

    output_file = OUTPUT_FILE
    plt.plot(header_arr, hosu_arr)
    plt.savefig(output_file)

    return(0)


main()





【ポイント】
◯行をnumpyに変換するときに行が一つであっても二次元配列になるためto_numpy()[0]とする。
◯output_b-2.pngが出力されるので要確認!
◯生成ファイル: https://python.hisakatano.com/data/output_b-2.png




CODE: c-1 (Biopython, ファイル入出力)


from Bio import SeqIO

# ---- Config ----

#FILE_NAME = "https://www.uniprot.org/uniprot/P59082.fasta"
FILE_NAME = "P59082.fasta"


def main():
    fname = FILE_NAME
    with open(fname, mode="r") as f:
        for record in SeqIO.parse(f, "fasta"):
            id_part = record.id
            desc_part = record.description
            seq = record.seq

            print("id: %s" % (id_part))
            print("desc: %s" % (desc_part))
            print("seq: %s" % (seq))

    return(0)


main()




【ポイント】
◯pip install biopythonなどでライブラリのインストールが必要。
◯FASTAファイルはこちらからダウンロード->https://www.uniprot.org/uniprot/P59082.fasta
◯SeqIO.parse()だけでFASTAデータを便利に使うことができる。
◯取得したseqに対して文字列処理を行うのが一般。
◯参考: https://qiita.com/Ag_smith/items/94c4b97729b043fae0cb




CODE: c-2 (Biopython, ファイル入出力)


from Bio import SeqIO

# ---- Config ----

FILE_NAME = "P59082.fasta"


def calc_gc(seq):
    gc = (seq.count("G") + seq.count("C")) / len(seq)
    return(gc)


def main():
    fname = FILE_NAME
    with open(fname, mode="r") as f:
        for record in SeqIO.parse(f, "fasta"):
            id_part = record.id
            desc_part = record.description
            seq = record.seq
            rev_seq = seq.reverse_complement()
            gc = calc_gc(seq)

            print("id: %s" % (id_part))
            print("desc: %s" % (desc_part))
            print("Reverse complement seq: %s" % (rev_seq))
            print("GC: %s" % (gc))

    return(0)


main()




【ポイント】
◯reverse_complement()で逆相補鎖の配列を作成。
◯文字列操作の部分はBiopythonの関数に頼らなくてもOK。むしろ自分自身で書けるようになった方がよい。
◯calc_gc()でGC含量を計算。
◯参考: https://qiita.com/ponnhide/items/0eaf8cbf8aeb35b3b925
◯biopythonのドキュメント: https://biopython.org/wiki/Documentation
◯アップデートによって前まで使われていた関数が使えなくなっていたりするので、あまりBiopythonの関数を信用しないようにしたほうがよい。




CODE: c-3 (Biopython, ファイル入出力)


from Bio import SeqIO
import gzip

# ---- Config ----

FILE_NAME = "pdb_seqres.txt.gz"
PRINT_NUM = 5


def main():
    fname = FILE_NAME

    f = gzip.open(fname, mode="rt")

    i = 0
    for record in SeqIO.parse(f, "fasta"):
        id_part = record.id
        desc_part = record.description
        seq = record.seq

        print("id: %s" % (id_part))
        print("desc: %s" % (desc_part))
        print("seq: %s" % (seq))

        i += 1
        if ( PRINT_NUM<=i ):
            break

    f.close()

    return(0)


main()




【ポイント】
◯.gzファイルはこちらからダウンロード: https://files.wwpdb.org/pub/pdb/derived_data/pdb_seqres.txt.gz
◯.gzファイルの読み込みは通常のopen()ではなくgzip.open()を使う。
◯c-0, c-1のようにwithを使ってもいいが、インデントが深くなり可読性が悪くなることがある。今回のようにopen()/close()を使うとインデントが深くならないという利点があるが、close()を忘れないようにしないといけない。
◯今回は出力が延々と続くので、5件で切っている。




CODE: d-1 (scikit-learn, Pandas)


from sklearn.decomposition import PCA
import pandas as pd
import matplotlib.pyplot as plt


# ---- Config ----

CSV_FILE = "http://python.hisakatano.com/data/iris.csv"
OUTPUT_FILE_1 = "d-1_output_1.png"
OUTPUT_FILE_2 = "d-1_output_2.png"


# ---------------------------------------------------------
# PCAの次元圧縮結果のプロット
# ---------------------------------------------------------

def plot_pca_result(df, output_file):
    plt.clf()
    label_type = set(df["label"])
    for t in label_type:
        df2 = df.query('label=="%s"' % (t))
        plt.scatter(x=df2[0], y=df2[1], label=t)
    plt.legend()
    plt.grid()
    plt.xlabel("PC1")
    plt.ylabel("PC2")
    plt.savefig(output_file)
    return


# ---------------------------------------------------------
# メイン
# ---------------------------------------------------------

def main():
    # ---- (1) data frameでのデータ取得 ----
    df = pd.read_csv(CSV_FILE, index_col=None, header=0)
    print(df)

    # ---- (2) numpyに変換しデータ成形 ----
    x = df.iloc[:, 0:4].to_numpy() 

    # ---- (3) scikit-learnによる分析処理 ----
    pca = PCA(n_components=2)
    pca.fit(x)
    x0 = pca.transform(x)

    # ---- 次元圧縮結果の可視化 ----
    df2 = pd.DataFrame(x0)
    df2["label"] = df["species"]
    print(df2)
    plot_pca_result(df2, OUTPUT_FILE_1)

    # ---- 寄与度の可視化 ----
    df3 = pd.DataFrame(pca.components_.T)
    df3["label"] = df.columns[0:4]
    print(df3)
    plot_pca_result(df3, OUTPUT_FILE_2)

    return(0)


main()




【ポイント】
◯pip install scikit-leranが必要。
◯「(1)data frameでのデータ取得 -> (2)numpyに変換しデータ成形 -> (3) scikit-learnによる分析処理」 が共通する一連の流れ。
◯numpyへの変換は必要ないときもあるが、本格的なデータ分析のときには必須の手順となるため慣れておこう。
◯参考: https://qiita.com/fsd-aki/items/65628ebe0973d88c16ef
◯出力ファイル1: https://python.hisakatano.com/data/d-1_output_1.png
◯出力ファイル2: https://python.hisakatano.com/data/d-1_output_2.png
◯irisデータについて: https://qiita.com/ao_log/items/fe9bd42fd249c2a7ee7a
◯PCA(主成分分析)とは?: https://www.srush.co.jp/blog/2462384781




CODE: d-2 (scikit-learn, Pandas)


from sklearn.linear_model import LinearRegression
import pandas as pd
import matplotlib.pyplot as plt


# ---- Config ----

CSV_FILE = "http://python.hisakatano.com/data/linear_regression_data.csv"
OUTPUT_FILE = "d-2_output.png"


# ---------------------------------------------------------
# メイン処理
# ---------------------------------------------------------

def main():
    # ---- (1) data frameでのデータ取得 ----
    df = pd.read_csv(CSV_FILE, index_col=None, header=0)
    print(df)

    # ---- (2) numpyに変換しデータ成形 ----
    data_na = df.to_numpy() 

    # ---- (3) scikit-learnによる分析処理 ----
    lr = LinearRegression()
    x = data_na[:, 0]
    y = data_na[:, 1]

    x = x.reshape(len(x), 1)    # xは行列にする。
                                # 今回は2次元データなのでNx1の行列。
    print(x)
    print(y)
    lr.fit(x, y)

    coef = lr.coef_[0]          # 傾き
    intercept = lr.intercept_   # 切片
    print("傾き: %f" % (coef))
    print("切片: %f" % (intercept))

    plt.scatter(x, y, color="red")
    plt.plot(x, lr.predict(x), color="blue")

    plt.grid()
    plt.savefig(OUTPUT_FILE)

    return(0)


main()




【ポイント】
◯Linear regression(線形回帰)とは: 散布図にいい感じに直線を引く処理。
◯最小二乗法と言った方が伝わる人もいるかも。
◯lr.fit(x, y)のxは行列にする。本来多次元のデータも扱えるため、xは多次元でも可。今回は二次元なので、Nx1の行列とする。
◯参考: https://qiita.com/0NE_shoT_/items/08376b08783cd554b02e
◯出力ファイル: https://python.hisakatano.com/data/d-2_output.png




CODE: d-3 (scikit-learn, Pandas)


from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import LabelEncoder
import pandas as pd
import numpy as np
import warnings


# ---- Config ----

warnings.simplefilter("ignore")     # 警告が表示されないようにする
CSV_FILE = "http://python.hisakatano.com/data/iris.csv"



# ---------------------------------------------------------
# MLPの学習
# ---------------------------------------------------------

def learn_mlp(x_arr, y_arr):
    print("Learning ... ")
    model = MLPClassifier(hidden_layer_sizes=(100,), max_iter=100, activation="relu", verbose=True)
    model.fit(x_arr, y_arr)
    print("Learning ... done")

    return(model)


# ---------------------------------------------------------
# メイン処理
# ---------------------------------------------------------

def main():
    # ---- (1) data frameでのデータ取得 ----
    df = pd.read_csv(CSV_FILE, index_col=None, header=0)
    print(df)

    x_df = df.iloc[:, 0:4]
    y_df = df.iloc[:, 4]

    # ---- (2) numpy arrayに変換しデータ成形 ----
    x_arr = x_df.to_numpy()
    y_arr = y_df.to_numpy()

    print(x_arr[0:5])
    print(y_arr[0:5])

    # ---- (3) scikit-learnによる分析処理 ----
    # ラベルを数値に変換 ("setosa"->0, "versicolour"->1, "virginica"->2)
    le = LabelEncoder()
    y_arr = le.fit_transform(y_arr)
    print(y_arr[0:5])

    # モデルの学習
    model = learn_mlp(x_arr, y_arr)

    # スコアの確認
    # 0.9以上であればだいたいOK
    score = model.score(x_arr, y_arr)
    print("Score: %.2f" % (score))

    # モデルのテスト
    tmp_data = np.array([[7.4,2.8,6.1,1.9]])    # テストデータは行列(二次元配列)にする
    y = model.predict(tmp_data)

    for i in range(0, 4):
        print("%s: %f" % (df.columns[i], tmp_data[0][i]))
    print("の品種は")
    print(le.inverse_transform(y)[0])   # ラベルの数値を文字列に戻す

    return(0)


main()




【ポイント】
◯多層パーセプトロン(MLP, Multi-Layer Perceptron)とは、ニューラルネットワークの原始的なモデル。
◯今回は入力層が4ノード、中間層が100ノード、出力層が3ノードの3層MLP。
◯活性化関数はReLU。sigmoidなどでもOK。
◯簡単なモデルではあるが、この層が深くなると深層学習と呼ばれるモデルになる。今の生成AIなどで使われているモデルと原理は変わらない。
◯参考: https://qiita.com/maskot1977/items/d0253e1eab1ff1315dff
◯参考: https://qiita.com/nekotto/items/111bc5412ed0c000a9e6




CODE: e-1 (seaborn, Pandas)


import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd


# ---- Config ----

CSV_FILE = "http://python.hisakatano.com/data/iris.csv"
OUTPUT_FILE = "e-1_output.svg"
matplotlib.rcParams['font.family'] = 'DejaVu Serif'


def main():
    df = pd.read_csv(CSV_FILE, index_col=None, header=0)
    print(df)

    bar_color = ["#479FFF", "#47DFFF", "#47FFC4"]

    sns.barplot(data=df, x="species", y="sepal_width", hue="species", palette=bar_color)
    plt.xlabel("")
    plt.title("Iris sepal width", fontsize=16)
    plt.savefig(OUTPUT_FILE)

    return(0)


main()




【ポイント】
◯pip install seabornが必要。
◯seabornは、matplotlibより見た目をスタイリッシュにしたライブラリ。
◯使い方はmatplotlibとほとんど同じ。
◯凡例や軸のラベルなどが勝手に出力されるのが便利。
◯svgファイル(ベクター画像)にすると、Power Pointへの貼付け時に拡大してもぼけないようになる。
◯参考: https://qiita.com/kakiuchis/items/f7c830a2b726992a6165
◯参考: https://qiita.com/nkay/items/ab5beea96e8648aeab63
◯出力ファイル: https://python.hisakatano.com/data/e-1_output.svg




CODE: e-2 (Graphviz, 関数)


import graphviz


DOT_FILE = "e-2_input.dot"
OUTPUT_FILE = "e-2_output"


def main():
    graph = graphviz.Source.from_file(DOT_FILE, format="png")
    print(graph)
    graph.render(filename=OUTPUT_FILE, cleanup=True)

    return(0)


main()




【ポイント】
◯pip install graphvizが必要。
◯DOT言語を用いて、別ファイルにグラフを記述。
◯DOTファイルは生成AIを使って出力してもOK。
◯なぜかgraph.render()のfilenameに拡張子を付けてはいけないきまりがある。
◯入力ファイル: https://python.hisakatano.com/data/e-2_input.dot
◯出力ファイル: https://python.hisakatano.com/data/e-2_output.png
◯参考: https://uepon.hatenadiary.com/entry/2024/10/15/001325