Skip to content
Closed

test #127

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/ssb_konjunk/dash/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""422 dash framework."""
2 changes: 1 addition & 1 deletion src/ssb_konjunk/dash/assets/indirect.css
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@
color: var(--secondary-color);
margin:0px;
font-weight: bolder;
}
}
2 changes: 1 addition & 1 deletion src/ssb_konjunk/dash/assets/kontroller.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
display: grid;
columns: 1;
gap: 20px;
}
}
11 changes: 5 additions & 6 deletions src/ssb_konjunk/dash/assets/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@
padding-bottom:20px;
padding-left:20px;
padding-right:20px;

}

table {
width:100%;
}

td {

white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
Expand Down Expand Up @@ -99,11 +99,11 @@ table, th, td {
}

.nav-row-container {

display:flex;
flex-direction: row;
align-items: flex-end;

}
.nav-item-container{
height: fit-content;
Expand All @@ -117,11 +117,10 @@ table, th, td {
.nav-item {
color: var(--main-secondary);
font-size:18px;

}

a.nav-item:hover {
color: var(--main-color);
font-size:18px
}

6 changes: 3 additions & 3 deletions src/ssb_konjunk/dash/assets/selector.css
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
@import "main.css";

.selector-option-text {

}

.selector-option-active {
Expand All @@ -21,10 +21,10 @@
padding-left: 6px;
}
.selector-container{

padding-left: 10px;
border-right: 1px solid var(--main-color);
height: 100%;
margin-right: 10px;
white-space: nowrap;
}
}
6 changes: 3 additions & 3 deletions src/ssb_konjunk/dash/assets/visualize.css
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
}

.visualizer-dropdown-item:hover {

}

.visualizer-nace-dropdown {
Expand Down Expand Up @@ -99,7 +99,7 @@
color: white;
}

.VirtualizedSelectOption:hover {
.VirtualizedSelectOption:hover {
background-color: var(--secondary-color);
color:white
}
}
1 change: 1 addition & 0 deletions src/ssb_konjunk/dash/calculations/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""functions to calculate the datasets for the dash app."""
14 changes: 6 additions & 8 deletions src/ssb_konjunk/dash/calculations/calc_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class DataManager:
------------------
- `self.raw_source`, `self.calendar_source`, `self.season_source`, `self.weigth_source`:
Datastrukturer for ulike måter å representere eller justere tidsserier.
- `get_table_X_v2(...)`: Metoder for å hente ulike tabellvarianter (17), hver tilpasset spesifikke analysetyper.
- `get_table_X_v2(...)`: Metoder for å hente ulike tabellvarianter (1-7), hver tilpasset spesifikke analysetyper.
- Statiske hjelpefunksjoner for sortering, prosentberegning og visuell formatering.
- Intern periodehåndtering for fleksibel datoanalyse.

Expand All @@ -51,7 +51,7 @@ class DataManager:

"""

def __init__(self, data: pd.DataFrame, *args, **kwargs):
def __init__(self, data: pd.DataFrame) -> None:
"""Initialiserer klassen med behandlet og strukturert tidsseriedata.

Filtrerer bort spesifikke 'nar'-verdier, sorterer data, henter klassifikasjonskoder,
Expand All @@ -61,8 +61,6 @@ def __init__(self, data: pd.DataFrame, *args, **kwargs):
Args:
data (pd.DataFrame): Inndata som inneholder tidsseriedata, med blant annet
kolonnene 'nar', 'periode', 'jus', 'korr', 'ujust' og 'verdi'.
*args: Ekstra posisjonsargumenter (ikke i bruk).
**kwargs: Ekstra nøkkelordsargumenter (ikke i bruk).
"""
nus = KlassClassification(
classification_id="6", language="nb", include_future=False
Expand Down Expand Up @@ -116,7 +114,7 @@ def __init__(self, data: pd.DataFrame, *args, **kwargs):
)

@staticmethod
def pad_single(x):
def pad_single(x: str) -> str:
"""Legger inn innrykk basert på nivå i hierarkisk kode.

