Skip to content

Commit 8a7576a

Browse files
authored
Merge pull request #128 from statisticsnorway/pre_commit_fix
Pre commit fix
2 parents 6fca75c + 9d8ee98 commit 8a7576a

24 files changed

+352
-89
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ repos:
6262
entry: pydoclint
6363
language: system
6464
types: [python]
65+
args: ["--allow-init-docstring=True"]
6566
- id: ruff
6667
name: ruff
6768
entry: ruff check --fix --exit-non-zero-on-fix

src/ssb_konjunk/dash/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""422 dash framework."""

src/ssb_konjunk/dash/assets/indirect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@
2424
color: var(--secondary-color);
2525
margin:0px;
2626
font-weight: bolder;
27-
}
27+
}

src/ssb_konjunk/dash/assets/kontroller.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
display: grid;
99
columns: 1;
1010
gap: 20px;
11-
}
11+
}

src/ssb_konjunk/dash/assets/main.css

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@
1919
padding-bottom:20px;
2020
padding-left:20px;
2121
padding-right:20px;
22-
22+
2323
}
2424

2525
table {
2626
width:100%;
2727
}
2828

2929
td {
30-
30+
3131
white-space: nowrap;
3232
overflow: hidden;
3333
text-overflow: ellipsis;
@@ -99,11 +99,11 @@ table, th, td {
9999
}
100100

101101
.nav-row-container {
102-
102+
103103
display:flex;
104104
flex-direction: row;
105105
align-items: flex-end;
106-
106+
107107
}
108108
.nav-item-container{
109109
height: fit-content;
@@ -117,11 +117,10 @@ table, th, td {
117117
.nav-item {
118118
color: var(--main-secondary);
119119
font-size:18px;
120-
120+
121121
}
122122

123123
a.nav-item:hover {
124124
color: var(--main-color);
125125
font-size:18px
126126
}
127-

src/ssb_konjunk/dash/assets/selector.css

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
@import "main.css";
22

33
.selector-option-text {
4-
4+
55
}
66

77
.selector-option-active {
@@ -21,10 +21,10 @@
2121
padding-left: 6px;
2222
}
2323
.selector-container{
24-
24+
2525
padding-left: 10px;
2626
border-right: 1px solid var(--main-color);
2727
height: 100%;
2828
margin-right: 10px;
2929
white-space: nowrap;
30-
}
30+
}

src/ssb_konjunk/dash/assets/visualize.css

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
}
4141

4242
.visualizer-dropdown-item:hover {
43-
43+
4444
}
4545

4646
.visualizer-nace-dropdown {
@@ -99,7 +99,7 @@
9999
color: white;
100100
}
101101

102-
.VirtualizedSelectOption:hover {
102+
.VirtualizedSelectOption:hover {
103103
background-color: var(--secondary-color);
104104
color:white
105-
}
105+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""functions to calculate the datasets for the dash app."""

