2018年10月26日金曜日

開発環境

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 コメント:

コメントを投稿