├── .gitattributes
├── .ipynb_checkpoints
├── eks1_doi_csv1-en-checkpoint.ipynb
├── eks1_doi_csv_nor-checkpoint.ipynb
├── komm-nr-id-nor-checkpoint.ipynb
├── kt-csv-en-checkpoint.ipynb
├── kt-csv-nor-checkpoint.ipynb
├── text-code-en-checkpoint.ipynb
├── text-code-nor-checkpoint.ipynb
└── two-tables-one-chart_nor-checkpoint.ipynb
├── LICENSE
├── PxWebApi2
├── README.md
├── beta-bruker.md
├── eks1_doi_csv_nor.ipynb
├── get_many_default_tables.ipynb
└── laks_nor.ipynb
├── README.md
├── eks1_doi_csv1-en.ipynb
├── eks1_doi_csv_nor.ipynb
├── jsonstatToPandas_function-en.ipynb
├── jsonstatToPandas_funksjon.ipynb
├── klass_kommune2020.ipynb
├── komm-nr-id-nor.ipynb
├── konkurs-dateconv-en.ipynb
├── konkurs-datokonv.ipynb
├── kostra-koder-nor.ipynb
├── kt-csv-en.ipynb
├── kt-csv-nor.ipynb
├── laks-en.ipynb
├── laks-no.ipynb
├── nr-datokonv-en.ipynb
├── nr-datokonv.ipynb
├── ssbapi_table_07459.json
├── text-code-en.ipynb
├── text-code-nor.ipynb
├── two-tables-one-chart-en.ipynb
└── two-tables-one-chart_nor.ipynb
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.ipynb_checkpoints/komm-nr-id-nor-checkpoint.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Hvordan lage spørring som gir både kommunenavn og kommunenummer (id) fra JSON-stat"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "### Importerer biblioteker\n",
15 | "Bruker [pyjstat](https://pypi.org/project/pyjstat/) og Pandas. Pandas importeres som del av pyjstat."
16 | ]
17 | },
18 | {
19 | "cell_type": "code",
20 | "execution_count": 1,
21 | "metadata": {},
22 | "outputs": [],
23 | "source": [
24 | "from pyjstat import pyjstat\n",
25 | "import requests"
26 | ]
27 | },
28 | {
29 | "cell_type": "markdown",
30 | "metadata": {},
31 | "source": [
32 | "URL med tabellens metadata, som vi skal poste spørringen mot"
33 | ]
34 | },
35 | {
36 | "cell_type": "code",
37 | "execution_count": 2,
38 | "metadata": {},
39 | "outputs": [],
40 | "source": [
41 | "POST_URL = 'https://data.ssb.no/api/v0/no/table/07459'"
42 | ]
43 | },
44 | {
45 | "cell_type": "markdown",
46 | "metadata": {},
47 | "source": [
48 | "Spørring - kan også tas fra konsoll.\n",
49 | "0, 1 og 2-åringer i Oslo, Bergen Trondheim i 2018 og 2019"
50 | ]
51 | },
52 | {
53 | "cell_type": "code",
54 | "execution_count": 3,
55 | "metadata": {},
56 | "outputs": [],
57 | "source": [
58 | "json_q = {\"query\":[{\"code\":\"Region\",\"selection\":{\"filter\":\"item\",\"values\":[\"0301\",\"1103\",\"5001\"]}},\n",
59 | " {\"code\":\"Kjonn\",\"selection\":{\"filter\":\"item\",\"values\":[\"1\",\"2\"]}},\n",
60 | " {\"code\":\"Alder\",\"selection\":{\"filter\":\"item\",\"values\":[\"000\",\"001\",\"002\"]}},\n",
61 | " {\"code\":\"ContentsCode\",\"selection\":{\"filter\":\"item\",\"values\":[\"Personer1\"]}},\n",
62 | " {\"code\":\"Tid\",\"selection\":{\"filter\":\"item\",\"values\":[\"2018\",\"2019\",\"2020\"]}}\n",
63 | " ],\n",
64 | " \"response\":{\"format\":\"json-stat2\"}}"
65 | ]
66 | },
67 | {
68 | "cell_type": "markdown",
69 | "metadata": {},
70 | "source": [
71 | "Poster spørringen"
72 | ]
73 | },
74 | {
75 | "cell_type": "code",
76 | "execution_count": 4,
77 | "metadata": {},
78 | "outputs": [],
79 | "source": [
80 | "res = requests.post(POST_URL, json=json_q)"
81 | ]
82 | },
83 | {
84 | "cell_type": "markdown",
85 | "metadata": {},
86 | "source": [
87 | "### Leser JSON-stat resultatet med biblioteket pyjstat\n",
88 | "Lagrer det som datasett ds."
89 | ]
90 | },
91 | {
92 | "cell_type": "code",
93 | "execution_count": 5,
94 | "metadata": {},
95 | "outputs": [],
96 | "source": [
97 | "ds = pyjstat.Dataset.read(res.text)"
98 | ]
99 | },
100 | {
101 | "cell_type": "code",
102 | "execution_count": 6,
103 | "metadata": {},
104 | "outputs": [
105 | {
106 | "data": {
107 | "text/plain": [
108 | "pyjstat.pyjstat.Dataset"
109 | ]
110 | },
111 | "execution_count": 6,
112 | "metadata": {},
113 | "output_type": "execute_result"
114 | }
115 | ],
116 | "source": [
117 | "type(ds)"
118 | ]
119 | },
120 | {
121 | "cell_type": "markdown",
122 | "metadata": {},
123 | "source": [
124 | "Se datasettet ds"
125 | ]
126 | },
127 | {
128 | "cell_type": "code",
129 | "execution_count": 7,
130 | "metadata": {},
131 | "outputs": [],
132 | "source": [
133 | "#ds"
134 | ]
135 | },
136 | {
137 | "cell_type": "markdown",
138 | "metadata": {},
139 | "source": [
140 | "### Henter noen overordnete metadata fra JSON-stat datasettet"
141 | ]
142 | },
143 | {
144 | "cell_type": "code",
145 | "execution_count": 8,
146 | "metadata": {},
147 | "outputs": [
148 | {
149 | "name": "stdout",
150 | "output_type": "stream",
151 | "text": [
152 | "07459: Befolkning, etter region, kjønn, alder, statistikkvariabel og år\n"
153 | ]
154 | }
155 | ],
156 | "source": [
157 | "tittel = ds['label']\n",
158 | "print(tittel)"
159 | ]
160 | },
161 | {
162 | "cell_type": "markdown",
163 | "metadata": {},
164 | "source": [
165 | "Sist Oppdatert som GMT"
166 | ]
167 | },
168 | {
169 | "cell_type": "code",
170 | "execution_count": 9,
171 | "metadata": {},
172 | "outputs": [
173 | {
174 | "name": "stdout",
175 | "output_type": "stream",
176 | "text": [
177 | "2021-02-23T07:00:00Z\n"
178 | ]
179 | }
180 | ],
181 | "source": [
182 | "last_update = ds['updated']\n",
183 | "print(last_update)"
184 | ]
185 | },
186 | {
187 | "cell_type": "markdown",
188 | "metadata": {},
189 | "source": [
190 | "Henter kilde"
191 | ]
192 | },
193 | {
194 | "cell_type": "code",
195 | "execution_count": 10,
196 | "metadata": {},
197 | "outputs": [
198 | {
199 | "name": "stdout",
200 | "output_type": "stream",
201 | "text": [
202 | "Statistisk sentralbyrå\n"
203 | ]
204 | }
205 | ],
206 | "source": [
207 | "source = ds['source']\n",
208 | "print(source)"
209 | ]
210 | },
211 | {
212 | "cell_type": "markdown",
213 | "metadata": {},
214 | "source": [
215 | "### Role gir noen snarveier, \n",
216 | "*men det er en liten bug i Statistikkbanken som ikke får med role - geo : 'Region' for akkurat denne tabellen, 07459*"
217 | ]
218 | },
219 | {
220 | "cell_type": "code",
221 | "execution_count": 11,
222 | "metadata": {},
223 | "outputs": [
224 | {
225 | "name": "stdout",
226 | "output_type": "stream",
227 | "text": [
228 | "OrderedDict([('time', ['Tid']), ('metric', ['ContentsCode'])])\n"
229 | ]
230 | }
231 | ],
232 | "source": [
233 | "ds_roles = ds['role']\n",
234 | "print(ds_roles)"
235 | ]
236 | },
237 | {
238 | "cell_type": "markdown",
239 | "metadata": {},
240 | "source": [
241 | "### Lager dataframes\n",
242 | "Vi må lage to dataframes, en med tekst og en med koder/ID. Pyjstat tillater bare enten/eller"
243 | ]
244 | },
245 | {
246 | "cell_type": "code",
247 | "execution_count": 12,
248 | "metadata": {},
249 | "outputs": [],
250 | "source": [
251 | "befolkning = ds.write('dataframe')\n",
252 | "befolkning_id = ds.write('dataframe', naming='id')"
253 | ]
254 | },
255 | {
256 | "cell_type": "markdown",
257 | "metadata": {},
258 | "source": [
259 | "Lager en ny kolonne med både kommunenummer og navn slått sammen. Kommunenummer er egentlig en streng på 4 tegn. "
260 | ]
261 | },
262 | {
263 | "cell_type": "code",
264 | "execution_count": 13,
265 | "metadata": {},
266 | "outputs": [
267 | {
268 | "name": "stderr",
269 | "output_type": "stream",
270 | "text": [
271 | "INFO:numexpr.utils:NumExpr defaulting to 8 threads.\n"
272 | ]
273 | }
274 | ],
275 | "source": [
276 | "befolkning['kommune'] = befolkning_id['Region'] + ' ' + befolkning['region']"
277 | ]
278 | },
279 | {
280 | "cell_type": "markdown",
281 | "metadata": {},
282 | "source": [
283 | "Lager en ny dataframe som bare har med kolonnene vi ønsker, i ny rekkefølge. Merk doble [[ ]]"
284 | ]
285 | },
286 | {
287 | "cell_type": "code",
288 | "execution_count": 14,
289 | "metadata": {},
290 | "outputs": [
291 | {
292 | "data": {
293 | "text/html": [
294 | "
\n",
295 | "\n",
308 | "
\n",
309 | " \n",
310 | " \n",
311 | " | \n",
312 | " kommune | \n",
313 | " kjønn | \n",
314 | " alder | \n",
315 | " år | \n",
316 | " value | \n",
317 | "
\n",
318 | " \n",
319 | " \n",
320 | " \n",
321 | " 0 | \n",
322 | " 0301 Oslo kommune | \n",
323 | " Menn | \n",
324 | " 0 år | \n",
325 | " 2018 | \n",
326 | " 4779 | \n",
327 | "
\n",
328 | " \n",
329 | " 1 | \n",
330 | " 0301 Oslo kommune | \n",
331 | " Menn | \n",
332 | " 0 år | \n",
333 | " 2019 | \n",
334 | " 4523 | \n",
335 | "
\n",
336 | " \n",
337 | " 2 | \n",
338 | " 0301 Oslo kommune | \n",
339 | " Menn | \n",
340 | " 0 år | \n",
341 | " 2020 | \n",
342 | " 4647 | \n",
343 | "
\n",
344 | " \n",
345 | " 3 | \n",
346 | " 0301 Oslo kommune | \n",
347 | " Menn | \n",
348 | " 1 år | \n",
349 | " 2018 | \n",
350 | " 4709 | \n",
351 | "
\n",
352 | " \n",
353 | " 4 | \n",
354 | " 0301 Oslo kommune | \n",
355 | " Menn | \n",
356 | " 1 år | \n",
357 | " 2019 | \n",
358 | " 4507 | \n",
359 | "
\n",
360 | " \n",
361 | "
\n",
362 | "
"
363 | ],
364 | "text/plain": [
365 | " kommune kjønn alder år value\n",
366 | "0 0301 Oslo kommune Menn 0 år 2018 4779\n",
367 | "1 0301 Oslo kommune Menn 0 år 2019 4523\n",
368 | "2 0301 Oslo kommune Menn 0 år 2020 4647\n",
369 | "3 0301 Oslo kommune Menn 1 år 2018 4709\n",
370 | "4 0301 Oslo kommune Menn 1 år 2019 4507"
371 | ]
372 | },
373 | "execution_count": 14,
374 | "metadata": {},
375 | "output_type": "execute_result"
376 | }
377 | ],
378 | "source": [
379 | "befolkning_ny = befolkning[['kommune', 'kjønn', 'alder', 'år', 'value']]\n",
380 | "befolkning_ny.head()"
381 | ]
382 | },
383 | {
384 | "cell_type": "markdown",
385 | "metadata": {},
386 | "source": [
387 | "### Kommunereformen\n",
388 | "\n",
389 | "Merk at denne spørringen i dette eksempelet bruker rene kommunenummer, og ikke K-koder for sammenslåtte kommuner i tidsserier. \n",
390 | "\n",
391 | "En spørring som inkluderer tidsserier for kommuner som er berørt av kommunereformen, kan ikke benytte \"item\". K-koder må ha **agg:** og navnet på aggregeringen KommSummer istedet, \"filter\": \"agg:KommSummer\". Benytter også \"agg:FemAarigGruppering\" på alder.\n",
392 | "\n",
393 | "Eksempel på en spørring for Oslo og Moss. Tallene for Oslo blir de samme som om jeg hadde brukt 0301, mens tidsserien for K-3002 Moss inkluderer kommunene som inngår i nye Moss, tidligere 0104 Moss og 0136 Rygge."
394 | ]
395 | },
396 | {
397 | "cell_type": "code",
398 | "execution_count": 15,
399 | "metadata": {},
400 | "outputs": [],
401 | "source": [
402 | "json_q1 = {\"query\":\n",
403 | " [{\"code\":\"Region\",\"selection\":{\"filter\":\"agg:KommSummer\",\"values\":[\"K-0301\",\"K-3002\"]}},\n",
404 | " {\"code\":\"Kjonn\",\"selection\":{\"filter\":\"item\",\"values\":[\"1\",\"2\"]}},\n",
405 | " {\"code\":\"Alder\",\"selection\":{\"filter\":\"agg:FemAarigGruppering\", \"values\":[\"F00-04\", \"F05-09\"]}},\n",
406 | " {\"code\":\"ContentsCode\",\"selection\":{\"filter\":\"item\",\"values\":[\"Personer1\"]}},\n",
407 | " {\"code\":\"Tid\",\"selection\":{\"filter\":\"item\",\"values\":[\"2018\",\"2019\",\"2020\", \"2021\"]}}\n",
408 | " ],\n",
409 | " \"response\":{\"format\":\"json-stat2\"}}"
410 | ]
411 | },
412 | {
413 | "cell_type": "code",
414 | "execution_count": 16,
415 | "metadata": {},
416 | "outputs": [
417 | {
418 | "data": {
419 | "text/html": [
420 | "\n",
421 | "\n",
434 | "
\n",
435 | " \n",
436 | " \n",
437 | " | \n",
438 | " region | \n",
439 | " kjønn | \n",
440 | " alder | \n",
441 | " statistikkvariabel | \n",
442 | " år | \n",
443 | " value | \n",
444 | "
\n",
445 | " \n",
446 | " \n",
447 | " \n",
448 | " 0 | \n",
449 | " Moss | \n",
450 | " Menn | \n",
451 | " 0-4 år | \n",
452 | " Personer | \n",
453 | " 2018 | \n",
454 | " 1239 | \n",
455 | "
\n",
456 | " \n",
457 | " 1 | \n",
458 | " Moss | \n",
459 | " Menn | \n",
460 | " 0-4 år | \n",
461 | " Personer | \n",
462 | " 2019 | \n",
463 | " 1248 | \n",
464 | "
\n",
465 | " \n",
466 | " 2 | \n",
467 | " Moss | \n",
468 | " Menn | \n",
469 | " 0-4 år | \n",
470 | " Personer | \n",
471 | " 2020 | \n",
472 | " 1201 | \n",
473 | "
\n",
474 | " \n",
475 | " 3 | \n",
476 | " Moss | \n",
477 | " Menn | \n",
478 | " 0-4 år | \n",
479 | " Personer | \n",
480 | " 2021 | \n",
481 | " 1151 | \n",
482 | "
\n",
483 | " \n",
484 | " 4 | \n",
485 | " Moss | \n",
486 | " Menn | \n",
487 | " 5-9 år | \n",
488 | " Personer | \n",
489 | " 2018 | \n",
490 | " 1408 | \n",
491 | "
\n",
492 | " \n",
493 | "
\n",
494 | "
"
495 | ],
496 | "text/plain": [
497 | " region kjønn alder statistikkvariabel år value\n",
498 | "0 Moss Menn 0-4 år Personer 2018 1239\n",
499 | "1 Moss Menn 0-4 år Personer 2019 1248\n",
500 | "2 Moss Menn 0-4 år Personer 2020 1201\n",
501 | "3 Moss Menn 0-4 år Personer 2021 1151\n",
502 | "4 Moss Menn 5-9 år Personer 2018 1408"
503 | ]
504 | },
505 | "execution_count": 16,
506 | "metadata": {},
507 | "output_type": "execute_result"
508 | }
509 | ],
510 | "source": [
511 | "# samme med ny spørring\n",
512 | "res1 = requests.post(POST_URL, json=json_q1)\n",
513 | "ds1 = pyjstat.Dataset.read(res1.text)\n",
514 | "befolkning1 = ds1.write('dataframe')\n",
515 | "befolkning_id1 = ds1.write('dataframe', naming='id')\n",
516 | "befolkning1.head()\n",
517 | "# (...)"
518 | ]
519 | },
520 | {
521 | "cell_type": "code",
522 | "execution_count": null,
523 | "metadata": {},
524 | "outputs": [],
525 | "source": []
526 | }
527 | ],
528 | "metadata": {
529 | "kernelspec": {
530 | "display_name": "Python 3",
531 | "language": "python",
532 | "name": "python3"
533 | },
534 | "language_info": {
535 | "codemirror_mode": {
536 | "name": "ipython",
537 | "version": 3
538 | },
539 | "file_extension": ".py",
540 | "mimetype": "text/x-python",
541 | "name": "python",
542 | "nbconvert_exporter": "python",
543 | "pygments_lexer": "ipython3",
544 | "version": "3.8.6"
545 | }
546 | },
547 | "nbformat": 4,
548 | "nbformat_minor": 4
549 | }
550 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
--------------------------------------------------------------------------------
/PxWebApi2/README.md:
--------------------------------------------------------------------------------
1 | # PxWebApi beta2 eksempler
2 |
3 | NB! Dette APIet er forstatt under endring.
4 |
5 | [eks1_doi_csv_nor](eks1_doi_csv_nor.ipynb) viser hvordan hente en enkel tabell, detaljomsetningsindeksen, med de nye parametrene i http GET
6 |
7 | [laks_v2_nor](laks_nor.ipynb) viser hvordan henter datasett som JSON-stat2 med både http GET og POST.
8 |
9 | [get_many_default_tables](get_many_default_tables.ipynb) er et eksempel på å hente alle tabeller innen en statististikk, her KPI, med det nye default uttrekket.
10 |
11 | [beta-bruker](beta-bruker.md) er en foreløpig oversettelse til norsk av en litt mangelfull brukerveiledning
12 |
13 | [PxWebApi v2 Beta Open API dokumentasjon - SSB](https://data.ssb.no/api/pxwebapi/v2-beta/index.html)
--------------------------------------------------------------------------------
/PxWebApi2/beta-bruker.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | # PxWebApi 2.0
5 | # Brukerhåndbok for PxWebApi v2 beta - utkast
6 | ## Hva denne håndboken dekker
7 | Dette dokumentet spesifiserer forespørslene og responsformatene, samt endepunktene for **PxWebApi 2.0 beta** hos SSB.
8 |
9 | ## _NB! Denne er en forløpig oversettelse og bearbeiding_ av https://github.com/PxTools/PxApiSpecs/blob/master/specs.md
10 |
11 | # Konsepter
12 | **PxWebApi** bruker noen abstraksjoner for å representere ulike deler av den statistiske databasen. Dette avsnittet gir leseren en bedre forståelse av disse abstraksjonene som grunnlag for å forstå strukturen i API-et og dataene som tilbys.
13 |
14 | ## Tabell
15 | En **tabell** er representasjonen av en statistisk tabell. Andre kan referere til det samme konseptet som et _datasett_, _kube_ eller _flerdimensjonal kube_. Vi har valgt å kalle det en **tabell** av historiske grunner. En tabell består av to deler: dataene som inneholder tallene, og metadataene som gir dataene kontekst eller mening. F.eks. data `5 550 203` og metadataene "befolkningen i Norge 1. januar 2024."
16 |
17 | ## Database
18 | En **database** er en samling av tabeller som er organisert og strukturert i henhold til et skjema. En vanlig feil er å blande konseptet database med et relasjonsdatabasesystem som **Oracle Database** eller **Microsoft SQL Server**. Av og til refererer "database" også til en instans av databasen.
19 |
20 | ## Mappe
21 | **Mapper** (Folder) brukes til å organisere tabeller i en database. En mappe kan inneholde andre mapper eller tabeller. Vanligvis refererer det første nivået med mapper i en database til de tematiske områdene i databasen. Andre kan også kalle dem "temaer" eller "emner".
22 |
23 |
24 | ## Variabel
25 | Tabeller er flerdimensjonale, og **variabler** er konseptet som brukes til å beskrive dataene. Mange kan referere til variabler som _dimensjoner_. Ta eksempelet med dataene `5 550 203` og metadataene "befolkningen i i Norge 1. januar 2024". `5 550 203` beskrives av tre variabler:
26 | 1. Hva vi måler. I vårt tilfelle er dette befolkningen. Denne variabelen er spesiell og refereres til som **statistikkvariabel**. Andre kan benevne denne som _målevariabel_ eller _innholdsvariabel_.
27 | 2. Tidspunktet tallet er assosiert med. I vårt tilfelle er det 31. desember 2021. Denne typen variabel er også spesiell og refereres til som **tidsvariabel**. Det skal alltid være én og kun én tidsvariabel.
28 | 3. Region. I vårt tilfelle er det Norge. Dette er også en spesiell type variabel kalt **geografisk variabel**. En tabell kan ha null eller flere geografiske variabler, men vanligvis bare én hvis de har noen.
29 |
30 | Det finnes en fjerde type variabel, bare kalt **variabel**. Den brukes til å beskrive dataene. Tenk deg at vi hadde delt `5 550 203` etter kjønn slik at vi hadde to dataceller i stedet, `2 795 718` og `2 754 485`, én for menn og én for kvinner. Da ville den fjerde variabelen være kjønn.
31 |
32 | ## Verdi
33 | Variabler har distinkte verdier som utgjør rommet for dem. F.eks. har vår kjønnsvariabel ovenfor to verdier: én for menn og én for kvinner.
34 |
35 | ## Kodeliste
36 | En variabel kan ha en tilknyttet **kodeliste** som definerer et nytt rom for variabelen ved å tilby forskjellige sett med verdier. F.eks. forestill deg at du har en regional variabel med verdier for hver kommune i Norge. Da kan du ha en kodeliste som transformerer kommunene til fylker.
37 |
38 | ## Datacelle
39 | En datacelle er den individuelle målingen i en tabell. Det totale antallet celler for en tabell gis av produktet av antall verdier for hver variabel.
40 |
41 | ## Datakildetype
42 | Informasjonen kan lagres i ulike formater og teknologier. Vi støtter for øyeblikket to forskjellige datakildetyper: **PX-filbaserte** og **Oracle-databaser** samt **Microsoft SQL Server**, som bruker **Common Nordic Meta Model**.
43 |
44 | ## Annen terminologi
45 | - **Paxiom**: Objektmodellen som representerer en tabell.
46 | - **CNMM**: Common Nordic Meta Model er en relasjonsdatamodell for å representere en `database` og `tabeller`. Den brukes og vedlikeholdes av Statistikkbyråene i Sverige, Norge og Danmark.
47 | - **PX-fil**: En fysisk representasjon av en tabell ved bruk av [PX-filformatet](https://www.scb.se/en/services/statistical-programs-for-px-files/px-file-format/).
48 | - **PX-fil-database**: En samling av PX-filer som representerer en `database`.
49 |
50 |
51 |
52 | # API-endepunkter
53 |
54 | Url-ene i endepunktet er uavhengig av store og små bokstaver.
55 |
56 | **POST** er primært ment for å hente data når forespørselen for å velge data kan bli svært stor. I noen tilfeller kan URL-en overskride det maksimale antallet tegn som er tillatt for en URL. I slike tilfeller kan en http **POST-forespørsel** være løsningen.
57 |
58 | ## Konfigurasjonsendepunkt
59 | Hent API-konfigurasjonsinnstillinger. Instanser av API-et kan være konfigurert forskjellig fra hverandre. Klienter kan bruke dette endepunktet for å hente informasjon som kan være nyttig for å styre oppførselen til klienten.
60 | ```
61 | HTTP GET https://data.ssb.no/api/pxwebapi/v2-beta/config
62 | ```
63 |
64 | ### Eksempel på respons
65 | ```json
66 | {
67 | "apiVersion": "2.0.0-beta.3",
68 | "appVersion": "0.0.1-alpha.2+default.selection.fix.build.7",
69 | "languages": [
70 | {
71 | "id": "en",
72 | "label": "English"
73 | },
74 | {
75 | "id": "no",
76 | "label": "Norsk"
77 | }
78 | ],
79 | "defaultLanguage": "no",
80 | "maxDataCells": 800000,
81 | "maxCallsPerTimeWindow": 30,
82 | "timeWindow": 10,
83 | "license": "https://creativecommons.org/share-your-work/public-domain/cc0/",
84 | "sourceReferences": [
85 | {
86 | "language": "en",
87 | "text": "Source: Statistics Norway"
88 | },
89 | {
90 | "language": "no",
91 | "text": "Kilde: Statistisk sentralbyrå"
92 | }
93 | ],
94 | "defaultMetadataFormat": 0,
95 | "defaultDataFormat": "json-stat2",
96 | "dataFormats": [
97 | "xlsx",
98 | "xlsx_doublecolumn",
99 | "csv",
100 | "csv_tab",
101 | "csv_tabhead",
102 | "csv_comma",
103 | "csv_commahead",
104 | "csv_space",
105 | "csv_spacehead",
106 | "csv_semicolon",
107 | "csv_semicolonhead",
108 | "csv2",
109 | "csv3",
110 | "json",
111 | "json-stat",
112 | "json-stat2",
113 | "parquet",
114 | "html5_table",
115 | "relational_table",
116 | "px"
117 | ],
118 | "features": [
119 | {
120 | "id": "CORS",
121 | "params": [
122 | {
123 | "key": "enabled",
124 | "value": "True"
125 | }
126 | ]
127 | }
128 | ]
129 | }
130 | ```
131 |
132 | - **apiVersion** angir versjonen av API-et.
133 | - **languages** lister språkene som kan brukes når man gjør forespørsler til API-et. Nesten alle endepunkter støtter en forespørselsparameter for språk (`lang`) som kan settes til `id` for språket, f.eks. `lang=en` for engelsk.
134 | - **defaultLanguage** angir hvilket språk som brukes i responsen når ingen språk er angitt.
135 | - **maxDataCells** spesifiserer maksimalt antall dataceller som kan hentes i én forespørsel.
136 | - **maxCallsPerTimeWindow** spesifiserer hvor mange forespørsler som kan gjøres i løpet av en tidsramme definert av **timeWindow**.
137 | - **timeWindow** angir varigheten på tidsrammen, i sekunder, som brukes i beskyttelsen mot overbelastning.
138 | - **sourceReferences** spesifiserer hvordan man kan sitere data hentet gjennom API-et.
139 | - **license** spesifiserer lisensen for dataene.
140 |
141 |
142 | ## Navigasjonsendepunkter
143 |
144 | Bla gjennom databasestrukturen.
145 |
146 | ### Returnerer rotmappen for databasen
147 | ```
148 | HTTP GET https://data.ssb.no/api/pxwebapi/v2-beta/navigation
149 | ```
150 |
151 | #### Parametere
152 | ##### lang
153 | En valgfri språkparameter.
154 |
155 | #### Eksempel på respons
156 | ```
157 | HTTP GET https://data.ssb.no/api/pxwebapi/v2-beta/navigation?lang=en
158 | ```
159 |
160 | ```json
161 | {
162 | "language": "en",
163 | "id": "",
164 | "label": "",
165 | "description": "",
166 | "folderContents": [
167 | {
168 | "type": "FolderInformation",
169 | "id": "al",
170 | "label": "Labour market and earnings",
171 | "description": "",
172 | "links": [
173 | {
174 | "rel": "self",
175 | "hreflang": "en",
176 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/al?lang=en"
177 | }
178 | ]
179 | },
180 | {
181 | "type": "FolderInformation",
182 | "id": "bf",
183 | "label": "Banking and financial markets",
184 | "description": "",
185 | "links": [
186 | {
187 | "rel": "self",
188 | "hreflang": "en",
189 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/bf?lang=en"
190 | }
191 | ]
192 | },
193 | {
194 | "type": "FolderInformation",
195 | "id": "vf",
196 | "label": "Establishments, enterprises and accounts",
197 | "description": "",
198 | "links": [
199 | {
200 | "rel": "self",
201 | "hreflang": "en",
202 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/vf?lang=en"
203 | }
204 | ]
205 | },
206 | {
207 | "type": "FolderInformation",
208 | "id": "be",
209 | "label": "Population",
210 | "description": "",
211 | "links": [
212 | {
213 | "rel": "self",
214 | "hreflang": "en",
215 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/be?lang=en"
216 | }
217 | ]
218 | },
219 | {
220 | "type": "FolderInformation",
221 | "id": "bb",
222 | "label": "Construction, housing and property",
223 | "description": "",
224 | "links": [
225 | {
226 | "rel": "self",
227 | "hreflang": "en",
228 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/bb?lang=en"
229 | }
230 | ]
231 | },
232 | {
233 | "type": "FolderInformation",
234 | "id": "ei",
235 | "label": "Energy and manufacturing",
236 | "description": "",
237 | "links": [
238 | {
239 | "rel": "self",
240 | "hreflang": "en",
241 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/ei?lang=en"
242 | }
243 | ]
244 | },
245 | {
246 | "type": "FolderInformation",
247 | "id": "he",
248 | "label": "Health",
249 | "description": "",
250 | "links": [
251 | {
252 | "rel": "self",
253 | "hreflang": "en",
254 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/he?lang=en"
255 | }
256 | ]
257 | },
258 | {
259 | "type": "FolderInformation",
260 | "id": "if",
261 | "label": "Income and consumption",
262 | "description": "",
263 | "links": [
264 | {
265 | "rel": "self",
266 | "hreflang": "en",
267 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/if?lang=en"
268 | }
269 | ]
270 | },
271 | {
272 | "type": "FolderInformation",
273 | "id": "in",
274 | "label": "Immigration and immigrants",
275 | "description": "",
276 | "links": [
277 | {
278 | "rel": "self",
279 | "hreflang": "en",
280 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/in?lang=en"
281 | }
282 | ]
283 | },
284 | {
285 | "type": "FolderInformation",
286 | "id": "js",
287 | "label": "Agriculture, forestry, hunting and fishing",
288 | "description": "",
289 | "links": [
290 | {
291 | "rel": "self",
292 | "hreflang": "en",
293 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/js?lang=en"
294 | }
295 | ]
296 | },
297 | {
298 | "type": "FolderInformation",
299 | "id": "kf",
300 | "label": "Culture and recreation",
301 | "description": "",
302 | "links": [
303 | {
304 | "rel": "self",
305 | "hreflang": "en",
306 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/kf?lang=en"
307 | }
308 | ]
309 | },
310 | {
311 | "type": "FolderInformation",
312 | "id": "nk",
313 | "label": "National accounts and business cycles",
314 | "description": "",
315 | "links": [
316 | {
317 | "rel": "self",
318 | "hreflang": "en",
319 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/nk?lang=en"
320 | }
321 | ]
322 | },
323 | {
324 | "type": "FolderInformation",
325 | "id": "nm",
326 | "label": "Nature and the environment",
327 | "description": "",
328 | "links": [
329 | {
330 | "rel": "self",
331 | "hreflang": "en",
332 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/nm?lang=en"
333 | }
334 | ]
335 | },
336 | {
337 | "type": "FolderInformation",
338 | "id": "os",
339 | "label": "Public sector",
340 | "description": "",
341 | "links": [
342 | {
343 | "rel": "self",
344 | "hreflang": "en",
345 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/os?lang=en"
346 | }
347 | ]
348 | },
349 | {
350 | "type": "FolderInformation",
351 | "id": "pp",
352 | "label": "Prices and price indices",
353 | "description": "",
354 | "links": [
355 | {
356 | "rel": "self",
357 | "hreflang": "en",
358 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/pp?lang=en"
359 | }
360 | ]
361 | },
362 | {
363 | "type": "FolderInformation",
364 | "id": "sk",
365 | "label": "Social conditions, welfare and crime",
366 | "description": "",
367 | "links": [
368 | {
369 | "rel": "self",
370 | "hreflang": "en",
371 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/sk?lang=en"
372 | }
373 | ]
374 | },
375 | {
376 | "type": "FolderInformation",
377 | "id": "sv",
378 | "label": "Svalbard",
379 | "description": "",
380 | "links": [
381 | {
382 | "rel": "self",
383 | "hreflang": "en",
384 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/sv?lang=en"
385 | }
386 | ]
387 | },
388 | {
389 | "type": "FolderInformation",
390 | "id": "ti",
391 | "label": "Technology and innovation",
392 | "description": "",
393 | "links": [
394 | {
395 | "rel": "self",
396 | "hreflang": "en",
397 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/ti?lang=en"
398 | }
399 | ]
400 | },
401 | {
402 | "type": "FolderInformation",
403 | "id": "tr",
404 | "label": "Transport and tourism",
405 | "description": "",
406 | "links": [
407 | {
408 | "rel": "self",
409 | "hreflang": "en",
410 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/tr?lang=en"
411 | }
412 | ]
413 | },
414 | {
415 | "type": "FolderInformation",
416 | "id": "ud",
417 | "label": "Education",
418 | "description": "",
419 | "links": [
420 | {
421 | "rel": "self",
422 | "hreflang": "en",
423 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/ud?lang=en"
424 | }
425 | ]
426 | },
427 | {
428 | "type": "FolderInformation",
429 | "id": "ut",
430 | "label": "External economy",
431 | "description": "",
432 | "links": [
433 | {
434 | "rel": "self",
435 | "hreflang": "en",
436 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/ut?lang=en"
437 | }
438 | ]
439 | },
440 | {
441 | "type": "FolderInformation",
442 | "id": "va",
443 | "label": "Elections",
444 | "description": "",
445 | "links": [
446 | {
447 | "rel": "self",
448 | "hreflang": "en",
449 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/va?lang=en"
450 | }
451 | ]
452 | },
453 | {
454 | "type": "FolderInformation",
455 | "id": "vt",
456 | "label": "Wholesale and retail trade and service activities",
457 | "description": "",
458 | "links": [
459 | {
460 | "rel": "self",
461 | "hreflang": "en",
462 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/vt?lang=en"
463 | }
464 | ]
465 | }
466 | ],
467 | "links": [
468 | {
469 | "rel": "self",
470 | "hreflang": "en",
471 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/?lang=en"
472 | }
473 | ]
474 | }
475 | ```
476 |
477 | ### Returner innholdet i en spesifikk mappe i databasen
478 | ```
479 | HTTP GET https://data.ssb.no/api/pxwebapi/v2-beta/navigation/{id}
480 | ```
481 |
482 | Returnerer databasemappen identifisert av **id**.
483 |
484 | #### Parametere
485 | ##### lang
486 | En valgfri språkparameter.
487 |
488 | #### Eksempel på respons
489 | Dette eksempelet viser responsen fra API-forespørselen `https://data.ssb.no/api/pxwebapi/v2-beta/navigation/pp`. Metadata om mappen **pp** returneres sammen med innholdet i mappen **Priser og prisindekser**.
490 |
491 | ```json
492 | {
493 | "language": "no",
494 | "id": "pp",
495 | "label": "Priser og prisindekser",
496 | "description": "",
497 | "folderContents": [
498 | {
499 | "type": "FolderInformation",
500 | "id": "pp01",
501 | "label": "Boligpriser og boligprisindekser",
502 | "description": "",
503 | "links": [
504 | {
505 | "rel": "self",
506 | "hreflang": "no",
507 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/pp01?lang=no"
508 | }
509 | ]
510 | },
511 | {
512 | "type": "FolderInformation",
513 | "id": "pp02",
514 | "label": "Byggekostnadsindekser",
515 | "description": "",
516 | "links": [
517 | {
518 | "rel": "self",
519 | "hreflang": "no",
520 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/pp02?lang=no"
521 | }
522 | ]
523 | },
524 | {
525 | "type": "FolderInformation",
526 | "id": "pp04",
527 | "label": "Konsumpriser",
528 | "description": "",
529 | "links": [
530 | {
531 | "rel": "self",
532 | "hreflang": "no",
533 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/pp04?lang=no"
534 | }
535 | ]
536 | },
537 | {
538 | "type": "FolderInformation",
539 | "id": "pp05",
540 | "label": "Produsent- og engrosprisindekser",
541 | "description": "",
542 | "links": [
543 | {
544 | "rel": "self",
545 | "hreflang": "no",
546 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/pp05?lang=no"
547 | }
548 | ]
549 | }
550 | ],
551 | "links": [
552 | {
553 | "rel": "self",
554 | "hreflang": "no",
555 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/navigation/PP?lang=no"
556 | }
557 | ]
558 | }
559 | ```
560 |
561 | **Responsen forklart**
562 |
563 | Navigasjonsendepunktet returnerer to objekter:
564 | 1. Et **Folder**-objekt som inneholder metadata om mappen som det ble spurt om.
565 | 2. En liste **folderContents** som inneholder innholdet i mappen (undermapper og statistiske tabeller).
566 |
567 | Det er tre mulige verdier for **objectType**:
568 | 1. **Folder** – Mappen som det ble spurt om i API-forespørselen.
569 | 2. **FolderInformation** – En undermappe til **Folder**-objektet.
570 | 3. **Table** – En statistisk tabell lokalisert i mappen.
571 |
572 | **Metainformasjon for mapper**
573 |
574 | - **id** – Mappe-ID.
575 | - **objectType** – Kan ha én av to mulige verdier:
576 | - **Folder** (mappen som det ble spurt om i API-forespørselen).
577 | - **FolderInformation** (undermappe).
578 | - **Heading** – En overskrift for å skille innholdet.
579 | - **label** – Mappetekst.
580 | - **description** – Beskrivelse av mappen.
581 | - **tags** – Tagger for mappen (ikke implementert ennå).
582 | - **links** – Hvordan navigere til mappen.
583 |
584 | **Metainformasjon for tabeller**
585 |
586 | - **id** – Tabell-ID.
587 | - **objectType** – Vil ha verdien "Table".
588 | - **label** – Tekst for tabellen.
589 | - **description** – Beskrivelse av tabellen.
590 | - **updated** – Når tabellen sist ble oppdatert.
591 | - **category** – Presentasjonskategori for tabellen. Mulige verdier er:
592 | - internal
593 | - official
594 | - private
595 | - section
596 | - **firstPeriod** – Den første tidsperioden for dataene i tabellen.
597 | - **lastPeriod** – Den siste tidsperioden for dataene i tabellen.
598 | - **discontinued** – Om tabellen vil bli oppdatert med nye data eller ikke.
599 | - **tags** – Tagger for tabellen (ikke implementert ennå).
600 | - **links** – Hvordan navigere til tabellen. For tabeller finnes det tre lenker:
601 | - **self** – Hvordan navigere til tabellen.
602 | - **metadata** – Hvordan navigere til tabellens metadata.
603 | - **data** – Hvordan navigere til tabellens data.
604 |
605 |
606 | ## Tabellendepunkter
607 |
608 | ### Liste over alle tabeller
609 | Viser alle tabeller i databasen. Listen kan filtreres ved hjelp av forskjellige parametere.
610 |
611 | ```
612 | HTTP GET https://data.ssb.no/api/pxwebapi/v2-beta/tables/
613 | ```
614 |
615 | #### Parametere
616 | Du kan begrense tabellene som returneres ved hjelp av følgende parametere:
617 |
618 | ##### lang
619 | En valgfri språkparameter.
620 |
621 | ##### query
622 | Velger bare tabeller som samsvarer med et kriterium angitt i søkeparameteren. Søk er basert på Lucene .Net, og gir mange avanserte søkemuligheter. Se [syntaks for søk](https://lucenenet.apache.org/docs/4.8.0-beta00017/api/queryparser/Lucene.Net.QueryParsers.Classic.html).
623 | ```
624 | https://data.ssb.no/api/pxwebapi/v2-beta/tables?query=befolkning
625 | ```
626 |
627 | ##### pastDays
628 | Velger bare tabeller som er oppdatert et visst antall dager før forespørselens tidspunkt. Gyldige verdier for **pastDays** er heltall mellom 1 og ?. *(vil returnere feil hvis ukjent verdi)*.
629 | ```
630 | https://data.ssb.no/api/pxwebapi/v2-beta/tables?pastDays=5
631 | ```
632 |
633 | ##### includeDiscontinued
634 | `true` eller `false`, avhengig av om utgåtte tabeller skal inkluderes. Tabeller som ikke eksplisitt har satt egenskapen **discontinued**, behandles som om de ikke er utgått.
635 |
636 | ##### pageSize
637 | Hvor mange treff eller tabeller som skal inkluderes på en side av responsen.
638 |
639 | ##### pageNumber
640 | Et tall som spesifiserer hvilken side av responsen som skal vises. Standardverdien er 1.
641 |
642 | #### Eksempel på respons
643 | Et eksempel som filtrerer på "befolkning" til side 2 med en sidestørrelse på 3:
644 | ```json
645 | {
646 | "language": "no",
647 | "tables": [
648 | {
649 | "type": "Table",
650 | "id": "12631",
651 | "label": "12631: Andel av befolkningen (mellom 16 og 79 år) på ferie (prosent) 2013-2023",
652 | "description": "",
653 | "updated": "2024-02-26T07:00:00Z",
654 | "firstPeriod": "2013",
655 | "lastPeriod": "2023",
656 | "category": "public",
657 | "variableNames": [
658 | "feriemål",
659 | "statistikkvariabel",
660 | "år"
661 | ],
662 | "links": [
663 | {
664 | "rel": "self",
665 | "hreflang": "no",
666 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/12631?lang=no"
667 | },
668 | {
669 | "rel": "metadata",
670 | "hreflang": "no",
671 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/12631/metadata?lang=no&outputFormat=json-px"
672 | },
673 | {
674 | "rel": "metadata",
675 | "hreflang": "no",
676 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/12631/metadata?lang=no&outputFormat=json-stat2"
677 | },
678 | {
679 | "rel": "data",
680 | "hreflang": "no",
681 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/12631/data?lang=no&outputFormat=json-stat2"
682 | }
683 | ]
684 | },
685 | {
686 | "type": "Table",
687 | "id": "13760",
688 | "label": "13760: Arbeidsstyrken, sysselsatte, arbeidsledige og utførte ukeverk, etter kjønn, alder og type justering. Bruddjusterte tall 2006M01-2024M09",
689 | "description": "",
690 | "updated": "2024-10-24T06:00:00Z",
691 | "firstPeriod": "2006M01",
692 | "lastPeriod": "2024M09",
693 | "category": "public",
694 | "variableNames": [
695 | "kjønn",
696 | "alder",
697 | "type justering",
698 | "statistikkvariabel",
699 | "måned"
700 | ],
701 | "links": [
702 | {
703 | "rel": "self",
704 | "hreflang": "no",
705 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/13760?lang=no"
706 | },
707 | {
708 | "rel": "metadata",
709 | "hreflang": "no",
710 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/13760/metadata?lang=no&outputFormat=json-px"
711 | },
712 | {
713 | "rel": "metadata",
714 | "hreflang": "no",
715 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/13760/metadata?lang=no&outputFormat=json-stat2"
716 | },
717 | {
718 | "rel": "data",
719 | "hreflang": "no",
720 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/13760/data?lang=no&outputFormat=json-stat2"
721 | }
722 | ]
723 | },
724 | {
725 | "type": "Table",
726 | "id": "05803",
727 | "label": "05803: Endringer i befolkningen i løpet av året 1735-2024",
728 | "description": "",
729 | "updated": "2024-02-21T07:00:00Z",
730 | "firstPeriod": "1735",
731 | "lastPeriod": "2024",
732 | "category": "public",
733 | "variableNames": [
734 | "statistikkvariabel",
735 | "år"
736 | ],
737 | "links": [
738 | {
739 | "rel": "self",
740 | "hreflang": "no",
741 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/05803?lang=no"
742 | },
743 | {
744 | "rel": "metadata",
745 | "hreflang": "no",
746 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/05803/metadata?lang=no&outputFormat=json-px"
747 | },
748 | {
749 | "rel": "metadata",
750 | "hreflang": "no",
751 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/05803/metadata?lang=no&outputFormat=json-stat2"
752 | },
753 | {
754 | "rel": "data",
755 | "hreflang": "no",
756 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/05803/data?lang=no&outputFormat=json-stat2"
757 | }
758 | ]
759 | }
760 | ],
761 | "page": {
762 | "pageNumber": 2,
763 | "pageSize": 3,
764 | "totalElements": 363,
765 | "totalPages": 121,
766 | "links": [
767 | {
768 | "rel": "next",
769 | "hreflang": "no",
770 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/?lang=no&query=befolkning&pagesize=3&pageNumber=3"
771 | },
772 | {
773 | "rel": "previous",
774 | "hreflang": "no",
775 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/?lang=no&query=befolkning&pagesize=3&pageNumber=1"
776 | },
777 | {
778 | "rel": "last",
779 | "hreflang": "no",
780 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/?lang=no&query=befolkning&pagesize=3&pageNumber=121"
781 | }
782 | ]
783 | },
784 | "links": [
785 | {
786 | "rel": "self",
787 | "hreflang": "no",
788 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/?lang=no&query=befolkning&pagesize=3&pageNumber=2"
789 | }
790 | ]
791 | }
792 | ```
793 |
794 | **Respons forklart**
795 |
796 | - **Tables** – En liste over tabellobjekter som inneholder grunnleggende metadata for en tabell.
797 | - **Page** – Informasjon om paginering for resultatene:
798 | - **pageNumber** – Sidetallet som ble returnert.
799 | - **pageSize** – Antall resultater per side.
800 | - **totalElements** – Det totale antallet tabeller.
801 | - **totalPages** – Det totale antallet sider.
802 | - **links** – Lenker til relevante sider: neste, forrige og siste side i resultatsettet.
803 |
804 | **Merk**
805 | Informasjonen kan være hurtigbufret for å forbedre ytelsen. Dette kan føre til forsinkelser i responsen rett etter publisering av nye data.
806 |
807 | ### Liste grunnleggende informasjon for en tabell
808 | ```
809 | HTTP GET https://data.ssb.no/api/pxwebapi/v2-beta/tables/
810 | ```
811 |
812 | #### Parametere
813 | ##### lang
814 | En valgfri språkparameter.
815 |
816 | #### Eksempel på respons
817 | Et eksempel som returnerer grunnleggende informasjon for tabellen **03013**:
818 | ```json
819 | {
820 | "type": "Table",
821 | "id": "03013",
822 | "label": "03013: Konsumprisindeks, etter konsumgruppe (2015=100) 1979M01-2024M10",
823 | "description": "",
824 | "sortCode": "000010",
825 | "updated": "2024-11-11T07:00:00Z",
826 | "firstPeriod": "1979M01",
827 | "lastPeriod": "2024M10",
828 | "category": "public",
829 | "variableNames": [
830 | "konsumgruppe",
831 | "statistikkvariabel",
832 | "måned"
833 | ],
834 | "links": [
835 | {
836 | "rel": "self",
837 | "hreflang": "no",
838 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/03013?lang=no"
839 | },
840 | {
841 | "rel": "metadata",
842 | "hreflang": "no",
843 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/03013/metadata?lang=no&outputFormat=json-px"
844 | },
845 | {
846 | "rel": "metadata",
847 | "hreflang": "no",
848 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/03013/metadata?lang=no&outputFormat=json-stat2"
849 | },
850 | {
851 | "rel": "data",
852 | "hreflang": "no",
853 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/03013/data?lang=no&outputFormat=json-stat2"
854 | }
855 | ],
856 | "language": "no"
857 | }
858 | ```
859 |
860 | **Merk**
861 | Informasjonen kan være hurtigbufret for å forbedre ytelsen, noe som kan føre til korte forsinkelser i responsen rett etter publisering av nye data.
862 |
863 | ### Liste metadata for en tabell
864 | Vis metadata for en spesifisert tabell.
865 | ```
866 | HTTP GET https://data.ssb.no/api/pxwebapi/v2-beta/tables//metadata
867 | ```
868 |
869 | #### Parametere
870 | ##### lang
871 | En valgfri språkparameter.
872 |
873 | ##### outputFormat
874 | Ett av følgende formater: `json-px` eller `json-stat2`. Standardverdi vil bli spesifisert av konfigurasjonsendepunktet.
875 |
876 | #### Eksempel på respons
877 | Metadata for tabell med id **11118** som json-stat2
878 |
879 | ```json
880 | {
881 | "version": "2.0",
882 | "class": "dataset",
883 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/11118/metadata?lang=no&outputFormat=json-stat2",
884 | "label": "11118: Konsumprisindeks for varer og tjenester, etter Leveringssektor, statistikkvariabel og år",
885 | "source": "Statistisk sentralbyrå",
886 | "updated": "2024-01-10T07:00:00Z",
887 | "link": {
888 | "data": [
889 | {
890 | "href": "https://data.ssb.no/api/pxwebapi/v2-beta/tables/11118/data?lang=no&outputFormat=json-stat2"
891 | }
892 | ]
893 | },
894 | "note": [
895 | "F.o.m. 2017 er referanseår 2015=100. Se den avsluttede tidsserien 03363 for tall t.o.m 2015 etter gammel klassifisering av leveransesektor med 1998=100."
896 | ],
897 | "role": {
898 | "time": [
899 | "Tid"
900 | ],
901 | "metric": [
902 | "ContentsCode"
903 | ]
904 | },
905 | "id": [
906 | "Leveringssektor",
907 | "ContentsCode",
908 | "Tid"
909 | ],
910 | "size": [
911 | 14,
912 | 2,
913 | 9
914 | ],
915 | "dimension": {
916 | "Leveringssektor": {
917 | "label": "Leveringssektor",
918 | "category": {
919 | "index": {
920 | "B1": 0,
921 | "B11": 1,
922 | "B111": 2,
923 | "B1111": 3,
924 | "B1112": 4,
925 | "B112": 5,
926 | "B12": 6,
927 | "B121": 7,
928 | "B122": 8,
929 | "B2": 9,
930 | "B21": 10,
931 | "B22": 11,
932 | "B221": 12,
933 | "B222": 13
934 | },
935 | "label": {
936 | "B1": "Varer",
937 | "B11": "Norske varer",
938 | "B111": "Norske varer uten energivarer",
939 | "B1111": "Norske jordbruksvarer",
940 | "B1112": "Norske varer uten jordbruks og energivarer",
941 | "B112": "Energivarer",
942 | "B12": "Importerte varer",
943 | "B121": "Importerte jordbruksvarer",
944 | "B122": "Importerte varer uten jordbruksvarer",
945 | "B2": "Tjenester",
946 | "B21": "Husleie",
947 | "B22": "Tjenester uten husleie",
948 | "B221": "Tjenester hvor arbeidskraft dominerer",
949 | "B222": "Tjenester med andre viktige priskomponenter"
950 | }
951 | },
952 | "extension": {
953 | "elimination": false,
954 | "show": "value",
955 | "codeLists": [ ]
956 | }
957 | },
958 | "ContentsCode": {
959 | "label": "statistikkvariabel",
960 | "category": {
961 | "index": {
962 | "LevIndAar": 0,
963 | "Aarsendring": 1
964 | },
965 | "label": {
966 | "LevIndAar": "Konsumprisindeks (2015=100)",
967 | "Aarsendring": "Årsendring (prosent)"
968 | },
969 | "unit": {
970 | "LevIndAar": {
971 | "base": "indeks",
972 | "decimals": 1
973 | },
974 | "Aarsendring": {
975 | "base": "prosent",
976 | "decimals": 1
977 | }
978 | }
979 | },
980 | "extension": {
981 | "elimination": false,
982 | "refperiod": {
983 | "LevIndAar": "Gjennomsnitt for året",
984 | "Aarsendring": "Gjennomsnitt for hvert år"
985 | },
986 | "show": "value",
987 | "codeLists": [ ]
988 | },
989 | "link": {
990 | "describedby": [
991 | {
992 | "extension": {
993 | "LevIndAar": "urn:ssb:conceptvariable:vardok:2755"
994 | }
995 | }
996 | ]
997 | }
998 | },
999 | "Tid": {
1000 | "label": "år",
1001 | "category": {
1002 | "index": {
1003 | "2015": 0,
1004 | "2016": 1,
1005 | "2017": 2,
1006 | "2018": 3,
1007 | "2019": 4,
1008 | "2020": 5,
1009 | "2021": 6,
1010 | "2022": 7,
1011 | "2023": 8
1012 | },
1013 | "label": {
1014 | "2015": "2015",
1015 | "2016": "2016",
1016 | "2017": "2017",
1017 | "2018": "2018",
1018 | "2019": "2019",
1019 | "2020": "2020",
1020 | "2021": "2021",
1021 | "2022": "2022",
1022 | "2023": "2023"
1023 | }
1024 | },
1025 | "extension": {
1026 | "elimination": false,
1027 | "show": "code",
1028 | "codeLists": [ ]
1029 | }
1030 | }
1031 | },
1032 | "extension": {
1033 | "px": {
1034 | "infofile": "None",
1035 | "tableid": "11118",
1036 | "decimals": 1,
1037 | "official-statistics": true,
1038 | "aggregallowed": false,
1039 | "language": "no",
1040 | "contents": "11118: Konsumprisindeks for varer og tjenester,",
1041 | "descriptiondefault": false,
1042 | "heading": [
1043 | "statistikkvariabel",
1044 | "år"
1045 | ],
1046 | "stub": [
1047 | "Leveringssektor"
1048 | ],
1049 | "matrix": "LevIndAar",
1050 | "subject-code": "al",
1051 | "subject-area": "Arbeid og lønn"
1052 | },
1053 | "contact": [
1054 | {
1055 | "name": " Konsumprisindeksen",
1056 | "phone": "62 88 56 34",
1057 | "mail": "konsumprisindeksen@ssb.no",
1058 | "raw": " Konsumprisindeksen, Statistisk sentralbyrå# +47 62 88 56 34#konsumprisindeksen@ssb.no"
1059 | }
1060 | ]
1061 | }
1062 | }
1063 | ```
1064 |
1065 | ### Hent data for en spesifikk tabell
1066 | ```
1067 | HTTP GET https://data.ssb.no/api/pxwebapi/v2-beta/tables//data/
1068 | ```
1069 |
1070 | #### Parametere
1071 | Variablene i tabellen kan brukes til å forespørre en spesifikk del av tabellen ved hjelp av følgende parametere. Hvis ingen parametere er angitt, velges et standardområde i tabellen.
1072 |
1073 | #### Eksempel på respons
1074 |
1075 | Data uten andre parametere enn språk og outputFormat for tabell med id **11118** som json-stat2
1076 |
1077 | ```
1078 | HTTP GET https://data.ssb.no/api/pxwebapi/v2-beta/tables/11118/data?lang=no&outputformat=json-stat2
1079 | ```
1080 |
1081 | ```json
1082 | {
1083 | "version": "2.0",
1084 | "class": "dataset",
1085 | "label": "11118: Konsumprisindeks for varer og tjenester, etter Leveringssektor, år og statistikkvariabel",
1086 | "source": "Statistisk sentralbyrå",
1087 | "updated": "2024-01-10T07:00:00Z",
1088 | "note": [
1089 | "F.o.m. 2017 er referanseår 2015=100. Se den avsluttede tidsserien 03363 for tall t.o.m 2015 etter gammel klassifisering av leveransesektor med 1998=100."
1090 | ],
1091 | "role": {
1092 | "time": [
1093 | "Tid"
1094 | ],
1095 | "metric": [
1096 | "ContentsCode"
1097 | ]
1098 | },
1099 | "id": [
1100 | "Leveringssektor",
1101 | "Tid",
1102 | "ContentsCode"
1103 | ],
1104 | "size": [
1105 | 14,
1106 | 1,
1107 | 2
1108 | ],
1109 | "dimension": {
1110 | "Leveringssektor": {
1111 | "label": "Leveringssektor",
1112 | "category": {
1113 | "index": {
1114 | "B1": 0,
1115 | "B11": 1,
1116 | "B111": 2,
1117 | "B1111": 3,
1118 | "B1112": 4,
1119 | "B112": 5,
1120 | "B12": 6,
1121 | "B121": 7,
1122 | "B122": 8,
1123 | "B2": 9,
1124 | "B21": 10,
1125 | "B22": 11,
1126 | "B221": 12,
1127 | "B222": 13
1128 | },
1129 | "label": {
1130 | "B1": "Varer",
1131 | "B11": "Norske varer",
1132 | "B111": "Norske varer uten energivarer",
1133 | "B1111": "Norske jordbruksvarer",
1134 | "B1112": "Norske varer uten jordbruks og energivarer",
1135 | "B112": "Energivarer",
1136 | "B12": "Importerte varer",
1137 | "B121": "Importerte jordbruksvarer",
1138 | "B122": "Importerte varer uten jordbruksvarer",
1139 | "B2": "Tjenester",
1140 | "B21": "Husleie",
1141 | "B22": "Tjenester uten husleie",
1142 | "B221": "Tjenester hvor arbeidskraft dominerer",
1143 | "B222": "Tjenester med andre viktige priskomponenter"
1144 | }
1145 | },
1146 | "extension": {
1147 | "elimination": false,
1148 | "show": "value"
1149 | }
1150 | },
1151 | "Tid": {
1152 | "label": "år",
1153 | "category": {
1154 | "index": {
1155 | "2023": 0
1156 | },
1157 | "label": {
1158 | "2023": "2023"
1159 | }
1160 | },
1161 | "extension": {
1162 | "elimination": false,
1163 | "show": "code"
1164 | }
1165 | },
1166 | "ContentsCode": {
1167 | "label": "statistikkvariabel",
1168 | "category": {
1169 | "index": {
1170 | "LevIndAar": 0,
1171 | "Aarsendring": 1
1172 | },
1173 | "label": {
1174 | "LevIndAar": "Konsumprisindeks (2015=100)",
1175 | "Aarsendring": "Årsendring (prosent)"
1176 | },
1177 | "unit": {
1178 | "LevIndAar": {
1179 | "base": "indeks",
1180 | "decimals": 1
1181 | },
1182 | "Aarsendring": {
1183 | "base": "prosent",
1184 | "decimals": 1
1185 | }
1186 | }
1187 | },
1188 | "extension": {
1189 | "elimination": false,
1190 | "refperiod": {
1191 | "LevIndAar": "Gjennomsnitt for året",
1192 | "Aarsendring": "Gjennomsnitt for hvert år"
1193 | },
1194 | "show": "value"
1195 | },
1196 | "link": {
1197 | "describedby": [
1198 | {
1199 | "extension": {
1200 | "LevIndAar": "urn:ssb:conceptvariable:vardok:2755"
1201 | }
1202 | }
1203 | ]
1204 | }
1205 | }
1206 | },
1207 | "extension": {
1208 | "px": {
1209 | "infofile": "None",
1210 | "tableid": "11118",
1211 | "decimals": 1,
1212 | "official-statistics": true,
1213 | "aggregallowed": false,
1214 | "language": "no",
1215 | "contents": "11118: Konsumprisindeks for varer og tjenester,",
1216 | "descriptiondefault": false,
1217 | "heading": [
1218 | "Tid",
1219 | "ContentsCode"
1220 | ],
1221 | "stub": [
1222 | "Leveringssektor"
1223 | ],
1224 | "matrix": "LevIndAar",
1225 | "subject-code": "al",
1226 | "subject-area": "Arbeid og lønn"
1227 | },
1228 | "contact": [
1229 | {
1230 | "name": " Konsumprisindeksen",
1231 | "phone": "62 88 56 34",
1232 | "mail": "konsumprisindeksen@ssb.no",
1233 | "raw": " Konsumprisindeksen, Statistisk sentralbyrå# +47 62 88 56 34#konsumprisindeksen@ssb.no"
1234 | }
1235 | ]
1236 | },
1237 | "value": [
1238 | 133.3,
1239 | 5.8,
1240 | 150,
1241 | 3.4,
1242 | 125.5,
1243 | 8.1,
1244 | 131.6,
1245 | 9.7,
1246 | 123.6,
1247 | 7.7,
1248 | 235.2,
1249 | -7,
1250 | 123.6,
1251 | 7,
1252 | 133.1,
1253 | 12.9,
1254 | 122.9,
1255 | 6.6,
1256 | 125.6,
1257 | 5.2,
1258 | 116.8,
1259 | 3.8,
1260 | 131.9,
1261 | 6.2,
1262 | 126.9,
1263 | 3.1,
1264 | 134.2,
1265 | 7.6
1266 | ]
1267 | }
1268 | ```
1269 |
1270 | ##### lang
1271 | En valgfri språkparameter.
1272 |
1273 | ##### valueCodes
1274 | Et utvalg som spesifiserer et område i tabellen som skal returneres. Alle variabler som ikke kan elimineres, må ha et utvalg spesifisert. Utvalget for en variabel gis i følgende form:
1275 | ```
1276 | valueCodes[VARIABLE-CODE]=ITEM-SELECTION-1,ITEM-SELECTION-2,ITEM-SELECTION-3, etc
1277 | ```
1278 | der `VARIABLE-CODE` er koden for variabelen, og `ITEM-SELECTION-X` er enten en verdikode eller et utvalguttrykk. Hvis verdikoden inneholder komma, må den være i hakeparenteser, f.eks. `[RANGE(1,12)]`.
1279 |
1280 | ##### codelist
1281 | En annen kodeliste kan spesifiseres for en variabel, f.eks. for å bruke en annen aggregering. Kodelisten spesifiseres slik:
1282 | ```
1283 | codelist[VARIABLE-CODE]=CODELIST-ID
1284 | ```
1285 | Hvor `VARIABLE-CODE` er koden for variabelen, og `CODELIST-ID` er ID-en til kodelisten som skal brukes.
1286 |
1287 |
1288 | ## POST-endepunktet for tabelldata
1289 |
1290 |
1291 | ### Hent data for en spesifikk tabell (POST-metode)
1292 | Dette endepunktet ligner på GET-metoden, men utvalgsuttrykkene sendes i selve forespørselens kropp som et JSON-objekt.
1293 |
1294 | ```
1295 | HTTP POST https://data.ssb.no/api/pxwebapi/v2-beta/tables//data?
1296 | ```
1297 |
1298 | #### Utvalgsuttrykk
1299 | JSON-objektet som spesifiserer forespørselen, gis i følgende form:
1300 | ```json
1301 | # POST API spørring - fryst og fersk laks siste 53 uker
1302 | payload = {"selection": [
1303 | {"variableCode": "VareGrupper2",
1304 | "valueCodes": [
1305 | "01", "02"
1306 | ]
1307 | },
1308 | {"variableCode": "ContentsCode",
1309 | "valueCodes": [
1310 | "Vekt", "Kilopris"
1311 | ]
1312 | },
1313 | {"variableCode": "Tid",
1314 | "valueCodes": ["2024*"] }
1315 | ]
1316 | }
1317 |
1318 | ```
1319 |
1320 | #### Parametere
1321 |
1322 | ##### lang
1323 | En valgfri språkparameter. Angis i endepunkt.
1324 |
1325 | ##### outputFormat
1326 | Angis i endepunktet. Formatet resultatet skal være i. Standardverdien er spesifisert av konfigurasjonsendepunktet. Se også konfigurasjonsendepunktet for tilgjengelige formater.
1327 |
1328 | Merk at til forskjell fra API-versjon 1, så angis nå outputformat og evt. språk i endepunktsurl.
1329 |
1330 | ### Utvalgsuttrykk
1331 | I stedet for å spesifisere alle verdikoder, kan man bruke et utvalgsuttrykk. Følgende utvalgsuttrykk er tilgjengelige:
1332 |
1333 | #### Jokertegnuttrykk
1334 | Et jokertegn kan brukes for å matche alle koder. For eksempel:
1335 | - `*01` matcher alle koder som slutter med `01`.
1336 | - `*2*` matcher alle koder som inneholder `2`.
1337 | - `A*` matcher alle koder som starter med `A`.
1338 | - `*` matcher alle koder.
1339 | - `202*` matcher alle koder som beynner på 202, f.eks. `2024M12`.
1340 |
1341 | Maksimalt to jokertegn kan brukes.
1342 |
1343 | #### Nøyaktig samsvar
1344 | Et spørsmålstegn (`?`) kan brukes til å matche nøyaktig ett tegn. For eksempel:
1345 | - `?` matcher nøyaktig ett tegn.
1346 | - `????M12` matcher fire tegn og som slutter med `M12`, f.eks. `2024M12`.
1347 |
1348 | #### TOP
1349 | Uttrykket `TOP(N, Offset)` velger de første `N` verdiene med et forskyvning på `Offset`. For eksempel:
1350 | - `TOP(5)` vil velge de første fem verdiene.
1351 | - `TOP(5,3)` vil velge den tredje til den åttende verdien.
1352 | Offset er som standard `0` og trenger ikke spesifiseres. Merk at for tidsvariabelen vil de nyeste verdiene komme først.
1353 |
1354 | #### BOTTOM
1355 | `BOTTOM` fungerer på samme måte som `TOP`, men velger verdier fra bunnen av verdilisten.
1356 |
1357 | #### RANGE
1358 | `RANGE(X,Y)` velger alle verdier mellom verdikodene `X` og `Y`, inkludert `X` og `Y`.
1359 |
1360 | #### FROM
1361 | `FROM(X)` velger alle verdikoder fra og med `X` og nedover, inkludert `X`.
1362 |
1363 | #### TO
1364 | `TO(X)` velger alle verdikoder fra starten av listen opp til og med `X`.
1365 |
1366 | ---
1367 |
1368 | ### Eliminasjon
1369 | Hvis eliminering er satt til `true`, kan variabelen elimineres. Da er det er ikke nødvendig å spesifisere noe utvalg for denne variabelen. Resultatet vil da ikke inneholde denne variabelen. Hvis variabelen har en verdi som angir at den er eliminasjonsverdi, vil denne verdien bli valgt for å eliminere variabelen. Hvis det ikke er spesifisert eliminasjonsverdi, vil variabelen elimineres ved å summere opp alle datapunkter for alle verdier av den variabelen. Hvis en variabel har eliminering satt til `false`, må minst én verdi velges for den variabelen.
1370 |
1371 |
1372 | ### Kodeliste-endepunkter
1373 |
1374 | #### Liste over kodelister for en tabell
1375 | Gir informasjon om en spesifikk kodeliste.
1376 |
1377 | ```
1378 | HTTP GET /api/v2/codelists/
1379 | ```
1380 |
1381 | ##### Parametere
1382 | ###### lang
1383 | En valgfri språkparameter.
1384 |
1385 | #### Eksempel på respons
1386 | Et eksempel på respons for kodelisten **agg_FylkerGjeldende**:
1387 | ```json
1388 | ikke implementert i v2-beta
1389 | ```
1390 |
1391 |
1392 |
1393 | # Responskoder
1394 | - **400** - Feil i spørring
1395 | - **403** - Forbidden
1396 | - **404** – Ressurs ikke funnet.
1397 | - **429** – For mange forespørsler.
1398 | - **50X** – Intern serverfeil.
1399 |
1400 | | Status code | Description | Reason |
1401 | | ------- | ----------- | --------------------- |
1402 | | 200 | Success | Endepunktet har gitt respont til forespørselen |
1403 | | 400 | Bad request | Forspørselen er ikke gyldig, feil i spørring |
1404 | | 403 | Forbidden | Antall celler overstiger grensene i APIet |
1405 | | 404 | Not found | URL i forespørsel eksisterer ikke |
1406 | | 429 | Too many requests | For mange forspørsler innen tidsperioden |
1407 | | 50X | Internal Server Error | Tjenesten kan være nede |
1408 |
1409 | # Restriksjoner
1410 |
1411 | Noen begrensninger i versjon 2.0 av API-et sammenlignet med den første versjonen av API-et:
1412 |
1413 | - **Kun én database** – Støtten for flere databaser som kan betjenes av samme instans av API-et er fjernet. Dette reduserer kompleksiteten i API-ets interne funksjoner, siden det ikke trenger å ta hensyn til ulike konfigurasjoner for forskjellige databaser. De fleste organisasjoner har bare én database, så effekten er begrenset til et fåtall instanser av API-et.
1414 | - Anbefalt løsning for organisasjoner med flere databaser: Ha flere instanser av API-et med forskjellig konfigurasjon.
1415 |
1416 | - **Ny tabellidentifikasjon** – Identifikatoren for en tabell er endret. I tilfelle en PX-fil brukes, benyttes **MATRIX** i stedet for filnavnet, og i tilfelle **CNMM** brukes, benyttes **TableId** i stedet for **MainTable**. Den nye ID-en skal være stabil og ikke gjenbrukes. Hvis en tabell endres på en måte som gjør den inkompatibel, bør den dupliseres og tildeles en ny ID. På denne måten vil API-et kunne identifisere tabellen selv om den er flyttet i databasen.
1417 |
1418 | - **Navn på aggregeringsfiler må være unike** – Navnene på aggregeringsfilene i en database må være unike, siden de vil tjene som ID for aggregeringsfilteret.
1419 |
1420 | - **VARIABLETYPE må formaliseres** – Variabeltypene må defineres og standardiseres.
1421 |
1422 | - **Tid er ikke lenger eliminerbar** - Det må nå alltid velges en verdi for tidsvariabelen.
1423 |
1424 | ## Referanser
1425 | - [https://www.dst.dk/en/Statistik/statistikbanken/api](https://www.dst.dk/en/Statistik/statistikbanken/api)
1426 | - [http://api.statbank.dk/console#data](http://api.statbank.dk/console#data)
1427 | - [https://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api](https://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api)
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ssb-api-python-examples
2 | ### Norsk - for [English see below](#English)
3 |
4 | # Hvordan bruke Python mot SSBs API-er, vist med Jupyter notebooks
5 |
6 | Statistisk sentralbyrå (SSB) tilbyr tre API-er for å hente ut og integrere SSBs data med egne systemer. API-ene er åpne og krever ikke registrering:
7 |
8 | - **API for å poste spørringer i JSON mot alle Statistikkbankens 7000 tabeller (PxWebApi)**: Dette API-et lar deg sende spørringer i JSON-format mot alle tabeller i Statistikkbankens.
9 | - **API med ferdige datasett**: Dette enkle API-et gir deg tilgang til 210 oppdaterte datasett med fast URL, hentet fra de mest brukte tabellene i Statistikkbanken.
10 | - **REST API for statistiske klassifikasjoner og kodelister**: Dette API-et gir deg tilgang til statistiske klassifikasjoner og kodelister (Klass).
11 |
12 |
13 | SSB har kommet med en **[versjon 2 beta](https://www.ssb.no/api/pxwebapi/pxwebapi-2.0-beta) av PxWebApi**. Dette håndterer også http GET. Formatet på http POST er nytt. Se **egen [README](PxWebApi2/README.md)** for eksempler som benytter versjon 2.
14 |
15 | Det kommer fortsatt mer metadata i JSON-stat2. Det gjelder både det gamle og nye APIet. Noen av eksemplene under er oppdatert, bl.a. for å vise dette.
16 |
17 | Forøvrig er R-pakken [PxWebApiData](https://CRAN.R-project.org/package=PxWebApiData) nylig oppdatert til versjon 1.0. Den håndterer også v2-beta GET Url'er.
18 |
19 |
20 |
21 | Alle eksempler bruker Python [Pandas](https://pandas.pydata.org/).
22 |
23 | ## API med ferdige datasett - CSV
24 | - [Varehandel](eks1_doi_csv_nor.ipynb) - veldig enkelt eksempel med lite datasett.
25 | - [Konjunkturtendensene](kt-csv-nor.ipynb) - Importerer et ferdig CSV datasett til Pandas, med 10 oppdaterte økonomiske prognoser. Viser enkle diagram med Pandas plot og Plotly Express.
26 |
27 |
28 | ## JSON-stat eksempler for å poste spørringer mot [PxWebApi](https://www.ssb.no/en/omssb/tjenester-og-verktoy/api/px-api)
29 |
30 | - [Laks](laks-no.ipynb) - Post spørring og få Pandas dataframe i retur
31 | - [JsonStatToPandas](jsonstatToPandas_funksjon.ipynb) - To funksjoner for å poste JSON spørring og få Pandas dataframe i retur
32 | - [komm-nr-id](komm-nr-id-nor.ipynb) - Hvordan vise **både** kommunenummer/-kode og kommunenavn i en dataframe, dvs. vise kode og tekst i JSON-stat
33 | - [Kombiner to tabeller](two-tables-one-chart_nor.ipynb) - Spørre mot to ulike Statstikkbank-tabeller og vise resultatet i en figur med Pandas pivot og Matplotlib.
34 | - [Konkurs-datokonv](konkurs-datokonv.ipynb) - Funksjon for å konvertere Tid fra kategori til datoformat. Viser forskjellen i to figurer med ukentlige konkurser.
35 | - [Nasjonalregnskap-datokonvertering](nr-datokonv.ipynb) - Viser samme spørring mot tabeller med ulik frakvense, her BNP-endring i månedlig, kvartalsvis og årlig nasjonalregnskap. Viser dateconv() som konverterer fra kategori til dataoformat og setter Pandas Period.
36 | - [text-code](text-code-nor.ipynb) - Få Kode og Tekst i JSON-stat - eksempel med HS-varekoder i månedlig Utenrikshandel
37 |
38 | ## Klassifikasjoner og kodelister (Klass)
39 | - [Klasskommune](klass_kommune2020.ipynb) - Standard for kommuneinndeling til Pandas.
40 | - [KOSTRA-koder](kostra-kode-nor.ipynb) - KOSTRA koder for regnskapsarter og -funksjoner. Hvordan hente og filtrere KOSTRA arter og funksjoner med definisjoner via Klass API (KOSTRA - Municipality-State-Reporting)
41 |
42 |
43 |
44 | #### Lenker for mer informasjon:
45 | - [SSBs API-er med åpne data](https://www.ssb.no/api/).
46 | - [API: Lag egne datasett (PxWebApi)](https://www.ssb.no/api/pxwebapi).
47 | - [PxWebApi brukerveiledning](https://www.ssb.no/omssb/_attachment/248256).
48 | - [Slik bruker du SSBs statistikkbank](https://www.ssb.no/statbank/hvordan-bruke-statistikkbanken).
49 |
50 | **R-bruker?**
51 | Bruk i stedet R-pakken [PxWebApiData](https://CRAN.R-project.org/package=PxWebApiData) og se denne [Introduksjonen](https://cran.r-project.org/package=PxWebApiData/vignettes/Introduction.html). Tips: Har du problem med æøå i API setlocale i R til "no_NO.UTF8"
52 |
53 | # English
54 | ## Jupyter notebooks on how to use Python to access Statstics Norways APIs
55 |
56 | Statistics Norway offers three APIs that allow you to retrieve and integrate SSB's data with your own systems. These APIs are open and do not require registration. Here is a brief overview of the three APIs:
57 |
58 | 1. **API for posting queries in JSON to all of Statbank Norway's 7000 tables ([PxWebApi](https://www.ssb.no/en/omssb/tjenester-og-verktoy/api/px-api))**: This API allows you to send queries in JSON format to all of Statistikkbanken's tables.
59 | 2. **API for ready-made datasets**: This API provides access to 210 datasets with fixed URLs, extracted from the most frequently used tables in the Statbank.
60 | 3. **REST API for statistical classifications and code lists**: This API provides access to statistical classifications and code lists.
61 |
62 |
63 | ## Examples using CSV from the [API for Readymade datasets](https://data.ssb.no/api/v0/dataset/?lang=en)
64 |
65 | - [Basic](eks1_doi_csv1-en.ipynb) a very basic example on Index of retail sales.
66 | - [Economic trends](kt-csv-nor.ipynb) Import a readymade CSV dataset, Main Economic Forecasts, to Pandas. Shows basic plots using Pandas plot and Plotly Express.
67 |
68 | ## Examples using http POST to query [PxWebApi](https://www.ssb.no/en/omssb/tjenester-og-verktoy/api/px-api)
69 | All examples are using JSON-stat output and the library [pyjstat](https://pypi.org/project/pyjstat/)
70 |
71 | - [basic](laks-en.ipynb) - a basic example on using http POST to query PxWebApi.
72 | - [jsonstatToPandas_function](jsonstatToPandas_function-en.ipynb) - General function to read JSON-stat to Pandas dataframes
73 | - [two-tables-one-chart](two-tables-one-chart-en.ipynb) - http POST example, combines two datasets from two Statbank tables using Pandas pivot, and plot them using Matplotlib.
74 | - [bankrupties](konkurs-datokonv-en.ipynb) - shows the use of a general function for converting the time variable from category to date, and the difference of the two in two plots. The table used is on weekly bankruptcies.
75 | - [gdp-dateconv](nr-datokonv-en.ipynb) - shows posting of the same query for GDP changes to tables with different frequency, and the use of the function dateconv() which converts from Categories to dateformat and set a Pandas PeriodIndex.
76 | - [text-code](text-code-en.ipynb) - shows how to get both text and code from JSON-stat. Example using HS-code from monthly Foreign trade by country.
77 |
78 |
79 | ## Example on Statistics Norway's [Statistical Classifications and Codelists](https://www.ssb.no/en/klass/) API
80 | - [Klasskommune](klass_kommune2020.ipynb) get municipality names and codes.
81 |
82 |
83 |
84 | **Using R ?** Try our R-package [PxWebApiData](https://CRAN.R-project.org/package=PxWebApiData) and see [Introduction](https://cran.r-project.org/package=PxWebApiData/vignettes/Introduction.html)
85 |
86 |
87 |
--------------------------------------------------------------------------------
/komm-nr-id-nor.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Hvordan lage spørring som gir både kommunenavn og kommunenummer (id) fra JSON-stat"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "### Importerer biblioteker\n",
15 | "Bruker [pyjstat](https://pypi.org/project/pyjstat/) og Pandas. Pandas importeres som del av pyjstat."
16 | ]
17 | },
18 | {
19 | "cell_type": "code",
20 | "execution_count": 1,
21 | "metadata": {},
22 | "outputs": [],
23 | "source": [
24 | "from pyjstat import pyjstat\n",
25 | "import requests"
26 | ]
27 | },
28 | {
29 | "cell_type": "markdown",
30 | "metadata": {},
31 | "source": [
32 | "URL med tabellens metadata, som vi skal poste spørringen mot"
33 | ]
34 | },
35 | {
36 | "cell_type": "code",
37 | "execution_count": 2,
38 | "metadata": {},
39 | "outputs": [],
40 | "source": [
41 | "POST_URL = 'https://data.ssb.no/api/v0/no/table/07459'"
42 | ]
43 | },
44 | {
45 | "cell_type": "markdown",
46 | "metadata": {},
47 | "source": [
48 | "Spørring - kan også tas fra konsoll.\n",
49 | "0, 1 og 2-åringer i Oslo, Stavanger Trondheim i 2019 - 2022. (For kommuner berørt av regionreformen se lenger ned)"
50 | ]
51 | },
52 | {
53 | "cell_type": "code",
54 | "execution_count": 3,
55 | "metadata": {},
56 | "outputs": [],
57 | "source": [
58 | "json_q = {\"query\":[{\"code\":\"Region\",\"selection\":{\"filter\":\"item\",\"values\":[\"0301\",\"1103\",\"5001\"]}},\n",
59 | " {\"code\":\"Kjonn\",\"selection\":{\"filter\":\"item\",\"values\":[\"1\",\"2\"]}},\n",
60 | " {\"code\":\"Alder\",\"selection\":{\"filter\":\"item\",\"values\":[\"000\",\"001\",\"002\"]}},\n",
61 | " {\"code\":\"ContentsCode\",\"selection\":{\"filter\":\"item\",\"values\":[\"Personer1\"]}},\n",
62 | " {\"code\":\"Tid\",\"selection\":{\"filter\":\"item\",\"values\":[\"2019\",\"2020\", \"2021\", \"2022\"]}}\n",
63 | " ],\n",
64 | " \"response\":{\"format\":\"json-stat2\"}}"
65 | ]
66 | },
67 | {
68 | "cell_type": "markdown",
69 | "metadata": {},
70 | "source": [
71 | "Poster spørringen"
72 | ]
73 | },
74 | {
75 | "cell_type": "code",
76 | "execution_count": 4,
77 | "metadata": {},
78 | "outputs": [],
79 | "source": [
80 | "res = requests.post(POST_URL, json=json_q)"
81 | ]
82 | },
83 | {
84 | "cell_type": "markdown",
85 | "metadata": {},
86 | "source": [
87 | "### Leser JSON-stat resultatet med biblioteket pyjstat\n",
88 | "Lagrer det som datasett ds."
89 | ]
90 | },
91 | {
92 | "cell_type": "code",
93 | "execution_count": 5,
94 | "metadata": {},
95 | "outputs": [],
96 | "source": [
97 | "ds = pyjstat.Dataset.read(res.text)"
98 | ]
99 | },
100 | {
101 | "cell_type": "code",
102 | "execution_count": 6,
103 | "metadata": {},
104 | "outputs": [
105 | {
106 | "data": {
107 | "text/plain": [
108 | "pyjstat.pyjstat.Dataset"
109 | ]
110 | },
111 | "execution_count": 6,
112 | "metadata": {},
113 | "output_type": "execute_result"
114 | }
115 | ],
116 | "source": [
117 | "type(ds)"
118 | ]
119 | },
120 | {
121 | "cell_type": "markdown",
122 | "metadata": {},
123 | "source": [
124 | "Se datasettet ds"
125 | ]
126 | },
127 | {
128 | "cell_type": "code",
129 | "execution_count": 7,
130 | "metadata": {},
131 | "outputs": [],
132 | "source": [
133 | "#ds"
134 | ]
135 | },
136 | {
137 | "cell_type": "markdown",
138 | "metadata": {},
139 | "source": [
140 | "### Henter noen overordnete metadata fra JSON-stat datasettet"
141 | ]
142 | },
143 | {
144 | "cell_type": "code",
145 | "execution_count": 8,
146 | "metadata": {},
147 | "outputs": [
148 | {
149 | "name": "stdout",
150 | "output_type": "stream",
151 | "text": [
152 | "07459: Befolkning, etter region, kjønn, alder, statistikkvariabel og år\n"
153 | ]
154 | }
155 | ],
156 | "source": [
157 | "tittel = ds['label']\n",
158 | "print(tittel)"
159 | ]
160 | },
161 | {
162 | "cell_type": "markdown",
163 | "metadata": {},
164 | "source": [
165 | "Sist Oppdatert som GMT"
166 | ]
167 | },
168 | {
169 | "cell_type": "code",
170 | "execution_count": 9,
171 | "metadata": {},
172 | "outputs": [
173 | {
174 | "name": "stdout",
175 | "output_type": "stream",
176 | "text": [
177 | "2022-02-24T07:00:00Z\n"
178 | ]
179 | }
180 | ],
181 | "source": [
182 | "last_update = ds['updated']\n",
183 | "print(last_update)"
184 | ]
185 | },
186 | {
187 | "cell_type": "markdown",
188 | "metadata": {},
189 | "source": [
190 | "Henter kilde"
191 | ]
192 | },
193 | {
194 | "cell_type": "code",
195 | "execution_count": 10,
196 | "metadata": {},
197 | "outputs": [
198 | {
199 | "name": "stdout",
200 | "output_type": "stream",
201 | "text": [
202 | "Statistisk sentralbyrå\n"
203 | ]
204 | }
205 | ],
206 | "source": [
207 | "source = ds['source']\n",
208 | "print(source)"
209 | ]
210 | },
211 | {
212 | "cell_type": "markdown",
213 | "metadata": {},
214 | "source": [
215 | "### Role gir noen snarveier, \n",
216 | "*men det er en liten bug i Statistikkbanken som ikke får med role - geo : 'Region' for akkurat denne tabellen, 07459*"
217 | ]
218 | },
219 | {
220 | "cell_type": "code",
221 | "execution_count": 11,
222 | "metadata": {},
223 | "outputs": [
224 | {
225 | "name": "stdout",
226 | "output_type": "stream",
227 | "text": [
228 | "OrderedDict([('time', ['Tid']), ('metric', ['ContentsCode']), ('geo', ['Region'])])\n"
229 | ]
230 | }
231 | ],
232 | "source": [
233 | "ds_roles = ds['role']\n",
234 | "print(ds_roles)"
235 | ]
236 | },
237 | {
238 | "cell_type": "markdown",
239 | "metadata": {},
240 | "source": [
241 | "### Lager dataframes\n",
242 | "Vi må lage to dataframes, en med tekst og en med koder/ID. Pyjstat tillater bare enten/eller"
243 | ]
244 | },
245 | {
246 | "cell_type": "code",
247 | "execution_count": 12,
248 | "metadata": {},
249 | "outputs": [],
250 | "source": [
251 | "befolkning = ds.write('dataframe')\n",
252 | "befolkning_id = ds.write('dataframe', naming='id')"
253 | ]
254 | },
255 | {
256 | "cell_type": "markdown",
257 | "metadata": {},
258 | "source": [
259 | "Lager en ny kolonne med både kommunenummer og navn slått sammen. Kommunenummer er egentlig en streng på 4 tegn. "
260 | ]
261 | },
262 | {
263 | "cell_type": "code",
264 | "execution_count": 13,
265 | "metadata": {},
266 | "outputs": [],
267 | "source": [
268 | "befolkning['kommune'] = befolkning_id['Region'] + ' ' + befolkning['region']"
269 | ]
270 | },
271 | {
272 | "cell_type": "markdown",
273 | "metadata": {},
274 | "source": [
275 | "Lager en ny dataframe som bare har med kolonnene vi ønsker, i ny rekkefølge. Merk doble [[ ]]"
276 | ]
277 | },
278 | {
279 | "cell_type": "code",
280 | "execution_count": 14,
281 | "metadata": {},
282 | "outputs": [
283 | {
284 | "data": {
285 | "text/html": [
286 | "\n",
287 | "\n",
300 | "
\n",
301 | " \n",
302 | " \n",
303 | " | \n",
304 | " kommune | \n",
305 | " kjønn | \n",
306 | " alder | \n",
307 | " år | \n",
308 | " value | \n",
309 | "
\n",
310 | " \n",
311 | " \n",
312 | " \n",
313 | " 0 | \n",
314 | " 0301 Oslo kommune | \n",
315 | " Menn | \n",
316 | " 0 år | \n",
317 | " 2019 | \n",
318 | " 4523 | \n",
319 | "
\n",
320 | " \n",
321 | " 1 | \n",
322 | " 0301 Oslo kommune | \n",
323 | " Menn | \n",
324 | " 0 år | \n",
325 | " 2020 | \n",
326 | " 4647 | \n",
327 | "
\n",
328 | " \n",
329 | " 2 | \n",
330 | " 0301 Oslo kommune | \n",
331 | " Menn | \n",
332 | " 0 år | \n",
333 | " 2021 | \n",
334 | " 4498 | \n",
335 | "
\n",
336 | " \n",
337 | " 3 | \n",
338 | " 0301 Oslo kommune | \n",
339 | " Menn | \n",
340 | " 0 år | \n",
341 | " 2022 | \n",
342 | " 4580 | \n",
343 | "
\n",
344 | " \n",
345 | " 4 | \n",
346 | " 0301 Oslo kommune | \n",
347 | " Menn | \n",
348 | " 1 år | \n",
349 | " 2019 | \n",
350 | " 4507 | \n",
351 | "
\n",
352 | " \n",
353 | " 5 | \n",
354 | " 0301 Oslo kommune | \n",
355 | " Menn | \n",
356 | " 1 år | \n",
357 | " 2020 | \n",
358 | " 4283 | \n",
359 | "
\n",
360 | " \n",
361 | " 6 | \n",
362 | " 0301 Oslo kommune | \n",
363 | " Menn | \n",
364 | " 1 år | \n",
365 | " 2021 | \n",
366 | " 4320 | \n",
367 | "
\n",
368 | " \n",
369 | " 7 | \n",
370 | " 0301 Oslo kommune | \n",
371 | " Menn | \n",
372 | " 1 år | \n",
373 | " 2022 | \n",
374 | " 4097 | \n",
375 | "
\n",
376 | " \n",
377 | " 8 | \n",
378 | " 0301 Oslo kommune | \n",
379 | " Menn | \n",
380 | " 2 år | \n",
381 | " 2019 | \n",
382 | " 4463 | \n",
383 | "
\n",
384 | " \n",
385 | " 9 | \n",
386 | " 0301 Oslo kommune | \n",
387 | " Menn | \n",
388 | " 2 år | \n",
389 | " 2020 | \n",
390 | " 4280 | \n",
391 | "
\n",
392 | " \n",
393 | " 10 | \n",
394 | " 0301 Oslo kommune | \n",
395 | " Menn | \n",
396 | " 2 år | \n",
397 | " 2021 | \n",
398 | " 3973 | \n",
399 | "
\n",
400 | " \n",
401 | " 11 | \n",
402 | " 0301 Oslo kommune | \n",
403 | " Menn | \n",
404 | " 2 år | \n",
405 | " 2022 | \n",
406 | " 4008 | \n",
407 | "
\n",
408 | " \n",
409 | " 12 | \n",
410 | " 0301 Oslo kommune | \n",
411 | " Kvinner | \n",
412 | " 0 år | \n",
413 | " 2019 | \n",
414 | " 4479 | \n",
415 | "
\n",
416 | " \n",
417 | " 13 | \n",
418 | " 0301 Oslo kommune | \n",
419 | " Kvinner | \n",
420 | " 0 år | \n",
421 | " 2020 | \n",
422 | " 4454 | \n",
423 | "
\n",
424 | " \n",
425 | " 14 | \n",
426 | " 0301 Oslo kommune | \n",
427 | " Kvinner | \n",
428 | " 0 år | \n",
429 | " 2021 | \n",
430 | " 4345 | \n",
431 | "
\n",
432 | " \n",
433 | "
\n",
434 | "
"
435 | ],
436 | "text/plain": [
437 | " kommune kjønn alder år value\n",
438 | "0 0301 Oslo kommune Menn 0 år 2019 4523\n",
439 | "1 0301 Oslo kommune Menn 0 år 2020 4647\n",
440 | "2 0301 Oslo kommune Menn 0 år 2021 4498\n",
441 | "3 0301 Oslo kommune Menn 0 år 2022 4580\n",
442 | "4 0301 Oslo kommune Menn 1 år 2019 4507\n",
443 | "5 0301 Oslo kommune Menn 1 år 2020 4283\n",
444 | "6 0301 Oslo kommune Menn 1 år 2021 4320\n",
445 | "7 0301 Oslo kommune Menn 1 år 2022 4097\n",
446 | "8 0301 Oslo kommune Menn 2 år 2019 4463\n",
447 | "9 0301 Oslo kommune Menn 2 år 2020 4280\n",
448 | "10 0301 Oslo kommune Menn 2 år 2021 3973\n",
449 | "11 0301 Oslo kommune Menn 2 år 2022 4008\n",
450 | "12 0301 Oslo kommune Kvinner 0 år 2019 4479\n",
451 | "13 0301 Oslo kommune Kvinner 0 år 2020 4454\n",
452 | "14 0301 Oslo kommune Kvinner 0 år 2021 4345"
453 | ]
454 | },
455 | "execution_count": 14,
456 | "metadata": {},
457 | "output_type": "execute_result"
458 | }
459 | ],
460 | "source": [
461 | "befolkning_ny = befolkning[['kommune', 'kjønn', 'alder', 'år', 'value']]\n",
462 | "befolkning_ny.head(15)"
463 | ]
464 | },
465 | {
466 | "cell_type": "markdown",
467 | "metadata": {},
468 | "source": [
469 | "### Kommunereformen\n",
470 | "\n",
471 | "Merk at spørringen i eksempelet over bruker rene kommunenummer, og ikke K-koder for sammenslåtte kommuner i tidsserier. \n",
472 | "\n",
473 | "En spørring som inkluderer tidsserier for kommuner som er berørt av kommunereformen, kan ikke benytte \"item\". K-koder må ha **agg:** og navnet på aggregeringen KommSummer istedet, \"filter\": \"agg:KommSummer\". Benytter også \"agg:FemAarigGruppering\" på alder.\n",
474 | "\n",
475 | "Eksempel på en spørring for Oslo og Moss. Tallene for Oslo blir de samme som om jeg hadde brukt 0301, mens tidsserien for K-3002 Moss inkluderer kommunene som inngår i nye Moss, tidligere 0104 Moss og 0136 Rygge."
476 | ]
477 | },
478 | {
479 | "cell_type": "code",
480 | "execution_count": 15,
481 | "metadata": {},
482 | "outputs": [],
483 | "source": [
484 | "json_q1 = {\"query\":\n",
485 | " [{\"code\":\"Region\",\"selection\":{\"filter\":\"agg:KommSummer\",\"values\":[\"K-0301\",\"K-3002\"]}},\n",
486 | " {\"code\":\"Kjonn\",\"selection\":{\"filter\":\"item\",\"values\":[\"1\",\"2\"]}},\n",
487 | " {\"code\":\"Alder\",\"selection\":{\"filter\":\"agg:FemAarigGruppering\", \"values\":[\"F00-04\", \"F05-09\"]}},\n",
488 | " {\"code\":\"ContentsCode\",\"selection\":{\"filter\":\"item\",\"values\":[\"Personer1\"]}},\n",
489 | " {\"code\":\"Tid\",\"selection\":{\"filter\":\"item\",\"values\":[\"2018\",\"2019\",\"2020\", \"2021\"]}}\n",
490 | " ],\n",
491 | " \"response\":{\"format\":\"json-stat2\"}}"
492 | ]
493 | },
494 | {
495 | "cell_type": "markdown",
496 | "metadata": {},
497 | "source": [
498 | "# samme som over men med ny spørring"
499 | ]
500 | },
501 | {
502 | "cell_type": "code",
503 | "execution_count": 16,
504 | "metadata": {},
505 | "outputs": [
506 | {
507 | "data": {
508 | "text/html": [
509 | "\n",
510 | "\n",
523 | "
\n",
524 | " \n",
525 | " \n",
526 | " | \n",
527 | " region | \n",
528 | " kjønn | \n",
529 | " alder | \n",
530 | " statistikkvariabel | \n",
531 | " år | \n",
532 | " value | \n",
533 | "
\n",
534 | " \n",
535 | " \n",
536 | " \n",
537 | " 0 | \n",
538 | " Moss | \n",
539 | " Menn | \n",
540 | " 0-4 år | \n",
541 | " Personer | \n",
542 | " 2018 | \n",
543 | " 1239 | \n",
544 | "
\n",
545 | " \n",
546 | " 1 | \n",
547 | " Moss | \n",
548 | " Menn | \n",
549 | " 0-4 år | \n",
550 | " Personer | \n",
551 | " 2019 | \n",
552 | " 1248 | \n",
553 | "
\n",
554 | " \n",
555 | " 2 | \n",
556 | " Moss | \n",
557 | " Menn | \n",
558 | " 0-4 år | \n",
559 | " Personer | \n",
560 | " 2020 | \n",
561 | " 1201 | \n",
562 | "
\n",
563 | " \n",
564 | " 3 | \n",
565 | " Moss | \n",
566 | " Menn | \n",
567 | " 0-4 år | \n",
568 | " Personer | \n",
569 | " 2021 | \n",
570 | " 1151 | \n",
571 | "
\n",
572 | " \n",
573 | " 4 | \n",
574 | " Moss | \n",
575 | " Menn | \n",
576 | " 5-9 år | \n",
577 | " Personer | \n",
578 | " 2018 | \n",
579 | " 1408 | \n",
580 | "
\n",
581 | " \n",
582 | "
\n",
583 | "
"
584 | ],
585 | "text/plain": [
586 | " region kjønn alder statistikkvariabel år value\n",
587 | "0 Moss Menn 0-4 år Personer 2018 1239\n",
588 | "1 Moss Menn 0-4 år Personer 2019 1248\n",
589 | "2 Moss Menn 0-4 år Personer 2020 1201\n",
590 | "3 Moss Menn 0-4 år Personer 2021 1151\n",
591 | "4 Moss Menn 5-9 år Personer 2018 1408"
592 | ]
593 | },
594 | "execution_count": 16,
595 | "metadata": {},
596 | "output_type": "execute_result"
597 | }
598 | ],
599 | "source": [
600 | "res1 = requests.post(POST_URL, json=json_q1)\n",
601 | "ds1 = pyjstat.Dataset.read(res1.text)\n",
602 | "befolkning1 = ds1.write('dataframe')\n",
603 | "befolkning1.head()"
604 | ]
605 | },
606 | {
607 | "cell_type": "code",
608 | "execution_count": 17,
609 | "metadata": {},
610 | "outputs": [
611 | {
612 | "data": {
613 | "text/html": [
614 | "\n",
615 | "\n",
628 | "
\n",
629 | " \n",
630 | " \n",
631 | " | \n",
632 | " Region | \n",
633 | " Kjonn | \n",
634 | " Alder | \n",
635 | " ContentsCode | \n",
636 | " Tid | \n",
637 | " value | \n",
638 | "
\n",
639 | " \n",
640 | " \n",
641 | " \n",
642 | " 0 | \n",
643 | " K-3002 | \n",
644 | " 1 | \n",
645 | " F00-04 | \n",
646 | " Personer1 | \n",
647 | " 2018 | \n",
648 | " 1239 | \n",
649 | "
\n",
650 | " \n",
651 | " 1 | \n",
652 | " K-3002 | \n",
653 | " 1 | \n",
654 | " F00-04 | \n",
655 | " Personer1 | \n",
656 | " 2019 | \n",
657 | " 1248 | \n",
658 | "
\n",
659 | " \n",
660 | " 2 | \n",
661 | " K-3002 | \n",
662 | " 1 | \n",
663 | " F00-04 | \n",
664 | " Personer1 | \n",
665 | " 2020 | \n",
666 | " 1201 | \n",
667 | "
\n",
668 | " \n",
669 | " 3 | \n",
670 | " K-3002 | \n",
671 | " 1 | \n",
672 | " F00-04 | \n",
673 | " Personer1 | \n",
674 | " 2021 | \n",
675 | " 1151 | \n",
676 | "
\n",
677 | " \n",
678 | " 4 | \n",
679 | " K-3002 | \n",
680 | " 1 | \n",
681 | " F05-09 | \n",
682 | " Personer1 | \n",
683 | " 2018 | \n",
684 | " 1408 | \n",
685 | "
\n",
686 | " \n",
687 | "
\n",
688 | "
"
689 | ],
690 | "text/plain": [
691 | " Region Kjonn Alder ContentsCode Tid value\n",
692 | "0 K-3002 1 F00-04 Personer1 2018 1239\n",
693 | "1 K-3002 1 F00-04 Personer1 2019 1248\n",
694 | "2 K-3002 1 F00-04 Personer1 2020 1201\n",
695 | "3 K-3002 1 F00-04 Personer1 2021 1151\n",
696 | "4 K-3002 1 F05-09 Personer1 2018 1408"
697 | ]
698 | },
699 | "execution_count": 17,
700 | "metadata": {},
701 | "output_type": "execute_result"
702 | }
703 | ],
704 | "source": [
705 | "befolkning_id1 = ds1.write('dataframe', naming='id')\n",
706 | "befolkning_id1.head()"
707 | ]
708 | },
709 | {
710 | "cell_type": "markdown",
711 | "metadata": {},
712 | "source": [
713 | "(...)"
714 | ]
715 | }
716 | ],
717 | "metadata": {
718 | "kernelspec": {
719 | "display_name": "Python 3 (ipykernel)",
720 | "language": "python",
721 | "name": "python3"
722 | },
723 | "language_info": {
724 | "codemirror_mode": {
725 | "name": "ipython",
726 | "version": 3
727 | },
728 | "file_extension": ".py",
729 | "mimetype": "text/x-python",
730 | "name": "python",
731 | "nbconvert_exporter": "python",
732 | "pygments_lexer": "ipython3",
733 | "version": "3.10.6"
734 | }
735 | },
736 | "nbformat": 4,
737 | "nbformat_minor": 4
738 | }
739 |
--------------------------------------------------------------------------------
/kostra-koder-nor.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "cell_id": "eb745bba-34e0-454d-af7f-f589b315ed9e"
7 | },
8 | "source": [
9 | "# Hente KOSTRA koder for arter og funksjoner via Klass API"
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {
15 | "cell_id": "f113a0af-03c8-487e-89b3-8d01619396b5",
16 | "tags": []
17 | },
18 | "source": [
19 | "### Importerer nødvendige biblioteker"
20 | ]
21 | },
22 | {
23 | "cell_type": "code",
24 | "execution_count": 1,
25 | "metadata": {
26 | "cell_id": "670507b8-9460-443e-8c4b-cfb5211583ca"
27 | },
28 | "outputs": [],
29 | "source": [
30 | "import pandas as pd\n",
31 | "import requests"
32 | ]
33 | },
34 | {
35 | "cell_type": "markdown",
36 | "metadata": {
37 | "cell_id": "825623b5-b0ca-4400-a26b-28d6e260ac5d",
38 | "tags": []
39 | },
40 | "source": [
41 | "### Hente data fra json url og se innholdet"
42 | ]
43 | },
44 | {
45 | "cell_type": "code",
46 | "execution_count": 2,
47 | "metadata": {
48 | "cell_id": "98045048-15fc-42c1-aa2c-8180733823a6"
49 | },
50 | "outputs": [],
51 | "source": [
52 | "url = 'https://data.ssb.no/api/klass/v1/versions/795.json' # regnskapsarter versjon 2016- \n",
53 | "\n",
54 | "# 'http://data.ssb.no/api/klass/v1/versions/1204.json' - regnskapsfunksjoner 2019-\n",
55 | "# 'http://data.ssb.no/api/klass/v1/versions/795.json' # regnskapsarter versjon 2016- "
56 | ]
57 | },
58 | {
59 | "cell_type": "code",
60 | "execution_count": 3,
61 | "metadata": {
62 | "cell_id": "fc52b65d-83df-4927-a41f-8f19ce365bd1"
63 | },
64 | "outputs": [],
65 | "source": [
66 | "r = requests.get(url = url)"
67 | ]
68 | },
69 | {
70 | "cell_type": "code",
71 | "execution_count": 4,
72 | "metadata": {
73 | "cell_id": "84c979b9-efb5-484d-b116-d967b78c30e1"
74 | },
75 | "outputs": [
76 | {
77 | "data": {
78 | "text/plain": [
79 | "requests.models.Response"
80 | ]
81 | },
82 | "execution_count": 4,
83 | "metadata": {},
84 | "output_type": "execute_result"
85 | }
86 | ],
87 | "source": [
88 | "type(r)"
89 | ]
90 | },
91 | {
92 | "cell_type": "markdown",
93 | "metadata": {
94 | "cell_id": "ebc9ca4e-ec82-41fb-b920-b2251271f939"
95 | },
96 | "source": [
97 | "### Det enkleste her er å bruke request for json() for å konvertere det til en dictionary"
98 | ]
99 | },
100 | {
101 | "cell_type": "code",
102 | "execution_count": 5,
103 | "metadata": {
104 | "cell_id": "71236af8-f076-493e-90e0-5fda1d08a57b"
105 | },
106 | "outputs": [],
107 | "source": [
108 | "# request av json og se evt. på innholdet\n",
109 | "dataset = r.json()\n",
110 | "# dataset "
111 | ]
112 | },
113 | {
114 | "cell_type": "code",
115 | "execution_count": 6,
116 | "metadata": {
117 | "cell_id": "67a4b7ad-6943-40f6-b61e-e14679be37c9"
118 | },
119 | "outputs": [
120 | {
121 | "data": {
122 | "text/plain": [
123 | "dict"
124 | ]
125 | },
126 | "execution_count": 6,
127 | "metadata": {},
128 | "output_type": "execute_result"
129 | }
130 | ],
131 | "source": [
132 | "# sjekke at uttrekket er endret fra json til en dictionary (dict)\n",
133 | "type(dataset)"
134 | ]
135 | },
136 | {
137 | "cell_type": "markdown",
138 | "metadata": {
139 | "cell_id": "f76feaa0-cfdd-4f69-b50c-a99cdb8e8c36"
140 | },
141 | "source": [
142 | "### Begrenser uttrekket til dimensjonen med classificationItems og henter noen få felt til dataframe df"
143 | ]
144 | },
145 | {
146 | "cell_type": "code",
147 | "execution_count": 7,
148 | "metadata": {
149 | "cell_id": "bfdf490b-cbcf-4cea-9e1f-95293305bb7b"
150 | },
151 | "outputs": [],
152 | "source": [
153 | "classItems = (dataset['classificationItems'])"
154 | ]
155 | },
156 | {
157 | "cell_type": "code",
158 | "execution_count": 8,
159 | "metadata": {},
160 | "outputs": [
161 | {
162 | "data": {
163 | "text/plain": [
164 | "{'code': '010',\n",
165 | " 'parentCode': '',\n",
166 | " 'level': '1',\n",
167 | " 'name': 'Fastlønn',\n",
168 | " 'shortName': None,\n",
169 | " 'notes': ''}"
170 | ]
171 | },
172 | "execution_count": 8,
173 | "metadata": {},
174 | "output_type": "execute_result"
175 | }
176 | ],
177 | "source": [
178 | "classItems[0]"
179 | ]
180 | },
181 | {
182 | "cell_type": "code",
183 | "execution_count": 9,
184 | "metadata": {
185 | "cell_id": "ba406fdf-a2de-49d6-9b68-8e1d0b50542b"
186 | },
187 | "outputs": [],
188 | "source": [
189 | "df = pd.DataFrame(classItems, columns =['code', 'name', 'notes'])"
190 | ]
191 | },
192 | {
193 | "cell_type": "code",
194 | "execution_count": 10,
195 | "metadata": {
196 | "cell_id": "e8a1de22-f36a-4d90-be3a-66bf8005989b"
197 | },
198 | "outputs": [
199 | {
200 | "data": {
201 | "text/html": [
202 | "\n",
203 | "\n",
216 | "
\n",
217 | " \n",
218 | " \n",
219 | " | \n",
220 | " code | \n",
221 | " name | \n",
222 | " notes | \n",
223 | "
\n",
224 | " \n",
225 | " \n",
226 | " \n",
227 | " 0 | \n",
228 | " 010 | \n",
229 | " Fastlønn | \n",
230 | " | \n",
231 | "
\n",
232 | " \n",
233 | " 1 | \n",
234 | " 020 | \n",
235 | " Lønn til vikarer | \n",
236 | " | \n",
237 | "
\n",
238 | " \n",
239 | " 2 | \n",
240 | " 030 | \n",
241 | " Lønn til ekstrahjelp | \n",
242 | " | \n",
243 | "
\n",
244 | " \n",
245 | " 3 | \n",
246 | " 040 | \n",
247 | " Overtidslønn | \n",
248 | " | \n",
249 | "
\n",
250 | " \n",
251 | " 4 | \n",
252 | " 050 | \n",
253 | " Annen lønn og trekkpliktige godtgjørelser | \n",
254 | " | \n",
255 | "
\n",
256 | " \n",
257 | "
\n",
258 | "
"
259 | ],
260 | "text/plain": [
261 | " code name notes\n",
262 | "0 010 Fastlønn \n",
263 | "1 020 Lønn til vikarer \n",
264 | "2 030 Lønn til ekstrahjelp \n",
265 | "3 040 Overtidslønn \n",
266 | "4 050 Annen lønn og trekkpliktige godtgjørelser "
267 | ]
268 | },
269 | "execution_count": 10,
270 | "metadata": {},
271 | "output_type": "execute_result"
272 | }
273 | ],
274 | "source": [
275 | "# se på de første 5 radene av dataframe ved å bruke .head()\n",
276 | "df.head()"
277 | ]
278 | },
279 | {
280 | "cell_type": "code",
281 | "execution_count": 11,
282 | "metadata": {
283 | "cell_id": "6adfb570-3cf6-4d14-91a1-e44ab1a937d2"
284 | },
285 | "outputs": [
286 | {
287 | "data": {
288 | "text/html": [
289 | "\n",
290 | "\n",
303 | "
\n",
304 | " \n",
305 | " \n",
306 | " | \n",
307 | " code | \n",
308 | " name | \n",
309 | " notes | \n",
310 | "
\n",
311 | " \n",
312 | " \n",
313 | " \n",
314 | " 280 | \n",
315 | " AGI30 | \n",
316 | " Salgsinntekter (i investering) | \n",
317 | " Begrepet viser (fylkes-)kommunens salgsinntekt... | \n",
318 | "
\n",
319 | " \n",
320 | " 281 | \n",
321 | " AGI31 | \n",
322 | " Refusjons- og overføringsinntekter inkl. rente... | \n",
323 | " Begrepet viser refusjons- og overføringsinntek... | \n",
324 | "
\n",
325 | " \n",
326 | " 282 | \n",
327 | " AGI32 | \n",
328 | " Sum finansieringstransaksjoner (C ) | \n",
329 | " Begrepet omfatter (fylkes-)kommunens finansier... | \n",
330 | "
\n",
331 | " \n",
332 | " 283 | \n",
333 | " AGI33 | \n",
334 | " Finansieringsbehov (D= B+C+A) | \n",
335 | " Begrepet beskriver (fylkes-)kommunens finansie... | \n",
336 | "
\n",
337 | " \n",
338 | " 284 | \n",
339 | " AGI34 | \n",
340 | " Sum finansiering (E ) | \n",
341 | " Begrepet viser hvordan (fylkes-)kommunen finan... | \n",
342 | "
\n",
343 | " \n",
344 | " 285 | \n",
345 | " AGI35 | \n",
346 | " Udekket/udisponert (F=D-E) | \n",
347 | " Begrepet omfatter (fylkes-)kommunens resultat ... | \n",
348 | "
\n",
349 | " \n",
350 | " 286 | \n",
351 | " AGI36 | \n",
352 | " Bruk av lån inkl. aksjer, andeler og utlån (ne... | \n",
353 | " Begrepet omfatter netto bruk av lån inkludert ... | \n",
354 | "
\n",
355 | " \n",
356 | " 287 | \n",
357 | " AGI37 | \n",
358 | " Kjøp av tjenester som erstatter (fylkes-)kommu... | \n",
359 | " Begrepet omfatter alle utgifter i investerings... | \n",
360 | "
\n",
361 | " \n",
362 | " 288 | \n",
363 | " AGID1 | \n",
364 | " Overskudd før lån og avsetninger | \n",
365 | " Begrepet omfatter brutto driftsresultat inkl. ... | \n",
366 | "
\n",
367 | " \n",
368 | " 289 | \n",
369 | " AGID2 | \n",
370 | " Bruk av fond/avsetning til fond, drift og inve... | \n",
371 | " Begrepet omfatter bruk av fond minus avsetning... | \n",
372 | "
\n",
373 | " \n",
374 | " 290 | \n",
375 | " AI620 | \n",
376 | " Annet salg av varer og tjenester, gebyrer o.l.... | \n",
377 | " | \n",
378 | "
\n",
379 | " \n",
380 | " 291 | \n",
381 | " AI660 | \n",
382 | " Salg av driftsmidler (i investeringsregnskapet | \n",
383 | " | \n",
384 | "
\n",
385 | " \n",
386 | " 292 | \n",
387 | " AI729 | \n",
388 | " Kompensasjon for merverdiavgift i investerings... | \n",
389 | " | \n",
390 | "
\n",
391 | " \n",
392 | " 293 | \n",
393 | " AI770 | \n",
394 | " Refusjon fra andre (private) (I) | \n",
395 | " | \n",
396 | "
\n",
397 | " \n",
398 | " 294 | \n",
399 | " AI905 | \n",
400 | " Utbytte og eieruttak | \n",
401 | " | \n",
402 | "
\n",
403 | " \n",
404 | "
\n",
405 | "
"
406 | ],
407 | "text/plain": [
408 | " code name \\\n",
409 | "280 AGI30 Salgsinntekter (i investering) \n",
410 | "281 AGI31 Refusjons- og overføringsinntekter inkl. rente... \n",
411 | "282 AGI32 Sum finansieringstransaksjoner (C ) \n",
412 | "283 AGI33 Finansieringsbehov (D= B+C+A) \n",
413 | "284 AGI34 Sum finansiering (E ) \n",
414 | "285 AGI35 Udekket/udisponert (F=D-E) \n",
415 | "286 AGI36 Bruk av lån inkl. aksjer, andeler og utlån (ne... \n",
416 | "287 AGI37 Kjøp av tjenester som erstatter (fylkes-)kommu... \n",
417 | "288 AGID1 Overskudd før lån og avsetninger \n",
418 | "289 AGID2 Bruk av fond/avsetning til fond, drift og inve... \n",
419 | "290 AI620 Annet salg av varer og tjenester, gebyrer o.l.... \n",
420 | "291 AI660 Salg av driftsmidler (i investeringsregnskapet \n",
421 | "292 AI729 Kompensasjon for merverdiavgift i investerings... \n",
422 | "293 AI770 Refusjon fra andre (private) (I) \n",
423 | "294 AI905 Utbytte og eieruttak \n",
424 | "\n",
425 | " notes \n",
426 | "280 Begrepet viser (fylkes-)kommunens salgsinntekt... \n",
427 | "281 Begrepet viser refusjons- og overføringsinntek... \n",
428 | "282 Begrepet omfatter (fylkes-)kommunens finansier... \n",
429 | "283 Begrepet beskriver (fylkes-)kommunens finansie... \n",
430 | "284 Begrepet viser hvordan (fylkes-)kommunen finan... \n",
431 | "285 Begrepet omfatter (fylkes-)kommunens resultat ... \n",
432 | "286 Begrepet omfatter netto bruk av lån inkludert ... \n",
433 | "287 Begrepet omfatter alle utgifter i investerings... \n",
434 | "288 Begrepet omfatter brutto driftsresultat inkl. ... \n",
435 | "289 Begrepet omfatter bruk av fond minus avsetning... \n",
436 | "290 \n",
437 | "291 \n",
438 | "292 \n",
439 | "293 \n",
440 | "294 "
441 | ]
442 | },
443 | "execution_count": 11,
444 | "metadata": {},
445 | "output_type": "execute_result"
446 | }
447 | ],
448 | "source": [
449 | "# se på de 15 siste radene av dataframe ved å bruke .tail()\n",
450 | "df.tail(15)"
451 | ]
452 | }
453 | ],
454 | "metadata": {
455 | "deepnote_execution_queue": [],
456 | "deepnote_notebook_id": "bcdd9619-5192-4443-834f-658888f84d77",
457 | "kernelspec": {
458 | "display_name": "Python 3 (ipykernel)",
459 | "language": "python",
460 | "name": "python3"
461 | },
462 | "language_info": {
463 | "codemirror_mode": {
464 | "name": "ipython",
465 | "version": 3
466 | },
467 | "file_extension": ".py",
468 | "mimetype": "text/x-python",
469 | "name": "python",
470 | "nbconvert_exporter": "python",
471 | "pygments_lexer": "ipython3",
472 | "version": "3.10.6"
473 | }
474 | },
475 | "nbformat": 4,
476 | "nbformat_minor": 4
477 | }
478 |
--------------------------------------------------------------------------------
/ssbapi_table_07459.json:
--------------------------------------------------------------------------------
1 | {"queryObj":{
2 | "query": [
3 | {
4 | "code": "Region",
5 | "selection": {
6 | "filter": "vs:Landet",
7 | "values": [
8 | "0"
9 | ]
10 | }
11 | },
12 | {
13 | "code": "Alder",
14 | "selection": {
15 | "filter": "vs:AlleAldre00B",
16 | "values": []
17 | }
18 | }
19 | ],
20 | "response": {
21 | "format": "json-stat2"
22 | }
23 | },"tableIdForQuery":"07459","postUrl":"https://data.ssb.no/api/v0/no/table/07459"}
--------------------------------------------------------------------------------
/text-code-en.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Query that returns both text(name) and code(ID) from JSON-stat\n",
8 | "## Example HS-codes in foreign trade"
9 | ]
10 | },
11 | {
12 | "cell_type": "markdown",
13 | "metadata": {},
14 | "source": [
15 | "### Import libraries\n",
16 | "Use [pyjstat](https://pypi.org/project/pyjstat/) library for JSON-stat and pandas. Pandas is loaded as part of av pyjstat"
17 | ]
18 | },
19 | {
20 | "cell_type": "code",
21 | "execution_count": 1,
22 | "metadata": {},
23 | "outputs": [],
24 | "source": [
25 | "from pyjstat import pyjstat\n",
26 | "import requests"
27 | ]
28 | },
29 | {
30 | "cell_type": "markdown",
31 | "metadata": {},
32 | "source": [
33 | "### URL with the table's metadata, where we post the query"
34 | ]
35 | },
36 | {
37 | "cell_type": "code",
38 | "execution_count": 2,
39 | "metadata": {},
40 | "outputs": [],
41 | "source": [
42 | "tabid = \"08799\" # \n",
43 | "lang = \"en\" # language code can also be \"no\"\n",
44 | "POST_URL = \"https://data.ssb.no/api/v0/\" + lang + \"/table/\" + tabid # 'https://data.ssb.no/api/v0/en/table/08799'"
45 | ]
46 | },
47 | {
48 | "cell_type": "markdown",
49 | "metadata": {},
50 | "source": [
51 | "### Query, can be taken from the console: \n",
52 | "Import / export all commodity codes (HS) to US latest month, ca. 65.000 cells. Max limit for one query in PxWebApi is 800.000 cells, incl. empty cells."
53 | ]
54 | },
55 | {
56 | "cell_type": "code",
57 | "execution_count": 3,
58 | "metadata": {},
59 | "outputs": [],
60 | "source": [
61 | "json_q = {\n",
62 | " \"query\": [\n",
63 | " {\n",
64 | " \"code\": \"Varekoder\",\n",
65 | " \"selection\": {\n",
66 | " \"filter\": \"all\",\n",
67 | " \"values\": [\n",
68 | " \"*\"\n",
69 | " ]\n",
70 | " }\n",
71 | " },\n",
72 | " {\n",
73 | " \"code\": \"ImpEks\",\n",
74 | " \"selection\": {\n",
75 | " \"filter\": \"item\",\n",
76 | " \"values\": [\n",
77 | " \"1\",\n",
78 | " \"2\"\n",
79 | " ]\n",
80 | " }\n",
81 | " },\n",
82 | " {\n",
83 | " \"code\": \"Land\",\n",
84 | " \"selection\": {\n",
85 | " \"filter\": \"item\",\n",
86 | " \"values\": [\n",
87 | " \"US\"\n",
88 | " ]\n",
89 | " }\n",
90 | " },\n",
91 | " {\n",
92 | " \"code\": \"ContentsCode\",\n",
93 | " \"selection\": {\n",
94 | " \"filter\": \"item\",\n",
95 | " \"values\": [\n",
96 | " \"Mengde1\",\n",
97 | " \"Verdi\",\n",
98 | " \"Mengde2\"\n",
99 | " ]\n",
100 | " }\n",
101 | " },\n",
102 | " {\n",
103 | " \"code\": \"Tid\",\n",
104 | " \"selection\": {\n",
105 | " \"filter\": \"top\",\n",
106 | " \"values\": [\n",
107 | " \"1\"\n",
108 | " ]\n",
109 | " }\n",
110 | " }\n",
111 | " ],\n",
112 | " \"response\": {\n",
113 | " \"format\": \"json-stat2\"\n",
114 | " }\n",
115 | "}\n"
116 | ]
117 | },
118 | {
119 | "cell_type": "markdown",
120 | "metadata": {},
121 | "source": [
122 | "### Post query"
123 | ]
124 | },
125 | {
126 | "cell_type": "code",
127 | "execution_count": 4,
128 | "metadata": {},
129 | "outputs": [],
130 | "source": [
131 | "res = requests.post(POST_URL, json=json_q)"
132 | ]
133 | },
134 | {
135 | "cell_type": "markdown",
136 | "metadata": {},
137 | "source": [
138 | "### Read JSON-stat result using the library pyjstat\n",
139 | "Saved it as dataset ds."
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": 5,
145 | "metadata": {},
146 | "outputs": [],
147 | "source": [
148 | "ds = pyjstat.Dataset.read(res.text)"
149 | ]
150 | },
151 | {
152 | "cell_type": "code",
153 | "execution_count": 6,
154 | "metadata": {},
155 | "outputs": [
156 | {
157 | "data": {
158 | "text/plain": [
159 | "pyjstat.pyjstat.Dataset"
160 | ]
161 | },
162 | "execution_count": 6,
163 | "metadata": {},
164 | "output_type": "execute_result"
165 | }
166 | ],
167 | "source": [
168 | "type(ds)"
169 | ]
170 | },
171 | {
172 | "cell_type": "markdown",
173 | "metadata": {},
174 | "source": [
175 | "Check dataset ds, large"
176 | ]
177 | },
178 | {
179 | "cell_type": "code",
180 | "execution_count": 7,
181 | "metadata": {},
182 | "outputs": [],
183 | "source": [
184 | "# ds"
185 | ]
186 | },
187 | {
188 | "cell_type": "markdown",
189 | "metadata": {},
190 | "source": [
191 | "### Get some main metadata from the JSON-stat dataset"
192 | ]
193 | },
194 | {
195 | "cell_type": "code",
196 | "execution_count": 8,
197 | "metadata": {},
198 | "outputs": [
199 | {
200 | "name": "stdout",
201 | "output_type": "stream",
202 | "text": [
203 | "08799: External trade in goods, by commodity number, imports/exports, country, contents and month\n"
204 | ]
205 | }
206 | ],
207 | "source": [
208 | "title = ds['label']\n",
209 | "print(title)"
210 | ]
211 | },
212 | {
213 | "cell_type": "markdown",
214 | "metadata": {},
215 | "source": [
216 | "Last update as GMT"
217 | ]
218 | },
219 | {
220 | "cell_type": "code",
221 | "execution_count": 9,
222 | "metadata": {},
223 | "outputs": [
224 | {
225 | "name": "stdout",
226 | "output_type": "stream",
227 | "text": [
228 | "2025-05-15T06:00:00Z\n"
229 | ]
230 | }
231 | ],
232 | "source": [
233 | "last_update = ds['updated']\n",
234 | "print(last_update)"
235 | ]
236 | },
237 | {
238 | "cell_type": "markdown",
239 | "metadata": {},
240 | "source": [
241 | "Get source"
242 | ]
243 | },
244 | {
245 | "cell_type": "code",
246 | "execution_count": 10,
247 | "metadata": {},
248 | "outputs": [
249 | {
250 | "name": "stdout",
251 | "output_type": "stream",
252 | "text": [
253 | "Statistics Norway\n"
254 | ]
255 | }
256 | ],
257 | "source": [
258 | "source = ds['source']\n",
259 | "print(source)"
260 | ]
261 | },
262 | {
263 | "cell_type": "markdown",
264 | "metadata": {},
265 | "source": [
266 | "New metadata in JSON-stat2, May 2025"
267 | ]
268 | },
269 | {
270 | "cell_type": "code",
271 | "execution_count": 11,
272 | "metadata": {},
273 | "outputs": [
274 | {
275 | "name": "stdout",
276 | "output_type": "stream",
277 | "text": [
278 | "['ContentsCode', 'Tid']\n"
279 | ]
280 | }
281 | ],
282 | "source": [
283 | "heading = ds['extension']['px']['heading']\n",
284 | "print(heading)"
285 | ]
286 | },
287 | {
288 | "cell_type": "code",
289 | "execution_count": 12,
290 | "metadata": {},
291 | "outputs": [
292 | {
293 | "name": "stdout",
294 | "output_type": "stream",
295 | "text": [
296 | "['Varekoder', 'ImpEks', 'Land']\n"
297 | ]
298 | }
299 | ],
300 | "source": [
301 | "stub = ds['extension']['px']['stub']\n",
302 | "print(stub)"
303 | ]
304 | },
305 | {
306 | "cell_type": "markdown",
307 | "metadata": {},
308 | "source": [
309 | "Footnotes"
310 | ]
311 | },
312 | {
313 | "cell_type": "code",
314 | "execution_count": 13,
315 | "metadata": {},
316 | "outputs": [
317 | {
318 | "name": "stdout",
319 | "output_type": "stream",
320 | "text": [
321 | "[\"Information about the validity and annual changes in the commodity numbers can be found at Commodity List External Trade.\\n
\\n\\nFrom 2006 on the following countries had their belonging to continent changed - Cyprus from Asia to Europe, and Armenia, Georgia, Kyrgyzstan, Kazakhstan, Tajikistan, Turkmenistan and Uzbekistan from Europe to Asia. However, in the selections of countries in the pull-down menu for European/Asian countries it is the present classification that will be shown for the whole time period (Cypros belonging to Europe and the other countries to Asia).\\n\\n
\\nStatistics Norway do not publish figures for the trade region previously Comecon after 2011. Former Comecon (only European Comecon countries in the Norwegian trade statistics): Armenia, Azerbaijan, Bulgaria, Estonia, Georgia, Belarus, Kazakhstan, Kyrgyzstan, Latvia, Lithuania, Moldova, Poland, Romania, Russia, Slovakia, Czech Republic, Tajikistan, Turkmenistan, Ukraine, Hungary, Uzbekistan.\", \"For more information, see About the statistics.\", \"Import figures on commodity number 2403.9990 and 2403.9991 in the period 2005-2013 is wrong, please see Revised import figures on snuff.\", 'When publishing statistics for a new month of measurement, figures for the previous months in the same year are also revised. Furthermore, the figures for all months of the year are revised twice more: First time in May the following year (year t + 1), before final figures are published in May one year later (year t + 2).', '12 February 2022 all the commodity codes were changed. The 8-digit commodity codes now have an addition that shows the year when each code was first used.', 'The data material in the External trade in goods statistics is very extensive, and at the most detailed level the quality can vary. The quality will be affected by errors in reported data. Users of the statistics must take this into account when using detailed figures. Commodity numbers with little trade, measured in value, will be more prone to errors than commodity numbers with a lot of trade. Furthermore, the statistical variables weight and quantity have poorer quality than value. Goods with restrictions and trade to particular countries are, however, monitored more closely.
\\n\\nStatistics Norway is required to report detailed figures to Eurostat, and therefore finds it appropriate that the figures are also published to Norwegian users, despite the varying quality.\\n', 'The figures for item numbers 99.60.1000 and 99.60.2000 are not complete and will be updated upon publication on 16 June 2025.']\n"
322 | ]
323 | }
324 | ],
325 | "source": [
326 | "if 'note' in ds:\n",
327 | "\tnote = ds['note']\n",
328 | "\tprint(note)"
329 | ]
330 | },
331 | {
332 | "cell_type": "markdown",
333 | "metadata": {},
334 | "source": [
335 | "_Role_ gives some shortcuts"
336 | ]
337 | },
338 | {
339 | "cell_type": "code",
340 | "execution_count": 14,
341 | "metadata": {},
342 | "outputs": [
343 | {
344 | "name": "stdout",
345 | "output_type": "stream",
346 | "text": [
347 | "OrderedDict({'time': ['Tid'], 'geo': ['Land'], 'metric': ['ContentsCode']})\n"
348 | ]
349 | }
350 | ],
351 | "source": [
352 | "ds_roles = ds['role']\n",
353 | "print(ds_roles)"
354 | ]
355 | },
356 | {
357 | "cell_type": "markdown",
358 | "metadata": {},
359 | "source": [
360 | "### Make dataframes\n",
361 | "We have to make two dataframes, one with text and one with id. Pyjstat returns 'label' by default."
362 | ]
363 | },
364 | {
365 | "cell_type": "code",
366 | "execution_count": 15,
367 | "metadata": {},
368 | "outputs": [],
369 | "source": [
370 | "hstrade = ds.write('dataframe')\n",
371 | "hstrade_id = ds.write('dataframe', naming='id')"
372 | ]
373 | },
374 | {
375 | "cell_type": "code",
376 | "execution_count": 16,
377 | "metadata": {},
378 | "outputs": [
379 | {
380 | "data": {
381 | "text/html": [
382 | "\n",
383 | "\n",
396 | "
\n",
397 | " \n",
398 | " \n",
399 | " | \n",
400 | " commodity number | \n",
401 | " imports/exports | \n",
402 | " country | \n",
403 | " contents | \n",
404 | " month | \n",
405 | " value | \n",
406 | "
\n",
407 | " \n",
408 | " \n",
409 | " \n",
410 | " 0 | \n",
411 | " Imports of unspecified goods, with duty (1988-... | \n",
412 | " Imports | \n",
413 | " United States of America | \n",
414 | " Quantity 1 (Q1) | \n",
415 | " 2025M04 | \n",
416 | " 0 | \n",
417 | "
\n",
418 | " \n",
419 | " 1 | \n",
420 | " Imports of unspecified goods, with duty (1988-... | \n",
421 | " Imports | \n",
422 | " United States of America | \n",
423 | " Value (NOK) | \n",
424 | " 2025M04 | \n",
425 | " 0 | \n",
426 | "
\n",
427 | " \n",
428 | " 2 | \n",
429 | " Imports of unspecified goods, with duty (1988-... | \n",
430 | " Imports | \n",
431 | " United States of America | \n",
432 | " Quantity 2 (Q2) | \n",
433 | " 2025M04 | \n",
434 | " 0 | \n",
435 | "
\n",
436 | " \n",
437 | " 3 | \n",
438 | " Imports of unspecified goods, with duty (1988-... | \n",
439 | " Exports | \n",
440 | " United States of America | \n",
441 | " Quantity 1 (Q1) | \n",
442 | " 2025M04 | \n",
443 | " 0 | \n",
444 | "
\n",
445 | " \n",
446 | " 4 | \n",
447 | " Imports of unspecified goods, with duty (1988-... | \n",
448 | " Exports | \n",
449 | " United States of America | \n",
450 | " Value (NOK) | \n",
451 | " 2025M04 | \n",
452 | " 0 | \n",
453 | "
\n",
454 | " \n",
455 | "
\n",
456 | "
"
457 | ],
458 | "text/plain": [
459 | " commodity number imports/exports \\\n",
460 | "0 Imports of unspecified goods, with duty (1988-... Imports \n",
461 | "1 Imports of unspecified goods, with duty (1988-... Imports \n",
462 | "2 Imports of unspecified goods, with duty (1988-... Imports \n",
463 | "3 Imports of unspecified goods, with duty (1988-... Exports \n",
464 | "4 Imports of unspecified goods, with duty (1988-... Exports \n",
465 | "\n",
466 | " country contents month value \n",
467 | "0 United States of America Quantity 1 (Q1) 2025M04 0 \n",
468 | "1 United States of America Value (NOK) 2025M04 0 \n",
469 | "2 United States of America Quantity 2 (Q2) 2025M04 0 \n",
470 | "3 United States of America Quantity 1 (Q1) 2025M04 0 \n",
471 | "4 United States of America Value (NOK) 2025M04 0 "
472 | ]
473 | },
474 | "execution_count": 16,
475 | "metadata": {},
476 | "output_type": "execute_result"
477 | }
478 | ],
479 | "source": [
480 | "hstrade.head()"
481 | ]
482 | },
483 | {
484 | "cell_type": "code",
485 | "execution_count": 17,
486 | "metadata": {},
487 | "outputs": [
488 | {
489 | "data": {
490 | "text/html": [
491 | "\n",
492 | "\n",
505 | "
\n",
506 | " \n",
507 | " \n",
508 | " | \n",
509 | " Varekoder | \n",
510 | " ImpEks | \n",
511 | " Land | \n",
512 | " ContentsCode | \n",
513 | " Tid | \n",
514 | " value | \n",
515 | "
\n",
516 | " \n",
517 | " \n",
518 | " \n",
519 | " 0 | \n",
520 | " 00000011_1988 | \n",
521 | " 1 | \n",
522 | " US | \n",
523 | " Mengde1 | \n",
524 | " 2025M04 | \n",
525 | " 0 | \n",
526 | "
\n",
527 | " \n",
528 | " 1 | \n",
529 | " 00000011_1988 | \n",
530 | " 1 | \n",
531 | " US | \n",
532 | " Verdi | \n",
533 | " 2025M04 | \n",
534 | " 0 | \n",
535 | "
\n",
536 | " \n",
537 | " 2 | \n",
538 | " 00000011_1988 | \n",
539 | " 1 | \n",
540 | " US | \n",
541 | " Mengde2 | \n",
542 | " 2025M04 | \n",
543 | " 0 | \n",
544 | "
\n",
545 | " \n",
546 | " 3 | \n",
547 | " 00000011_1988 | \n",
548 | " 2 | \n",
549 | " US | \n",
550 | " Mengde1 | \n",
551 | " 2025M04 | \n",
552 | " 0 | \n",
553 | "
\n",
554 | " \n",
555 | " 4 | \n",
556 | " 00000011_1988 | \n",
557 | " 2 | \n",
558 | " US | \n",
559 | " Verdi | \n",
560 | " 2025M04 | \n",
561 | " 0 | \n",
562 | "
\n",
563 | " \n",
564 | "
\n",
565 | "
"
566 | ],
567 | "text/plain": [
568 | " Varekoder ImpEks Land ContentsCode Tid value\n",
569 | "0 00000011_1988 1 US Mengde1 2025M04 0\n",
570 | "1 00000011_1988 1 US Verdi 2025M04 0\n",
571 | "2 00000011_1988 1 US Mengde2 2025M04 0\n",
572 | "3 00000011_1988 2 US Mengde1 2025M04 0\n",
573 | "4 00000011_1988 2 US Verdi 2025M04 0"
574 | ]
575 | },
576 | "execution_count": 17,
577 | "metadata": {},
578 | "output_type": "execute_result"
579 | }
580 | ],
581 | "source": [
582 | "hstrade_id.head()"
583 | ]
584 | },
585 | {
586 | "cell_type": "markdown",
587 | "metadata": {},
588 | "source": [
589 | "### Make new column with ID and label concatinated"
590 | ]
591 | },
592 | {
593 | "cell_type": "code",
594 | "execution_count": 18,
595 | "metadata": {},
596 | "outputs": [],
597 | "source": [
598 | "hstrade['hstrade_combi'] = hstrade_id['Varekoder'] + ' ' + hstrade['commodity number']"
599 | ]
600 | },
601 | {
602 | "cell_type": "code",
603 | "execution_count": 19,
604 | "metadata": {},
605 | "outputs": [
606 | {
607 | "data": {
608 | "text/plain": [
609 | "Index(['commodity number', 'imports/exports', 'country', 'contents', 'month',\n",
610 | " 'value', 'hstrade_combi'],\n",
611 | " dtype='object')"
612 | ]
613 | },
614 | "execution_count": 19,
615 | "metadata": {},
616 | "output_type": "execute_result"
617 | }
618 | ],
619 | "source": [
620 | "hstrade.columns"
621 | ]
622 | },
623 | {
624 | "cell_type": "markdown",
625 | "metadata": {},
626 | "source": [
627 | "### Make new dataframe with only the colums we want in new order. Mark double [[ ]]"
628 | ]
629 | },
630 | {
631 | "cell_type": "code",
632 | "execution_count": 20,
633 | "metadata": {},
634 | "outputs": [],
635 | "source": [
636 | "hstrade_new = hstrade[['hstrade_combi', 'imports/exports', 'country', 'contents', 'month',\n",
637 | " 'value']]"
638 | ]
639 | },
640 | {
641 | "cell_type": "code",
642 | "execution_count": 21,
643 | "metadata": {},
644 | "outputs": [
645 | {
646 | "data": {
647 | "text/html": [
648 | "\n",
649 | "\n",
662 | "
\n",
663 | " \n",
664 | " \n",
665 | " | \n",
666 | " hstrade_combi | \n",
667 | " imports/exports | \n",
668 | " country | \n",
669 | " contents | \n",
670 | " month | \n",
671 | " value | \n",
672 | "
\n",
673 | " \n",
674 | " \n",
675 | " \n",
676 | " 80413 | \n",
677 | " 99999999_1988 Total, all commodities not for p... | \n",
678 | " Imports | \n",
679 | " United States of America | \n",
680 | " Value (NOK) | \n",
681 | " 2025M04 | \n",
682 | " 174702436 | \n",
683 | "
\n",
684 | " \n",
685 | " 80414 | \n",
686 | " 99999999_1988 Total, all commodities not for p... | \n",
687 | " Imports | \n",
688 | " United States of America | \n",
689 | " Quantity 2 (Q2) | \n",
690 | " 2025M04 | \n",
691 | " 0 | \n",
692 | "
\n",
693 | " \n",
694 | " 80415 | \n",
695 | " 99999999_1988 Total, all commodities not for p... | \n",
696 | " Exports | \n",
697 | " United States of America | \n",
698 | " Quantity 1 (Q1) | \n",
699 | " 2025M04 | \n",
700 | " 90970447 | \n",
701 | "
\n",
702 | " \n",
703 | " 80416 | \n",
704 | " 99999999_1988 Total, all commodities not for p... | \n",
705 | " Exports | \n",
706 | " United States of America | \n",
707 | " Value (NOK) | \n",
708 | " 2025M04 | \n",
709 | " 572834089 | \n",
710 | "
\n",
711 | " \n",
712 | " 80417 | \n",
713 | " 99999999_1988 Total, all commodities not for p... | \n",
714 | " Exports | \n",
715 | " United States of America | \n",
716 | " Quantity 2 (Q2) | \n",
717 | " 2025M04 | \n",
718 | " 0 | \n",
719 | "
\n",
720 | " \n",
721 | "
\n",
722 | "
"
723 | ],
724 | "text/plain": [
725 | " hstrade_combi imports/exports \\\n",
726 | "80413 99999999_1988 Total, all commodities not for p... Imports \n",
727 | "80414 99999999_1988 Total, all commodities not for p... Imports \n",
728 | "80415 99999999_1988 Total, all commodities not for p... Exports \n",
729 | "80416 99999999_1988 Total, all commodities not for p... Exports \n",
730 | "80417 99999999_1988 Total, all commodities not for p... Exports \n",
731 | "\n",
732 | " country contents month value \n",
733 | "80413 United States of America Value (NOK) 2025M04 174702436 \n",
734 | "80414 United States of America Quantity 2 (Q2) 2025M04 0 \n",
735 | "80415 United States of America Quantity 1 (Q1) 2025M04 90970447 \n",
736 | "80416 United States of America Value (NOK) 2025M04 572834089 \n",
737 | "80417 United States of America Quantity 2 (Q2) 2025M04 0 "
738 | ]
739 | },
740 | "execution_count": 21,
741 | "metadata": {},
742 | "output_type": "execute_result"
743 | }
744 | ],
745 | "source": [
746 | "hstrade_new.tail()"
747 | ]
748 | },
749 | {
750 | "cell_type": "code",
751 | "execution_count": null,
752 | "metadata": {},
753 | "outputs": [],
754 | "source": []
755 | }
756 | ],
757 | "metadata": {
758 | "kernelspec": {
759 | "display_name": "Python 3 (ipykernel)",
760 | "language": "python",
761 | "name": "python3"
762 | },
763 | "language_info": {
764 | "codemirror_mode": {
765 | "name": "ipython",
766 | "version": 3
767 | },
768 | "file_extension": ".py",
769 | "mimetype": "text/x-python",
770 | "name": "python",
771 | "nbconvert_exporter": "python",
772 | "pygments_lexer": "ipython3",
773 | "version": "3.12.3"
774 | }
775 | },
776 | "nbformat": 4,
777 | "nbformat_minor": 4
778 | }
779 |
--------------------------------------------------------------------------------
/text-code-nor.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Spørring som både gir tekst(navn) og kode(ID) fra JSON-stat\n",
8 | "### eksempel HS-koder utenrikshandel"
9 | ]
10 | },
11 | {
12 | "cell_type": "markdown",
13 | "metadata": {},
14 | "source": [
15 | "### Importerer biblioteker\n",
16 | "Bruker [pyjstat](https://pypi.org/project/pyjstat/) og pandas. Pandas lastes som del av pyjstat"
17 | ]
18 | },
19 | {
20 | "cell_type": "code",
21 | "execution_count": 1,
22 | "metadata": {},
23 | "outputs": [],
24 | "source": [
25 | "from pyjstat import pyjstat\n",
26 | "import requests"
27 | ]
28 | },
29 | {
30 | "cell_type": "markdown",
31 | "metadata": {},
32 | "source": [
33 | "### URL med tabellens metadata, som vi skal poste spørringen mot"
34 | ]
35 | },
36 | {
37 | "cell_type": "code",
38 | "execution_count": 2,
39 | "metadata": {},
40 | "outputs": [],
41 | "source": [
42 | "tabid = \"08799\" # kam endres til årstabellen 08801, uten andre endringer\n",
43 | "lang = \"no\" # language code can also be \"en\"\n",
44 | "POST_URL = \"https://data.ssb.no/api/v0/\" + lang + \"/table/\" + tabid # 'https://data.ssb.no/api/v0/no/table/08799'"
45 | ]
46 | },
47 | {
48 | "cell_type": "markdown",
49 | "metadata": {},
50 | "source": [
51 | "Spørring, kan tas fra konsoll: Import / eksport alle varekoder til US siste måned, ca. 65000 celler. Max grense for en spørring i PxWebApi er 800.000 celler, inkl tomme celler"
52 | ]
53 | },
54 | {
55 | "cell_type": "code",
56 | "execution_count": 3,
57 | "metadata": {},
58 | "outputs": [],
59 | "source": [
60 | "json_q = {\n",
61 | " \"query\": [\n",
62 | " {\n",
63 | " \"code\": \"Varekoder\",\n",
64 | " \"selection\": {\n",
65 | " \"filter\": \"all\",\n",
66 | " \"values\": [\n",
67 | " \"*\"\n",
68 | " ]\n",
69 | " }\n",
70 | " },\n",
71 | " {\n",
72 | " \"code\": \"ImpEks\",\n",
73 | " \"selection\": {\n",
74 | " \"filter\": \"item\",\n",
75 | " \"values\": [\n",
76 | " \"1\",\n",
77 | " \"2\"\n",
78 | " ]\n",
79 | " }\n",
80 | " },\n",
81 | " {\n",
82 | " \"code\": \"Land\",\n",
83 | " \"selection\": {\n",
84 | " \"filter\": \"item\",\n",
85 | " \"values\": [\n",
86 | " \"US\"\n",
87 | " ]\n",
88 | " }\n",
89 | " },\n",
90 | " {\n",
91 | " \"code\": \"ContentsCode\",\n",
92 | " \"selection\": {\n",
93 | " \"filter\": \"item\",\n",
94 | " \"values\": [\n",
95 | " \"Mengde1\",\n",
96 | " \"Verdi\",\n",
97 | " \"Mengde2\"\n",
98 | " ]\n",
99 | " }\n",
100 | " },\n",
101 | " {\n",
102 | " \"code\": \"Tid\",\n",
103 | " \"selection\": {\n",
104 | " \"filter\": \"top\",\n",
105 | " \"values\": [\n",
106 | " \"1\"\n",
107 | " ]\n",
108 | " }\n",
109 | " }\n",
110 | " ],\n",
111 | " \"response\": {\n",
112 | " \"format\": \"json-stat2\"\n",
113 | " }\n",
114 | "}\n"
115 | ]
116 | },
117 | {
118 | "cell_type": "markdown",
119 | "metadata": {},
120 | "source": [
121 | "### Poster spørringen"
122 | ]
123 | },
124 | {
125 | "cell_type": "code",
126 | "execution_count": 4,
127 | "metadata": {},
128 | "outputs": [],
129 | "source": [
130 | "res = requests.post(POST_URL, json=json_q)"
131 | ]
132 | },
133 | {
134 | "cell_type": "markdown",
135 | "metadata": {},
136 | "source": [
137 | "### Leser JSON-stat resultatet med biblioteket pyjstat\n",
138 | "Lagrer det som datasett ds."
139 | ]
140 | },
141 | {
142 | "cell_type": "code",
143 | "execution_count": 5,
144 | "metadata": {},
145 | "outputs": [],
146 | "source": [
147 | "ds = pyjstat.Dataset.read(res.text)"
148 | ]
149 | },
150 | {
151 | "cell_type": "code",
152 | "execution_count": 6,
153 | "metadata": {},
154 | "outputs": [
155 | {
156 | "data": {
157 | "text/plain": [
158 | "pyjstat.pyjstat.Dataset"
159 | ]
160 | },
161 | "execution_count": 6,
162 | "metadata": {},
163 | "output_type": "execute_result"
164 | }
165 | ],
166 | "source": [
167 | "type(ds)"
168 | ]
169 | },
170 | {
171 | "cell_type": "markdown",
172 | "metadata": {},
173 | "source": [
174 | "Se datasettet ds, ta evt. vekk kommentaren"
175 | ]
176 | },
177 | {
178 | "cell_type": "code",
179 | "execution_count": 8,
180 | "metadata": {},
181 | "outputs": [],
182 | "source": [
183 | "# ds"
184 | ]
185 | },
186 | {
187 | "cell_type": "markdown",
188 | "metadata": {},
189 | "source": [
190 | "### Henter noen overordnete metadata fra JSON-stat datasettet. \n",
191 | "#### Nytt: Flere metadata i 2024"
192 | ]
193 | },
194 | {
195 | "cell_type": "code",
196 | "execution_count": 9,
197 | "metadata": {},
198 | "outputs": [
199 | {
200 | "name": "stdout",
201 | "output_type": "stream",
202 | "text": [
203 | "08799: Utenrikshandel med varer, etter varenummer, import/eksport, land, statistikkvariabel og måned\n"
204 | ]
205 | }
206 | ],
207 | "source": [
208 | "tittel = ds['label']\n",
209 | "print(tittel)"
210 | ]
211 | },
212 | {
213 | "cell_type": "markdown",
214 | "metadata": {},
215 | "source": [
216 | "Sist Oppdatert som GMT"
217 | ]
218 | },
219 | {
220 | "cell_type": "code",
221 | "execution_count": 10,
222 | "metadata": {},
223 | "outputs": [
224 | {
225 | "name": "stdout",
226 | "output_type": "stream",
227 | "text": [
228 | "2025-05-15T06:00:00Z\n"
229 | ]
230 | }
231 | ],
232 | "source": [
233 | "last_update = ds['updated']\n",
234 | "print(last_update)"
235 | ]
236 | },
237 | {
238 | "cell_type": "markdown",
239 | "metadata": {},
240 | "source": [
241 | "Henter kilde"
242 | ]
243 | },
244 | {
245 | "cell_type": "code",
246 | "execution_count": 11,
247 | "metadata": {},
248 | "outputs": [
249 | {
250 | "name": "stdout",
251 | "output_type": "stream",
252 | "text": [
253 | "Statistisk sentralbyrå\n"
254 | ]
255 | }
256 | ],
257 | "source": [
258 | "source = ds['source']\n",
259 | "print(source)"
260 | ]
261 | },
262 | {
263 | "cell_type": "markdown",
264 | "metadata": {},
265 | "source": [
266 | "Roles gir noen snarveier til IDene på faste dimensjoner i datasettet"
267 | ]
268 | },
269 | {
270 | "cell_type": "code",
271 | "execution_count": 12,
272 | "metadata": {},
273 | "outputs": [
274 | {
275 | "name": "stdout",
276 | "output_type": "stream",
277 | "text": [
278 | "OrderedDict({'time': ['Tid'], 'geo': ['Land'], 'metric': ['ContentsCode']})\n"
279 | ]
280 | }
281 | ],
282 | "source": [
283 | "ds_roles = ds['role']\n",
284 | "print(ds_roles)"
285 | ]
286 | },
287 | {
288 | "cell_type": "markdown",
289 | "metadata": {},
290 | "source": [
291 | "Nye metadata i JSON-stat2 er tableid (tabellnummer), kort tabelltittel og noter"
292 | ]
293 | },
294 | {
295 | "cell_type": "code",
296 | "execution_count": 13,
297 | "metadata": {},
298 | "outputs": [
299 | {
300 | "name": "stdout",
301 | "output_type": "stream",
302 | "text": [
303 | "08799\n"
304 | ]
305 | }
306 | ],
307 | "source": [
308 | "table_id = ds['extension']['px']['tableid']\n",
309 | "print(table_id)"
310 | ]
311 | },
312 | {
313 | "cell_type": "code",
314 | "execution_count": 14,
315 | "metadata": {},
316 | "outputs": [
317 | {
318 | "name": "stdout",
319 | "output_type": "stream",
320 | "text": [
321 | "08799: Utenrikshandel med varer,\n"
322 | ]
323 | }
324 | ],
325 | "source": [
326 | "kort_tit = ds['extension']['px']['contents']\n",
327 | "print(kort_tit)"
328 | ]
329 | },
330 | {
331 | "cell_type": "markdown",
332 | "metadata": {},
333 | "source": [
334 | "Nye metadata i JSON-stat2. Primært med tanke på Beta2?"
335 | ]
336 | },
337 | {
338 | "cell_type": "code",
339 | "execution_count": 16,
340 | "metadata": {},
341 | "outputs": [
342 | {
343 | "name": "stdout",
344 | "output_type": "stream",
345 | "text": [
346 | "['ContentsCode', 'Tid']\n"
347 | ]
348 | }
349 | ],
350 | "source": [
351 | "heading = ds['extension']['px']['heading']\n",
352 | "print(heading)"
353 | ]
354 | },
355 | {
356 | "cell_type": "code",
357 | "execution_count": 17,
358 | "metadata": {},
359 | "outputs": [
360 | {
361 | "name": "stdout",
362 | "output_type": "stream",
363 | "text": [
364 | "['Varekoder', 'ImpEks', 'Land']\n"
365 | ]
366 | }
367 | ],
368 | "source": [
369 | "stub = ds['extension']['px']['stub']\n",
370 | "print(stub)"
371 | ]
372 | },
373 | {
374 | "cell_type": "markdown",
375 | "metadata": {},
376 | "source": [
377 | "### Lager dataframes\n",
378 | "Vi må lage to dataframes, en med tekst og en med ID. Pyjstat tillater bare enten/eller"
379 | ]
380 | },
381 | {
382 | "cell_type": "code",
383 | "execution_count": 18,
384 | "metadata": {},
385 | "outputs": [],
386 | "source": [
387 | "hstrade = ds.write('dataframe')\n",
388 | "hstrade_id = ds.write('dataframe', naming='id')"
389 | ]
390 | },
391 | {
392 | "cell_type": "code",
393 | "execution_count": 19,
394 | "metadata": {},
395 | "outputs": [
396 | {
397 | "data": {
398 | "text/html": [
399 | "\n",
400 | "\n",
413 | "
\n",
414 | " \n",
415 | " \n",
416 | " | \n",
417 | " varenummer | \n",
418 | " import/eksport | \n",
419 | " land | \n",
420 | " statistikkvariabel | \n",
421 | " måned | \n",
422 | " value | \n",
423 | "
\n",
424 | " \n",
425 | " \n",
426 | " \n",
427 | " 0 | \n",
428 | " Uspesifiserte varer, tollbare (1988-2003) (M1=... | \n",
429 | " Import | \n",
430 | " USA | \n",
431 | " Mengde 1 (M1) | \n",
432 | " 2025M04 | \n",
433 | " 0 | \n",
434 | "
\n",
435 | " \n",
436 | " 1 | \n",
437 | " Uspesifiserte varer, tollbare (1988-2003) (M1=... | \n",
438 | " Import | \n",
439 | " USA | \n",
440 | " Verdi (kr) | \n",
441 | " 2025M04 | \n",
442 | " 0 | \n",
443 | "
\n",
444 | " \n",
445 | " 2 | \n",
446 | " Uspesifiserte varer, tollbare (1988-2003) (M1=... | \n",
447 | " Import | \n",
448 | " USA | \n",
449 | " Mengde 2 (M2) | \n",
450 | " 2025M04 | \n",
451 | " 0 | \n",
452 | "
\n",
453 | " \n",
454 | " 3 | \n",
455 | " Uspesifiserte varer, tollbare (1988-2003) (M1=... | \n",
456 | " Eksport | \n",
457 | " USA | \n",
458 | " Mengde 1 (M1) | \n",
459 | " 2025M04 | \n",
460 | " 0 | \n",
461 | "
\n",
462 | " \n",
463 | " 4 | \n",
464 | " Uspesifiserte varer, tollbare (1988-2003) (M1=... | \n",
465 | " Eksport | \n",
466 | " USA | \n",
467 | " Verdi (kr) | \n",
468 | " 2025M04 | \n",
469 | " 0 | \n",
470 | "
\n",
471 | " \n",
472 | "
\n",
473 | "
"
474 | ],
475 | "text/plain": [
476 | " varenummer import/eksport land \\\n",
477 | "0 Uspesifiserte varer, tollbare (1988-2003) (M1=... Import USA \n",
478 | "1 Uspesifiserte varer, tollbare (1988-2003) (M1=... Import USA \n",
479 | "2 Uspesifiserte varer, tollbare (1988-2003) (M1=... Import USA \n",
480 | "3 Uspesifiserte varer, tollbare (1988-2003) (M1=... Eksport USA \n",
481 | "4 Uspesifiserte varer, tollbare (1988-2003) (M1=... Eksport USA \n",
482 | "\n",
483 | " statistikkvariabel måned value \n",
484 | "0 Mengde 1 (M1) 2025M04 0 \n",
485 | "1 Verdi (kr) 2025M04 0 \n",
486 | "2 Mengde 2 (M2) 2025M04 0 \n",
487 | "3 Mengde 1 (M1) 2025M04 0 \n",
488 | "4 Verdi (kr) 2025M04 0 "
489 | ]
490 | },
491 | "execution_count": 19,
492 | "metadata": {},
493 | "output_type": "execute_result"
494 | }
495 | ],
496 | "source": [
497 | "hstrade.head()"
498 | ]
499 | },
500 | {
501 | "cell_type": "code",
502 | "execution_count": 20,
503 | "metadata": {},
504 | "outputs": [
505 | {
506 | "data": {
507 | "text/html": [
508 | "\n",
509 | "\n",
522 | "
\n",
523 | " \n",
524 | " \n",
525 | " | \n",
526 | " Varekoder | \n",
527 | " ImpEks | \n",
528 | " Land | \n",
529 | " ContentsCode | \n",
530 | " Tid | \n",
531 | " value | \n",
532 | "
\n",
533 | " \n",
534 | " \n",
535 | " \n",
536 | " 0 | \n",
537 | " 00000011_1988 | \n",
538 | " 1 | \n",
539 | " US | \n",
540 | " Mengde1 | \n",
541 | " 2025M04 | \n",
542 | " 0 | \n",
543 | "
\n",
544 | " \n",
545 | " 1 | \n",
546 | " 00000011_1988 | \n",
547 | " 1 | \n",
548 | " US | \n",
549 | " Verdi | \n",
550 | " 2025M04 | \n",
551 | " 0 | \n",
552 | "
\n",
553 | " \n",
554 | " 2 | \n",
555 | " 00000011_1988 | \n",
556 | " 1 | \n",
557 | " US | \n",
558 | " Mengde2 | \n",
559 | " 2025M04 | \n",
560 | " 0 | \n",
561 | "
\n",
562 | " \n",
563 | " 3 | \n",
564 | " 00000011_1988 | \n",
565 | " 2 | \n",
566 | " US | \n",
567 | " Mengde1 | \n",
568 | " 2025M04 | \n",
569 | " 0 | \n",
570 | "
\n",
571 | " \n",
572 | " 4 | \n",
573 | " 00000011_1988 | \n",
574 | " 2 | \n",
575 | " US | \n",
576 | " Verdi | \n",
577 | " 2025M04 | \n",
578 | " 0 | \n",
579 | "
\n",
580 | " \n",
581 | "
\n",
582 | "
"
583 | ],
584 | "text/plain": [
585 | " Varekoder ImpEks Land ContentsCode Tid value\n",
586 | "0 00000011_1988 1 US Mengde1 2025M04 0\n",
587 | "1 00000011_1988 1 US Verdi 2025M04 0\n",
588 | "2 00000011_1988 1 US Mengde2 2025M04 0\n",
589 | "3 00000011_1988 2 US Mengde1 2025M04 0\n",
590 | "4 00000011_1988 2 US Verdi 2025M04 0"
591 | ]
592 | },
593 | "execution_count": 20,
594 | "metadata": {},
595 | "output_type": "execute_result"
596 | }
597 | ],
598 | "source": [
599 | "hstrade_id.head()"
600 | ]
601 | },
602 | {
603 | "cell_type": "markdown",
604 | "metadata": {},
605 | "source": [
606 | "### Lager en ny kolonne med både HS varekode og tekst slått sammen"
607 | ]
608 | },
609 | {
610 | "cell_type": "code",
611 | "execution_count": 21,
612 | "metadata": {},
613 | "outputs": [],
614 | "source": [
615 | "hstrade['hstrade_combi'] = hstrade_id['Varekoder'] + ' ' + hstrade['varenummer']"
616 | ]
617 | },
618 | {
619 | "cell_type": "code",
620 | "execution_count": 22,
621 | "metadata": {},
622 | "outputs": [
623 | {
624 | "data": {
625 | "text/plain": [
626 | "Index(['varenummer', 'import/eksport', 'land', 'statistikkvariabel', 'måned',\n",
627 | " 'value', 'hstrade_combi'],\n",
628 | " dtype='object')"
629 | ]
630 | },
631 | "execution_count": 22,
632 | "metadata": {},
633 | "output_type": "execute_result"
634 | }
635 | ],
636 | "source": [
637 | "hstrade.columns"
638 | ]
639 | },
640 | {
641 | "cell_type": "markdown",
642 | "metadata": {},
643 | "source": [
644 | "### Lager en ny dataframe som bare har med kolonnene vi ønsker, i ny rekkefølge. \n",
645 | "Merk doble [[ ]] for å lage dataframe"
646 | ]
647 | },
648 | {
649 | "cell_type": "code",
650 | "execution_count": 23,
651 | "metadata": {},
652 | "outputs": [],
653 | "source": [
654 | "hstrade_new = hstrade[['hstrade_combi', 'import/eksport', 'land', 'statistikkvariabel', 'måned',\n",
655 | " 'value']]"
656 | ]
657 | },
658 | {
659 | "cell_type": "code",
660 | "execution_count": 24,
661 | "metadata": {},
662 | "outputs": [
663 | {
664 | "data": {
665 | "text/html": [
666 | "\n",
667 | "\n",
680 | "
\n",
681 | " \n",
682 | " \n",
683 | " | \n",
684 | " hstrade_combi | \n",
685 | " import/eksport | \n",
686 | " land | \n",
687 | " statistikkvariabel | \n",
688 | " måned | \n",
689 | " value | \n",
690 | "
\n",
691 | " \n",
692 | " \n",
693 | " \n",
694 | " 80408 | \n",
695 | " 99603000_2023 VOEC-forsendelser (2023-) (M1=kg... | \n",
696 | " Import | \n",
697 | " USA | \n",
698 | " Mengde 2 (M2) | \n",
699 | " 2025M04 | \n",
700 | " 0 | \n",
701 | "
\n",
702 | " \n",
703 | " 80409 | \n",
704 | " 99603000_2023 VOEC-forsendelser (2023-) (M1=kg... | \n",
705 | " Eksport | \n",
706 | " USA | \n",
707 | " Mengde 1 (M1) | \n",
708 | " 2025M04 | \n",
709 | " 0 | \n",
710 | "
\n",
711 | " \n",
712 | " 80410 | \n",
713 | " 99603000_2023 VOEC-forsendelser (2023-) (M1=kg... | \n",
714 | " Eksport | \n",
715 | " USA | \n",
716 | " Verdi (kr) | \n",
717 | " 2025M04 | \n",
718 | " 0 | \n",
719 | "
\n",
720 | " \n",
721 | " 80411 | \n",
722 | " 99603000_2023 VOEC-forsendelser (2023-) (M1=kg... | \n",
723 | " Eksport | \n",
724 | " USA | \n",
725 | " Mengde 2 (M2) | \n",
726 | " 2025M04 | \n",
727 | " 0 | \n",
728 | "
\n",
729 | " \n",
730 | " 80412 | \n",
731 | " 99999999_1988 Sum alle varenumre med restriksj... | \n",
732 | " Import | \n",
733 | " USA | \n",
734 | " Mengde 1 (M1) | \n",
735 | " 2025M04 | \n",
736 | " 24397438 | \n",
737 | "
\n",
738 | " \n",
739 | " 80413 | \n",
740 | " 99999999_1988 Sum alle varenumre med restriksj... | \n",
741 | " Import | \n",
742 | " USA | \n",
743 | " Verdi (kr) | \n",
744 | " 2025M04 | \n",
745 | " 174702436 | \n",
746 | "
\n",
747 | " \n",
748 | " 80414 | \n",
749 | " 99999999_1988 Sum alle varenumre med restriksj... | \n",
750 | " Import | \n",
751 | " USA | \n",
752 | " Mengde 2 (M2) | \n",
753 | " 2025M04 | \n",
754 | " 0 | \n",
755 | "
\n",
756 | " \n",
757 | " 80415 | \n",
758 | " 99999999_1988 Sum alle varenumre med restriksj... | \n",
759 | " Eksport | \n",
760 | " USA | \n",
761 | " Mengde 1 (M1) | \n",
762 | " 2025M04 | \n",
763 | " 90970447 | \n",
764 | "
\n",
765 | " \n",
766 | " 80416 | \n",
767 | " 99999999_1988 Sum alle varenumre med restriksj... | \n",
768 | " Eksport | \n",
769 | " USA | \n",
770 | " Verdi (kr) | \n",
771 | " 2025M04 | \n",
772 | " 572834089 | \n",
773 | "
\n",
774 | " \n",
775 | " 80417 | \n",
776 | " 99999999_1988 Sum alle varenumre med restriksj... | \n",
777 | " Eksport | \n",
778 | " USA | \n",
779 | " Mengde 2 (M2) | \n",
780 | " 2025M04 | \n",
781 | " 0 | \n",
782 | "
\n",
783 | " \n",
784 | "
\n",
785 | "
"
786 | ],
787 | "text/plain": [
788 | " hstrade_combi import/eksport land \\\n",
789 | "80408 99603000_2023 VOEC-forsendelser (2023-) (M1=kg... Import USA \n",
790 | "80409 99603000_2023 VOEC-forsendelser (2023-) (M1=kg... Eksport USA \n",
791 | "80410 99603000_2023 VOEC-forsendelser (2023-) (M1=kg... Eksport USA \n",
792 | "80411 99603000_2023 VOEC-forsendelser (2023-) (M1=kg... Eksport USA \n",
793 | "80412 99999999_1988 Sum alle varenumre med restriksj... Import USA \n",
794 | "80413 99999999_1988 Sum alle varenumre med restriksj... Import USA \n",
795 | "80414 99999999_1988 Sum alle varenumre med restriksj... Import USA \n",
796 | "80415 99999999_1988 Sum alle varenumre med restriksj... Eksport USA \n",
797 | "80416 99999999_1988 Sum alle varenumre med restriksj... Eksport USA \n",
798 | "80417 99999999_1988 Sum alle varenumre med restriksj... Eksport USA \n",
799 | "\n",
800 | " statistikkvariabel måned value \n",
801 | "80408 Mengde 2 (M2) 2025M04 0 \n",
802 | "80409 Mengde 1 (M1) 2025M04 0 \n",
803 | "80410 Verdi (kr) 2025M04 0 \n",
804 | "80411 Mengde 2 (M2) 2025M04 0 \n",
805 | "80412 Mengde 1 (M1) 2025M04 24397438 \n",
806 | "80413 Verdi (kr) 2025M04 174702436 \n",
807 | "80414 Mengde 2 (M2) 2025M04 0 \n",
808 | "80415 Mengde 1 (M1) 2025M04 90970447 \n",
809 | "80416 Verdi (kr) 2025M04 572834089 \n",
810 | "80417 Mengde 2 (M2) 2025M04 0 "
811 | ]
812 | },
813 | "execution_count": 24,
814 | "metadata": {},
815 | "output_type": "execute_result"
816 | }
817 | ],
818 | "source": [
819 | "hstrade_new.tail(10)"
820 | ]
821 | },
822 | {
823 | "cell_type": "markdown",
824 | "metadata": {},
825 | "source": [
826 | "## Fotnoter"
827 | ]
828 | },
829 | {
830 | "cell_type": "markdown",
831 | "metadata": {},
832 | "source": [
833 | "Fotnoter er nytt i JSON-stat2. Fra SSB statstikkbank er det klare svakheter i formatering. Det er ikke entydig skilletegn notene og forstyrrende koder for visuell formatering. Det er uklart om beste praksis vil være \"nøstet liste\" eller ikke. For koden her har jeg fått bistand av \"Claude\"."
834 | ]
835 | },
836 | {
837 | "cell_type": "code",
838 | "execution_count": 25,
839 | "metadata": {},
840 | "outputs": [
841 | {
842 | "name": "stdout",
843 | "output_type": "stream",
844 | "text": [
845 | "[\"For informasjon om gyldighet for og årlige endringer i varenummere, se Statistisk varefortegnelse for utenrikshandelen.\\n
\\n\\nFra og med 2006 fikk følgende land endret tilhørighet til verdensdel - Kypros fra Asia til Europa, og Armenia, Aserbajdsjan, Georgia, Kirgisistan, Kasakhstan, Tadsjikistan, Turkmenistan og Usbekistan fra Europa til Asia. I utvalgene av enkeltland i nedtrekksmenyen for Europeiske land/Asiatiske land er det den nåværende inndelingen som vises for hele tidsperioden (Kypros hører med til Europa og de andre landene til Asia ).\\n
\\nSSB publiserer ikke tall for handelsområdet tidligere Comecon etter 2011.Grupperingen og besto (i handelsstatistikken) kun av europeiske Comecon-land: Armenia, Aserbajdsjan, Bulgaria, Estland, Georgia, Hviterussland, Kasakhstan, Kirgisistan, Latvia, Litauen, Moldova, Polen, Romania, Russland, Slovakia, Tsjekkia, Tadsjikistan, Turkmenistan, Ukraina, Ungarn, Usbekistan.\", \"For mer informasjon, se Om statistikken.\", \"Import for varenummer 2403.9991 og 2403.9990 i perioden 2005-2013 er feil, se Korrigerte tall for import av snus.\", 'Ved publisering av statistikk for en ny målemåned revideres samtidig tallene for de foregående månedene i samme år. Videre revideres tallene for alle månedene i året ytterligere to ganger: Første gang i mai påfølgende år (år t+1), før endelige tall publiseres i mai ett år senere (år t+2).', 'Den 12.2.2022 ble alle varekodene endret. De 8-sifrete varekodene har nå en tilføyelse som viser årstallet da varekoden ble tatt i bruk.', 'Datamaterialet i Utenrikshandel med varer er svært omfattende, og på det mest detaljerte nivået vil kvaliteten kunne variere. Kvalitet vil påvirkes av feil i innrapporterte data. Brukere av statistikken må derfor utøve skjønn når detaljerte tall anvendes. Varenummer med liten handel, målt i verdi, vil være mer utsatt for feil enn varenummer med mye handel. Videre har statistikkvariablene vekt og mengde dårligere kvalitet enn verdi. Varer med restriksjoner og handel til spesielle land følges imidlertid nøyere opp.
\\n\\nSSB er pålagt å rapportere detaljerte tall til Eurostat, og finner det derfor hensiktsmessig at tallene også offentliggjøres til norske brukere til tross for varierende kvalitet.', 'Tallene for varenumrene 99.60.1000 og 99.60.2000 er ikke komplette, og vil bli oppdatert ved publiseringen 16. juni 2025.']\n"
846 | ]
847 | }
848 | ],
849 | "source": [
850 | "if 'note' in ds:\n",
851 | " note = ds['note']\n",
852 | " print(note)"
853 | ]
854 | },
855 | {
856 | "cell_type": "code",
857 | "execution_count": 26,
858 | "metadata": {},
859 | "outputs": [],
860 | "source": [
861 | "# re er for regulære uttrykk - brukes for søk/erstatt\n",
862 | "import re\n",
863 | "\n",
864 | "def clean_text(text_list):\n",
865 | " \"\"\"\n",
866 | " Fjerner \\n,
og
fra tekster\n",
867 | " \"\"\"\n",
868 | " cleaned_list = []\n",
869 | " for text in text_list:\n",
870 | " # Fjern \\n,
og
\n",
871 | " cleaned_text = re.sub(r'\\\\n|
', ' ', text)\n",
872 | " \n",
873 | " # Fjern ekstra mellomrom\n",
874 | " cleaned_text = re.sub(r'\\s+', ' ', cleaned_text).strip()\n",
875 | " \n",
876 | " cleaned_list.append(cleaned_text)\n",
877 | " \n",
878 | " return cleaned_list\n"
879 | ]
880 | },
881 | {
882 | "cell_type": "markdown",
883 | "metadata": {},
884 | "source": [
885 | "Spitter flere fotnoter i flere lister."
886 | ]
887 | },
888 | {
889 | "cell_type": "code",
890 | "execution_count": 27,
891 | "metadata": {},
892 | "outputs": [],
893 | "source": [
894 | "def split_note(text_list):\n",
895 | " \"\"\"\n",
896 | " Splitter tekster og returnerer separate lister\n",
897 | " \"\"\"\n",
898 | " # Leter etter: \" eller ' - komma mellomrom - \" eller ' \n",
899 | " split_pattern = r'(?:\"|\\')\\s*(?:\"|\\')'\n",
900 | " \n",
901 | " # Lag en liste for alle notene\n",
902 | " list_of_lists = []\n",
903 | "\n",
904 | " # Gå gjennom hver tekst i input-listen\n",
905 | " for text in text_list:\n",
906 | " # Liste for å lagre hver fotnote\n",
907 | " parts_of_text = []\n",
908 | " \n",
909 | " # Del opp teksten ved anførselstegn-mønsteret\n",
910 | " raw_parts = re.split(split_pattern, text)\n",
911 | " \n",
912 | " # Gå gjennom hver del\n",
913 | " for part in raw_parts:\n",
914 | " # Fjern mellomrom i start og slutt\n",
915 | " cleaned_part = part.strip()\n",
916 | " \n",
917 | " # Hvis delen ikke er tom etter rensing\n",
918 | " if cleaned_part:\n",
919 | " # Legg til i listen for denne teksten\n",
920 | " parts_of_text.append(cleaned_part)\n",
921 | " \n",
922 | " # Legg til denne tekstens deler i hovedlisten\n",
923 | " list_of_lists.append(parts_of_text)\n",
924 | " \n",
925 | "\n",
926 | " return list_of_lists"
927 | ]
928 | },
929 | {
930 | "cell_type": "code",
931 | "execution_count": 28,
932 | "metadata": {},
933 | "outputs": [
934 | {
935 | "name": "stdout",
936 | "output_type": "stream",
937 | "text": [
938 | "[\"For informasjon om gyldighet for og årlige endringer i varenummere, se Statistisk varefortegnelse for utenrikshandelen. Fra og med 2006 fikk følgende land endret tilhørighet til verdensdel - Kypros fra Asia til Europa, og Armenia, Aserbajdsjan, Georgia, Kirgisistan, Kasakhstan, Tadsjikistan, Turkmenistan og Usbekistan fra Europa til Asia. I utvalgene av enkeltland i nedtrekksmenyen for Europeiske land/Asiatiske land er det den nåværende inndelingen som vises for hele tidsperioden (Kypros hører med til Europa og de andre landene til Asia ). SSB publiserer ikke tall for handelsområdet tidligere Comecon etter 2011.Grupperingen og besto (i handelsstatistikken) kun av europeiske Comecon-land: Armenia, Aserbajdsjan, Bulgaria, Estland, Georgia, Hviterussland, Kasakhstan, Kirgisistan, Latvia, Litauen, Moldova, Polen, Romania, Russland, Slovakia, Tsjekkia, Tadsjikistan, Turkmenistan, Ukraina, Ungarn, Usbekistan.\", \"For mer informasjon, se Om statistikken.\", \"Import for varenummer 2403.9991 og 2403.9990 i perioden 2005-2013 er feil, se Korrigerte tall for import av snus.\", 'Ved publisering av statistikk for en ny målemåned revideres samtidig tallene for de foregående månedene i samme år. Videre revideres tallene for alle månedene i året ytterligere to ganger: Første gang i mai påfølgende år (år t+1), før endelige tall publiseres i mai ett år senere (år t+2).', 'Den 12.2.2022 ble alle varekodene endret. De 8-sifrete varekodene har nå en tilføyelse som viser årstallet da varekoden ble tatt i bruk.', 'Datamaterialet i Utenrikshandel med varer er svært omfattende, og på det mest detaljerte nivået vil kvaliteten kunne variere. Kvalitet vil påvirkes av feil i innrapporterte data. Brukere av statistikken må derfor utøve skjønn når detaljerte tall anvendes. Varenummer med liten handel, målt i verdi, vil være mer utsatt for feil enn varenummer med mye handel. Videre har statistikkvariablene vekt og mengde dårligere kvalitet enn verdi. Varer med restriksjoner og handel til spesielle land følges imidlertid nøyere opp. SSB er pålagt å rapportere detaljerte tall til Eurostat, og finner det derfor hensiktsmessig at tallene også offentliggjøres til norske brukere til tross for varierende kvalitet.', 'Tallene for varenumrene 99.60.1000 og 99.60.2000 er ikke komplette, og vil bli oppdatert ved publiseringen 16. juni 2025.']\n"
939 | ]
940 | }
941 | ],
942 | "source": [
943 | "renset_note = clean_text(note)\n",
944 | "print(renset_note)"
945 | ]
946 | },
947 | {
948 | "cell_type": "code",
949 | "execution_count": 29,
950 | "metadata": {},
951 | "outputs": [
952 | {
953 | "name": "stdout",
954 | "output_type": "stream",
955 | "text": [
956 | "[[\"For informasjon om gyldighet for og årlige endringer i varenummere, se Statistisk varefortegnelse for utenrikshandelen. Fra og med 2006 fikk følgende land endret tilhørighet til verdensdel - Kypros fra Asia til Europa, og Armenia, Aserbajdsjan, Georgia, Kirgisistan, Kasakhstan, Tadsjikistan, Turkmenistan og Usbekistan fra Europa til Asia. I utvalgene av enkeltland i nedtrekksmenyen for Europeiske land/Asiatiske land er det den nåværende inndelingen som vises for hele tidsperioden (Kypros hører med til Europa og de andre landene til Asia ). SSB publiserer ikke tall for handelsområdet tidligere Comecon etter 2011.Grupperingen og besto (i handelsstatistikken) kun av europeiske Comecon-land: Armenia, Aserbajdsjan, Bulgaria, Estland, Georgia, Hviterussland, Kasakhstan, Kirgisistan, Latvia, Litauen, Moldova, Polen, Romania, Russland, Slovakia, Tsjekkia, Tadsjikistan, Turkmenistan, Ukraina, Ungarn, Usbekistan.\"], [\"For mer informasjon, se Om statistikken.\"], [\"Import for varenummer 2403.9991 og 2403.9990 i perioden 2005-2013 er feil, se Korrigerte tall for import av snus.\"], ['Ved publisering av statistikk for en ny målemåned revideres samtidig tallene for de foregående månedene i samme år. Videre revideres tallene for alle månedene i året ytterligere to ganger: Første gang i mai påfølgende år (år t+1), før endelige tall publiseres i mai ett år senere (år t+2).'], ['Den 12.2.2022 ble alle varekodene endret. De 8-sifrete varekodene har nå en tilføyelse som viser årstallet da varekoden ble tatt i bruk.'], ['Datamaterialet i Utenrikshandel med varer er svært omfattende, og på det mest detaljerte nivået vil kvaliteten kunne variere. Kvalitet vil påvirkes av feil i innrapporterte data. Brukere av statistikken må derfor utøve skjønn når detaljerte tall anvendes. Varenummer med liten handel, målt i verdi, vil være mer utsatt for feil enn varenummer med mye handel. Videre har statistikkvariablene vekt og mengde dårligere kvalitet enn verdi. Varer med restriksjoner og handel til spesielle land følges imidlertid nøyere opp. SSB er pålagt å rapportere detaljerte tall til Eurostat, og finner det derfor hensiktsmessig at tallene også offentliggjøres til norske brukere til tross for varierende kvalitet.'], ['Tallene for varenumrene 99.60.1000 og 99.60.2000 er ikke komplette, og vil bli oppdatert ved publiseringen 16. juni 2025.']]\n"
957 | ]
958 | }
959 | ],
960 | "source": [
961 | "noter = split_note(renset_note)\n",
962 | "print(noter)"
963 | ]
964 | },
965 | {
966 | "cell_type": "code",
967 | "execution_count": 30,
968 | "metadata": {},
969 | "outputs": [
970 | {
971 | "name": "stdout",
972 | "output_type": "stream",
973 | "text": [
974 | "Resultat: Teksten ble delt i disse delene:\n",
975 | "\n",
976 | "Fotnote 1:\n",
977 | " For informasjon om gyldighet for og årlige endringer i varenummere, se Statistisk varefortegnelse for utenrikshandelen. Fra og med 2006 fikk følgende land endret tilhørighet til verdensdel - Kypros fra Asia til Europa, og Armenia, Aserbajdsjan, Georgia, Kirgisistan, Kasakhstan, Tadsjikistan, Turkmenistan og Usbekistan fra Europa til Asia. I utvalgene av enkeltland i nedtrekksmenyen for Europeiske land/Asiatiske land er det den nåværende inndelingen som vises for hele tidsperioden (Kypros hører med til Europa og de andre landene til Asia ). SSB publiserer ikke tall for handelsområdet tidligere Comecon etter 2011.Grupperingen og besto (i handelsstatistikken) kun av europeiske Comecon-land: Armenia, Aserbajdsjan, Bulgaria, Estland, Georgia, Hviterussland, Kasakhstan, Kirgisistan, Latvia, Litauen, Moldova, Polen, Romania, Russland, Slovakia, Tsjekkia, Tadsjikistan, Turkmenistan, Ukraina, Ungarn, Usbekistan.\n",
978 | "\n",
979 | "Fotnote 2:\n",
980 | " For mer informasjon, se Om statistikken.\n",
981 | "\n",
982 | "Fotnote 3:\n",
983 | " Import for varenummer 2403.9991 og 2403.9990 i perioden 2005-2013 er feil, se Korrigerte tall for import av snus.\n",
984 | "\n",
985 | "Fotnote 4:\n",
986 | " Ved publisering av statistikk for en ny målemåned revideres samtidig tallene for de foregående månedene i samme år. Videre revideres tallene for alle månedene i året ytterligere to ganger: Første gang i mai påfølgende år (år t+1), før endelige tall publiseres i mai ett år senere (år t+2).\n",
987 | "\n",
988 | "Fotnote 5:\n",
989 | " Den 12.2.2022 ble alle varekodene endret. De 8-sifrete varekodene har nå en tilføyelse som viser årstallet da varekoden ble tatt i bruk.\n",
990 | "\n",
991 | "Fotnote 6:\n",
992 | " Datamaterialet i Utenrikshandel med varer er svært omfattende, og på det mest detaljerte nivået vil kvaliteten kunne variere. Kvalitet vil påvirkes av feil i innrapporterte data. Brukere av statistikken må derfor utøve skjønn når detaljerte tall anvendes. Varenummer med liten handel, målt i verdi, vil være mer utsatt for feil enn varenummer med mye handel. Videre har statistikkvariablene vekt og mengde dårligere kvalitet enn verdi. Varer med restriksjoner og handel til spesielle land følges imidlertid nøyere opp. SSB er pålagt å rapportere detaljerte tall til Eurostat, og finner det derfor hensiktsmessig at tallene også offentliggjøres til norske brukere til tross for varierende kvalitet.\n",
993 | "\n",
994 | "Fotnote 7:\n",
995 | " Tallene for varenumrene 99.60.1000 og 99.60.2000 er ikke komplette, og vil bli oppdatert ved publiseringen 16. juni 2025.\n"
996 | ]
997 | }
998 | ],
999 | "source": [
1000 | "print(\"Resultat: Teksten ble delt i disse delene:\")\n",
1001 | "for i, sublist in enumerate(noter, 1):\n",
1002 | " print(f\"\\nFotnote {i}:\")\n",
1003 | " for j, part in enumerate(sublist, 1):\n",
1004 | " print(f\" {part}\")"
1005 | ]
1006 | },
1007 | {
1008 | "cell_type": "code",
1009 | "execution_count": null,
1010 | "metadata": {},
1011 | "outputs": [],
1012 | "source": []
1013 | },
1014 | {
1015 | "cell_type": "code",
1016 | "execution_count": null,
1017 | "metadata": {},
1018 | "outputs": [],
1019 | "source": []
1020 | }
1021 | ],
1022 | "metadata": {
1023 | "kernelspec": {
1024 | "display_name": "Python 3 (ipykernel)",
1025 | "language": "python",
1026 | "name": "python3"
1027 | },
1028 | "language_info": {
1029 | "codemirror_mode": {
1030 | "name": "ipython",
1031 | "version": 3
1032 | },
1033 | "file_extension": ".py",
1034 | "mimetype": "text/x-python",
1035 | "name": "python",
1036 | "nbconvert_exporter": "python",
1037 | "pygments_lexer": "ipython3",
1038 | "version": "3.12.3"
1039 | }
1040 | },
1041 | "nbformat": 4,
1042 | "nbformat_minor": 4
1043 | }
1044 |
--------------------------------------------------------------------------------