Files
palkkakysely/template/index.html
Aarni Koskela 663cd3d349 Add 2025 survey data support
The 2025 survey uses a single English-only xlsx (instead of separate
fi/en files) with a restructured schema: compensation is split into
base salary, commission, lomaraha, bonus, and equity components;
working time is h/week instead of percentage; and competitive salary
is categorical instead of boolean. Vuositulot is now synthesized
from the component fields.

Drop COLUMN_MAP_2024, COLUMN_MAP_2024_EN_TO_FI, VALUE_MAP_2024_EN_TO_FI,
read_initial_dfs_2024, read_data_2024, map_sukupuoli, map_vuositulot,
split_boolean_column_to_other, apply_fixups, and the associated gender
value lists and boolean text maps. All of this exists in version history.

- KKPALKKA now includes base salary + commission (median 5500 → 5800)
- Apply map_numberlike to tuntilaskutus and vuosilaskutus columns to
  handle string values like "60 000" and "100 000"
- Filter out zeros when computing tunnusluvut on the index page so
  stats reflect actual reported values

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:40:13 +02:00

95 lines
3.9 KiB
HTML

{% extends "_base.html" %}
{% macro eur_span(number) -%}
<span title="{{ number }}" class="eur" data-number="{{ number }}">{{ number }}&nbsp;</span>
{%- endmacro %}
{% macro tunnusluvut_points(df, col_name, title) %}
{% with num_kk = df[col_name][pd.to_numeric(df[col_name], errors='coerce') > 0].dropna() %}
<li title="n = {{ num_kk.count() }}">{{ title }}, keskiarvo = {{ eur_span(num_kk.mean()|round(0)) }}</li>
<li title="n = {{ num_kk.count() }}">{{ title }}, mediaani = {{ eur_span(num_kk.median()|round(0)) }}</li>
{% endwith %}
{% endmacro %}
{% block body %}
<header>
<a href="https://koodiklinikka.fi">
<img src="{{ logo_svg }}" alt="koodiklinikan logo" style="height: 3em">
</a>
</header>
<h1>Koodiklinikan palkkakysely, {{ year }}</h1>
<ul>
<li><i>n</i> = {{ df|length }}</li>
<li><i>n</i> palkansaajia = {{ df[df[cm.PALKANSAAJA_VAI_LASKUTTAJA_COL] == "Palkansaaja"]|length }}</li>
<li><i>n</i> laskuttajia = {{ df[df[cm.PALKANSAAJA_VAI_LASKUTTAJA_COL] == "Laskuttaja"]|length }}</li>
</ul>
<h2>Palkansaajien tunnusluvut</h2>
<ul>
{% for col_name, title in [
(cm.KKPALKKA_COL, 'kuukausipalkka'),
(cm.VUOSITULOT_COL, 'vuositulot'),
(cm.KK_TULOT_NORM_COL, 'laskennallinen norm. kuukausipalkka'),
] %}
{{ tunnusluvut_points(df, col_name, title) }}
{% endfor %}
</ul>
<h2>Laskuttajien tunnusluvut</h2>
<ul>
{% for col_name, title in [
(cm.TUNTILASKUTUS_ALV0_COL, 'tuntilaskutus (ALV 0%)'),
(cm.VUOSILASKUTUS_ALV0_COL, 'vuosilaskutus (ALV 0%)'),
] %}
{{ tunnusluvut_points(df, col_name, title) }}
{% endfor %}
</ul>
<h2>Työkalut</h2>
<ul>
<li><a href="charts.html">Kaaviot</a></li>
<li><a href="profiling_report.html">Lähdedatan analyysi</a></li>
<li><a href="/palkkakysely/analysaattori/?url=/palkkakysely/{{ year }}/data.json">Pivot-työkalu</a></li>
</ul>
<h2>Data</h2>
Tämä data on käsitelty
<a href="https://github.com/koodiklinikka/palkkakysely/tree/master/pulkka">normalisointiskripteillä</a>.
<ul>
<li><a href="data.csv">Lähdedata (CSV)</a></li>
<li><a href="data.html">Lähdedata (HTML)</a></li>
<li><a href="data-vertical.html">Vastaukset eriteltyinä (HTML)</a></li>
<li><a href="data.json">Lähdedata (JSON)</a></li>
<li><a href="data.xlsx">Lähdedata (XLSX)</a></li>
</ul>
<h2>Raakadata</h2>
Tämä on Google Sheetsistä tuotu käsittelemätön raakadata.
<ul>
<li><a href="raw.tsv">Raakadata (TSV)</a></li>
<li><a href="raw.xlsx">Raakadata (XLSX)</a></li>
</ul>
<div class="muistutus">
<script async data-uid="d6b9e17663" src="https://koodiklinikka-palkkakysely.kit.com/d6b9e17663/index.js"></script>
<noscript>
<a href="https://koodiklinikka-palkkakysely.kit.com/d6b9e17663">Tilaa muistutus</a>
</noscript>
</div>
<h2>Viittaaminen ja lisenssi</h2>
<p>
Viittaathan dataa käyttäessäsi tähän sivustoon: <a href="{{ site_url }}">{{ site_url }}</a>.
</p>
<p>
Datan lisenssi on <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0
International</a> (CC&nbsp;BY&nbsp;4.0).<br>
Mankelointityökalujen lisenssi on <a href="https://opensource.org/licenses/MIT">MIT</a>.
</p>
<script>
for (const eur of document.querySelectorAll(".eur")) {
// Try to parse data-number, format as browser-native currency
const number = parseFloat(eur.dataset.number);
if (!isNaN(number)) {
eur.textContent = number.toLocaleString("fi-FI", {style: "currency", currency: "EUR"});
}
}
</script>
{% endblock %}
{% block footer %}
<footer>
Generoitu {{ date }}
</footer>
{% endblock %}