スカラー a と b の和が偶数かどうかを判定するプログラムを書け。

In [0]:

```
a = 12
b = 8
s = a + b
print(s)
if s % 2 == 0:
print('even')
else:
print('odd')
```

リストの要素のうち、最大値および最小値を求めよ。

In [0]:

```
a = [5, 2, 9, 4, 3, 3]
MAX = -100000
MIN = 100000
for w in a:
if w > MAX:
MAX = w
if w < MIN:
MIN = w
print(MIN)
print(MAX)
```

リスト中の重複要素を取り除き、重複要素のないリストを作成せよ。ただし、集合を使わないこと。

In [0]:

```
a = [2, 2, 9, 6, 3, 3]
z = []
for w in a:
n = 0
for u in a:
if w == u:
n = n + 1
if n == 1:
z.append(w)
else:
has_w = 0
for zi in z:
if zi == w:
has_w = 1
if has_w == 0:
z.append(w)
print(z)
```

確率 0.4 で表、確率 0.6 で裏のコインを投げたとき、表が10回出るまでに何回投げればよいのかを調べよ。ただし、0 から 1 までの範囲内で一様乱数を発生する関数として、`random.uniform(0, 1)`

を用いてよい。

In [0]:

```
import random
# コインを投げた回数
ntry = 0
# 表の回数
n = 0
# 表の回数が 10 回になるまでコインを投げ続ける
while n < 10:
# 1. コイン投げる
x = random.uniform(0, 1)
ntry = ntry + 1
# 2. 表裏を判定する
if x < 0.4:
# 3. 表ならば n に 1 を加える
n = n + 1
print(n)
print(ntry)
```

確率 0.4 で表、確率 0.6 で裏のコインを投げたとき、表が 10 回出るまでに必要な回数を求めるプログラムを作り、そのプログラムを 1000 回実行して得られた 1000 の値の平均値を求めよ。ただし、0 から 1 までの範囲内で一様乱数を発生する関数として、`random.uniform(0, 1)`

を用いてよい。

In [0]:

```
import random
ntries = []
j = 0
while j < 10000:
### ここから ###
ntry = 0
n = 0
while n < 10:
x = random.uniform(0, 1)
ntry = ntry + 1
if x < 0.4:
n = n + 1
### ここまで ###
ntries.append(ntry)
j = j + 1
print(ntries)
print(sum(ntries)/len(ntries))
```

一様分布を利用して xy 平面上の -1 ≤ x ≤ 1 かつ -1 ≤ y ≤ 1 の領域に乱数を散らばせて、円周率πを求めよ。ただし、面積 S、半径 r および円周率πについて、S = πr^{2} の関係を証明なしに用いて良い。

In [0]:

```
x = []
y = []
# 1000 個の乱数を発生させて x 座標とする
# 1000 個の乱数を発生させて y 座標とする
j = 0
while j < 1000000:
_x = random.uniform(-1, 1)
_y = random.uniform(-1, 1)
x.append(_x)
y.append(_y)
j = j + 1
n_square = len(x)
n_circle = 0
# 点が単位円の中に入っているかどうかを 1 つずつチェックする
for px, py in zip(x, y):
r = px * px + py * py
if r <= 1:
n_circle = n_circle + 1
# pi : 4 = n_circle : n_squre
pi = 4 * n_circle / n_square
print(pi)
```

$f(x) = x^2 + 2x - 1$ の関数を Python の関数で定義せよ。次に、f(x) を x = a で微分したときに得られる値を計算する関数も Python で定義せよ。ただし、微分の定義式は次の通りである。必要であれば、h=0.001 とおいてよい。

$$ f'(a) = \lim_{h\to 0} \frac{f(a + h) - f(a)}{h} $$In [0]:

```
def f(x):
y = x * x + 2 * x - 1
return y
a = 2
h = 0.00000000001
fa = f(a)
fah = f(a + h)
fprimea = (fah - fa) / h
print(fprimea)
```

$f(x) = x^2 + 2x - 1$ の最小値およびその最小値を与える x の値を求めよ。

f(x) はしたに凸の二次関数であるから、その一次導関数 f'(x) が f'(a)=0 を満たすとき、f(a) が f(x) の最小値となる。

