Analyse av Enhetsregisteret med Python og Pandas
-
@oivind-langeland Mystisk avvik. Spørsmålet er midt i blinken for å legge inn i kommentarfeltet direkte på Enhetsregisteret si oppføring i data.norge.no. Legg det gjerne inn der.
Enhetsregisteret som CSV via Datahotellet
Når det gjeld Enhetsregisteret i CSV-format så er det tilgjengeleg via Datahotellet (hotell.difi.no).Merk at det er data.brreg.no som er hovud-distribusjonen for Enhetsregisteret. Når Enhetsregisteret vart gjort tilgjengeleg som opne data for om lag 10 år sidan, vart det først distribuert via Datahotellet. Seinare (2016?) starta Brønnøysundregistrene med distribusjonar frå eigne løysingar på data.brreg.no. Sidan så mange brukar Datahotellet, har ein fortsett å distribuere der også. Skal ein setje opp integrasjonar, bør ein bruke data.brreg.no.
-
@livar-bergheim Tusen takk for oppfølgingen! Jeg er glad jeg var ydmyk i min første post og antydet at feilen nok kunne ligge på min side. Ved nærmere testing, og etter noen tips fra @steinar-skagemo , viser det seg nemlig at feilen nettopp ligger på min side. Det viser seg altså at xlsx-filen man får ned fra APIet til Brreg inneholder to faner. Dersom Xlsx2csv-modulen kjøres uten parametere, tar den bare første fanen, og da mister man data. Jeg løste det ved å kjøre Xlsx2csv-modulen to ganger, en gang for hvert sheet, og deretter slå sammen resultatene fra disse to kjøringene, og droppe duplikatene. Da stemmer tallene overens fra xlsx og direktesøk i APIet til Brreg. Det er nok mangt man kan si om koden under, men den viser hvert fall hvordan det kan gjøres. Igjen tusen takk for at både du og Steinar fulgte opp, saken er løst
def lag_utvalg(): Xlsx2csv(ER_FULL_FIL, outputencoding="utf-8").convert("er1.csv", sheetid=1) Xlsx2csv(ER_FULL_FIL, outputencoding="utf-8").convert("er2.csv", sheetid=2) df_fane1 = pd.read_csv('er1.csv') df_fane2 = pd.read_csv('er2.csv') df_kombinert = pd.concat([df_fane1, df_fane2], ignore_index=True, sort=False) df_kombinert_trimmet = df_kombinert[["Organisasjonsnummer", "Navn", 'Organisasjonsform.kode', "Organisasjonsform.beskrivelse", "Næringskode 1", "Næringskode 1.beskrivelse", "Næringskode 2", "Næringskode 2.beskrivelse", "Næringskode 3", "Næringskode 3.beskrivelse", "Postadresse.adresse", "Postadresse.kommune", "Registreringsdato i Enhetsregisteret", "Antall ansatte"]] df_utvalg = df_kombinert_trimmet.astype(str) sok_etter = list(NACE_UTVALG.split(",")) nace_utvalg_1 = df_utvalg[df_utvalg['Næringskode 1'].str.contains('|'.join(sok_etter))] nace_utvalg_2 = df_utvalg[df_utvalg['Næringskode 2'].str.contains('|'.join(sok_etter))] nace_utvalg_3 = df_utvalg[df_utvalg['Næringskode 3'].str.contains('|'.join(sok_etter))] utvalg = pd.concat([nace_utvalg_1, nace_utvalg_2, nace_utvalg_3], ignore_index=True, sort=False).drop_duplicates(subset=['Organisasjonsnummer']) skriv_csv(utvalg, ER_UTVALG_FIL)
-
-
Jeg er helt ny på praktisk bruk av APIer, men tenkte å bruke noen rolige sommerdager på å gjøre noe med det. Er det noen som har en tutorial e.l på bruk av enhetsregisteret APIet med Python (3.7)? Det ser ut som om det står mye nyttig her
https://data.brreg.no/enhetsregisteret/api/docs/index.html
men jeg går meg vill i hvordan jeg får ut informasjonen. Jeg får ut OK-kode (200) som tyder på at ting er satt opp riktig, men jeg skjønner f.eks ikke hvordan jeg kan se innholdet i json filimport requests response = requests.get('https://data.brreg.no/enhetsregisteret/api/enheter/lastned') print(response)
-
@sophus-aarnaes jeg driver med samme øvelsen, og deler noe av min innsikt, kanskje det kan hjelpe. Satser på at @steinar-skagemo eller de andre fra BR korrigerer meg om jeg er helt ute.. Det endepunktet du bruker tror jeg bare gir deg en json-fil, som i tillegg er zippet. For at du skal kunne gjøre noe med den må du først zippe den opp og lese hele eller deler av den inn i maskinens arbeidsminne. Min erfaring er at den er utrolig tung å jobbe med og egentlig mest nyttig om du har tenkt til å gjøre analyse eller andre store oppgaver på hele ER (ikke underenhetene) lokalt. Om du er på jakt etter å lære litt mer praktisk bruk av API ville jeg brukt et av andre endepunktene, dette som nevnes i eksempel 2 er et bra utgangspunkt (jf. din lenke):
Jeg har skrevet en liten python-snutt som bruker det APIet. Den ligger her: https://github.com/xivind/learning-code/blob/main/br_enhetsregisteret/er_api_test.py
Med slik bruk av APIet får du json-svaret fra APIet rett inn i arbeidsminnet og kan skrive det ut (print-metoden) eller gjøre andre operasjoner på det, f. eks. sammenstille og skrive til en json-fil. Eller lese inn i en Panda-frame for litt analyse, jf. Steinars instruks. Håper dette er til hjelp, og så har sikkert folkene fra BR eller Digdir @livar-bergheim mer å legge til PS Kodesnutten jeg viser til over er fortsatt under arbeid..
-
Takk for svar og super deling av kode på Github. Der er det sikkert mye å lære, men jeg trenger å ta de første skrittene først og skjønne hva linje for linje gjør. Jeg valgte heller eksempelet med å hente en spesifikk enhet basert på orgnr. Når jeg også skjønte at jeg må bruker print(response.text) hjalp det:
response = requests.get('https://data.brreg.no/enhetsregisteret/api/enheter/920125298') print(response.text)
Svar:
{"organisasjonsnummer":"920125298","navn":"ASKER KOMMUNE","organisasjonsform":{"kode":"KOMM","beskrivelse":"Kommune","_links": ......Det er mulig dette er en avsporing av den opprinnelige tråden som handlet om utforskning av ER med Pandas?
Har i tilfelle noen forslag til hvor tips/triks/spørsmål om bruk av ER APIet hører hjemme?
Hvis noen lager en Python tutorial på bruk av ER APIet for nybegynnere kan det kanskje være et nytt innlegg på nivå med "Analyse av Enhetsregisteret med Python og Pandas"? -
@sophus-aarnaes det er heldigvis ganske lave skuldre på dette forumet, så tror ikke er så farlig at innlegg ikke treffer 100% på tråd-temaet Men da jeg skrev min post tipset @livar-bergheim om at det kanskje var bedre å legge det rett på datasettet det gjelder. I dette tilfellet ER, og her er lenken jeg ble vist til: https://data.norge.no/datasets/68d08f28-a16d-4fab-a953-ed4ab08ce2e2
-
@oivind-langeland @sophus-aarnaes : Det er framleis analyse av Enhetsregisteret med Python, sjølv om det er utan Pandas, så eg tenker dette passar godt som ei fortsetting på denne tråden
Om du seinare tykkjer det passar betre, går det alltids an å lage ein ny tråd.Kommentarfeltet tenker eg passar betre for kortare kommentarar, til dømes @oivind-langeland sitt innlegg med eit godt tips til andre brukarar på å vere obs på at XLSX-fila har fleire ark. Det er nokre tankar om kva ein kan bruke kommentar-feltet til i lanseringsposten frå tidlegare i år. Kommenter gjerne om du har tankar om kommentarfeltet.
Dersom ein har ein lengre diskusjonstråd som her, så passar det betre som ein vanleg tråd/emne i Datalandsbyen. Når ein legg inn ei lenke til datasettet i posten, dukkar det opp i datasett-oppføringa på data.norge.no, under avsnittet «Datalandsbyen»:
-
Bra å se at flere ønsker å dele erfaringer fra programmatisk behandling av ER med python/pandas dataframe.
Jeg lurer på om noen av dere har tips til bruk av APIet. Er ikke så kjent med curl, men helt ok i python og terminal.
Ønsker å hente navn for et sett med ca 250 organisasjonsnumre. Jeg kan selvfølgelig gjøre det for hver enkelt enhet med:
$ curl 'https://data.brreg.no/enhetsregisteret/api/enheter/112233445' -i -X GET
men får da hele oppføringen i retur.
Noen som har tips til hvordan jeg kan be om bare navn for hele listen med org.nr.?
-
@jon-tonnessen Ser ikkje ut til at du kan hente kun foretaksnamn ved oppslag i data.brreg.no sitt API. Du kjem ikkje unna å motta oppføringa med postadresse og alle andre felt, og må deretter fjerne det unødige lokalt etter å ha motteke dataene.
Eit grep som gjer det lettare å slå opp dei 250 organisasjonsnummera, er å hente fleire enheter i eitt API-oppslag.
Eksempel: https://data.brreg.no/enhetsregisteret/api/enheter/?organisasjonsnummer=983887457,889640782Korleis ein gjer dette i Python/Pandas veit eg dessverre ikkje i farta.
-
@livar-bergheim Var det jeg mistenkte, men det er ikke noe problem. Vasking og fjerning av ikke-relevante nøkler kan gjøres enkelt i python med pandas dataframes med df.drop:
# Fjerne kolonner for næringskode: df.drop(columns=['naeringskode1', 'naeringskode1_beskrivelse', 'naeringskode2', 'naeringskode2_beskrivelse', 'naeringskode3', 'naeringskode3_beskrivelse'])