Opening up the French
tax software
http://www.openfisca.fr/
https://framagit.org/openfisca
https://github.com/openfisca
@OpenFisca
Michel Blancard
michel.blancard@data.gouv.fr
PyData – June 14, 2016
I - What is OpenFisca?
Legislation
It's growing!
In French (that most French
people don't understand),
not in python!
Notices
Bulletin Officiel des Finances
Publiques-Impôts (BOFiP)
Décrets
How to compute the French tax and benefits?
It's complex!
4
How to compute the French tax and benefits?
It's complex, because the reality is complex.
Individuals
Housing
Family
Taxation
How to compute the French tax and benefits?
OpenFisca aims to :
●
cover both tax and benefits policies
●
be efficient
●
one family simulation
●
simulation on the whole country
●
be understandable
●
be open source
What is OpenFisca?
OpenFisca is used for :
●
improving readability
to the public
●
designing reforms
●
simulating one's
situation
●
understanding the tax
and social system
mes-aides.gouv.fr
Why compute the French tax and benefits?
OpenFisca is used for :
●
improving readability
to the public
●
designing reforms
●
simulating one's
situation
●
understanding the tax
and social system
How to compute the French taxes ?
tax difference
between/after marriage
OpenFisca is used for :
●
improving readability
to the public
●
designing reforms
●
simulating one's
situation
●
understanding the tax
and social system
How to compute the French taxes ?
personal simulation
ui.openfisca.fr
OpenFisca is used for :
●
improving readability
to the public
●
designing reforms
●
simulating one's
situation
●
understanding the
tax and social system
How to compute the French taxes ?
tax percentage as a
function of income
The history of OpenFisca
2011 2014 2016
2 economists
python scripts
with QT frontend
2 developers
join the project
tax calculator of the
tax administration
released
increasing
demand for an
open simulator
OpenFisca
reaches the sky
and beyond...
(see later)
France Stratégie
France Stratégie
IPP
Etalab
II – The French tax
calculator
●
direct demand (aug 2014)
●
6 months later : seisine of the CADA
●
2 months later : positive notice from the CADA
●
2 months later : beginning of judicial proceedings
●
10 months later : release of the source code !
●
10 months later + ε : the court issues a positive decision
The quest for the source code
(want to speed up the process ? → ouvre-boite.org)
●
April 1-2, 2016 at the Mozilla Fundation
●
presence of 3 Ministers
●
developers, civil servants, economists,
citizens... all sitting at the same table !
A hackathon to celebrate :
CodeImpôt
Preparation by Etalab and DGFiP :
●
understand the Domain Specific
Language (DSL) : M
●
parse using Clean PEG (Igor
Dejanović's Arpeggio)
●
simplify the Abstract Syntax Tree
(AST)
→ Direct Acyclic Graph of trees
Preparation
regle 10214:
application : iliad,batch ;
CSGAC = max(0,CSGC ­ CICSG);
CSNET = max(0,(CSGC + PCSG ­ 
CICSG ­ CSGIM)) ;
RDSAC = max(0,RDSC ­ CIRDS);
RDNET = max(0,(RDSC + PRDS ­ 
CIRDS ­ CRDSIM));
PRSNET = max(0,(PRSC + PPRS ­ 
CIPRS ­ PRSPROV))  ;
CVNAC  =  CVNSALC;
CVNNET  =  max(0,(CVNSALC + PCVN 
­ COD8YT));
REGVNET  = BREGV + PREGV ;
CDISAC = CDISC ;
CDISNET = max(0,(CDISC + PCDIS ­ 
CDISPROV))  ;
CGLOAAC = CGLOA ;
CGLOANET = max(0,(CGLOA + PGLOA­
COD8YL ))  ;
Preparation by Etalab and DGFiP :
●
understand the Domain Specific
Language (DSL) : M
●
parse using Clean PEG (Igor
Dejanović's Arpeggio)
●
simplify the Abstract Syntax Tree
(AST)
→ Direct Acyclic Graph of trees
Preparation
comment = r'#.*'
symbol = r'w+'
symbol_enumeration = symbol 
("," symbol)*
float = r'd+.d+'
integer = r'd+'
string = '"' r'[^"]*' '"'
interval = symbol ".." symbol
brackets = "[" symbol "]"
...
Preparation by Etalab and DGFiP :
●
understand the Domain Specific
Language (DSL) : M
●
parse using Clean PEG (Igor
Dejanović's Arpeggio)
●
simplify the Abstract Syntax Tree
(AST)
→ Direct Acyclic Graph of trees
Preparation
Python object / JSON
●
Directed Acyclic Graph (DAG)
traversal (400ms)
●
Arithmetic computations at each
node (0.4ms in total for a single
simulation)
During the hackathon
Efficient computation
vs
400ms + 0.4ms = 400.4ms
for 1 simulation
400ms + 10.000x0.4ms = 4.4s
for 10.000 simulation
Long live Numpy and vectorized computations !
During the hackathon
Visualise
During the hackathon
Simplify the graph for common fiscal situations
During the hackathon
Transpile to other languages
var functionsMapping = {
    '+':function sumTab(tabValeurs){
         return tabValeurs.reduce(function(a,b){
            return a+b;
        });
    },
    '*':function mulTab(tabValeurs){
        return tabValeurs.reduce(function(a,b){
            return a*b;
        });
    },
    . . .
Step 1 : Define an implementation of the operations
During the hackathon
Transpile to other languages
function computeFormula(node, values){
    if(node.nodetype ==='symbol'){
        var value = values[node.name];
        if(typeof(value)==='undefined'){
            value = 0;
        };
        return value
    }else if(node.nodetype ==='float'){
        return node.value;
    }else if(node.nodetype==='call'){
        var name = node.name;
        var func = functionsMapping[name];
        var args = [];
        for(i in node.args){
            args.push(computeFormula(node.args[i],values));
        }
        return func(args);
    }
}
Step 2 : Code a DAG traversal
III – From code to data
II – The French tax
calculator
Tax rules vs implementation
Rule of least power
different concerns
storage
versioning
editing
speed
simplicity
(technologies
evolve fast)
Python Code
Quality Authority
Parsing the current code
Baron
Redbaron
Astroid Custom python
python → julia
2to3
The future
Tax rules
written in
DSL(s)
Unique internal
graph
representation
Implementation(s)
The glue ? Python ? A functional language ?
Take-away message
Language choice is not definitive !
(if you start with python)
Thank you !
http://www.openfisca.fr/
https://framagit.org/openfisca
https://github.com/openfisca
@OpenFisca
Michel Blancard
michel.blancard@data.gouv.fr
PyData – June 14, 2016
We are hiring !

Opening up the French tax software

  • 1.
    Opening up theFrench tax software http://www.openfisca.fr/ https://framagit.org/openfisca https://github.com/openfisca @OpenFisca Michel Blancard michel.blancard@data.gouv.fr PyData – June 14, 2016
  • 2.
    I - Whatis OpenFisca?
  • 3.
    Legislation It's growing! In French(that most French people don't understand), not in python! Notices Bulletin Officiel des Finances Publiques-Impôts (BOFiP) Décrets How to compute the French tax and benefits?
  • 4.
    It's complex! 4 How tocompute the French tax and benefits?
  • 5.
    It's complex, becausethe reality is complex. Individuals Housing Family Taxation How to compute the French tax and benefits?
  • 6.
    OpenFisca aims to: ● cover both tax and benefits policies ● be efficient ● one family simulation ● simulation on the whole country ● be understandable ● be open source What is OpenFisca?
  • 7.
    OpenFisca is usedfor : ● improving readability to the public ● designing reforms ● simulating one's situation ● understanding the tax and social system mes-aides.gouv.fr Why compute the French tax and benefits?
  • 8.
    OpenFisca is usedfor : ● improving readability to the public ● designing reforms ● simulating one's situation ● understanding the tax and social system How to compute the French taxes ? tax difference between/after marriage
  • 9.
    OpenFisca is usedfor : ● improving readability to the public ● designing reforms ● simulating one's situation ● understanding the tax and social system How to compute the French taxes ? personal simulation ui.openfisca.fr
  • 10.
    OpenFisca is usedfor : ● improving readability to the public ● designing reforms ● simulating one's situation ● understanding the tax and social system How to compute the French taxes ? tax percentage as a function of income
  • 11.
    The history ofOpenFisca 2011 2014 2016 2 economists python scripts with QT frontend 2 developers join the project tax calculator of the tax administration released increasing demand for an open simulator OpenFisca reaches the sky and beyond... (see later) France Stratégie France Stratégie IPP Etalab
  • 12.
    II – TheFrench tax calculator
  • 13.
    ● direct demand (aug2014) ● 6 months later : seisine of the CADA ● 2 months later : positive notice from the CADA ● 2 months later : beginning of judicial proceedings ● 10 months later : release of the source code ! ● 10 months later + ε : the court issues a positive decision The quest for the source code (want to speed up the process ? → ouvre-boite.org)
  • 14.
    ● April 1-2, 2016at the Mozilla Fundation ● presence of 3 Ministers ● developers, civil servants, economists, citizens... all sitting at the same table ! A hackathon to celebrate : CodeImpôt
  • 15.
    Preparation by Etalaband DGFiP : ● understand the Domain Specific Language (DSL) : M ● parse using Clean PEG (Igor Dejanović's Arpeggio) ● simplify the Abstract Syntax Tree (AST) → Direct Acyclic Graph of trees Preparation regle 10214: application : iliad,batch ; CSGAC = max(0,CSGC ­ CICSG); CSNET = max(0,(CSGC + PCSG ­  CICSG ­ CSGIM)) ; RDSAC = max(0,RDSC ­ CIRDS); RDNET = max(0,(RDSC + PRDS ­  CIRDS ­ CRDSIM)); PRSNET = max(0,(PRSC + PPRS ­  CIPRS ­ PRSPROV))  ; CVNAC  =  CVNSALC; CVNNET  =  max(0,(CVNSALC + PCVN  ­ COD8YT)); REGVNET  = BREGV + PREGV ; CDISAC = CDISC ; CDISNET = max(0,(CDISC + PCDIS ­  CDISPROV))  ; CGLOAAC = CGLOA ; CGLOANET = max(0,(CGLOA + PGLOA­ COD8YL ))  ;
  • 16.
    Preparation by Etalaband DGFiP : ● understand the Domain Specific Language (DSL) : M ● parse using Clean PEG (Igor Dejanović's Arpeggio) ● simplify the Abstract Syntax Tree (AST) → Direct Acyclic Graph of trees Preparation comment = r'#.*' symbol = r'w+' symbol_enumeration = symbol  ("," symbol)* float = r'd+.d+' integer = r'd+' string = '"' r'[^"]*' '"' interval = symbol ".." symbol brackets = "[" symbol "]" ...
  • 17.
    Preparation by Etalaband DGFiP : ● understand the Domain Specific Language (DSL) : M ● parse using Clean PEG (Igor Dejanović's Arpeggio) ● simplify the Abstract Syntax Tree (AST) → Direct Acyclic Graph of trees Preparation Python object / JSON
  • 18.
    ● Directed Acyclic Graph(DAG) traversal (400ms) ● Arithmetic computations at each node (0.4ms in total for a single simulation) During the hackathon Efficient computation vs 400ms + 0.4ms = 400.4ms for 1 simulation 400ms + 10.000x0.4ms = 4.4s for 10.000 simulation Long live Numpy and vectorized computations !
  • 19.
  • 20.
    During the hackathon Simplifythe graph for common fiscal situations
  • 21.
    During the hackathon Transpileto other languages var functionsMapping = {     '+':function sumTab(tabValeurs){          return tabValeurs.reduce(function(a,b){             return a+b;         });     },     '*':function mulTab(tabValeurs){         return tabValeurs.reduce(function(a,b){             return a*b;         });     },     . . . Step 1 : Define an implementation of the operations
  • 22.
    During the hackathon Transpileto other languages function computeFormula(node, values){     if(node.nodetype ==='symbol'){         var value = values[node.name];         if(typeof(value)==='undefined'){             value = 0;         };         return value     }else if(node.nodetype ==='float'){         return node.value;     }else if(node.nodetype==='call'){         var name = node.name;         var func = functionsMapping[name];         var args = [];         for(i in node.args){             args.push(computeFormula(node.args[i],values));         }         return func(args);     } } Step 2 : Code a DAG traversal
  • 23.
    III – Fromcode to data
  • 24.
    II – TheFrench tax calculator Tax rules vs implementation Rule of least power different concerns storage versioning editing speed simplicity (technologies evolve fast)
  • 25.
    Python Code Quality Authority Parsingthe current code Baron Redbaron Astroid Custom python python → julia 2to3
  • 26.
    The future Tax rules writtenin DSL(s) Unique internal graph representation Implementation(s) The glue ? Python ? A functional language ?
  • 27.
    Take-away message Language choiceis not definitive ! (if you start with python)
  • 28.
    Thank you ! http://www.openfisca.fr/ https://framagit.org/openfisca https://github.com/openfisca @OpenFisca MichelBlancard michel.blancard@data.gouv.fr PyData – June 14, 2016 We are hiring !