a に初期値を与えて、f'(a) を計算する。f'(a) が負の値ならば、a = a + r として、f'(a) が正の値ならば、a = a - rとして、もう一度 f'(a) を求める。r = 0.001 と小さめな値にする。

2 の操作を無限回繰り返すことで f'(a) = 0 となる a が求められる。ただし、プログラムで計算する場合は、正確に f'(a) = 0 となる点を正確に求められないので、例えば f'(a) < 0.0001 ならば終了するなどの制御を入れる。

In [0]:

```
import random
# 関数 f(x) の定義
def f(x):
y = x * x + 2 * x - 1
return y
# 微分関数の定義（関数 g(x) に対して、g'(a) を計算する関数）
def diff(g, a):
h = 0.001
fa = g(a)
fah = g(a + h)
fprimea = (fah - fa) / h
return fprimea
# ランダムな値を 1 つ決める
a = random.uniform(-1, 1)
# f'(a) を求める
error = diff(f, a)
# f'(a) が 0.0001 未満になるまで次の処理を繰り返す
while error > 0.0001:
if error > 0:
# 微分係数がプラスならば、a を左に 0.001 動かす
a = a - 0.01
elif error < 0:
# 微分係数がマイナスならば、a を右に 0.001 動かす
a = a + 0.01
# 新しい a の値で微分係数を求める。
error = diff(f, a)
# 最小値を与える x（人が数学的に計算した場合は -1）
print(a)
# 最小値（人が数学的に計算した場合は -2）
print(f(a))
```

右のリスト fh の要素のうち、「>」から始まる要素の個数を求めよ。

In [0]:

```
fh = ['>1ALK:A', 'TPEMPVL', 'TGQYTHA',
'>1ALK:B', 'TPEMPVL', 'TGQYTHA']
n = 0
for line in fh:
firstchar = line[0:1]
if firstchar == '>':
n = n + 1
print(n)
```

In [0]:

```
f = '1alk.fa'
n = 0
with open(f, 'r') as fh:
# ここでファイルの内容はすべて fh に入っている状態になる
for line in fh:
if line[0:1] == '>':
n = n + 1
print(n)
```

In [0]:

```
n = 0
name = ''
with open('1alk.fa', 'r') as fh:
for line in fh:
line = line.replace('\n', '')
if line[0:1] == '>':
if name != '':
print(name)
print(n)
name = line
n = 0
else:
n = n + len(line)
print(name)
print(n)
```

In [0]:

```
seqnA = 0
seqnC = 0
seqnG = 0
seqnT = 0
with open('ft.fa', 'r') as fh:
for line in fh:
line = line.replace('\n', '')
if line[0:1] == '>':
print(line)
else:
for b in line:
if b == 'A':
seqnA = seqnA + 1
elif b == 'C':
seqnC = seqnC + 1
elif b == 'G':
seqnG = seqnG + 1
elif b == 'T':
seqnT = seqnT + 1
print(seqnA)
print(seqnC)
print(seqnG)
print(seqnT)
```

In [0]:

```
with open('out.txt', 'w') as outfh:
with open('sample.fa', 'r') as infh:
# 初期化
seqname = ''
seqnA = 0
seqnC = 0
seqnG = 0
seqnT = 0
# ファイルの各行に対して処理
for line in infh:
line = line.replace('\n', '')
# > から始まる行ならば名前を記録
if line[0:1] == '>':
# 前の処理結果を出力
if seqname != '':
temp = seqname + ',' + str(seqnA) + ',' + str(seqnC) + ',' + str(seqnG) + ',' + str(seqnT) + '\n'
outfh.write(temp)
# 初期化
seqname = ''
seqnA = 0
seqnC = 0
seqnG = 0
seqnT = 0
seqname = line
# > から始まる行でなければA, C, G, Tの数を数える
else:
# 文字列をリスト皆して、各文字を調べて頻度を計数する
for b in line:
if b == 'A':
seqnA = seqnA + 1
elif b == 'C':
seqnC = seqnC + 1
elif b == 'G':
seqnG = seqnG + 1
elif b == 'T':
seqnT = seqnT + 1
temp = seqname + ',' + str(seqnA) + ',' + str(seqnC) + ',' + str(seqnG) + ',' + str(seqnT)
outfh.write(temp)
```

