Module:Population de France/Données
Apparence
La documentation pour ce module peut être créée à Module:Population de France/Données/doc
--[[
Sous-module de Module:Tableau population d'article de commune de France contenant
les fonctions de génération des notes associées à des données de population
--]]
local p = {}
p.outils = require("Module:Population de France/Outils")
p.constantes = require("Module:Population de France/Constantes")
--[[
fonction de chargement des données, via module de données
retourne la structure de données (ou nil si échec de chargement)
et en seconde valeur true si les données sont complètes, un numéro d'erreur sinon
--]]
function p.charge_donnees(nom)
-- cache accès fonction (pour performances)
local mwTrim = mw.text.trim
-- vérification
if ((nom == nil) or (nom == "")) then
return nil, 1
end
local donnees = "Module:Données/" .. nom .. "/évolution population"
-- données présentes ?
local etat, data = pcall(require, donnees)
if (etat == false) then
return nil, 2
end
data.module = donnees
-- on vérifie la présence des données nécessaires
-- données communes
if ((data["nom"] == nil) or (data["division"] == nil)) then
return data, 3
end
-- division prise en charge ?
if (p.constantes.divisions[data["division"]] == nil) then
return data, 4
end
-- superficie présente ?
if ((data["superficie"] == nil) or (tonumber(data["superficie"]) == nil)) then
return data, 4
end
data["superficie"] = tonumber(data["superficie"])
-- données spécifiques (selon la division)
-- spécifiques aux communes
if ((data["division"] == "commune") or (data["division"] == "commune en DROM") or
(data["division"] == "commune en COM1") or (data["division"] == "commune nouvelle") or
(data["division"] == "commune en COM2") or (data["division"] == "commune en COM3") or
(data["division"] == "commune déléguée") or (data["division"] == "ancienne commune") or
(data["division"] == "commune associée")) then
if ((data["nom-dep"] == nil) and (data["division"] ~= "commune en DROM")) then
return data, 5 -- obligatoire, sauf pour DROM
end
if (data["insee"] == nil) then
return data, 5
end
if (data["recens-prem"] == nil) then
return data, 5
end
if (data["recens-prem"] ~= "annuel") then
if (tonumber(data["recens-prem"]) == nil) then
return data, 5 -- vaut annuel ou une année
end
data["recens-prem"] = tonumber(data["recens-prem"]) -- en cas de "
end
else
-- pour les autres il faut un recens-prem = annuel
data["recens-prem"] = "annuel"
end
-- À FAIRE pour les autres
-- on "calcule" les données qui peuvent être reconstruites
if (data["nom-wp"] == nil) then
-- reconstruction du wikilien
local nom = data.nom:gsub( ' %(.+', '' )
if nom == data.nom then
data["nom-wp"] = '[[' .. nom .. ']]'
else
data["nom-wp"] = '[[' .. data.nom .. '|' .. nom .. ']]'
end
end
-- le type (permet de regrouper toutes les communes)
data["type"] = p.constantes.divisions[data["division"]]
-- données calculées
local nb = 0 -- nombre d'années dans les données
local mmin = -1 -- min/max des années avec référence
local mmax = -1
local pmin = -1 -- population min/max
local pmax = -1
local premier = -1 -- première et dernière année
local dernier = -1
-- on reconstruit les valeurs min/max/nb
for annee, pop in pairs(data) do
if (type(annee) == "number") then
nb = nb + 1
if (pop["ref"] ~= nil) then
if (annee > mmax) then
mmax = annee
end
if ((mmin == -1) or (annee < mmin)) then
mmin = annee
end
end
vpop = tonumber(mwTrim(pop["pop"]))
if (vpop > pmax) then
pmax = vpop
end
if (vpop > 0) then -- on ne compte pas "-1" qui indique "pas de valeur"
if ((pmin == -1) or (vpop < pmin)) then
pmin = vpop
end
end
-- idem premier/dernier
if (annee > dernier) then
dernier = annee
end
if ((premier == -1) or (annee < premier)) then
premier = annee
end
end
end
if (mmin ~= -1) then
data["minref"] = mmin
end
if (mmax ~= -1) then
data["maxref"] = mmax
end
if (pmin ~= -1) then
data["popmin"] = pmin
end
if (pmax ~= -1) then
data["popmax"] = pmax
end
if (premier ~= -1) then
data["premier"] = premier
end
if (dernier ~= -1) then
data["dernier"] = dernier
end
data["nombre"] = nb-1
-- on retourne les données
return data, true
end
--[[
Calcule la variation de population (en %, signé, arrondi à 2 digits)
sur les 5 dernières années, ou nil si pas trouvé / problème
--]]
function p.variation(data)
-- vérifications
if (data == nil) then
return nil
end
if ((data["dernier"] == nil) or (data[data["dernier"]] == nil)) then
return nil
end
-- s'il n'y a pas 5 ans, on prend le plus ancien
local cible = data["dernier"]-6 -- On prend 6 ans de 2022 à 2027 en raison de l'absence de collecte en 2021, cf https://www.insee.fr/fr/statistiques/fichier/6005800/fichereport_EAR_20211115.pdf
if (data["nom-dep"] == "Mayotte" or data["nom-dep"] == "Nouvelle-Calédonie" or data["nom-dep"] == "Wallis-et-Futuna" or data["nom-dep"] == "Polynésie française") then -- Ces collectivités ne sont pas concernées par l'absence de collecte en 2021 (autre méthode de recensement)
cible = data["dernier"]-5
end
if (data[cible] == nil) then
return nil
-- désactivé
-- cible = data["premier"]
end
return p.outils.round(100*(data[data["dernier"]]["pop"] - data[cible]["pop"]) /
data[cible]["pop"], 2), cible
end
--[[
Utilise la fonction précédente pour créer la phrase "en augmentation/diminution de X % par rapport à NNN"
retourne en second paramètre +1 si augmentation, -1 si réduction, 0 si stagnation
--]]
function p.variation_texte(data)
local delta, cible = p.variation(data)
if (delta ~= nil) then
if (delta < 0) then
return "en diminution de " .. mw.language.getContentLanguage():formatNum(-delta) .. " % par rapport à " .. cible, -1
elseif (delta > 0) then
return "en augmentation de " .. mw.language.getContentLanguage():formatNum(delta) .. " % par rapport à " .. cible, 1
else -- égal
return "en stagnation par rapport à " .. cible, 0
end
else
return nil
end
end
--[[
Retourne une table contenant { année, population } correspondant
aux données les plus récentes pour cette commune
--]]
function p.valeur_recente(data)
if ((data["dernier"] == nil) or (data[data["dernier"]]["pop"] == nil)) then
return nil
end
return { data["dernier"], data[data["dernier"]]["pop"] }
end
return p