MET logo

Kodeklubben

Innhold

  1. IPython Notebook
  2. api.met.no - kodeeksempler

1. IPython Notebook

IPython Notebook er en slags digital loggbok, som kan inneholde alt fra ren tekst til kjørbar Python kode, med resultater vist direkte i nettleseren.

Jeg kommer til å legge ut denne notatboken på it.met.no i løpet av morgendagen, sammen med instruksjoner til hvordan dere kan installere IPython Notebook, slik at dere kan videreutvikle programsnuttene vi lager etterpå.

Først sier vi at plot skal vises direkte i notatboken:

In [2]:
%pylab inline
Populating the interactive namespace from numpy and matplotlib

Litt eksperimentering med plotting:

In [3]:
x = linspace(0, 10, 50)

y = 0.2*x
y2 = cos(x)

plot(x,y)
plot(x,y2)
Out[3]:
[<matplotlib.lines.Line2D at 0x7fae9ad74a10>]

Variable er globale for hele notatboken, her skriver vi ut 'x':

In [4]:
x
Out[4]:
array([  0.        ,   0.20408163,   0.40816327,   0.6122449 ,
         0.81632653,   1.02040816,   1.2244898 ,   1.42857143,
         1.63265306,   1.83673469,   2.04081633,   2.24489796,
         2.44897959,   2.65306122,   2.85714286,   3.06122449,
         3.26530612,   3.46938776,   3.67346939,   3.87755102,
         4.08163265,   4.28571429,   4.48979592,   4.69387755,
         4.89795918,   5.10204082,   5.30612245,   5.51020408,
         5.71428571,   5.91836735,   6.12244898,   6.32653061,
         6.53061224,   6.73469388,   6.93877551,   7.14285714,
         7.34693878,   7.55102041,   7.75510204,   7.95918367,
         8.16326531,   8.36734694,   8.57142857,   8.7755102 ,
         8.97959184,   9.18367347,   9.3877551 ,   9.59183673,
         9.79591837,  10.        ])

Litt mer plotting:

In [6]:
plt.xkcd()
plt.title('Cosine!')
plot(x, y2)
Out[6]:
[<matplotlib.lines.Line2D at 0x7fae9ac47410>]

Noen flere eksempler på hva vi kan gjøre i en notatbok:

MET logo

In [8]:
from IPython.display import YouTubeVideo

YouTubeVideo('t_TzRaK9kpU')
Out[8]:
In [9]:
from IPython.display import HTML
HTML('<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350></iframe>')
Out[9]:

En notatbok kan også lett deles på nett, f.eks. på nbviewer.ipython.org. Følg med på it.met.no, så får dere vite hvordan.

2. api.met.no

Her følger tre kodeeksempler (det første eksempelet henter kun et bilde via en url) som benytter api.met.no:

Hente satellittbilde

Satellittbilde

Sol opp/ned

In [12]:
from lxml import etree
import dateutil.parser as dparser

# les XML-dokument fra url og hent ut rot-noden (se http://api.met.no/weatherapi/sunrise/1.0/documentation)
tree = etree.parse('http://api.met.no/weatherapi/sunrise/1.0/?lat=59.9132694;lon=10.7391112;date=2015-02-19')
root = tree.getroot()

# skriv ut hele XML-dokumentet
#print(etree.tostring(root, pretty_print=True))

# 1. finn den første tag-en ved navn "sun", og les attributtene "rise" og "set"
# 2. les disse attributtene inn i et dato-og-tid objekt (ved hjelp av dparser.parse())
sunrise = dparser.parse(next(tree.iter('sun')).attrib['rise'])
sunset = dparser.parse(next(tree.iter('sun')).attrib['set'])

# hent ut tid-delen, gjør denne om til en tekststreng og skriv ut
print "Rise (UTC tid): " + str(sunrise.time())
print "Set (UTC tid): " + str(sunset.time())
Rise (UTC tid): 06:44:57
Set (UTC tid): 16:17:51

Hent aktuelt værsymbol

In [13]:
from lxml import etree
import dateutil.parser as dparser
import datetime as dt
from IPython.display import Image

# les XML-dokument fra url og hent ut rot-noden (se http://api.met.no/weatherapi/locationforecast/1.9/documentation)
tree = etree.parse('http://api.met.no/weatherapi/locationforecast/1.9/?lat=59.9132694;lon=10.7391112')
root = tree.getroot()

# skriv ut hele XML-dokumentet
#print(etree.tostring(root, pretty_print=True))

# finn modellen som heter "LOCAL" og les ut tidsperioden varselet gjelder for
for element in tree.iter('model'):
    if element.attrib['name'] == 'LOCAL':
        from_time = dparser.parse(element.attrib['from'])
        to_time = dparser.parse(element.attrib['to'])

print "Leser fra varsel for perioden " + str(from_time) + " til " + str(to_time) + " (UTC tid)"


# 1. gå igjennom alle time-tag-er, finn tag-en som dekker nåtid til +1 time
# 2. finn så værsymbolet gitt i tag-en "symbol", som er en barne-tag av time-tag-en
for element in tree.iter('time'):
    current_from = dparser.parse(element.attrib['from'])
    current_to = dparser.parse(element.attrib['to'])
    if current_from == from_time and (from_time + dt.timedelta(hours=1)) == current_to:
        weather_symbol_text = next(element.iterdescendants('symbol')).attrib['id']
        weather_symbol_number = next(element.iterdescendants('symbol')).attrib['number']
     
print "\nAktuelt værsymbol:"

# konstruer url for å hente riktig værsymbol fra api.met.no
weather_symbol_url = "http://api.met.no/weatherapi/weathericon/1.1/?symbol=" + weather_symbol_number +";is_night=0;content_type=image/png"
#print weather_symbol_url

# hent værsymbol-bildet og vis det
weather_symbol_image = Image(url=weather_symbol_url)
display(weather_symbol_image)

print weather_symbol_text
Leser fra varsel for perioden 2015-02-19 12:00:00+00:00 til 2015-02-22 00:00:00+00:00 (UTC tid)

Aktuelt værsymbol:
Cloud
In [ ]: