si type metric
From the National Institute of Standards and Technology’s Office OF Weights and Measures, one can find a handy list of all the metric prefixes: e.g.
| Purpose | Name | Symbol | Factor | Name | |----------------------------------|----------------------------|--------|--------------|--------------| | larger quantities or whole units | quetta | Q | $$10^{30}$$ | nonillion | | | ronna | R | $$10^{27}$$ | octillion | | | yotta | Y | $$10^{24}$$ | septillion | | | … | … | … | … | | | hecto Example: hectare | h | $$10^{2}$$ | hundred | | | deka Example: dekameter | da | $$10^{1}$$ | ten | | | | | $$10^{o}$$ | one | | | deci Example: decimeter | da | $$10^{-1}$$ | tenth | | | centi Example: centigram | h | $$10^{-2}$$ | hundredth | | | … | … | … | … | | | yocto Example: yoctosecond | y | $$10^{-24}$$ | septillionth | | | ronto | r | $$10^{-27}$$ | octillionth | | smaller quantities or sub units | quecto | q | $$10^{-30}$$ | nonillionth |
Oh how nice it would be to have a class like
unit
which we could
subclass and use as follows:
class second(unit):
name = 'second'
s1 = second(1)
s1, s1.kilo, s1.milli, s1.to(3), float(s1.to(3))
(1.0 S, 0.001 KS, 1000.0 mS, 0.001 KS, 0.001)
ah so easy to convert between and even have clean formatting.
pip install nist
fact
While each fact
(factor) has base: ClassVar[int] = 10
, base
is actually an instance
variable.
>>> float(kilo()), float(kilo(base=2)), float(kilo(base=5)), float(kilo(base=10))
(1000.0, 8.0, 125.0, 1000.0)
In case that behavior is not obvious
fact
is really just a
named and explicilty signed exponent:
>>> kb = kilo(base=2)
>>> kb.abrv, kb.base, kb.expo, kb.sign, kb.ekey, float(kb)
('kilo', 2, 3, 1, 3, 8.0)
Each fact
uses efmt
for its representation by default efmt
is True, but can be turned off
by setting efmt
to False.
>>> (
(decka(), hecto(), kilo(), mega(), giga(), tera()),
(decka(showefmt=False), hecto(showefmt=False), kilo(showefmt=False), mega(showefmt=False), giga(showefmt=False), tera(showefmt=False))
)
((e+1, e+2, e+3, e+6, e+9, e+12), (F1P, F2P, F3P, F6P, F9P, F12P))
Actually we have three formats to work with:
>>> kilo().fstr, kilo(showbase=True).bstr, kilo(showbase=True).efmt
('F3P', '10^+3', 'e+3')
unit
The goal of the unit
class is to make it easy to create units:
class second(unit):
name = 'second'
>>> s1 = second(1)
>>> s1, s1.kilo, s1.milli, s1.to(3), float(s1.to(3)), s1.shownumb
(1.0 S, 0.001 KS, 1000.0 mS, 0.001 KS, 0.001, True)
We can also explore all the different ways of viewing formats:
import pandas as pd
results = list()
factors = (tera, decka, deci, centi, milli, pico)
for fcls in factors:
for flt in (1, 20, 0.03):
for factrepr in {'abrv', 'name', 'symb'}:
for shownumb in (True, False):
for abrvunit in (True, False):
res = fmtunit(
org = flt, flt=flt / float(fcls()), unt = unit, fct = fcls,
factrepr=factrepr, shownumb=shownumb, abrvunit=abrvunit,
unitname='second', factname=None, ndig=3
)
results.append(dict(
fname=fcls.name, flt=flt, res=res, org = flt / float(fcls()),
shownumb=shownumb, abrvunit=abrvunit, factrepr=factrepr
))
df = pd.DataFrame(results).sort_values(by=['fname', 'res'])
df.head()
| | fname | flt | res | org | shownumb | abrvunit | factrepr | |----:|:----------|-----:|:-------------|----:|:---------|:---------|:---------| | 134 | hundredth | 0.03 | 0.03 S | 3 | False | True | name | | 138 | hundredth | 0.03 | 0.03 S | 3 | False | True | abrv | | 142 | hundredth | 0.03 | 0.03 S | 3 | False | True | symb | | 143 | hundredth | 0.03 | 0.03 S | 3 | False | False | symb | | 135 | hundredth | 0.03 | 0.03 seconds | 3 | False | False | name |