Amsterdam, subsidie in beeld

De gemeente Amsterdam biedt een CSV aan die alle subsidies vanaf 2016 bijgehouden wordt. Het subsidie register heeft een handig online register (https://subsidie-feiten.amsterdam.nl). Het register is niet fijn om handmatig door te lopen. Soms is het CSV-bestand kapot en verwacht kennis van de lezer hoe deze correct geïmporteerd kan worden in Excel. Hier onder vind je een werkend Excel bestand, een onlineversie en het Python script hoe het Excel bestand gegenereerd wordt.

Subsidie in Excel bestand

Het excel bestand wordt elke zondagnacht verwerkt en opnieuw geplaatst.
subsidie.xlsx

Subsidie in online Excel bestand (bijgewerkt op 11 juli 2021)

https://1drv.ms/x/s!Ai2Y5igLoiC_jKQl4WrTeHK8bRXyKw?e=x46eVY

Python script

Requirements:
1. Python 3
2. Openpyxl
3. Pandas

import pandas as pd
import os
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows

"""
This script parses a csv file and creates a sheet for each topic.
In this case we fetch a csv file from the City Amsterdam. The csv file
contains all subsidy requests of the city. 

Made by Maikel van Leeuwen <maikel.van.leeuwen@pm.me>
"""

file_location = "subsidie.xlsx"
csv_url = "https://e85bcf2124fb4437b1bc6eb75dfc3abf.objectstore.eu/dcatd/e9c8c1f383ff447a904588b1ab72d7c7"
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
pd.set_option('display.max_rows', None)


def remove_file():
    """
    Remove file if exists and creates a new Xlsx file.
    :return: None
    """
    if os.path.exists(file_location):
        os.remove(file_location)


def list_from_col():
    """
    Creates a list from values from the Column ORGANISATIEONDERDEELD
    :return: list with items of the column ORGANISATIEONDERDEEL
    """
    nan_value = float("NaN")
    aanvrager.replace("", nan_value, inplace=True)
    aanvrager.dropna(subset=["ORGANISATIEONDERDEEL"], inplace=True)

    # dump column 'ORGANISATIEONDERDEEL to list
    col_organisatie = aanvrager['ORGANISATIEONDERDEEL'].tolist()
    # Remove bullshit value
    col_organisatie.remove("--------------------")

    # Remove duplicates
    col_organistatie = list(set(col_organisatie))
    # Sort list
    col_organistatie.sort()

    return col_organistatie


def create_xls():
    """
    Create workbook and sheets
    :return: None
    """
    wb = openpyxl.Workbook()  # Create workbook
    ws1 = wb.active  # Activate sheet
    ws1.title = "Grof"  # Set first sheet title
    for col in column_list:
        wb.create_sheet(col)  # Create sheets
    wb.save(filename=file_location)


def fill_xls():
    """
    Fills the first sheet with all values
    :return: None
    """
    wb = openpyxl.load_workbook(filename=file_location)
    ws1 = wb.active
    for r in dataframe_to_rows(aanvrager, index=True, header=True):
        ws1.append(r)
    wb.save(filename=file_location)


def fill_xls_selection(query, sheet):
    """
    Fills a sheet per topic from the list column_list
    :param query: panda query results
    :param sheet: The to be selected sheet which will be filled
    :return: None
    """
    wb = openpyxl.load_workbook(filename=file_location)
    sheet = wb[sheet]
    for r in dataframe_to_rows(query, index=True, header=True):
        sheet.append(r)
    wb.save(filename=file_location)


# Subsidie gemeenste Amsterdam
subsidie = pd.read_csv(csv_url,
                       encoding="ISO-8859-1", sep=";", low_memory=False)

aanvrager = subsidie[
    ["SUBSIDIEJAAR", "DOSSIERNUMMER", "REGELINGNAAM", "BELEIDSTERREIN", "ORGANISATIEONDERDEEL", "TYPE_PERIODICITEIT",
     "AANVRAGER", "PROJECT_NAAM", "BEDRAG_AANGEVRAAGD", "BEDRAG_VASTGESTELD"]]

aanvrager = aanvrager.sort_values(by='SUBSIDIEJAAR', ascending=False)

# remove existing file
remove_file()
# Initialize list of column ORGANISATIEONDERDEEL
column_list = list_from_col()
# Create the frame of the workbook
create_xls()
# fill the sheet "grof" of the workbook with all data
fill_xls()
# fill sheet per selected topic
for count, col in enumerate(column_list):
    print("We are at sheet {}".format(col))
    selection = aanvrager.loc[aanvrager["ORGANISATIEONDERDEEL"] == col]
    fill_xls_selection(selection, col)

Leave a Comment