開発環境
- macOS Mojave - Apple
- Emacs (Text Editor)
- Python 3.7 (プログラミング言語)
Pythonからはじめる数学入門 (Amit Saha (著)、黒川 利明 (翻訳)、オライリージャパン)の2章(データを統計量で記述する)、3.9(プログラミングチャレンジ)、問題3-4(百分位を求める)を取り組んでみる。
コード(Emacs)
Python 3
#!/usr/bin/env python3
def score(data, percentile):
n = len(data)
if n == 0:
raise Exception('データが無い')
if 0 == percentile:
return data[0]
if percentile == 100:
return data[-1]
if 0 < percentile < 100:
data = sorted(data)
i = n * percentile / 100 + 0.5
if i.is_integer():
return data[int(i) - 1]
k = int(i)
f = i - k
return (1 - f) * data[k - 1] + f * data[k]
raise Exception(f'百分位は0以上から100以下: {percentile}')
data = [5, 1, 9, 3, 14, 9, 7]
percentiles = [50, 25]
for percentile in percentiles:
print(f'{percentile}百分位: {score(data, percentile)}')
with open('marks.txt') as f:
nums = [float(line) for line in f]
print(nums)
while True:
try:
percentile = input('百分位: ')
if percentile == 'q':
break
percentile = float(percentile)
print(f'{percentile}百分位: {score(nums, percentile)}')
except ValueError as err:
print(err)
except Exception as err:
print(err)
入出力結果(Terminal, Jupyter(IPython))
$ ./sample4.py 50百分位: 7 25百分位: 3.5 [11.0, 20.0, 18.0, 18.0, 16.0, 11.0, 16.0, 18.0, 17.0, 16.5, 18.5, 19.5, 16.5, 14.5, 13.5, 12.5, 10.5, 15.5, 13.5, 16.5, 20.0, 18.0, 19.5, 15.0, 18.0] 百分位: -1 百分位は0以上から100以下: -1.0 百分位: 0 0.0百分位: 11.0 百分位: 10 10.0百分位: 11.0 百分位: 50 50.0百分位: 16.5 百分位: 100 100.0百分位: 18.0 百分位: 101 百分位は0以上から100以下: 101.0 百分位: q $
0 コメント:
コメントを投稿