💻 Aggregering av data

💻 Aggregering av data#

Open In Colab

Dataaggregering refererer til en prosess der vi kombinerer data i grupper. Når vi gjør romlig dataaggregering, slår vi geometriene sammen til grovere enheter (basert på noen attributter), og kan også beregne sammendragsstatistikk for disse kombinerte geometriene fra de opprinnelige, mer detaljerte verdiene. For eksempel, anta at vi er interessert i å studere kontinenter, men vi har bare landnivådata som datsettet for land; Hvis vi aggregerer dataene etter kontinent, vil vi konvertere dataene på landsnivå til et datasett på kontinentnivå.

I denne opplæringen vil vi aggregere befolkningsdataene våre i Ås, dvs. rutenettcellene som har samme antall innbyggere vil bli slått sammen.

La oss starte med å laste inn befolkningsdata i Ås fra filen: aas_befolkning_2023.geojson:

import pathlib 
NOTEBOOK_PATH = pathlib.Path().resolve()
DATA_MAPPE = NOTEBOOK_PATH / "data"
import geopandas
intersection = geopandas.read_file(DATA_MAPPE / "ssb_rutenett" / "aas_befolkning_2023.geojson")

For å gjøre aggregeringen vil vi bruke en metode som heter dissolve() som tar som inngang kolonnen som vil bli brukt til å utføre aggregeringen:

# Utføre aggregeringen
dissolved = intersection.dissolve(by="pop_tot")

