echo 'Hauptprognose ohne Wanderung';so wird diese Meldung im "Miniprotokoll, d.h. im Protokoll, im Textfenster der Hauptmaske, in der Logdatei (Hauptmaske/Datei/Logdatei) und in Hauptmaske/Start/Eigene Scripts/Start/batch_all.pl ausgegeben.
Für die Prognose eine Verknüpfung für eine Eingabedatei erstellen:
shortcut 'zuvol_v1', 'zuvol'; shortcut '../generic/bgwr2000', 'bgwr2000'; shortcut 'H:/pool/fruc2000', 'fruc2000';und nach der Prognose wieder zu löschen
remove qw(zuvol bgwr2000 fruc2000);Bei kleinen Eingabedateien kann es bequemer sein, diese vor der Prognose zu erstellen:
fwrite 'eckreg.csv', <<e; 2010;3;2;0;1500 2010;3;2;1;1200 2010;3;2;2;1500 eund nach der Prognose zu entfernen
remove 'eckreg';Weiterhin kann man Plausibilitätschecks ergänzen, z.B.
echo "ndemo/D1: vergleiche neubaub mit bew Spalte 9 und 14"; my $n = filesum 'neubaub', 2010; my $a = filesum 'bew', 2010, 8; # Summe über Binnenauszüge in Neubauten my $e = filesum 'bew', 2010, 13; # Summe über Erstbezug is $n, $a, 1, "neubaub $n gleich bew Binnenauszüge in Neubauten $a"; is $n, $e, 1, "neubaub $n gleich bew Erstbezug aus Untersuchungsgebiet $e"; chkbewgem 'bewgem', 2010, 1, 0; # ist Endbevölkerung = Anfangsbev. + Bewegungen ? # Vergleiche Summe pro Gebiet von eckgem und gem my $eh = filehash 'eckgem', [2010, 1], 2; my $gh = filehash 'gem2010', 2010, 1; echo dump $eh, $gh; # Testausgabe ishash $eh, $gh, 1, "eckgem = gem2010", 1;Beispiel:
echo 'Prognose mit hohem Außenzuzug'; purge; # lösche Versionsunterverzeichnis shortcut qw(zuvol_hoch zuvol); # verwende zuvol_hoch grnvzgr 'fruc2000'; # Geburtenraten nach Vorgabe TFR srnvle 'strb200', 61, 1; # Sterberaten nach Vorgabe Lebenserwarungnach der Prognose:
indikator({aggGKZ => $_, dir => 'ind_'.$_) foreach(1, 2); report($_) foreach(1, 2, 13); zeitreihe($_, 'zr_ag_', q($i,$i,$i,$i,int($i)/20)) foreach qw(gem gebam); xyplot 'zr_ag_gem'; matrix(fn => 'gstrom', shape => 4, size => 1000); blackbox_test 1 1; remove 'zuvol'; # lösche Verknüpfung zu zuvol_hochIm einzelnen gibt es folgende Funktionen:
agg $hash, 'reftyp', 4;aggregiert eine differenzierte Summe von filehash auf Binnentypen
my $e = filehash 'ecktyp', 2010, 2; # Zielwerte Binnentypen P3 my $g = filehash 'gem2010', 2010, 1; # Summe Gebiete my $b = agg $g, 'reftyp', 4; # Aggregation Summe Gebiet auf Binnentypen # Vergleich Zielwerte Binnentypen mit aggregierter gem: ishash $e, $b, 1, "ecktyp = agg(gem2010)", 1;
appcol '-', '2..5', sub{}, 'zr_gem2020', 'zr_gem2029, 'zr_gem20-29'; # '-' : Operation # '2..5' : Schlüsselspalten # sub{} : hier leere Funtion für Berechnungen Ausgabedatei # zr_gem2020 : Ausgangsdateie # zr_gem2029 : Anzufügende Datei oder Dateien # zr_gem20-29 : Ausgabedateisiehe Spalten anfügen/addieren/subtrahieren
blackbox_test $delta, $verbose;Bausteinabhängige Konsistenzprüfungen.
$delta | Toleranz für die Genauigkeit der Ergebnisse, z.B. 1 |
---|---|
$verbose | 0-3: Geschwätzigkeit |
Sollten Inkonsistenzen auftauchen, ist eine Prüfung auf mögliche Modell- oder Programmierfehler in der Prognose oder im Prüfprogramm sinnvoll.
Einwohner/Prognose/Berechnen/Befehle (nach der Prognose)
blackbox_test 1, 0;startet diesen Test nach jeder Prognose
Im Einzelnen werden pro Prognosejahr JJJJ folgende Prüfungen durchgeführt:
Je nach Baustein:
C1-4 | wegvol = wegzug = bew Außenwegzug |
---|---|
C6 | wegvJJJJ = bew Außenwegzug |
D1 | neubaub = bew Neubauerstbezug aus UG + Neubauerstbezug von außen bew Binnenauszug aus Neubauerstbezug = bew Neubauerstbezug aus U |
E1 | rueckbaub = bew Rückbauendauszug nach außen + nach UG wegzug = bew Rückbauendauszug nach außen + Außenwegzug bew Binnenzuzug aus Rückbauendauszug = bew Rückbaueneauszug ins UG |
G1 | eckgeb = bew Geburt |
G2 | eckgebg (gkz definiert) = bewegm Geburt |
K1-4 | zuvol = bew Außenzuzug = zuzug |
K5 | zuvlJJJJ = bew Außenzuzug = zuzug |
K5 | zuvgJJJJ = bew Außenzuzug |
M1-2 | eckreg = gemJJJJ |
N1-4 | saldvol = zuzug - wegzug zuvolo = saldvol + wegzug |
P1 | eckgem = gemJJJJ |
P2 | gemJJJJ in eckgem[1 .. 2] |
P3 | ecktyp = gemJJJJ |
P4 | gemJJJJ in ecktyp[1 .. 2] |
S1 | eckstrb = bew Sterbefall |
S2 | eckstrbg (gkz definiert) = bewgem Sterbefall |
Y1 | bgwg = bew Geburt |
browse 'zr_gem.csv'; # Anzeige Ausgabedatei zr_gem browse 'ind/index.html'; # Anzeige Protokoll Indikatoren browse 'ind'; # Anzeige Verzeichnis IndikatorenAnzeige einer Datei oder Verzeichnis im Versionsunterverzeichnis.
indikator report xyplot zeitreihe
BS('C') == 2) # return Bausteinnummer BS('C', 1, 2) # Bausteinnummer ist 1 oder 2
call 'hello.pl'; # Ausführen script (Versionsverzeichnis)/hello.pl call '../hello.pl'; # bei Variantenprognosen nützlich call 'hello.pl', 'args' 'to' 'hello'; # with arguments
chkbew $filename, $filter, $t, $verbose [, $notage];Prüft Konsistenz von gem(filter), dsga/r(filter), bew, gem(filter+1), d.h. ob Endbevölkerung gleich Anfangsbevölkerung + die diversen Bewegungen ist.
g0(gkz,bg,gg,ag) <- gem(filter) g1(gkz,bg,gg,ag) <- gem(filter+1) R1: dsga(filter) von g0 abziehen R2: dsgr(filter)-Rate von g0 abziehen g0 altern (Altersindices erhöhen, bei NAG-1 aufsammeln) für jede Zeile von bew bilanz = g0 + Summe über die Bewegungen mit Vorzeichen + g1 prüfe (|bilanz| < t) ?Beispiel:
chkbew 'bew', 2010, 1, 0; chkbew 'bewagg', 2010, 1, 0; # funktioniert (noch) nicht, verwende chkbewagg
chkbewagg $filter, $t, $verbose;Prüfe, ob bewagg Aggreagat von bew ist.
chkbewgem $filename, $filter, $t, $verbose;Prüft Konsistenz von bewgem oder bewgemagg, d.h. ob Endbevölkerung gleich Anfangsbevölkerung + die diversen Bewegungen ist.
chkbew 'bewgem', 2010, 1, 0; chkbew 'bewgemagg1', 2010, 1, 0;
my ($name, $n) = colnum 'bew', 'DG4WA.WA';Spaltenname $name = 'Außenwegzug', Spaltenummer $n = 8 in Datei bew
dospath('file')erzeugt Dateinamen
C:\...\file.csv
echo 'hello'; # hello echo `dir`; # Ergebnis Systembefehl 'directory listing' PrognoseergebnisverzeichnisAusgabe Text ins Textfeld der SIKURS Hauptmaske
echof '%.2f', $sum;Formatierte Ausgabe
if (eqaref(1, 2, 3, [1, 2, 3])) { ... }Vergleiche array mit arrayref
filehash 'filename', filter, hashcol [, valcol]; filter ab Spalte 1: [2010] oder [2010, 1] oder [] hascol Spalten für hash: [] | [2] | [1 .. 5] valcol Wertespalte (Optional -1 =letzte)lese in hash
my $g = filehash 'gem2013', [], [2 .. 5]; echo $g{107}{1}{2}{42};Beispiel 2: zr_gem
fwrite '/zr_gem', (filehash('gem*', [], [1 .. 5])[1];Beispiel 3: zr_gem aggregiert auf Jahr und Gebiet
fwrite '/zr_gem', (filehash('gem*', [], [1 .. 2])[1];
my $gebiete = filekeys 'gem2010', [], [2];Anzahl Schlüssel in Datei
filesum 'filename', filter[, column];bildet die Summe einer Datei 'filename' über die Spalte column (Voreinstellung die letzte Spalte), deren erste Spalte mit filter übereinstimmt.
my $z = filesum 'zuvol', 2010; # Summe über letzte Spalte des Abschnitts 2010 my $e = filesum 'eckgem, [2010, 2]; # Summe über alle Werte mit 2010;2 in den ersten beiden Spalten # entspricht bei P2 und eckgem der Summe der Obergrenzen my $f = filesum 'fruc2010', []; # Summe über alle Werte my $f = filesum 'fruc2010'; # Summe über alle Werte
'dsga2010' = find_file('dsga', 2013);Finde Datei dsga2013 oder älter
('gem2010', 'gem2011') = find_file('gem*');Finde alle Dateien gem*
floats 'bew', 2;Anzahl nichtganzzahliger Werte in Datei 'bew' mit verbosity 0/1/2(dashboard)
fsort 'gstrom_roh', 'gstrom';sortiert
gstrom_roh.csv
fwrite 'filename', t1, t2, ... 'filename' Datei filename.csv im Projektverzeichnis '/filename' Datei filename.csv im Versionsunterverzeichnis t1, t2, .. Text | hasref Beispiel: # Erstelle Datei eckreg.csv: fwrite 'eckreg', < 'EOT'; 2013;1;1;0;3100 2014;1;1;0;3300 EOT Erstelle Datei gem2010_copy.csv im Versionsunterverzeichnis: my $gem = filehash 'gem2010', [], [1 .. 5]; fwrite '/gem2010_copy', "jhr;g;b;g;a;n\n", $gem;
gname 'zuzug', 2
gzuzug.csv
GoL qw(-rows 30 -cols 30 -size 20 -start what -p 0.3 -delay 200 -torus 1); what: line_4 | line_10 | glider | small_exploder | exploder | spaceship | tumbler | gosper_glider_gun | [[3,2],[3,3],[3,4]]see a b
grnvzgr('fruc2000'); grnvzgr('C:/.../fruc2000');Geburtenraten nach Vorgabe Zusammengefasste Geburtenrate mit Ausgangsdatei
fruc2000.csv
gstromname, 2
1: strom, 2: gstrom_weg, 3: gstrom_zu, 4: gstrom_weg, 5: gstrom, 6: gstrom
my $sum = hashsum $hashref;Summe der Blätter einer mehrstufigen hash
zeitreihe('gem', '../hhp/gem', ['$i', 'reftyp 1 12', '$i', '$i', '$i', { subset =gt; 2 }); # aggregiere gem-Dateien für hhprog hhprog('hhp', { Prognose = > 1 }; # Haushalteprognose # Haushalteprognose in Unterverzeichnis 'hhp' mit optionalen Parametern: # berechneQuoten => 0, # Prognose => 1, # jung => 35, # alt => 65, # AusgabeMicroMerkmale => 0, # Protokollumfang => 1, # Zeitreihenplot => 1, # FilterW01 => 0, # QtypCol => 12, # R02map => 1, # NBG => 2, # LFWBB => 0startet Ergebnis/Zeitreihe/Start
IPF 'IPF2021', 'IPF2021_ipf', { format => 2, iter => 20, eps => 1e-10, verbose => 4);"Iterative Proportional Fit" siehe Extras/Eigene Sripts/Start/IPF.pl
is $a, $b, $t, 'comment';ist a == b bis auf Toleranz t
isdefsorted 2, undef, 7, 'comment';prüft, ob die definierten Argumente sortiert sind.
ishash $a, $b, $t, 'comment', $verbose [, $fak];Prüft, ob gem-artige Datenstruktur a bis auf Faktor $fak identisch zu Datenstruktur b (bis auf Toleranz t) ist
issorted 2, 5, 7, 'comment';prüft, ob die Argumente sortiert sind.
jahre([$js, [$je]])gibt Bereich [Startjahr+$js .. Endjahr+$je] zurück
ok $b, 'comment';Prüft, ob b "wahr"
ok filesum('gem2011', 2011) < 3000, 'gem2011 < 3000';
if (-e path('zuvol'));path gibt Pfad zurück und -e prüft, ob pfad existiert
if (pathex('zuvol'));prüft, ob pfad existiert
indikator(1); # mit Parametern aus sikurs.ini indikator(0); # mit default Parametern indikator({}); # mit default Parametern # indikator mit expliziten einzelnen oder allen Parametern # fehlende Parameter haben voreingestellten Wert indikator({ # Differenzierung der Indikatoren refGKZ => 2, refTYG => 3, refTYS => 4, diffBG => 1, diffGG => 1, # Altersbereiche (siehe Datei App/constant.csv) NAGFU => 15, NAGFO => 44, NAGWU => 20, NAGWO => 64, # Auswahl gem Dateien allGEM => 1, # Ausgabeoptionen prtQA => 0, prtALE => 0, prtHTM => 1, prtCSV => 1, dir => 'ind', # Name Ausgabeverzeichnis });berechnet Indikatoren von Prognoseergebnissen
matrix(fn => 'gstrom', shape => 4, size => 1000);Visualisierung/Zeitreihen/Stromkreise
gstrom.csv (gwegzug.csv gzuzug.csv strom.csv wegzug.csv zuzug.csv)
als "animated gif heatmap" mit 1000 Punkten Grafikhöhe.filter => '', # Auswahlfilter "#1 == 2009" key => 'set key outside', # set key left term => "pngcairo enhanced size 800,600 color solid font 'Arial,10'", reftorte => 'reftorte'; # Referenzdatei demografische Struktur bei shape 2 shape => 4, # 1 Kreise, 2 Torten, 3 Farbpalette 1, 4 Farbpalette 2 title => 'Titel',
purge;Löscht das Versions-Unterverzeichnis
my $ref = reftyp 5Spalte 5 ist tyb (Spalten zählen ab 1)
remove 'zuvol'; # löscht zuvol.csv.lnk oder zuvol.csv remove 'zuvol.csv'; # löscht zuvol.csv remove 'zuvol.csv.lnk'; # löscht zuvol.csv.lnk remove 'fruc*.csv.lnk'; # löscht fruc2012.csv.lnk, fruc2013.csv.lnk, ... remove '*.lnk'; # löscht alle .lnk DateienAchtung: keine Dateien löschen, die später z.B. für Indikatoren benötigt werden.
report(n); # reporting für Differenzierung n: # 1 Untersuchungsraum # 2 Gebiet # 3 Typ Geburten # ... report($_) foreach (1 .. 13); # reporting für alle Spalten der reftyp.csvReport Ergebnis Einwohnerprognose liest Parameter aus
opt.txt
falls vorhanden
shortcut 'zuvol_v1', 'zuvol'; # im gleichen Verzeichnis shortcut '../share/zuvol_v1', 'zuvol'; # mir relativem Pfad shortcut 'H:/daten/zuvol_v1', 'zuvol'; # mit absolutem PfadErstellt die Verknüpfung
zuvol.csv.lnk
auf
zuvol_v1.csv
zuvol.csv
kann parallel existieren, die Prognose wird
aber zuvol.csv.lnk
verwenden.remove 'zuvol.csv.lnk';
kann man den Link gezielt
wieder Löschen und zuvol.csv
behalten.skip 'noch nicht fertig', 7skip 7 Tests
split_file 'gem';Zerlege Datei
gem.csv
in die Jahresanbschnitte
gem2020.csv gem2021.csv ...
srnvle('strb2000',61,1); srnvle('C:/.../strb2000',61,1);Sterberaten nach Vorgabe Lebenserwartung mit Ausgangsdatei
strb2000.csv
, 61 Iterationen und Ausgabe 0-Werte
summaryAusgabe blackbox test summary information
subsystem q(zrgem -o ../hhp/gem -a "$i,reftyp 1 12,$i,$i,$i" -r)Starte SIKURS subsystem zrgem zur Aggregation Zeitreihe (Einwohner/Prognose/Berechnen/Parameter/Zeitreihe)
-o ../hhp/gem # Ausgabedatei gem.csv im Unterverzeichnis hhp der Prognose -a "$i,$i,$i,$i,$i" # Aggregationsformeln für 5 Spalten -r # ohne Ausgangsjahr Prognose(siehe alternative Zeitreihe)
adeton hhprog dstmak shp2plt sikern
)
system('C:\...\Rscript.exe', 'C:\...\myscript.R'); # starte R-script set_encoding('CP850'); # Codierung cmd shell system('dir/B >prot.tmp'); # Dateien im Versionsunterverzeichnis echo `dir/B`; # same same
thematicMap(colattr => 6, shapefile => 'C:/../nbg_district.shp', datafile => 'zr_gem'); # colattr => '', # Merkmalsnummer aus dbf-Datei für Farbe # rgbformula => '7,5,15', # rgb-Formel # cbrange => '*:*', # range Merkmal # diasize => '', # diagram type and size # diaattr => '3,4,5', # Merkmalsnummern diagram # txtattr => '', # Mermalsnummer Textausgabe # PLTlabelfont => 'Arial,6', # Font für gnuplot "set label ..." # PLTerm => 'pngcairo', # gnuplot set term # PLTheight => 800, # gnuplot set term size x, 800 # PLTermfont => 'Arial,8', # gnuplot set term font 'Arial,8'Ergebnis/Anzeige/Thematische Karte
xyplot('zr_gem'); xyplot('zr_gem', 1, 2, '', -1, { area => 0, # 0 absolut, 1 Flächenplot, 2 Histogramm filter => '', # Auswahlfilter '#1 == 2009' key => 'set key outside', # set key left lines => 'linespoints', # lines, points title => 'schöner Titel', xlabel => 'Jahr', xrange => '*:*', # 2000:2030 ylabel => 'Einwohner', yrange => '*.*, # 0:1000 });Visualisierung/Zeitreihen/X-Y-Plot mit den Parametern
zr_gem | zu plottende Datei (ohne .csv) |
---|---|
1 | Spalte Jahr |
2 | Spalte(n) Schlüssel |
Spalte Geschlecht | |
-1 | Spalte Wert (-1 = letzte) |
{ } | Optionen |
zeitreihe([typ [, agg [, par]]]); typ: bew bewagg ... gem ... zuzug agg: '$i,reftyp 1 5,$i,1,int($i)/20' par: { subset => 2, # 1: alle, 2: nur Ausgabedateien aggFunc => 1, # Anzahl Sätze statt Summe round => 1, # Willmann Rundung columnCross => 5, # Spalte 5 nebeneinander jahre => [2001, 2005, 2009], # aggregiere nur diese Jahre } # Beispiele zeitreihe; # > zr_gem.csv zeitreihe('gem', 'xr_gem'); # > xr_gem.csv zeitreihe('bew', '../zr_gem'); # > ../zr_gem.csv zeitreihe('bew', 'D:/dat/bew'); # > D:/dat/bew.csv # > zr_gem.csv mit Gebiet > Binnentyp, 1 BG, 5 AG: zeitreihe('gem', 'zr_gem', '$i,reftyp 1 5,1,$i,int($i/20)'); # > zr_gem.csv, zr_bew.csv mit Aggregation Anzahl Sätze statt Summe my $agg = q($i,$i,1,1,0); my $par = { aggFunc => 1 }; zeitreihe($_, 'zr_'.$_, $agg, $par) foreach qw(gem bew); # > zr_gem2020.csv zr_gem2029.csv mit Summe pro Gebiet: zeitreihe('gem', 'zr_gem'.$_, [qw($i $i 1 1 0)], { jahre => [$_]}) foreach(2020, 2029); # Prozentuale Veränderung (100 * (zr_gem2029 - zr_gem2020) / zr_gem2020) -> zr_gem20_29 my $prozent = sub { my $r=shift; $r->[2] = 100 * ($r->[1] - $4->[0]) / $4->[0] }; appcol('.', '2..5', $prozent, 'zr_gem2020', 'zr_gem2029', 'zr_gem20_29'); # Thematische Karte Prognosebilanz pro Gebiet thematicMap(colattr => 7, datafile => 'zr_gem20_29', shapefile => 'C:/../karte.shp')Ergebnis Zeitreihe
subsystem q(zrgem -o../hhp/gem -a '$i,reftyp 1 12,$i,$i,$i' -r)