Folium Choropleth Error ['NoneType' object is not subscriptable]

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Winflo
User
Beiträge: 9
Registriert: Donnerstag 25. Juni 2020, 12:17

Hallo zusammen,

ich möchte mit Folium ein Choropleth erstellen, welches Einfärbungen bei verschiedenen deutschen Postleitzahlen vornimmt und die Farben anhand von Preisen variieren. Leider komme ich mit folgender Fehlermeldung nicht weiter und brauche Hilfe:

Code: Alles auswählen

  File "C:\Users\choropleth_germany.py", line 122, in <module>
    legend_name = 'Gesamtpreise').add_to(karte)

  File "C:\Users\Nutzer\anaconda3\lib\site-packages\folium\features.py", line 1200, in __init__
    color_data = data.set_index(columns[0])[columns[1]].to_dict()

TypeError: 'NoneType' object is not subscriptable
Folgend mein Code:

Code: Alles auswählen

import folium

#Karte mit Lokalisierung von Deutschland
karte = folium.Map(location=[51.133481, 10.018343], tiles='Stamen Terrain', zoom_start=7)

#Pfad zur .geojson-Datei
geojson_germany = "C:\\Users\\gemeinden_simplify200.geojson"

#Erstellung des Choropleth
folium.Choropleth(geo_data = geojson_germany, 
                  data = gesamtpreise,
                  colums = ['Postleitzahl', 'Gesamtpreis'],
                  key_on ='Feature.properties.destatis.zip',
                  threshold_scale = [0,500,1000,1500],
                  fill_color = 'YlOrRd',
                  fill_opacitiy = 0.5,
                  line_opacitiy = 0.2,
                  legend_name = 'Gesamtpreise').add_to(karte)

#Choropleth speichern
karte.save("gesamtpreis_choropleth.html")
Die Variable gesamtpreise beinhaltet in Spalte 0 die Postleitzahlen (als String) und in Spalte 1 die Gesamtpreise (als Float).

Bild

Folgend ein Auszug aus der .geojson für den key_on:

Code: Alles auswählen

{"type":"Feature","properties":{"ADE":6,"GF":4,"BSG":1,"RS":"010040000000","AGS":"01004000","SDV_RS":"010040000000","GEN":"Neumünster","BEZ":"Stadt","IBZ":60,"BEM":"kreisfrei","NBD":"ja","SN_L":"01","SN_R":"0","SN_K":"04","SN_V1":"00","SN_V2":"00","SN_G":"000","FK_S3":"R","NUTS":"DEF04","RS_0":"010040000000","AGS_0":"01004000","WSK":"1970/04/26","DEBKG_ID":"DEBKGDL20000E4SA","destatis":{"RS":"010040000000","area":71.66,"population":79487,"population_m":39241,"population_w":40246,"population_density":1109,"zip":"24534,"center_lon":"9,988422","center_lat":"54,069895","travel_key":"F04"", ...
Da bin ich mir unsicher, ob ich für die Postleitzahl den richtigen key_on geschrieben habe.

Ich hoffe, ihr könnt mir helfen. Wenn ihr noch Informationen benötigt, sagt gerne Bescheid.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`columns` ist an der Stelle `None`. Weil Du das nicht übergibst nehme ich an. Du übergibst `colums`. Bitte einmal genau die Buchstaben in diesen beiden Namen vergleichen. 😉
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Winflo
User
Beiträge: 9
Registriert: Donnerstag 25. Juni 2020, 12:17

Danke blackjack! Da hatte sich dann wohl ein Flüchtigkeitsfehler eingeschlichen. :wink:

Kurze Frage noch zur Fehlermeldung die nun direkt im Anschluss kam:

Code: Alles auswählen

  File "C:\Users\Nutzer\anaconda3\lib\site-packages\folium\features.py", line 1243, in get_by_key
    return (obj.get(key, None) if len(key.split('.')) <= 1 else

AttributeError: 'NoneType' object has no attribute 'get'
Müssen in meinem Dataframe alle Postleitzahlen vorhanden sein, die es auch in meiner .geojson-Datei gibt? Oder färbt Folium die nicht existierenden Postleitzahl dann nur nicht ein (so möchte ich das gerne)?
Winflo
User
Beiträge: 9
Registriert: Donnerstag 25. Juni 2020, 12:17

Also der Fehler liegt bei key_on ... Ich habe gerade mehrfach verschiedenste Kombinationen ausprobiert, doch keine funktioniert.

Code: Alles auswählen

key_on = 'features.properties.zip'        #AttributeError: 'NoneType' object has no attribute 'get'
key_on = 'feature.properties.zip'                     #ValueError: key_on `'properties.zip'` not found in GeoJSON
key_on = 'feature.properties.destatis.zip'     #AttributeError: 'NoneType' object has no attribute 'get'
key_on = 'features.properties.destatis.zip'  #AttributeError: 'NoneType' object has no attribute 'get'
key_on = 'feature.properties.zip'                     #ValueError: key_on `'properties.zip'` not found in GeoJSON
key_on = 'features.properties.zip'                  #AttributeError: 'NoneType' object has no attribute 'get'
Kann mir jemand von euch helfen, wieso der key_on nicht greift?

Folgend findet ihr die .geojson-Datei als Dict:

Bild

Bild

Bild

Bild

Bild

Bild
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Winflo: Laut Dokumentation muss es mit "feature." anfangen, womit alle Varianten mit "features." schon mal raus sind.

Demnach müsste es also "feature.properties.destatis.zip" sein. Und ich vermute mal ganz stark, dass es diesen Pfad/Wert auch in jedem Feature-Wert geben muss. Und das es den Wert der da gelesen wird, auch garantiert in den Daten geben muss wo das dann als Schlüssel verwendet wird.

Wenn man im Netz nach dem Dateinamen sucht, den Du da verwendest, findet man das hier: https://gist.github.com/Tungurahua/304b ... 00-geojson

In der Datei gibt es den Wert in jedem Feature. Aber da ist auch kein Neumünster enthalten, also ist das wohl eine andere Datei.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Winflo
User
Beiträge: 9
Registriert: Donnerstag 25. Juni 2020, 12:17

Super, vielen Dank für die Unterstützung! Ich habe festgestellt, dass in der .geojson nicht alle Postleitzahlen aus meinem Dataframe vorhanden waren. Daraufhin habe ich eine andere verwendet und das Problem war gelöst.
Antworten