# Hva fikk vi
dissolved.head()
geometry ru250m gml_id lokalId navnerom versjonId oppdateringsdato gyldigFra datauttaksdato navn språk kommunenummer kommunenavn samiskForvaltningsområde
pop_tot
1 MULTIPOLYGON (((261225.86 6618040.14, 261183.5... 22605006626000 kommune.28 d285e9c4-8da0-4dfc-b927-31ba7ee17e6a https://data.geonorge.no/sosi/inndelinger/innd... 3 2023-11-28 16:00:22 2024-01-01 2024-03-04 12:27:57 Ås nor 3218 Ås False
2 MULTIPOLYGON (((260250 6618500, 260250 6618250... 22650006625250 kommune.28 d285e9c4-8da0-4dfc-b927-31ba7ee17e6a https://data.geonorge.no/sosi/inndelinger/innd... 3 2023-11-28 16:00:22 2024-01-01 2024-03-04 12:27:57 Ås nor 3218 Ås False
3 MULTIPOLYGON (((260000 6619250, 260250 6619250... 22617506625250 kommune.28 d285e9c4-8da0-4dfc-b927-31ba7ee17e6a https://data.geonorge.no/sosi/inndelinger/innd... 3 2023-11-28 16:00:22 2024-01-01 2024-03-04 12:27:57 Ås nor 3218 Ås False
4 MULTIPOLYGON (((262000 6618000, 262000 6617941... 22602506625750 kommune.28 d285e9c4-8da0-4dfc-b927-31ba7ee17e6a https://data.geonorge.no/sosi/inndelinger/innd... 3 2023-11-28 16:00:22 2024-01-01 2024-03-04 12:27:57 Ås nor 3218 Ås False
5 MULTIPOLYGON (((261079.69 6617980.86, 261078.9... 22650006625500 kommune.28 d285e9c4-8da0-4dfc-b927-31ba7ee17e6a https://data.geonorge.no/sosi/inndelinger/innd... 3 2023-11-28 16:00:22 2024-01-01 2024-03-04 12:27:57 Ås nor 3218 Ås False

La oss sammenligne antall celler i lagene før og etter aggregeringen:

print(f"Rader i opprinnelig intersection GeoDataFrame: {len(intersection)}")
print(f"Rader i oppløst lag: {len(dissolved)}")
Rader i opprinnelig intersection GeoDataFrame: 636
Rader i oppløst lag: 142

Faktisk har antall rader i dataene våre blitt redusert og polygonene har blitt slått sammen.

Hva skjedde egentlig her? La oss ta en nærmere titt.

La oss se hvilke kolonner vi nå har i vår GeoDataFrame:

dissolved.columns
Index(['geometry', 'ru250m', 'gml_id', 'lokalId', 'navnerom', 'versjonId',
       'oppdateringsdato', 'gyldigFra', 'datauttaksdato', 'navn', 'språk',
       'kommunenummer', 'kommunenavn', 'samiskForvaltningsområde'],
      dtype='object')

Som vi kan se, kan ikke kolonnen som vi brukte for å utføre aggregeringen (pop_tot) finnes lenger i kolonnelisten. Hva skjedde med den?

La oss ta en titt på indeksene i vår GeoDataFrame:

dissolved.index
Index([  1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
       ...
       250, 256, 261, 278, 284, 297, 300, 344, 368, 379],
      dtype='int32', name='pop_tot', length=142)

Aha! Vel nå forstår vi hvor kolonnen vår gikk. Den brukes nå som indeks i vår dissolved GeoDataFrame.

Nå kan vi for eksempel bare velge slike geometrier fra laget som har for eksempel nøyaktig 15 innbyggere:

# Velg bare geometrier som har 15 innbyggere
dissolved.loc[15]
geometry                    MULTIPOLYGON (((259250.00000892268 6620999.999...
ru250m                                                         22612506625750
gml_id                                                             kommune.28
lokalId                                  d285e9c4-8da0-4dfc-b927-31ba7ee17e6a
navnerom                    https://data.geonorge.no/sosi/inndelinger/innd...
versjonId                                                                   3
oppdateringsdato                                          2023-11-28 16:00:22
gyldigFra                                                 2024-01-01 00:00:00
datauttaksdato                                            2024-03-04 12:27:57
navn                                                                       Ås
språk                                                                     nor
kommunenummer                                                            3218
kommunenavn                                                                Ås
samiskForvaltningsområde                                                False
Name: 15, dtype: object
# Se datatype
type(dissolved.loc[15])
pandas.core.series.Series

Som vi kan se, har vi nå som et resultat et Pandas Series objekt som inneholder i utgangspunktet en rad fra vår opprinnelige aggregerte GeoDataFrame.

La oss også visualisere disse 15 innbyggere-rutenettcellene.

Først må vi konvertere den valgte raden tilbake til en GeoDataFrame:

# Lag en GeoDataFrame
selection = geopandas.GeoDataFrame([dissolved.loc[15]], crs=dissolved.crs)

Plott utvalget på toppen av hele rutenettet:

# Plott alle rutenettcellene, og rutenettcellene som har 15 innbyggere
ax = dissolved.plot(facecolor="gray")
selection.plot(ax=ax, facecolor="red")
<Axes: >
../../_images/5e4233e01233742bf517c6909b6f934427b696f91216e948334cd52cec0578e5.png

En annen måte å visualisere befolkningen i hele GeoDataFrame på er å plott ved hjelp av en spesifikk kolonne. For å bruke vår pop_tot kolonne, som nå er indeksen i GeoDataFrame, må vi tilbakestille indeksen:

dissolved = dissolved.reset_index()
dissolved.head()
pop_tot geometry ru250m gml_id lokalId navnerom versjonId oppdateringsdato gyldigFra datauttaksdato navn språk kommunenummer kommunenavn samiskForvaltningsområde
0 1 MULTIPOLYGON (((261225.86 6618040.14, 261183.5... 22605006626000 kommune.28 d285e9c4-8da0-4dfc-b927-31ba7ee17e6a https://data.geonorge.no/sosi/inndelinger/innd... 3 2023-11-28 16:00:22 2024-01-01 2024-03-04 12:27:57 Ås nor 3218 Ås False
1 2 MULTIPOLYGON (((260250 6618500, 260250 6618250... 22650006625250 kommune.28 d285e9c4-8da0-4dfc-b927-31ba7ee17e6a https://data.geonorge.no/sosi/inndelinger/innd... 3 2023-11-28 16:00:22 2024-01-01 2024-03-04 12:27:57 Ås nor 3218 Ås False
2 3 MULTIPOLYGON (((260000 6619250, 260250 6619250... 22617506625250 kommune.28 d285e9c4-8da0-4dfc-b927-31ba7ee17e6a https://data.geonorge.no/sosi/inndelinger/innd... 3 2023-11-28 16:00:22 2024-01-01 2024-03-04 12:27:57 Ås nor 3218 Ås False
3 4 MULTIPOLYGON (((262000 6618000, 262000 6617941... 22602506625750 kommune.28 d285e9c4-8da0-4dfc-b927-31ba7ee17e6a https://data.geonorge.no/sosi/inndelinger/innd... 3 2023-11-28 16:00:22 2024-01-01 2024-03-04 12:27:57 Ås nor 3218 Ås False
4 5 MULTIPOLYGON (((261079.69 6617980.86, 261078.9... 22650006625500 kommune.28 d285e9c4-8da0-4dfc-b927-31ba7ee17e6a https://data.geonorge.no/sosi/inndelinger/innd... 3 2023-11-28 16:00:22 2024-01-01 2024-03-04 12:27:57 Ås nor 3218 Ås False

Som vi kan se, har vi nå vår pop_tot som en kolonne igjen, og kan da plott GeoDataFrame ved å sende denne kolonnen ved hjelp av column parameteren:

dissolved.plot(column="pop_tot")
<Axes: >
../../_images/24b60399abad9ef649f667b3244dae29989d99b97070db1f6594739a49fdd4b6.png