島の数を調べる。ただし # から始まる行は、コメント行である。

In [0]:

```
f = 'diversity_galapagos.txt'
n = 0
with open(f, 'r') as fh:
for line in fh:
if (line[0:1] != '#') and (line[0:6] != 'Island'):
n = n + 1
print(n)
```

ガラパゴス島の多様性データ diversity_galapagos.txt を読み込んで、各島の面積（Area）当たりの種数（Species）を答えよ。ただし、文字列を実数に変換する場合は `float`

関数を使用する。

In [0]:

```
f = 'diversity_galapagos.txt'
ratios = []
with open(f, 'r') as fh:
for line in fh:
# # および Island で始まらない行に対して処理を行う
if (line[0:1] != '#') and (line[0:6] != 'Island'):
# 1 行のデータを split 関数で分割する。
# このファイルはタブ区切りであることに注意。
# タブ区切りは、Python では '\t' という 2 文字で表される
linedata = line.split('\t')
#print(linedata)
# split 後、2列目Speciesおよび4列目Areaに当たるデータを取得してくる。
n_species = int(linedata[1])
n_area = float(linedata[3])
# 割り算を行なって「面積あたりの種数」を求める。
ratio = n_species / n_area
print(linedata[0])
print(ratio)
```

IWGSCv1.1.gff3 ファイル中の全遺伝子（gene）の染色体名、位置番号、および遺伝子 ID を抽出して、次の出力例のように CSV ファイルに書き出せ。ただし、これらの情報は、# 以外の文字から始まる行に記述されている。1 列目に染色体名、3 列目に分子タイプ、4 列目と 5 列目には開始位置と終了位置、9 列目には遺伝子 ID が記述されている。

```
TraesCS1A02G000100,chr1A,40098,70338
TraesCS1A02G000200,chr1A,70239,89245
TraesCS1A02G000300,chr1A,95906,104903
TraesCS1A02G000400,chr1A,102794,122504
TraesCS1A02G000500,chr1A,149490,154559
TraesCS1A02G000600,chr1A,162313,162609
```

In [0]:

```
with open('IWGSCv1.1.gff3', 'r') as fh:
for line in fh:
if line[0:1] != '#':
line_data = line.split('\t')
col1 = line_data[0]
col3 = line_data[2]
col4 = line_data[3]
col5 = line_data[4]
col9 = line_data[8].split(';')[0].replace('ID=', '')
if col3 == 'gene':
print(col9 + ',' + col1 + ',' + col4 + ',' + col5)
```

In [0]:

```
nC = 0
with open('1alk.cif', 'r') as fh:
for line in fh:
if line[0:4] == 'ATOM':
s = line[12]
if s == 'C':
nC = nC + 1
print(nC)
```

リストa に含まれている奇数と偶数の数を求めよ。

In [0]:

```
a = [1, 3, 5, 2, 4, 9]
n_odd = 0
n_even = 0
for x in a:
if x % 2 == 0:
n_even = n_even + 1
else:
n_odd = n_odd + 1
print(n_odd)
print(n_even)
```

リスト b の各要素をリスト a の各要素として追加せよ。

In [0]:

```
a = [1, 3, 5, 7, 9]
b = [2, 4, 6, 8, 10]
a.extend(b)
print(a)
a = [1, 3, 5, 7, 9]
b = [2, 4, 6, 8, 10]
for w in b:
a.append(w)
print(a)
# `a` should be:
# [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
```

リスト a とリスト b に共通する要素をリスト c に代入せよ。ただし、集合演算用の関数を使わずに、for 文などを使うこと。

In [0]:

```
a = [2, 4, 6, 8, 10, 12, 14]
b = [3, 6, 9, 12, 15]
c = []
for ai in a:
n = 0
for bi in b:
if ai == bi:
n = 1
if n == 1:
c.append(ai)
print(c)
# [6, 12]
```

"hello world" を "Hello World" のように単語の 1 文字目が大文字となるような変換プログラムを書け。ただし、`upper`

