Where the list of areas of activity comes from #140
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Blocks
Reference
Postulo/postulo#140
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Observation
Prerequisite. Which list, at what depth, and under what licence — answerable on its own, and
the answer decides most of what the company form then looks like.
What exists
jobs/industries.pyholds 32 names, assembled by hand:They are
gettextstrings, so they are translated with the interface — all 39 languages,as part of Postulo's own catalogues. They are offered as suggestions in a
<datalist>andnever as a closed list; the real vocabulary is
Industry, one set per person, created byslug so Fintech and fintech are one thing.
Thirty-two is not a classification. It has Gaming and E-commerce but no Water supply,
no Mining, no Arts, no Public administration as distinct from Public sector, and
nothing at all for a third of the economy.
What this asks for
A real list of areas of activity to seed from, general enough to cover the economy and
recognisable enough that somebody picks their own without reading a manual.
The candidates
NACE — the EU's statistical classification of economic activities, the obvious fit for a
project that has already decided to put Europe first. Rev. 2.1 was adopted in October 2022
and is in use for European statistics from 2025. Rev. 2's structure is four levels: 21
sections (letters A–U), 88 divisions (two digits), 272 groups, 615 classes. Published
by Eurostat in every official EU language, and available as Linked Open Data.
ISIC — the UN classification NACE derives from, and the honest choice once Postulo is
past Europe (#71, #72, #101). NACE maps onto it, so choosing NACE now does not close it off.
NAICS / SIC — North America. Wrong first audience for this project.
A proprietary list — LinkedIn's ~150 industries and its imitators are the vocabulary
people actually recognise, and none of them come with a licence that permits shipping them.
Worth being careful about
The translations are the argument, more than the taxonomy. A hand-made list of 200 names
would be 200 × 39 = 7,800 translations, carried by this project for ever. NACE is
published in every official EU language by the body that maintains it. That is the single
biggest reason to take a standard rather than write a longer list, and it is worth saying
before anybody starts adding names to
industries.py.Granularity decides whether this is usable at all. 615 classes is a form nobody fills in.
21 sections is coarser than the list we have now — Information and communication covers
software, telecoms, publishing and film in one word. 88 divisions is probably the answer, and
it should be chosen deliberately rather than by taking whatever file is easiest to parse.
NACE classifies the business, not the job, and the difference will bite. Somebody
applying to a bank's software team is applying to K — Financial and insurance activities,
which is true of the employer and useless to the applicant. The current vocabulary is the
applicant's own words about a company, which is a different question wearing the same label.
Whatever is adopted has to survive that: a person who wants to write Fintech must still be
able to.
So this is almost certainly a seed, not a replacement.
Industryis per person bydesign, with the reason written into the model: "two people on one instance may describe the
same employer differently, and neither should see the other's words." A closed standard list
would reverse that. Seeding the suggestions from NACE and letting the free vocabulary stand
keeps both — and a stored code beside the name is what makes a report (#56) legible to an
employment office that thinks in NACE.
The licence has to be checked before anything is vendored, not assumed from "it is EU
data". The instruments to read are Regulation (EC) 1893/2006 and Commission Delegated
Regulation 2023/137, and Decision 2011/833/EU on the reuse of Commission documents. An
AGPL project shipping a data file needs the answer in writing.
Whatever is vendored has to be updatable. NACE Rev. 2.1 replaced Rev. 2 after sixteen
years; a list copied into a Python module will be copied again. Where it lives — a data file
with its revision recorded, rather than a tuple in a module — is part of this decision.
People already have industries. Every existing
Industryrow is somebody's own word, andseeding a standard list must not duplicate, rename or absorb them. Matching by slug is what
already stops Fintech and fintech from breeding; it will not stop Software from
existing beside J62 Computer programming.
Done in
0aff31fd. The three questions, answered.Which list: NACE
For the reason the issue gives — Europe first, and ISIC stays open because NACE maps onto it. NAICS and SIC are the wrong first audience; LinkedIn's ~150 industries are the vocabulary people recognise and come with no licence that permits shipping them.
At what depth: divisions
87 divisions under 22 sections — Rev. 2.1's shape, which is not Rev. 2's: the restructuring split Information and communication into a publishing/broadcasting section and a telecom/computing one, and there are 22 sections (A–V) rather than 21.
Chosen between three rather than taken from whatever parsed easiest, exactly as asked:
Under what licence: CC BY 4.0, and checked rather than assumed
src/postulo/jobs/data/LICENCE.mdcarries the attribution verbatim, says exactly what was changed (Eurostat prefixes each label with its own code; the code is stored separately and stripped from the name — nothing was translated, renamed, merged or added), and says how to replace the file when Rev. 3 arrives.Where it came from: the Publications Office's EU Vocabularies copy, concept scheme
http://data.europa.eu/ux2/nace2.1/, through the ShowVoc SPARQL endpoint. The harvest script is in the issue rather than in the repository, on purpose: a build step that fetches from the internet is a build step that fails when somebody else's server does.The translations, which were the real argument
87 × 24 = 2,088 names, written by the body that maintains them. Not one is a gettext string here — they are reference data in the same sense a language's own name is, and
messages.pynever sees them. One new translatable string went into the catalogues: the field label NACE division.Fifteen of the thirty-nine languages Postulo speaks are not official EU languages. Those readers get the English division names, and the module says why: inventing NACE names for Catalan or Ukrainian would be this project asserting a classification it does not maintain.
pt-brreads the Portuguese names anden-gbthe English ones — a variant of a language is the same words.It bites exactly where you said it would, and survives
So this is a seed, and three things make that real rather than stated:
Industryis unchanged in kind — still one free vocabulary per person, still matched by slug, still theirs.<datalist>shows its options in order until somebody types, and Software being visible before Manufacture of coke and refined petroleum products is the difference between a helpful list and a statistical yearbook. They are already translated, so they cost nothing. (Education is in both; it is offered once.)What the standard buys beyond coverage is
Industry.code: a name that matches a division carries it, so a report (#56) can say 62 to an employment office that thinks in NACE while the person goes on reading their own word. The code follows the name rather than sitting beside it — rename an industry to a division and it gains that code; rename it away and it loses it. One invariant, no way for the two to disagree.Existing rows
Untouched, and tested for it: the migration contains no
RunPython. It adds a column and widensnamefrom 60 to 160, because sixty is generous for a word somebody types and too short for Computing infrastructure, data processing, hosting and other information service activities (92). A code arrives when a name is saved that matches a division, never retroactively — a migration that went looking for codes to attach would be this project deciding what somebody meant.Also
tests/test_nace.py, 23 tests. Suite 4353 passed, 29 skipped; browser suite 54 passed.