# Interesting Python Packages that Deserve Our Attention

 Pay Notebook Creator: Roy Hyunjin Han 0 Set Container: Numerical CPU with TINY Memory for 10 Minutes 0 Total 0

# Vision¶

Help researchers by exploring cool packages written in Python.

# Mission¶

Learn how to write functions that handle units.

Roy Hyunjin Han

# Context¶

When applying mathematics to the real world, it is important to be mindful of the units for each quantity.

# Timeframe¶

20170605-2000 - 20170605-2100: 1 hour estimated

20170605-2000 - 20170605-2130: 1.5 hours actual

# Objectives¶

1. Write an expression that uses the pint package.
2. Write a function that uses the pint package.
3. Write a tool that uses the pint package.

# Log¶

20170605-2000 - 20170605-2030: 30 minutes

In [ ]:
import pip
pip.main(['install', 'pint'])

+ Make sure the pint package is installed



I would really like to use Jupyter with Vim key bindings next time.

Katy Huff mentioned the pint package in her keynote at PyCon 2017.

I took some time to work through the documentation. The package is written by Hernan E. Grecco, who is a professor and researcher at the University of Buenos Aires in Argentina.

20170605-2030 - 20170605-2100: 30 minutes

Let's look at why this package is cool.

In [ ]:
from pint import UnitRegistry
u = UnitRegistry()


It comes predefined with a lot of units.

In [ ]:
' '.join(dir(u))

In [ ]:
distance = 10 * u.kilometer
print(distance)
print(distance + 500 * u.meter)
print(distance * distance)

In [ ]:
print(distance.to(u.mile))
print(distance.to(u.foot))


Use ito for in-place conversions.

In [ ]:
distance.ito(u.mile)
distance


Parse strings.

In [ ]:
Q = u.Quantity

In [ ]:
Q('1 km/s').to(u.mile / u.hour)


Format strings.

In [ ]:
x = Q('100 km/hr ** 2').to(u.mile / u.hour ** 2)
print('{:P}'.format(x))  # Pretty Print
print('{:L}'.format(x))  # LaTeX
print('{:H}'.format(x))  # HTML


Use arrays.

In [ ]:
[[2, 3], [4, 5]] * u.lb + [[6, 7], [8, 9]] * u.kg


Define functions.

In [ ]:
help(u.wraps)

In [ ]:
@u.wraps(u.kilowatt_hour, u.hour)
def compute_kwh(time_in_hours):
return time_in_hours * 10

compute_kwh(Q('180 minutes'))

In [ ]:
@u.wraps(u.meter / u.second, (u.meter, u.meter, u.second))
def compute_velocity(distance1, distance2, time_interval):
return (distance2 - distance1) / time_interval

compute_velocity(Q('5 meters'), Q('1 mile'), Q('1 minute'))

+ List which aspects of the package we would like to feature
+ Write an expression
+ Write a function    

20170605-2100 - 20170605-2130: 30 minutes

The documentation notes that one cannot combine objects that are initialized using different UnitRegistry instances.

ValueError: Cannot operate with Quantity and Quantity of different registries.

Thus it is important to use a single UnitRegistry for an entire application.

Use set_application_registry when unpickling unit-aware objects to ensure that all objects are instantiated from the same UnitRegistry class.

In [ ]:
from pint import set_application_registry
set_application_registry(u)


I think we can design a simple CrossCompute tool that converts units. What is a unit conversion that I do frequently? Well for now, let's just convert temperatures.

+ Write a tool



We made a rough and fun tool. We should eventually let people deploy the tool directly.

What are some exercises that people could do to practice using this package?

In [ ]:
# Write an expression that adds three different units of time

In [ ]:
# Write a function that takes the number of years and returns the number of hours

In [ ]:
# Add a decorator using u.wraps that sets the following units:
# initial_velocity in meters per second
# final_velocity in meters per second
# time_interval in seconds
# acceleration in meters per second squared

def compute_acceleration(
initial_velocity, final_velocity, time_interval):
return (final_velocity - initial_velocity) / time_interval

x = compute_acceleration(
Q('0.5 km/hr'), Q('5 mile/second'), Q('7 microseconds'))
# assert x.magnitude == 1149511587.3015873

+ Create some exercises so that people can practice