、`capitalize`

、`title`

関数等を使わないこと。

In [4]:

```
s = 'one of these days is none of these days.'
#print(s.upper())
#print(s.capitalize())
#print(s.title())
d = {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E', 'f': 'F',
'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L',
'm': 'M', 'n': 'N', 'o': 'O', 'p': 'P', 'q': 'Q', 'r': 'R',
's': 'S', 't': 'T', 'u': 'U', 'v': 'V', 'w': 'W', 'x': 'X',
'y': 'Y', 'z': 'Z'}
t = ''
for ss in s.split(' '):
t = t + d[ss[0]] + ss[1:] + ' '
print(t)
```

10,000 以下の 19 と 23 の公約数をすべて求めよ。

In [2]:

```
for i in range(9999):
n = i + 1
if n % 19 == 0 and n % 23 == 0:
print(n)
```

10,000 以下の素数（1 または自分自身でしか割り切れない数値）を全て求めよ。

In [12]:

```
n = 10000
pn = []
for m in range(n + 1):
if m > 1:
n_div = 0
for k in range(m + 1):
if k > 1:
if m % k == 0:
n_div = n_div + 1
if n_div == 1:
pn.append(m)
print(pn)
```

セルシウス度 C とケルビン K との間に K =C + 273.15 の関係が成り立つ。32 セルシウス度を文字列「27C」で表すとき、これを「300.15K」となるように変換するプログラムを作成せよ。

In [13]:

```
a = '27C'
b = '???K'
degree_c = float(a.replace('C', ''))
degree_k = degree_c + 273.15
b = str(degree_k) + 'K'
print(b)
```

昭和 1 年は西暦 1926 年であり、平成 1 年は西暦 1989 年、令和 1 年は西暦 2019 年である。年号から西暦および西暦から年号に変換するプログラムを書け。

例）「H2」を入力したら「1990」を出力し、「S60」を入力したら「1985」を出力し、「2019」を入力したら「R1」を出力する。

In [21]:

```
s = 'S60'
h = 'H2'
a = '2019'
def change_year(x):
x_first = x[0:1]
output = ''
if x_first == 'S':
output = str(int(x[1:]) + 1925)
elif x_first == 'H':
output = str(int(x[1:]) + 1988)
elif x_first == 'R':
output = str(int(x[1:]) + 2018)
else:
y = int(x)
if y >= 2018:
output = 'R' + str(y - 2018)
elif y >= 1988:
output = 'H' + str(y - 1988)
elif y >= 1925:
output = 'R' + str(y - 1925)
return output
print(change_year(s))
print(change_year(h))
print(change_year(a))
```

In [25]:

```
n_large = 0
n_small = 0
with open('trees.txt', 'r') as fh:
for line in fh:
if line[0:4] != 'Tree':
dat = line.split('\t')
if float(dat[3]) > 25.0:
n_large = n_large + 1
else:
n_small = n_small + 1
print(n_large)
print(n_small)
```

In [0]:

```
# 模範回答なし
# Pandas で解いてみてください。
```

sleep_in_mammals.txt を読み込み、各種(Species)の睡眠時間(TotalSleep)を、棒グラフでわかりやすく示せ。

In [29]:

```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
file = 'https://aabbdd.jp/data/sleep_in_mammals.txt'
d = pd.read_csv(file, comment='#', header=0, sep='\t')
x = d.loc[:, 'Species'].values
y = np.log10(d.loc[:, 'TotalSleep'].values)
# plt.rcParams['figure.figsize'] = (15.0, 5.0)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.bar(x, y)
ax.set_xticklabels(x, rotation=90)
fig.show()
```

sleep_in_mammals.txt を読み込み、各種(Species)の体重(BodyWt)と睡眠時間(TotalSleep)の関係を、散布図でわかりやすく描け。

In [28]:

```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
file = 'https://aabbdd.jp/data/sleep_in_mammals.txt'
d = pd.read_csv(file, comment='#', header=0, sep='\t')
x = d.loc[:, 'TotalSleep']
y = np.log10(d.loc[:, 'BodyWt'])
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.scatter(x, y)
ax.set_xlabel('TotalSleep')
ax.set_ylabel('log10(BodyWt)')
ax.set_xlim(0, max(x) * 1.05)
ax.set_ylim(0, max(y) * 1.05)
fig.show()
```

