<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Functies van podiumkunstenaars
Welke rollen nemen podiumkunstenaars op in hun producties? Een eerste blik op de rollen op basis van producties sinds 2010.
Eerst een aantal libraries om de data op te halen en te verwerken.
Step1:  We moeten verbinding maken met de databank.
Step3:  De SQL om de gegevens op te halen is niet zo moeilijk
Step4:  Even de gegevens binnenhalen en in een pandas dataframe stoppen.
Step5:  Een kleine functie om de functies van een persoon op te halen en het totaal.
Step6:  Loopen doorheen alle personen.
Step7:  Het resultaat ziet er als volgt uit
Step8:  Als voorbeeld even de persoon met het meeste aantal functies.
Step9:  Zelf verder analyseren? Download de excel file
<ASSISTANT_TASK:>
Python Code:
import psycopg2
from configparser import ConfigParser
from pandas import DataFrame
from collections import Counter
Explanation: Functies van podiumkunstenaars
Welke rollen nemen podiumkunstenaars op in hun producties? Een eerste blik op de rollen op basis van producties sinds 2010.
Eerst een aantal libraries om de data op te halen en te verwerken.
End of explanation
cfg = ConfigParser()
cfg.read("db.cfg")
knst = psycopg2.connect(host=cfg['db']['host'], port=cfg['db']['port'],
                        database=cfg['db']['db'], user=cfg['db']['user'],
                        password=cfg['db']['pwd'])
knst.set_client_encoding('UTF-8')
cur = knst.cursor()
Explanation: We moeten verbinding maken met de databank.
End of explanation
sql = 
SELECT pr.id, f.name_nl, pe.full_name
FROM production.productions pr
JOIN production.seasons s
ON pr.season_id = s.id
JOIN production.relationships r
ON pr.id = r.production_id
JOIN production.people pe
ON r.person_id = pe.id
JOIN production.functions f
ON r.function_id = f.id
WHERE s.start_year >= 2010
Explanation: De SQL om de gegevens op te halen is niet zo moeilijk:
End of explanation
cur.execute(sql)
os = cur.fetchall()
df = DataFrame([o for o in os], columns=["productie_id", "functie", "persoon"])
Explanation: Even de gegevens binnenhalen en in een pandas dataframe stoppen.
End of explanation
def get_counted_functions_for_person(persoon):
    functies = Counter(df[df["persoon"] == persoon]["functie"]).most_common()
    totaal_aantal_functies = sum([f[1] for f in functies])
    functies_percentage = [(f[0], f[1] / float(totaal_aantal_functies)) for f in functies]
    return functies_percentage, totaal_aantal_functies
Explanation: Een kleine functie om de functies van een persoon op te halen en het totaal.
End of explanation
lines = []
for persoon in set(df["persoon"].values):
    functies, totaal = get_counted_functions_for_person(persoon)
    for f in functies:
        lijn = [persoon, totaal, f[0], f[1]]
        lines.append(lijn)
df_functies = DataFrame(lines, columns=["persoon", "totaal aantal functies", "functie", "percentage"])
Explanation: Loopen doorheen alle personen.
End of explanation
df_functies.head()
Explanation: Het resultaat ziet er als volgt uit:
End of explanation
df_functies[df_functies["totaal aantal functies"] == max(df_functies["totaal aantal functies"])]
Explanation: Als voorbeeld even de persoon met het meeste aantal functies.
End of explanation
df_functies.to_excel("functies.xlsx")
Explanation: Zelf verder analyseren? Download de excel file:
End of explanation
<END_TASK>