src/ssb_konjunk/dash/calculations/calc_data.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class DataManager:
3434
------------------
3535
- `self.raw_source`, `self.calendar_source`, `self.season_source`, `self.weigth_source`:
3636
Datastrukturer for ulike måter å representere eller justere tidsserier.
37-
- `get_table_X_v2(...)`: Metoder for å hente ulike tabellvarianter (17), hver tilpasset spesifikke analysetyper.
37+
- `get_table_X_v2(...)`: Metoder for å hente ulike tabellvarianter (1-7), hver tilpasset spesifikke analysetyper.
3838
- Statiske hjelpefunksjoner for sortering, prosentberegning og visuell formatering.
3939
- Intern periodehåndtering for fleksibel datoanalyse.
4040
@@ -51,7 +51,7 @@ class DataManager:
5151
5252
"""
5353

54-
def __init__(self, data: pd.DataFrame, *args, **kwargs):
54+
def __init__(self, data: pd.DataFrame) -> None:
5555
"""Initialiserer klassen med behandlet og strukturert tidsseriedata.
5656
5757
Filtrerer bort spesifikke 'nar'-verdier, sorterer data, henter klassifikasjonskoder,
@@ -61,8 +61,6 @@ def __init__(self, data: pd.DataFrame, *args, **kwargs):
6161
Args:
6262
data (pd.DataFrame): Inndata som inneholder tidsseriedata, med blant annet
6363
kolonnene 'nar', 'periode', 'jus', 'korr', 'ujust' og 'verdi'.
64-
*args: Ekstra posisjonsargumenter (ikke i bruk).
65-
**kwargs: Ekstra nøkkelordsargumenter (ikke i bruk).
6664
"""
6765
nus = KlassClassification(
6866
classification_id="6", language="nb", include_future=False
@@ -116,7 +114,7 @@ def __init__(self, data: pd.DataFrame, *args, **kwargs):
116114
)
117115

118116
@staticmethod
119-
def pad_single(x):
117+
def pad_single(x: str) -> str:
120118
"""Legger inn innrykk basert på nivå i hierarkisk kode.
121119
122120
Gitt en streng der nivåer er adskilt med bindestrek (f.eks. '1 - 1.1 - 1.1.1'),
@@ -168,7 +166,7 @@ def to_percent(
168166
return (weights * chg_rate) / 100
169167

170168
@property
171-
def header_1(self):
169+
def header_1(self) -> list[str]:
172170
"""Lister standardkolonner for visning i tabelloversikt.
173171
174172
Returns:
@@ -186,7 +184,7 @@ def get_nacer(self) -> list[str]:
186184
"""
187185
return self.data["nar"].unique().tolist() # pyright: ignore
188186

189-
def add_klass_codes(self, data: pd.DataFrame, on: str):
187+
def add_klass_codes(self, data: pd.DataFrame, on: str) -> pd.dataframe:
190188
"""Legger til klassifikasjonsnavn til et datasett basert på en spesifisert kolonne.
191189
192190
Slår opp koder fra `self.class_codes` og legger til fullstendige navn i en ny kolonne,
@@ -258,7 +256,7 @@ def get_all_periods(self) -> list[str]:
258256
"""
259257
return [item.as_period() for item in self.periods.create_period_range(12)]
260258

261-
def format_aggregates(self, data: pd.Series):
259+
def format_aggregates(self, data: pd.Series) -> pd.series:
262260
"""Formaterer hierarkiske aggregeringskoder med innrykk.
263261
264262
Bruker `pad_single` for å legge til visuelt innrykk basert på hierarkinivå

src/ssb_konjunk/dash/calculations/helper_functions.py

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import datetime
21
from datetime import date
32
from datetime import datetime
43
from typing import Literal
@@ -8,23 +7,23 @@
87
import polars as pl
98

109

11-
def monthdelta(d1: datetime, d2: datetime):
12-
"""Finner differansen mellom to måneder"""
10+
def monthdelta(d1: datetime, d2: datetime) -> int:
11+
"""Finner differansen mellom to måneder."""
1312
d1_ = pendulum.instance(d1)
1413
d2_ = pendulum.instance(d2)
1514
return (d1_ - d2_).in_months()
1615

1716

1817
def parse_period(period: str) -> datetime:
19-
"""Parser en periode til datetime"""
18+
"""Parser en periode til datetime."""
2019
return datetime.strptime(period, "%Y-%m")
2120

2221

2322
def multi_join(
2423
dfs: list[pl.DataFrame],
2524
on: str,
2625
how: Literal["left", "right", "inner", "cross", "semi", "anti"] = "left",
27-
):
26+
) -> pl.DataFrame:
2827
"""Slår sammen flere Polars DataFrames sekvensielt på en spesifisert kolonne.
2928
3029
Utfører en kjedet sammenslåing (join) av flere DataFrames i en gitt liste basert på én felles kolonne.
@@ -46,6 +45,8 @@ def multi_join(
4645

4746

4847
class DataSource:
48+
"""Representerer en datakilde tilrettelagt for tidsbasert analyse og gruppering."""
49+
4950
def __init__(
5051
self,
5152
data: pl.DataFrame,
@@ -136,7 +137,7 @@ def _gen_header(self, n: int, skip: int = 0):
136137
oldest: datetime = dates[-1 - ((n * skip) + n)]
137138
return f"{self._create_date(oldest)} - {self._create_date(latest)}"
138139

139-
def _base(self, n: int, *agg, **named_aggs):
140+
def _base(self, n: int, *agg: pl.Expr, **named_aggs: pl.Expr):
140141
"""Utfører aggregering over dynamiske tidsvinduer og grupper.
141142
142143
Args:
@@ -156,7 +157,9 @@ def _base(self, n: int, *agg, **named_aggs):
156157
.agg(*agg, **named_aggs)
157158
)
158159

159-
def _base_w_header(self, n: int, skip: int = 0, *agg, **named_aggs):
160+
def _base_w_header(
161+
self, n: int, skip: int = 0, *agg: pl.Expr, **named_aggs: pl.Expr
162+
):
160163
"""Genererer en overskrift for perioden og returnerer resultatet fra baseaggregering.
161164
162165
Kombinerer datoperiode-headeren med aggregerte resultater fra `_base`.
@@ -208,7 +211,7 @@ def n_month_percent(self, n: int, skip: int = 0) -> tuple[str, pl.DataFrame]:
208211
},
209212
)
210213

211-
def n_percent_rolling(self, n: int, skip: int = 0):
214+
def n_percent_rolling(self, n: int, skip: int = 0) -> pl.DataFrame:
212215
"""Beregner rullerende prosentvis endring over en periode og returnerer med datoperiode-header.
213216
214217
Denne metoden bruker en rullerende tidsvinduanalyse for å beregne prosentvis endring
@@ -225,14 +228,14 @@ def n_percent_rolling(self, n: int, skip: int = 0):
225228
"""
226229

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

234237
def map_test(x: pl.DataFrame):
235-
"""Lager det rullende gjennomsnittet for hver periodegruppe"""
238+
"""Lager det rullende gjennomsnittet for hver periodegruppe."""
236239
if x.shape[0] != n:
237240
x = x.with_columns(
238241
**{self._avg: pl.col(self._col).fill_null(strategy="backward")}
@@ -261,7 +264,7 @@ def map_test(x: pl.DataFrame):
261264
.explode(self._avg)
262265
)
263266

264-
def n_mean_rolling(self, n: int, skip: int = 0):
267+
def n_mean_rolling(self, n: int, skip: int = 0) -> pl.DataFrame:
265268
"""Beregner et rullerende gjennomsnitt for hver gruppe i datasettet og returnerer med datoperiode-header.
266269
267270
Denne metoden beregner gjennomsnittet av verdiene innenfor et rullerende vindu på `n` måneder.
@@ -278,14 +281,14 @@ def n_mean_rolling(self, n: int, skip: int = 0):
278281
"""
279282

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

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

376379

377-
def rounded_average(df: pd.DataFrame, ordered_columns: list[str]):
380+
def rounded_average(df: pd.DataFrame, ordered_columns: list[str]) -> pd.Series:
381+
"""Beregner gjennomsnitt per rad for utvalgte kolonner, avrundet til én desimal.
382+
383+
Args:
384+
df (pd.DataFrame): DataFrame med data.
385+
ordered_columns (list[str]): Liste med kolonnenavn som skal inkluderes i gjennomsnittet.
386+
387+
Returns:
388+
pd.Series: Gjennomsnitt per rad, avrundet til én desimal.
389+
"""
378390
df_copy = df[ordered_columns]
379391
df_copy = df_copy.round(1)
380392
res = df_copy.sum(axis="columns").div(len(ordered_columns))
381393
return res.round(1)
382394

383395

384-
def calc_change_rate(df: pd.DataFrame, ordered_columns: list[str], n: int = 1):
396+
def calc_change_rate(
397+
df: pd.DataFrame, ordered_columns: list[str], n: int = 1
398+
) -> pd.dateframe:
399+
"""Beregner prosentvis endring mellom kolonner over n perioder.
400+
401+
Args:
402+
df (pd.DataFrame): DataFrame med data.
403+
ordered_columns (list[str]): Liste med kolonnenavn i rekkefølge.
404+
n (int, optional): Antall perioder tilbake for endringsberegning. Defaults to 1.
405+
406+
Returns:
407+
pd.DataFrame: Prosentvis endring per rad for hver kolonne (fra n. kolonne og fremover).
408+
"""
385409
results = []
386410
for i in range(n, len(ordered_columns), 1):
387411
col_present = ordered_columns[i]
@@ -392,7 +416,16 @@ def calc_change_rate(df: pd.DataFrame, ordered_columns: list[str], n: int = 1):
392416
return pd.concat(results, axis="columns", keys=ordered_columns[n:])
393417

394418

395-
def rolling_change_rate(df: pd.DataFrame, step: int = 1):
419+
def rolling_change_rate(df: pd.DataFrame, step: int = 1) -> pd.dateframe:
420+
"""Beregner rullende prosentvis endring mellom kolonner med gitt steg.
421+
422+
Args:
423+
df (pd.DataFrame): DataFrame med kolonner som representerer perioder.
424+
step (int, optional): Antall kolonner å hoppe over for å beregne endring. Defaults to 1.
425+
426+
Returns:
427+
pd.DataFrame: Prosentvis endring per rad, med kolonner fra `step` og fremover.
428+
"""
396429
results = []
397430
for i in range(step, len(df.columns), step):
398431
col_present = df.columns[i]

0 commit comments

Comments
 (0)