├── .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 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | "
kommunekjønnalderårvalue
00301 Oslo kommuneMenn0 år20184779
10301 Oslo kommuneMenn0 år20194523
20301 Oslo kommuneMenn0 år20204647
30301 Oslo kommuneMenn1 år20184709
40301 Oslo kommuneMenn1 år20194507
\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 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | "
regionkjønnalderstatistikkvariabelårvalue
0MossMenn0-4 årPersoner20181239
1MossMenn0-4 årPersoner20191248
2MossMenn0-4 årPersoner20201201
3MossMenn0-4 årPersoner20211151
4MossMenn5-9 årPersoner20181408
\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 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | "
kommunekjønnalderårvalue
00301 Oslo kommuneMenn0 år20194523
10301 Oslo kommuneMenn0 år20204647
20301 Oslo kommuneMenn0 år20214498
30301 Oslo kommuneMenn0 år20224580
40301 Oslo kommuneMenn1 år20194507
50301 Oslo kommuneMenn1 år20204283
60301 Oslo kommuneMenn1 år20214320
70301 Oslo kommuneMenn1 år20224097
80301 Oslo kommuneMenn2 år20194463
90301 Oslo kommuneMenn2 år20204280
100301 Oslo kommuneMenn2 år20213973
110301 Oslo kommuneMenn2 år20224008
120301 Oslo kommuneKvinner0 år20194479
130301 Oslo kommuneKvinner0 år20204454
140301 Oslo kommuneKvinner0 år20214345
\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 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | "
regionkjønnalderstatistikkvariabelårvalue
0MossMenn0-4 årPersoner20181239
1MossMenn0-4 årPersoner20191248
2MossMenn0-4 årPersoner20201201
3MossMenn0-4 årPersoner20211151
4MossMenn5-9 årPersoner20181408
\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 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | "
RegionKjonnAlderContentsCodeTidvalue
0K-30021F00-04Personer120181239
1K-30021F00-04Personer120191248
2K-30021F00-04Personer120201201
3K-30021F00-04Personer120211151
4K-30021F05-09Personer120181408
\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 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | "
codenamenotes
0010Fastlønn
1020Lønn til vikarer
2030Lønn til ekstrahjelp
3040Overtidslønn
4050Annen lønn og trekkpliktige godtgjørelser
\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 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | "
codenamenotes
280AGI30Salgsinntekter (i investering)Begrepet viser (fylkes-)kommunens salgsinntekt...
281AGI31Refusjons- og overføringsinntekter inkl. rente...Begrepet viser refusjons- og overføringsinntek...
282AGI32Sum finansieringstransaksjoner (C )Begrepet omfatter (fylkes-)kommunens finansier...
283AGI33Finansieringsbehov (D= B+C+A)Begrepet beskriver (fylkes-)kommunens finansie...
284AGI34Sum finansiering (E )Begrepet viser hvordan (fylkes-)kommunen finan...
285AGI35Udekket/udisponert (F=D-E)Begrepet omfatter (fylkes-)kommunens resultat ...
286AGI36Bruk av lån inkl. aksjer, andeler og utlån (ne...Begrepet omfatter netto bruk av lån inkludert ...
287AGI37Kjøp av tjenester som erstatter (fylkes-)kommu...Begrepet omfatter alle utgifter i investerings...
288AGID1Overskudd før lån og avsetningerBegrepet omfatter brutto driftsresultat inkl. ...
289AGID2Bruk av fond/avsetning til fond, drift og inve...Begrepet omfatter bruk av fond minus avsetning...
290AI620Annet salg av varer og tjenester, gebyrer o.l....
291AI660Salg av driftsmidler (i investeringsregnskapet
292AI729Kompensasjon for merverdiavgift i investerings...
293AI770Refusjon fra andre (private) (I)
294AI905Utbytte og eieruttak
\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 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | "
commodity numberimports/exportscountrycontentsmonthvalue
0Imports of unspecified goods, with duty (1988-...ImportsUnited States of AmericaQuantity 1 (Q1)2025M040
1Imports of unspecified goods, with duty (1988-...ImportsUnited States of AmericaValue (NOK)2025M040
2Imports of unspecified goods, with duty (1988-...ImportsUnited States of AmericaQuantity 2 (Q2)2025M040
3Imports of unspecified goods, with duty (1988-...ExportsUnited States of AmericaQuantity 1 (Q1)2025M040
4Imports of unspecified goods, with duty (1988-...ExportsUnited States of AmericaValue (NOK)2025M040
\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 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | "
VarekoderImpEksLandContentsCodeTidvalue
000000011_19881USMengde12025M040
100000011_19881USVerdi2025M040
200000011_19881USMengde22025M040
300000011_19882USMengde12025M040
400000011_19882USVerdi2025M040
\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 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | "
hstrade_combiimports/exportscountrycontentsmonthvalue
8041399999999_1988 Total, all commodities not for p...ImportsUnited States of AmericaValue (NOK)2025M04174702436
8041499999999_1988 Total, all commodities not for p...ImportsUnited States of AmericaQuantity 2 (Q2)2025M040
8041599999999_1988 Total, all commodities not for p...ExportsUnited States of AmericaQuantity 1 (Q1)2025M0490970447
8041699999999_1988 Total, all commodities not for p...ExportsUnited States of AmericaValue (NOK)2025M04572834089
8041799999999_1988 Total, all commodities not for p...ExportsUnited States of AmericaQuantity 2 (Q2)2025M040
\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 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | "
varenummerimport/eksportlandstatistikkvariabelmånedvalue
0Uspesifiserte varer, tollbare (1988-2003) (M1=...ImportUSAMengde 1 (M1)2025M040
1Uspesifiserte varer, tollbare (1988-2003) (M1=...ImportUSAVerdi (kr)2025M040
2Uspesifiserte varer, tollbare (1988-2003) (M1=...ImportUSAMengde 2 (M2)2025M040
3Uspesifiserte varer, tollbare (1988-2003) (M1=...EksportUSAMengde 1 (M1)2025M040
4Uspesifiserte varer, tollbare (1988-2003) (M1=...EksportUSAVerdi (kr)2025M040
\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 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | "
VarekoderImpEksLandContentsCodeTidvalue
000000011_19881USMengde12025M040
100000011_19881USVerdi2025M040
200000011_19881USMengde22025M040
300000011_19882USMengde12025M040
400000011_19882USVerdi2025M040
\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 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | "
hstrade_combiimport/eksportlandstatistikkvariabelmånedvalue
8040899603000_2023 VOEC-forsendelser (2023-) (M1=kg...ImportUSAMengde 2 (M2)2025M040
8040999603000_2023 VOEC-forsendelser (2023-) (M1=kg...EksportUSAMengde 1 (M1)2025M040
8041099603000_2023 VOEC-forsendelser (2023-) (M1=kg...EksportUSAVerdi (kr)2025M040
8041199603000_2023 VOEC-forsendelser (2023-) (M1=kg...EksportUSAMengde 2 (M2)2025M040
8041299999999_1988 Sum alle varenumre med restriksj...ImportUSAMengde 1 (M1)2025M0424397438
8041399999999_1988 Sum alle varenumre med restriksj...ImportUSAVerdi (kr)2025M04174702436
8041499999999_1988 Sum alle varenumre med restriksj...ImportUSAMengde 2 (M2)2025M040
8041599999999_1988 Sum alle varenumre med restriksj...EksportUSAMengde 1 (M1)2025M0490970447
8041699999999_1988 Sum alle varenumre med restriksj...EksportUSAVerdi (kr)2025M04572834089
8041799999999_1988 Sum alle varenumre med restriksj...EksportUSAMengde 2 (M2)2025M040
\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 | --------------------------------------------------------------------------------