solution_051d.py

#!/usr/bin/python3
# ===================================================================
#
# ===================================================================

import numpy as np
import draw_xy_axes as ax
import coordinate_conversion as cc
import user_interface as ui
from   graphics import *
import random
import sys


popfile = 'bell_curve_data.dat'


# -------------------------------------------------------------------
# ---- read population data from a file
# ---- return a list of population values
# -------------------------------------------------------------------

def pop_data_list(fn):

    pop = []                   # population data from file

    lc = 0                     # line count 

    inFile = open(fn,'r')      # open population data file

    for l in inFile:           # read each line

        l = l.strip()          # strip whitespace

        tf,i = ui.is_integer(l)  # test/convert to integer

        if not tf:             # non-integer?
            print()
            print(f'non-integer in input data ({l})')
            print('exit program')
            print()
            sys.exit()

        pop.append(i)          # save value in the list

        lc += 1                # increment line read count

    inFile.close()             # close population data file

    print()
    print(f'{lc} population values read from file ({fn})')

    return pop                 # return population list


# ------------------------------------------------------------------
# ---- return a list of samples from the population list
# ----   poplst - population data list
# ----   samsiz - size of sample
# ---- -------------------------------------------------------------
# ---- Note: the population is a normal distribution (bell curve)
# ------------------------------------------------------------------

def sample(poplst,samsiz):

    poplen = len(poplst)

    # ---- collect samsiz sample

    sam = []

    for _ in range(samsiz):

        i = random.randint(0,poplen-1)

        sam.append(poplst[i])

    # ---- calculate mean and standard deviation

    avg = np.mean(sam)     # average (mean)
    std = np.std(sam)      # standard deviation

    return (sam,avg,std)


# -------------------------------------------------------------------
# ---- main
# -------------------------------------------------------------------

# ---- get population data

poplst = pop_data_list(popfile)

print()
print(f'population size: {len(poplst)}')

# ---- size of sample from population

samsiz = 21                    # sample size

sam,avg,std = sample(poplst,samsiz)

print()
print(f'Mean  : {avg:.02f}')
print(f'STD   : {std:.02f}')
print(f'Sample: {sam}')
print()