-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add data generator folder #200
Conversation
if enddate is not None and int(enddate[:4]) < 2019: #filter out "stillgelegt vor 2019" | ||
continue |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One check that I believe is missing here is whether a unit was temporarily out of order on 2018-12-31. There are a few:
sqlite3 --readonly --table --header Marktstammdatenregister.db <temp.sql
+--------------------+--------------------+---------------------+---------------------+-----------------------------+---------------------------------------+----------------------------+
| EinheitMastrNummer | Gemeindeschluessel | Registrierungsdatum | Inbetriebnahmedatum | DatumEndgueltigeStilllegung | DatumBeginnVoruebergehendeStilllegung | DatumWiederaufnahmeBetrieb |
+--------------------+--------------------+---------------------+---------------------+-----------------------------+---------------------------------------+----------------------------+
| SEE940917235426 | 06431003 | 2021-06-11 | 1992-07-13 | | 2013-01-01 | |
| SEE970950685179 | 09471208 | 2021-02-22 | 1998-01-01 | | 2018-07-01 | |
| SEE908579456740 | 14521180 | 2019-12-30 | 2000-11-27 | | 2018-05-28 | |
| SEE946498391087 | 06435021 | 2021-06-21 | 2001-05-09 | 2016-12-03 | 2016-12-02 | |
| SEE924641851886 | 08435057 | 2021-03-02 | 2001-12-01 | | 2013-10-15 | |
| SEE963007354166 | 08222000 | 2020-08-05 | 2002-12-17 | | 2015-08-03 | 2020-08-04 |
| SEE953246223538 | 08222000 | 2020-08-04 | 2004-07-26 | | 2015-08-03 | |
| SEE984820500431 | 08222000 | 2020-08-04 | 2004-07-26 | | 2015-08-04 | |
| SEE985573680722 | 08222000 | 2020-08-18 | 2004-07-26 | | 2015-01-01 | |
| SEE988733115041 | 06635018 | 2019-03-02 | 2006-09-08 | 2016-01-01 | 2015-12-31 | |
| SEE936191315770 | 08119018 | 2020-09-23 | 2006-12-15 | | 2015-02-23 | 2020-05-09 |
| SEE933515647708 | 03360001 | 2021-02-07 | 2008-04-30 | | 2016-12-12 | |
| SEE907763705213 | 09180117 | 2020-11-30 | 2009-05-19 | | 2017-11-27 | |
| SEE995170337905 | 05911000 | 2021-01-28 | 2009-11-05 | | 2018-03-12 | |
| SEE934689600001 | 05154036 | 2021-01-31 | 2010-06-01 | | 2018-12-28 | |
| SEE937282159198 | 03360001 | 2021-02-07 | 2010-06-30 | | 2016-12-12 | |
| SEE929943807784 | 08435057 | 2021-03-02 | 2010-12-13 | | 2013-10-15 | |
| SEE986230459743 | 13071096 | 2020-01-14 | 2011-09-30 | | 2012-10-06 | |
| SEE947572090827 | 08336014 | 2020-08-11 | 2011-12-15 | | 2011-12-16 | |
| SEE914810546941 | 08326052 | 2019-05-23 | 2011-12-19 | | 2011-12-20 | |
| SEE987563779416 | 05758004 | 2020-11-30 | 2011-12-29 | | 2013-12-29 | |
| SEE974929724524 | 08426013 | 2021-09-03 | 2011-12-31 | | 2018-08-01 | 2021-02-24 |
| SEE966845109103 | 02000000 | 2019-08-09 | 2012-03-05 | | 2018-02-16 | |
| SEE948748543444 | 16051000 | 2021-01-31 | 2012-06-05 | | 2016-12-13 | |
| SEE933708173960 | 07315000 | 2021-02-12 | 2013-03-28 | | 2017-12-06 | |
| SEE942263936569 | 07337070 | 2020-07-05 | 2014-07-31 | | 2018-01-01 | 2020-06-24 |
| SEE959082082117 | 06440017 | 2021-02-11 | 2014-10-31 | | 2018-07-25 | 2020-12-07 |
| SEE981269470325 | 01057077 | 2019-03-03 | 2017-05-15 | 2017-05-17 | 2017-05-16 | |
| SEE964966236203 | 05112000 | 2020-12-31 | 2017-09-18 | | 2017-09-24 | 2019-06-30 |
| SEE921772502595 | 05112000 | 2020-12-31 | 2017-09-25 | | 2017-10-04 | |
| SEE967773395460 | 12063142 | 2019-03-14 | 2018-12-08 | | 2018-12-09 | 2019-03-14 |
+--------------------+--------------------+---------------------+---------------------+-----------------------------+---------------------------------------+----------------------------+
Generated with
select
EinheitMastrNummer,
Gemeindeschluessel,
Registrierungsdatum,
Inbetriebnahmedatum,
DatumEndgueltigeStilllegung,
DatumBeginnVoruebergehendeStilllegung,
DatumWiederaufnahmeBetrieb
from
EinheitSolar
where
Inbetriebnahmedatum <= "2018-12-31"
and DatumBeginnVoruebergehendeStilllegung <= "2018-12-31"
and (DatumWiederaufnahmeBetrieb is null or DatumWiederaufnahmeBetrieb > "2018-12-31")
To be fair, their total Nettonennleistung is only ~369 kW.
temp.sql
How to obtain DB: GermanZero-de/localzero-data-public#29
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ja das stimmt. Das sollte wahrscheinlich noch hinzugefügt werden. Obwohl 369 kW eigentlich vernachlässigbar über die ~30 kommunen ist.
Aber füge ich noch hinzu! Danke für das Feedback :)
"09478444":"Neuensorger Forst ist ein gemeindefreies gebiet", | ||
"01053105":"Sachsenwald ist ein gemeindefreies Gebiet", | ||
"06435200":"Gutsbezirk Spessart ist ist ein gemeindefreies Gebiet", | ||
"01060014":"BuchholzerForstist ist ein gemeindefreies Gebiet", | ||
"09572444":"Gdefr. Geb. (Lkr Erlangen-Höchstadt) ist ein gemeindefreies Gebiet", | ||
"03155501":"Solling (Landkreis Northeim) ist ein gemeindefreies Gebiet", | ||
"03153504":"Harz (Landkreis Goslar), gemfr. Gebiet ist ein gemeindefreies Gebiet"} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you explain the process by which you reduced the AGS history to the short list here in exceptionDict
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@curiousleo wir berechnen mit local zero ja nur die AGS-Schlüssel in unserer Master Liste mit dem stand 31.12.2018. (siehe localzero-data-public/ags/master.csv)
Dort haben wir keine gemeindefreien Gebiete mit aufgenommen, weil wir für die AGS-Schlüssel auch in anderen Daten-Tabellen noch Datenlücken haben. (Gemeindefreie Gebiete sind meistens Naturflächen/Wälder/Seen etc., die keine eigene Verwaltung haben und wo sonst auch nicht sonderlich viel passiert).
Ich prüfe in dem Skript, nachdem ich alle Markstammdatenregister Einheiten, den bei ihnen eingetragenen Ags-Schlüsseln zugeordnet habe, ob alle hieraus resultierenden AGS-Schlüssel auch in der Master Liste sind. Ist das nicht der Fall gibt es verschiedene Optionen:
- Der Ags-Schlüssel ist ein alter Schlüssel einer kommune, die vor Ende 2018 ihren Ags geändert hat.
- Der Ags-Schlüssel ist ein neuer Schlüssel einer kommune, die nach Ende 2018 ihren Ags geändert hat.
- Der Ags-Schlüssel gehört zu einem gemeindefreien Gebiet und ist deswegen nicht in der Masterliste.
Aktuell frage ich für alle diese Fälle die json, die man unter https://www.xrepository.de/api/xrepository/urn:xoev-de:bund:destatis:bevoelkerungsstatistik:codeliste:ags.historie_2021-12-31/download/Destatis.AGS.Historie_2021-12-31.json findet, ob es für die jeweiligen Schlüssel Änderungen vor oder nach 2018 gab und passe diese an (wie genau ich das mache ist hier vielleicht erstmal nicht relevant, aber können wir auch gerne nochmal drüber reden).
Danach überprüfe ich nochmal, ob die nun angepassten Schlüssel in der Masterliste sind.
Dies war selbstverständlich nicht der Fall bei den 7 gemeindefreien Gebieten in meiner Exception list. Die habe ich manuell erstellt mit mehreren Script-Durchläufen. Das Script stoppt, wenn der Fall auftritt, dass ein angepasster AGS nicht in der Master liste enthalten ist.
Hilft dir das? :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Ultramarin95 danke für die ausführliche Erklärung.
Verstehe ich es richtig, dass die Werte in dem markierten dictionary quasi den Grund angeben, warum dieser AGS ignoriert wird? (Konkret zum Beispiel: "AGS 01053105 wird ignoriert, weil Sachsenwald ein gemeindefreies Gebiet ist".)
Dann halte ich es für eine gute Idee, das dictionary kurz zu kommentieren, etwa mit "Diese AGS werden ignoriert, zum Beispiel weil wir zurzeit für gemeindefreie Gebiete keine Daten aufbereiten. Die den AGS zugeordneten Werte geben den Grund an, warum der jeweilige AGS ignoriert wird."
data/dataGeneratorScripts/generateRenewables/importMarktStammDaten.py
Outdated
Show resolved
Hide resolved
data/dataGeneratorScripts/generateRenewables/importMarktStammDaten.py
Outdated
Show resolved
Hide resolved
data/dataGeneratorScripts/generateRenewables/importMarktStammDaten.py
Outdated
Show resolved
Hide resolved
Danke für deine Kommentare @curiousleo. Man sieht vielleicht, dass ich noch nicht so lange mit Python arbeite und diese sinnvollen Module noch nicht so kenne :D Baue ich ein! |
def handle_not_in_master( | ||
input_dict: defaultdict, | ||
master: list, | ||
data_list, | ||
look_up_dict, | ||
population_dict: dict, | ||
*, | ||
print_details: bool = False, | ||
): | ||
""" | ||
This deals with all ags entries in input_dict that are not contained in the master list. It adds the power values of the missing ags keys to their | ||
successors or predecessors. | ||
|
||
So far the powers are distributes over sevreal ags keys proportional to their population. | ||
The EE-unit is disregarded/deleted if the ags corresponds to a gemeindefreie Gebiet. | ||
""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Diese Funktion ist der komplizierteste Teil dieses PRs. So wie ich das sehe, ist das zum Teil, weil die Logik selbst komplex ist, aber die Implementierung macht es einem auch nicht einfach, die Logik zu verstehen.
In der ags-historie.json
steht folgendes:
Änderungsart: 1=Auflösung (AGS wird ungültig); 2=Teilausgliederung (Gemeinde gibt einen Teil ab, AGS bleibt weiterhin gültig); 3=Schlüsseländerung (AGS wird ungültig, Gemeinde bekommt einen neuen AGS, z.B. bei Kreiszugehörigkeitsänderungen); 4=Namensänderung (AGS bleibt bestehen, Gemeinde bekommt einen neuen Namen oder eine Zusatzbezeichnung wie z.B. ", Stadt"
Idealerweise gäbe es hier doctest
oder Dokumentation, um zu zeigen, wie input_dict
in den folgenden Fällen verändert wird:
- Gemeinde1 wird aufgelöst (Änderungsart = 1) und Teil von Gemeinde2.
- Gemeinde1 wird aufgelöst und Teil von Gemeinde2, dann wird Gemeinde2 aufgelöst und Teil von Gemeinde3.
- Gemeinde1 gibt einen Teil an Gemeinde2 ab (Änderungsart = 2).
- Gemeinde1 wird aufgelöst (Änderungsart = 1) und Teil von Gemeinde2 und außerdem gibt Gemeinde3 einen Teil an Gemeinde2 ab (Änderungsart = 2).
- Gemeinde1 ändert ihren AGS (Änderungsart = 3).
- Gemeinde1 ändert ihren Namen (Änderungsart = 4) und gleichzeitig ihren AGS -- einziges Beispiel, das ich finden konnte: Pulsnitz, Stadt (14625450) -> Puschwitz / Bóšicy (14625460).
(Damit GitHub das verlinkt: GermanZero-de/localzero-data-public#30 wird mit diesem Code generiert.) |
It looks like this currently needs some coding work. (If some of the things are done hitting the corresponding Resolve Conversation is a nice way to clean up). Anyway I've set this to Draft so that I don't have to actively check if this is ready now or not. @Ultramarin95 Set it to Ready for review when you have done your outstanding changes (or if I misunderstood what's going on). Also remember that your ready to rock output is now outdated so update that when you want to be merged. |
…erator-core into addDataGeneratorFolder
…thub.com/GermanZero-de/localzero-generator-core into addDataGeneratorFolder
I tried to really understand how this works by reading the code and trying different approaches myself. In the end I came up with a similar approach: grouping AGS together into connected components with a successor relation and then distributing power over them by population. (At least I think that's what the code in this PR does.) Here's what I came up with: importMarktStammDaten.py It can be run as follows: # Setup
poetry add disjoint-set
curl https://s3.eu-central-1.wasabisys.com/mastr-backup/Marktstammdatenregister.db.gz | gunzip - >Marktstammdatenregister.db
curl -o ags_historie.json https://www.xrepository.de/api/xrepository/urn:xoev-de:bund:destatis:bevoelkerungsstatistik:codeliste:ags.historie_2021-12-31/download/Destatis.AGS.Historie_2021-12-31.json
# Run it (outputs to "out3.csv" currently)
poetry run python importMarktStammDaten.py data/public/population/2018.csv ags_historie.json Marktstammdatenregister.db The main differences are:
The script takes ~13 seconds on my laptop to produce this CSV from the export created on 2022-04-12: 2018.csv |
Okay we need to resolve this one way or the other. @curiousleo @Ultramarin95 have you had offline discussions? If not can I get a brain dump from each one of you? |
Yes, @Ultramarin95 pointed out a case that the code I put forward doesn't handle. I can't retrieve it right now because the Matrix instance is unreachable for me. I think it was something along the lines of:
I'm really sorry to say that I don't think I'll have the time in the near future to fix the code I proposed to do this (even though there's a good chance the actual diff is very small). So here's how I see where things stand:
So the question is, what's the best way to get to working code that we have confidence in? I am not sure. I think that it would be worth considering fixing the code I suggested. With the testing setup in place, it should be possible with reasonable effort to actually turn existing examples where it gives the wrong answer into tests and then fix those cases with high confidence:
The alternative I see is to improve the code in this PR with documentation and tests. As far as I can tell, making the code testable will require some effort. And that's all I can say, really. Chucking a bunch of code over the fence is bad style. I did try to make the code legible at least. But feel free to reject it, obviously. |
@curiousleo Thanks for the update. Leon and I discussed this a bit more. Leon will do the work to do pretty much your suggestion (that is take your code as a starting point but add all of Leon's knowledge to make it actually correct to hopefully get something that is correct AND readable...). I'm not surprised that you don't have time now, I think I pretty much told you so when we had our first chat ;-). Anyhow best of luck and say hello to samdk from me. |
This reverts commit 88c8848.
@bgrundmann kann jetzt reviewed werden. Ich würde, bevor wir den Branch mergen, noch die Daten updaten und dann die Hashänderung hier mit reinnehmen. Siehe GermanZero-de/localzero-data-public#33 |
Okay go for it. |
Hier einmal die sich ändernden Variablen für Göttingen 2035:
|
We are ready to rock!
|
this adds a data generator folder in the data folder. You should look into this @bgrundmann if this structure is okay for you. We can also talk about this towmorrow (Donnerstag).
in principle we are ready to rock :)