Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tilføj tidsserie-modul (fire.api.ts) #547

Draft
wants to merge 14 commits into
base: master
Choose a base branch
from
Draft

Conversation

xidus
Copy link
Collaborator

@xidus xidus commented Jan 13, 2022

Disse ændringer er indtil videre i draft-status.

Det skyldes, at arbejdet stadig pågår, herunder endelig brug af ændringer, som @kbevers har lavet til datamodellen, som betyder, at de eksplicitte SQL-forespørgsler i dette PR skal oversættes til tilsvarende ORM-forespørgsler.

Ændringerne i dette PR føjer følgende API til FIRE:

  • Gør det muligt at hente eksisterende tidsserie.
  • Gør det muligt at hente seneste/udvalgte observationer af punkter i tidsseriens punktsamling.
  • Gør det muligt at beregne koter (med GNU Gama) for disse observerede punkter, så de kan indgå som et nyt tidsskridt for hvert observereret punkt i punktsamlingens tidsserie.
  • Gør det muligt at lægge de nye tidsskridt ind i FIRE-databasen, så tidsserien derved opdateres.

@xidus xidus linked an issue Jan 13, 2022 that may be closed by this pull request
9 tasks
@xidus xidus changed the title Tilføj tidsserie-modul (fire.api.ts) [ci skip]. Tilføj tidsserie-modul (fire.api.ts) Jan 13, 2022
@xidus
Copy link
Collaborator Author

xidus commented Jan 13, 2022

Eksempel på anvendelse, som koden ser ud nu:

from fire.api import ts
punkt_id = 'fb89d73a-c2a5-4fd6-974f-1fff650f5a66'
mulige = ts.hent_mulige_tidsserier(punkt_id)
mulige
# [('TS:81007', 11),
#  ('EPSG:25832', 8),
#  ('EPSG:4937', 7),
#  ('EPSG:5799', 2),
#  ('DK:S34S', 2),
#  ('DK:GI44', 2),
#  ('TS:BUDP', 1),
#  ('EPSG:4258', 1)]

# Der er en tidsserie med SRID TS:81007
jessen_id = '81007'
tidsserie = ts.hent_tidsserie(jessen_id)

# Hent observationer fra opmålingsperiode ud fra punktgruppen i tidsserien
punktgruppe = sorted(set(tidsserie.punkt_id))
observationer_punktgruppe = ts.hent_observationer_af_punktgruppe(punktgruppe, dato_fra='2018-05-01', dato_til='2018-11-01')

# Hent observationer fra opmålingsperiode ud fra jessen_id (tidsserie-ID'et)
observationer_tidsserie = ts.hent_observationer_for_tidsserie(jessen_id, dato_fra='2018-05-01', dato_til='2018-11-01')

# Check, at de to resultatsæt er ens
all(observationer_punktgruppe == observationer_tidsserie)
# True

# Relativ kote
g = tidsserie
g['residual'] = g.kote - g[g.jessen_id == jessen_id].kote[0]

# Plot ...
# (...)

Copy link
Collaborator

@busstoptaktik busstoptaktik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lidt løse kommentarer. Ikke alle er reelt relevante på dette stadie i kodens udviklingshistorie, men måske anvendelige til overvejelse omkring den videre udvikling?

return pd.DataFrame(columns=datacls.__annotations__).astype(datacls.__annotations__)


def dataframe(datacls):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Smart!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pissesmart!!


# --- TEMP

# ENV_DB = 'test'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Det ville väre rart med en kommentar her: Man skal helt ned og læse logikken i get_db() før man kan se meningen

# --- TEMP

# ENV_DB = 'test'
ENV_DB = 'prod'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ENV_DB: Final = 'prod'

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nå - jeg kan se at en kommentar oppe i toppen er drattet ud, med dekontekstualisering af denne kommentar til følge.

Det jeg mente var at typeannotationen Final markerer en konstant. Final bør derfor importeres sammen med Iterable i dit from typing import udtryk

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh, nice, den kendte jeg ikke... :)


import datetime as dt
from dataclasses import dataclass
from typing import Iterable
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Det vil nok være en god idé også at importere Final fra typing, da du benytter konstanter

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hov, nej, her kom den jo...


# ENV_DB = 'test'
ENV_DB = 'prod'
DB = None
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DB er ikke en konstant, og bør derfor hedde db iflg dette afsnit af PEP8

WHERE pit.infotype = 'IDENT:landsnr'
)
SELECT
p.id AS punkt_id,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... og dog: Er dette rent faktisk en anvendelse, eller bare definition af en ny punkt_id?

Comment on lines 122 to 123
k.t AS dato,
k.z AS kote,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Jeg er i hvert fald ret sikker på at disse to AS ikke anvendes

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@busstoptaktik selvom AS-aliasserne ikke nødvendigvis bruges direkte i SQL-koden kan det godt give mening. Det er også en måde at omdøbe kolonnerne i sit output, se fx her:

Screenshot 2022-01-14 at 11 55 22

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Praktisk!

# return ny_df(TidsseriePost).append(data) # .astype(TidsseriePost)


def hent_observationer_af_punktgruppe(punktgruppe: Iterable[str], dato_fra: dt.datetime = None, dato_til: dt.datetime = None, full_print: bool = False) -> pd.DataFrame:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hent_observationer_i_punktgruppe ville være et mere retvisende navn, da den enkelte observation er "i" og vi ikke altod har obs af hele gruppen

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tak, jeg overvejede også semantikken til disse funktioner, men var ikke helt tilfreds. Jeg ser på det.

* Punkgruppen er større end to punkter, da nedenstående forespørgsel ikke dur uden mindst to punkter, der er observeret mellem i løbet af det angivne tidsrum.
"""
# Start et halvt år tilbage, hvis én eller begge datoer i tidsrummet mangler.
# TODO: Genbesøg detaljer, når resten er klar.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

God idé :-)

p.id = '{punkt_id}'
"""
print(sql)
return fetchall(sql)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Det ser ud som om der mangler et linjeskift her

@xidus
Copy link
Collaborator Author

xidus commented Jan 21, 2022

Jeg undlader commits med ændringer til _netoversigt i den endelige rebase.

@kbevers
Copy link
Collaborator

kbevers commented Jan 21, 2022

Lige nu er det lidt svært at overskue koden her. Det ser ud som om der bliver foretaget to overordnede ting: 1) refaktorisering af regneark/dataframes og 2) tidsseriehåndtering. Måske det er en fordel at dele dem op i to separate pull requests?

@xidus xidus force-pushed the feat/ts/niv branch 2 times, most recently from c5721ce to 9d7e9e3 Compare February 15, 2022 07:56
@xidus xidus self-assigned this Feb 15, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
3 participants