In [4]:
import numpy as np
import random

a = np.zeros(128)
# a[:] = random.random()
for idx in range(len(a)):
    a[idx] = random.random() * 32
    
print(a)

a -= np.min(a)
a /= np.max(a)
print(a)
[21.69105142 25.72890239 29.01647141 25.63210082 22.04566692 13.5044074
 11.1683822   8.24892717 10.39251578  9.72646774  8.98570553 22.45445427
 10.03751237 13.61069492 11.62789597 14.53903076  2.78697113 26.40423555
 16.57793995 16.90733611  6.91385313  1.67579576 23.75692982 12.16704539
  8.25555564 22.91688269  5.76720808 14.18195559  2.67224843 13.73695144
  9.58878316 10.79048053 19.44631005 22.81664958 31.60514838  5.24561525
 11.59750503 15.89393728  9.98458583  2.84969215 31.96432883 16.91351334
  0.91304174 18.77998448 29.14676905 28.99647487  8.75326486 29.67161148
 24.4474046  21.19138682 15.8934629  29.71638863  8.65830993 29.86490781
 23.72407311  7.19545471 12.24386381  8.23495181  7.05380371  0.54461269
  0.87260722 10.23900881  2.03520809 26.72971507 12.10261008  5.13521825
  5.1665402   7.24822789 10.35947841  0.94084446 11.76597421 14.3993391
 23.50977288 10.85472443 17.04423077 21.28962971 30.3705205   1.0933283
 18.37063672  0.94290565  0.12547786  0.05469595 20.8228789   1.35346216
  1.3424813  29.98407261 21.55345998  8.88986185 26.1979377   4.25636298
 25.78306193 17.76659194  6.24753321 24.98874032 21.80853807  3.7244782
 20.89263574 18.52858485 29.28791612  0.73026379 21.90552577 26.26271092
 15.84185316  7.820566    1.67347562 15.84183476 30.15849041  2.58971802
 25.80084561 17.16301205  5.71146299  8.02780785  4.62383149 24.45081956
  4.79689226 17.05475128  3.80235419 13.25610283 13.92387441 30.22924704
 18.51868834 15.81745843  2.00916688 17.32825087 25.37194591 28.87725764
 27.01644673  7.63984955]
[0.67805091 0.80459109 0.90761857 0.80155748 0.68916402 0.42149377
 0.34828625 0.25679491 0.32397176 0.30309881 0.27988444 0.70197481
 0.31284648 0.42482466 0.36268672 0.45391731 0.0856254  0.82575502
 0.51781367 0.52813645 0.21495569 0.05080283 0.74279243 0.37958285
 0.25700263 0.71646662 0.17902156 0.44272711 0.08203017 0.42878135
 0.29878398 0.33644337 0.60770408 0.71332546 0.98874382 0.16267562
 0.36173431 0.49637805 0.31118784 0.08759099 1.         0.52833003
 0.02689927 0.58682244 0.91170191 0.90699191 0.27260009 0.92814968
 0.76443088 0.66239217 0.49636318 0.92955293 0.26962435 0.9342073
 0.74176275 0.22378066 0.38199023 0.25635694 0.21934153 0.01535326
 0.02563211 0.31916108 0.06206628 0.83595506 0.37756355 0.15921594
 0.16019753 0.22543449 0.32293642 0.02777056 0.36701388 0.44953959
 0.73504691 0.33845668 0.53242652 0.66547095 0.95005244 0.03254918
 0.57399409 0.02783516 0.0022182  0.         0.65084368 0.04070138
 0.04035726 0.93794174 0.673739   0.27688084 0.81928996 0.13167394
 0.80628837 0.55506424 0.19407422 0.78139553 0.68173276 0.11500547
 0.65302976 0.57894395 0.91612524 0.02117128 0.68477221 0.82131985
 0.49474581 0.24337071 0.05073013 0.49474523 0.94340773 0.07944379
 0.80684569 0.53614895 0.17727459 0.24986536 0.14318985 0.7645379
 0.14861331 0.53275622 0.11744598 0.41371228 0.43463924 0.94562514
 0.57863381 0.49398132 0.06125019 0.54132728 0.79340461 0.90325582
 0.8449408  0.23770733]
In [20]:
import math

class StatsList:
    """
    Stores a list of numbers and provides some simple statistics.
    """
    lst: list[float]
    sum: float
    product: float
    min: float
    max: float
    
    def __init__(self) -> None:
        self.lst = []
        self.sum = 0.0
        self.product = 1.0
        self.min = 0.0
        self.max = 0.0
        
    def append(self, val: float) -> None:
        self.lst.append(val)
        self.sum += val
        self.product *= val
        if len(self.lst) == 1:
            self.min = val
            self.max = val
        else:
            if val < self.min:
                self.min = val
            if val > self.max:
                self.max = val
        
    def mean(self) -> float:
        return self.sum / len(self.lst)
    
    def geometricMean(self) -> float:
        return self.product ** (1/len(self.lst))
    
x = StatsList()
print(x.lst)
x.append(24601.0)
print(x.lst)
x.append(42.0)
print(x.lst)
print(x.sum, x.product, x.mean(), x.geometricMean())
x.append(-math.pi)
print(x.sum, x.product, x.mean(), x.geometricMean())
print(x.min, x.max)
print(x)
[]
[24601.0]
[24601.0, 42.0]
24643.0 1033242.0 12321.5 1016.485120402655
24639.85840734641 -3246025.476580425 8213.286135782137 (74.03219834333919+128.22752892667992j)
-3.141592653589793 24601.0
<__main__.StatsList object at 0x7f17377878e0>
In [21]:
import csv

def csvStats(filename: str) -> dict[str, StatsList]:
    r = {}
    with open(filename) as ifh:
        rdr = csv.DictReader(ifh)
        for row in rdr:
            for key in row:
                if not (key in r):
                    r[key] = StatsList()
                r[key].append(float(row[key]))
    return r

stats = csvStats("nino34.csv")
for key in stats:
    print(f"{key} mean: {stats[key].mean()}, " +
          f"{key} min: {stats[key].min}, {key} max: {stats[key].max}")
    
YR mean: 1987.3762376237623, YR min: 1950.0, YR max: 2025.0
MON mean: 6.485148514851486, MON min: 1.0, MON max: 12.0
TOTAL mean: 26.906149614961517, TOTAL min: 24.25, TOTAL max: 29.41
ClimAdjust mean: 26.894906490649106, ClimAdjust min: 26.01, ClimAdjust max: 27.94
ANOM mean: 0.011133113311331119, ANOM min: -2.09, ANOM max: 2.71