Gitt en streng der nivåer er adskilt med bindestrek (f.eks. '1 - 1.1 - 1.1.1'),
Expand Down Expand Up @@ -168,7 +166,7 @@ def to_percent(
return (weights * chg_rate) / 100

@property
def header_1(self):
def header_1(self) -> list[str]:
"""Lister standardkolonner for visning i tabelloversikt.

Returns:
Expand All @@ -186,7 +184,7 @@ def get_nacer(self) -> list[str]:
"""
return self.data["nar"].unique().tolist() # pyright: ignore

def add_klass_codes(self, data: pd.DataFrame, on: str):
def add_klass_codes(self, data: pd.DataFrame, on: str) -> pd.dataframe:
"""Legger til klassifikasjonsnavn til et datasett basert på en spesifisert kolonne.

Slår opp koder fra `self.class_codes` og legger til fullstendige navn i en ny kolonne,
Expand Down Expand Up @@ -258,7 +256,7 @@ def get_all_periods(self) -> list[str]:
"""
return [item.as_period() for item in self.periods.create_period_range(12)]

def format_aggregates(self, data: pd.Series):
def format_aggregates(self, data: pd.Series) -> pd.series:
"""Formaterer hierarkiske aggregeringskoder med innrykk.

Bruker `pad_single` for å legge til visuelt innrykk basert på hierarkinivå
Expand Down
65 changes: 49 additions & 16 deletions src/ssb_konjunk/dash/calculations/helper_functions.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import datetime
from datetime import date
from datetime import datetime
from typing import Literal
Expand All @@ -8,23 +7,23 @@
import polars as pl


def monthdelta(d1: datetime, d2: datetime):
"""Finner differansen mellom to måneder"""
def monthdelta(d1: datetime, d2: datetime) -> int:
"""Finner differansen mellom to måneder."""
d1_ = pendulum.instance(d1)
d2_ = pendulum.instance(d2)
return (d1_ - d2_).in_months()


def parse_period(period: str) -> datetime:
"""Parser en periode til datetime"""
"""Parser en periode til datetime."""
return datetime.strptime(period, "%Y-%m")


def multi_join(
dfs: list[pl.DataFrame],
on: str,
how: Literal["left", "right", "inner", "cross", "semi", "anti"] = "left",
):
) -> pl.DataFrame:
"""Slår sammen flere Polars DataFrames sekvensielt på en spesifisert kolonne.

Utfører en kjedet sammenslåing (join) av flere DataFrames i en gitt liste basert på én felles kolonne.
Expand All @@ -46,6 +45,8 @@ def multi_join(


class DataSource:
"""Representerer en datakilde tilrettelagt for tidsbasert analyse og gruppering."""

def __init__(
self,
data: pl.DataFrame,
Expand Down Expand Up @@ -136,7 +137,7 @@ def _gen_header(self, n: int, skip: int = 0):
oldest: datetime = dates[-1 - ((n * skip) + n)]
return f"{self._create_date(oldest)} - {self._create_date(latest)}"

def _base(self, n: int, *agg, **named_aggs):
def _base(self, n: int, *agg: pl.Expr, **named_aggs: pl.Expr):
"""Utfører aggregering over dynamiske tidsvinduer og grupper.

Args:
Expand All @@ -156,7 +157,9 @@ def _base(self, n: int, *agg, **named_aggs):
.agg(*agg, **named_aggs)
)

def _base_w_header(self, n: int, skip: int = 0, *agg, **named_aggs):
def _base_w_header(
self, n: int, skip: int = 0, *agg: pl.Expr, **named_aggs: pl.Expr
):
"""Genererer en overskrift for perioden og returnerer resultatet fra baseaggregering.

Kombinerer datoperiode-headeren med aggregerte resultater fra `_base`.
Expand Down Expand Up @@ -208,7 +211,7 @@ def n_month_percent(self, n: int, skip: int = 0) -> tuple[str, pl.DataFrame]:
},
)

def n_percent_rolling(self, n: int, skip: int = 0):
def n_percent_rolling(self, n: int, skip: int = 0) -> pl.DataFrame:
"""Beregner rullerende prosentvis endring over en periode og returnerer med datoperiode-header.

Denne metoden bruker en rullerende tidsvinduanalyse for å beregne prosentvis endring
Expand All @@ -225,14 +228,14 @@ def n_percent_rolling(self, n: int, skip: int = 0):
"""

def _gen_header(n: int, skip: int = 0):
"""Lager overskrift for hver perioden"""
"""Lager overskrift for hver perioden."""
dates = self.data.get_column(self._date).unique().sort()
latest: datetime = dates[-1 - (skip)]
oldest: datetime = dates[-1 - ((skip) + n - 1)]
return f"{self._create_date(oldest)} - {self._create_date(latest)}"

def map_test(x: pl.DataFrame):
"""Lager det rullende gjennomsnittet for hver periodegruppe"""
"""Lager det rullende gjennomsnittet for hver periodegruppe."""
if x.shape[0] != n:
x = x.with_columns(
**{self._avg: pl.col(self._col).fill_null(strategy="backward")}
Expand Down Expand Up @@ -261,7 +264,7 @@ def map_test(x: pl.DataFrame):
.explode(self._avg)
)

def n_mean_rolling(self, n: int, skip: int = 0):
def n_mean_rolling(self, n: int, skip: int = 0) -> pl.DataFrame:
"""Beregner et rullerende gjennomsnitt for hver gruppe i datasettet og returnerer med datoperiode-header.

Denne metoden beregner gjennomsnittet av verdiene innenfor et rullerende vindu på `n` måneder.
Expand All @@ -278,14 +281,14 @@ def n_mean_rolling(self, n: int, skip: int = 0):
"""

def _gen_header(n: int, skip: int = 0):
"""Lager overskrift for hver perioden"""
"""Lager overskrift for hver perioden."""
dates = self.data.get_column(self._date).unique().sort()
latest: datetime = dates[-1 - (skip)]
oldest: datetime = dates[-1 - ((skip) + n - 1)]
return f"{self._create_date(oldest)} - {self._create_date(latest)}"

def map_test(x: pl.DataFrame):
"""Lager det rullende gjennomsnittet for hver periodegruppe"""
"""Lager det rullende gjennomsnittet for hver periodegruppe."""
if x.shape[0] != n:
x = x.with_columns(
**{self._avg: pl.col(self._col).fill_null(strategy="backward")}
Expand Down Expand Up @@ -374,14 +377,35 @@ def n_month_percent_compare(
return header, joined


def rounded_average(df: pd.DataFrame, ordered_columns: list[str]):
def rounded_average(df: pd.DataFrame, ordered_columns: list[str]) -> pd.Series:
"""Beregner gjennomsnitt per rad for utvalgte kolonner, avrundet til én desimal.

Args:
df (pd.DataFrame): DataFrame med data.
ordered_columns (list[str]): Liste med kolonnenavn som skal inkluderes i gjennomsnittet.

Returns:
pd.Series: Gjennomsnitt per rad, avrundet til én desimal.
"""
df_copy = df[ordered_columns]
df_copy = df_copy.round(1)
res = df_copy.sum(axis="columns").div(len(ordered_columns))
return res.round(1)


def calc_change_rate(df: pd.DataFrame, ordered_columns: list[str], n: int = 1):
def calc_change_rate(
df: pd.DataFrame, ordered_columns: list[str], n: int = 1
) -> pd.dateframe:
"""Beregner prosentvis endring mellom kolonner over n perioder.

Args:
df (pd.DataFrame): DataFrame med data.
ordered_columns (list[str]): Liste med kolonnenavn i rekkefølge.
n (int, optional): Antall perioder tilbake for endringsberegning. Defaults to 1.

Returns:
pd.DataFrame: Prosentvis endring per rad for hver kolonne (fra n. kolonne og fremover).
"""
results = []
for i in range(n, len(ordered_columns), 1):
col_present = ordered_columns[i]
Expand All @@ -392,7 +416,16 @@ def calc_change_rate(df: pd.DataFrame, ordered_columns: list[str], n: int = 1):
return pd.concat(results, axis="columns", keys=ordered_columns[n:])


def rolling_change_rate(df: pd.DataFrame, step: int = 1):
def rolling_change_rate(df: pd.DataFrame, step: int = 1) -> pd.dateframe:
"""Beregner rullende prosentvis endring mellom kolonner med gitt steg.

Args:
df (pd.DataFrame): DataFrame med kolonner som representerer perioder.
step (int, optional): Antall kolonner å hoppe over for å beregne endring. Defaults to 1.

Returns:
pd.DataFrame: Prosentvis endring per rad, med kolonner fra `step` og fremover.
"""
results = []
for i in range(step, len(df.columns), step):
col_present = df.columns[i]
Expand Down
Loading
Loading