In [27]:

```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
file = 'https://aabbdd.jp/data/trees.txt'
d = pd.read_csv(file, header=0, sep='\t')
is_large = (d.loc[:, 'Volume'] > 25.0)
tall_trees = d.loc[is_large, :]
short_trees = d.loc[~is_large, :]
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.scatter(tall_trees.loc[:, 'Height'], tall_trees.loc[:, 'Girth'])
ax.scatter(short_trees.loc[:, 'Height'], short_trees.loc[:, 'Girth'])
ax.set_xlabel('Height')
ax.set_ylabel('Girth')
fig.show()
```

In [30]:

```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
file = 'https://aabbdd.jp/data/pines.txt'
d = pd.read_csv(file, header=0, sep='\t')
hgt90 = d.loc[:, 'Hgt90']
hgt96 = d.loc[:, 'Hgt96']
hgt97 = d.loc[:, 'Hgt97']
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
for i in range(d.shape[0]):
x = [0, 6, 7]
y = [hgt90[i], hgt96[i], hgt97[i]]
ax.plot(x, y)
ax.set_xlabel('Time')
ax.set_ylabel('Height')
fig.show()
```

講義中に書いたコードのメモ。

In [0]:

```
import numpy as np
a = np.array([[0,2,0,1,2,0],
[1,0,3,0,0,2],
[3,1,0,2,2,1],
[2,2,2,1,0,1],
[1,0,1,3,2,2],
[0,3,1,0,2,0]])
b = np.array([[1,0,0],
[0,1,0],
[0,0,1]])
s = np.full((4, 4), np.nan)
for row_i in range(np.size(a, axis=0) - 2):
for col_i in range(np.size(a, axis=1) - 2):
asub = a[row_i:(row_i+3), (col_i):(col_i+3)]
x = asub * b
y = np.sum(x)
s[row_i, col_i] = y
print(s)
```

In [0]:

```
all([True, True, True, False])
```

Out[0]:

In [0]:

```
import pandas as pd
file = 'iris.txt'
d = pd.read_csv(file, header=0, sep='\t')
for gname, gdata in d.groupby('Species'):
sl = gdata.loc[:, 'Sepal.Length']
sw = gdata.loc[:, 'Sepal.Width']
pl = gdata.loc[:, 'Petal.Length']
pw = gdata.loc[:, 'Petal.Width']
sr = sl / sw
pr = pl / pw
sr_mean = sr.mean()
pr_mean = pr.mean()
print([gname, sr_mean, pr_mean])
```

In [0]:

```
import pandas as pd
file = 'rice.txt'
d = pd.read_csv(file, header=0, sep='\t')
grouping_by = ['variety', 'fert']
for gname, gdata in d.groupby(grouping_by):
rootwt = gdata.loc[:, 'root_dry_mass']
shootwt = gdata.loc[:, 'shoot_dry_mass']
rootwt_mean = rootwt.mean()
shootwt_mean = shootwt.mean()
print([gname[0], gname[1], rootwt_mean, shootwt_mean])
```

In [0]:

```
import pandas as pd
file = 'trees.txt'
d = pd.read_csv(file, header=0, sep='\t')
h = d.loc[:, 'Height']
g = d.loc[:, 'Girth']
lower_than_80 = (h < 80)
higer_eqthan_80 = (h >= 80)
print(g[higer_eqthan_80].mean())
print(g[higer_eqthan_80].var())
print(g[lower_than_80].mean())
print(g[lower_than_80].var())
```

In [0]:

```
import pandas as pd
file = 'pines.txt'
d = pd.read_csv(file, header=0, sep='\t')
hgt90 = d.loc[:, 'Hgt90']
hgt97 = d.loc[:, 'Hgt97']
diff = hgt97 - hgt90
f_ismax = (diff == diff.max())
d.loc[f_ismax, 'ID']
```

Out[0]:

In [0]:

```
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.array([0, 300])
y = np.array([0, 300])
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y)
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
fig.show()
```

In [0]:

```
```