Page MenuHomec4science

clean_data.py
No OneTemporary

File Metadata

Created
Sat, Jul 5, 15:09

clean_data.py

#!/usr/bin/env python
# coding: utf-8
import pandas as pd
import numpy as np
####################################
# BEGIN OF PROCESS PV_installations#
####################################
def remove_useless_lines_from_PV_installations(PV_installations):
PV_installations.drop(PV_installations[PV_installations["Anlage_Energieträger # Source d'énergie du dispositif"] != "Photovoltaik"].index, inplace = True)
def remove_useless_cols_from_PV_installations(PV_installations):
labels = ["Anmeldedatum # Date de déclaration"]
labels.append("Anmeldedatum # Date de déclaration")
labels.append("Anlage_Inbetriebnahme # Mise en service de l'installation")
labels.append("Anlage_Vertragsende # Fin du contrat de l'installation")
labels.append("Anlage_Strasse")
labels.append("Anlage_PLZ # Code postal de l'installation")
labels.append("Anlage_Kanton # Canton")
labels.append("Produzent_Firma # Firme(Société) de production")
labels.append("Produzent_Anrede # Titre (M.,Mme.) du producteur")
labels.append("Produzent_Name # Nom du producteur")
labels.append("Produzent_Vorname # Prénom du producteur")
labels.append("Anlage_Energieträger # Source d'énergie du dispositif")
labels.append("Leistung [kW] # Puissance")
PV_installations.drop(columns = labels, inplace = True)
def split_columns_from_PV_installations(pv_installations):
pv_installations['Angebaute Anlage'] = pv_installations['Anlagentyp # Type de dispositif']
pv_installations['Freistehende Anlage'] = pv_installations['Anlagentyp # Type de dispositif']
pv_installations['Integrierte Anlage'] = pv_installations['Anlagentyp # Type de dispositif']
pv_installations.rename(columns={'Anlagentyp # Type de dispositif': 'Total Anlage'}, inplace=True )
pv_installations['Angebaute Anlage'].replace({'Angebaute Anlage':1,'Freistehende Anlage':0,'Integrierte Anlage':0},inplace=True)
pv_installations['Freistehende Anlage'].replace({'Angebaute Anlage':0,'Freistehende Anlage':1,'Integrierte Anlage':0},inplace=True)
pv_installations['Integrierte Anlage'].replace({'Angebaute Anlage':0,'Freistehende Anlage':0,'Integrierte Anlage':1},inplace=True)
pv_installations['Total Anlage'].replace({'Angebaute Anlage':1,'Freistehende Anlage':1,'Integrierte Anlage':1},inplace=True)
pv_installations['natürliche Personen'] = pv_installations['Anlage_Projekt-Bezeichnung # Désignation du projet du dispositif']
pv_installations.rename(columns={"Anlage_Projekt-Bezeichnung # Désignation du projet du dispositif": "juristische Personen"}, inplace=True )
pv_installations['natürliche Personen'] = (pv_installations['natürliche Personen'] == 'natürliche Person').astype(int)
pv_installations['juristische Personen'] = (pv_installations['juristische Personen'] != 'natürliche Person').astype(int)
def group_PV_installations_by_communes(pv_installations):
return pv_installations.groupby('Anlage_Ort # Emplacement de installation').sum(inplace = True)
def process_PV_installations(pv_installations):
remove_useless_lines_from_PV_installations(pv_installations)
remove_useless_cols_from_PV_installations(pv_installations)#must be called after remove_useless_lines
split_columns_from_PV_installations(pv_installations)
return group_PV_installations_by_communes(pv_installations)#cannot do groupeby inplace, need to return
# END OF PROCESS PV_installations
################################################
# BEGIN OF PROCESS PV_annual_potential_communes#
################################################
def unify_communes_column_name_of_PV_annual_potential_communes(PV_annual_potential_communes):
PV_annual_potential_communes.rename(columns={'NAME': "Anlage_Ort # Emplacement de installation"}, inplace=True )
def remove_useless_cols_from_PV_communes_annual(PV_annual_potential_communes):
labels = ["BFS_NUMMER # NUMERO OFS"]
#labels.append("PV_per_cap")
labels.append("EINWOHNERZ # POPULATION")
labels.append("REVISION_J")
PV_annual_potential_communes.drop(columns = labels, inplace = True)
def remove_nan_rows(PV_annual_potential_communes):
PV_annual_potential_communes.dropna(inplace = True)
def process_PV_annual_potential_communes(PV_annual_potential_communes):
unify_communes_column_name_of_PV_annual_potential_communes(PV_annual_potential_communes)
remove_useless_cols_from_PV_communes_annual(PV_annual_potential_communes)
remove_nan_rows(PV_annual_potential_communes)
# END OF PROCESS PV_annual_potential_communes
#####################################
# BEGIN OF PROCESS electricity_price#
#####################################
# Communes-Company Relation
# -------------------------
def unify_communes_column_name_of_communes_company_relation(communes_company_relation):
communes_company_relation.rename(columns={'Gemeinde': "Anlage_Ort # Emplacement de installation"}, inplace=True )
communes_company_relation.rename(columns={'Name': "Netzbetreiber # Gestionnaires de reseau de distribution"}, inplace=True )
def remove_useless_cols_from_communes_company_relation(communes_company_relation):
labels = ["Adresse"]
labels.append("Adresszusatz")
labels.append("PLZ")
labels.append("Ort")
labels.append("Gde-Nr.")
labels.append("PLZ.1")
labels.append("Kanton")
communes_company_relation.drop(columns = labels, inplace = True)
def process_communes_company_relation(communes_company_relation):
unify_communes_column_name_of_communes_company_relation(communes_company_relation)
remove_useless_cols_from_communes_company_relation(communes_company_relation)
communes_company_relation.drop_duplicates(inplace=True)
# Electricity Price
# -----------------
# - keep h4, c2, c5 because we follow the paper:
# "H4-catogery households
# with an annual electricity demand of 4.5 MWh/year (or approximately
# with 5 rooms, an electric stove, a tumbler, and without
# electric heating), C2-category small commercial business with the
# demand of 30 MWh/year and the maximum power load of 15 kW,
# and C5-category large industry with the demand of 500MWh/year,
# maximum load of 150 kW, medium voltage, and own transformer
# station."
def remove_useless_lines_from_electricity_price(electricity_price):
condictionH4 = electricity_price["Kategorie"] != "H4"
condictionC2 = electricity_price["Kategorie"] != "C2"
condictionC5 = electricity_price["Kategorie"] != "C5"
electricity_price.drop(electricity_price[np.logical_and(np.logical_and(condictionH4, condictionC2), condictionC5)].index, inplace = True)
def remove_useless_cols_from_electricity_price(electricity_price):
labels = ["ID"]
labels.append("VSE-ID # AES-ID")
labels.append("Netznutzung # l'utilisation du réseau")
labels.append("Energie")
labels.append("Abgabe # Distribution")
labels.append("KEV # secteur de distribution de l'énergie")
electricity_price.drop(columns = labels, inplace = True)
def rework_columns_from_electricity_price(electricity_price):
electricity_price['H4'] = electricity_price['Kategorie']
electricity_price['C2'] = electricity_price['Kategorie']
electricity_price.rename(columns={'Kategorie': 'C5'}, inplace=True )
electricity_price['H4'].replace({'H4':1,'C2':0,'C5':0},inplace=True)
electricity_price['C2'].replace({'H4':0,'C2':1,'C5':0},inplace=True)
electricity_price['C5'].replace({'H4':0,'C2':0,'C5':1},inplace=True)
electricity_price['H4'] = electricity_price['H4']*electricity_price['Total exkl. MWST # Total hors TVA']
electricity_price['C2'] = electricity_price['C2']*electricity_price['Total exkl. MWST # Total hors TVA']
electricity_price['C5'] = electricity_price['C5']*electricity_price['Total exkl. MWST # Total hors TVA']
labels = ["Total exkl. MWST # Total hors TVA"]
electricity_price.drop(columns = labels, inplace = True)
def group_electricity_price(electricity_price):
return electricity_price.groupby('Netzbetreiber # Gestionnaires de reseau de distribution').mean().reset_index()
def process_electricity_price(electricity_price):
#order matter
remove_useless_lines_from_electricity_price(electricity_price)
remove_useless_cols_from_electricity_price(electricity_price)
rework_columns_from_electricity_price(electricity_price)
return group_electricity_price(electricity_price)
# Merge and Save
# --------------
def merge_electricity_price_with_communes_company_relation(electricity_price, communes_company_relation):
merged = pd.merge(electricity_price, communes_company_relation, on="Netzbetreiber # Gestionnaires de reseau de distribution", how='inner')
merged.drop(columns = ['Netzbetreiber # Gestionnaires de reseau de distribution'], inplace = True)
return merged
# END OF PROCESS electricity_price
##################################
# BEGIN OF PROCESS Socio_economic#
##################################
def remove_features_in_socio_economic_2016_not_in_17_18(socio_economic_2016):
list_to_remove = ['Partis politiques en % (élections au Conseil national): Autres',
'Infractions en ‰ de la population totale: selon le Code pénal (CP)',
'Infractions en ‰ de la population totale: selon la Loi sur les stupéfiants et les produits psychotropes (LStup)',
'Infractions en ‰ de la population totale: selon la Loi sur les étrangers (LEtr)']
socio_economic_2016.drop(columns = list_to_remove, inplace = True)
# for unknown values x in file socio-eco 2018
# for economy part : remove the x's by computing a simple 3 way rule ... only for 2018, don't know why !
def special_process_on_socio_economic_2018(socio_economic_2018):
to_be_replace_primaire = pd.DataFrame([x == 'X' for x in socio_economic_2018['Economie: Secteur primaire']]).astype(int)
to_be_replace_secondaire = pd.DataFrame([x == 'X' for x in socio_economic_2018['Economie: Secteur secondaire']]).astype(int)
to_be_replace_tertiaire = pd.DataFrame([x == 'X' for x in socio_economic_2018['Economie: Secteur tertiaire']]).astype(int)
#
to_be_replace_primaire1 = pd.DataFrame([x == 'X' for x in socio_economic_2018['Economie: Secteur primaire.1']]).astype(int)
to_be_replace_secondaire1 = pd.DataFrame([x == 'X' for x in socio_economic_2018['Economie: Secteur secondaire.1']]).astype(int)
to_be_replace_tertiaire1 = pd.DataFrame([x == 'X' for x in socio_economic_2018['Economie: Secteur tertiaire.1']]).astype(int)
socio_economic_2018['Economie: Emplois total'] = socio_economic_2018['Economie: Emplois total'].apply(lambda x : 0 if x == 'X' else x).astype(float)
socio_economic_2018['Economie: Secteur primaire'] = socio_economic_2018['Economie: Secteur primaire'].apply(lambda x : 0 if x == 'X' else x).astype(float)
socio_economic_2018['Economie: Secteur secondaire'] = socio_economic_2018['Economie: Secteur secondaire'].apply(lambda x : 0 if x == 'X' else x).astype(float)
socio_economic_2018['Economie: Secteur tertiaire'] = socio_economic_2018['Economie: Secteur tertiaire'].apply(lambda x : 0 if x == 'X' else x).astype(float)
#
socio_economic_2018['Economie: Etablissements total'] = socio_economic_2018['Economie: Etablissements total'].apply(lambda x : 0 if x == 'X' else x).astype(float)
socio_economic_2018['Economie: Secteur primaire.1'] = socio_economic_2018['Economie: Secteur primaire.1'].apply(lambda x : 0 if x == 'X' else x).astype(float)
socio_economic_2018['Economie: Secteur secondaire.1'] = socio_economic_2018['Economie: Secteur secondaire.1'].apply(lambda x : 0 if x == 'X' else x).astype(float)
socio_economic_2018['Economie: Secteur tertiaire.1'] = socio_economic_2018['Economie: Secteur tertiaire.1'].apply(lambda x : 0 if x == 'X' else x).astype(float)
correct_primaire = socio_economic_2018['Economie: Emplois total'] -socio_economic_2018['Economie: Secteur secondaire'] - socio_economic_2018['Economie: Secteur tertiaire']
correct_secondaire = socio_economic_2018['Economie: Emplois total'] -socio_economic_2018['Economie: Secteur primaire'] - socio_economic_2018['Economie: Secteur tertiaire']
correct_tertiaire = socio_economic_2018['Economie: Emplois total'] -socio_economic_2018['Economie: Secteur primaire'] - socio_economic_2018['Economie: Secteur secondaire']
#
correct_primaire1 = socio_economic_2018['Economie: Etablissements total'] -socio_economic_2018['Economie: Secteur secondaire.1'] - socio_economic_2018['Economie: Secteur tertiaire.1']
correct_secondaire1 = socio_economic_2018['Economie: Etablissements total'] -socio_economic_2018['Economie: Secteur primaire.1'] - socio_economic_2018['Economie: Secteur tertiaire.1']
correct_tertiaire1 = socio_economic_2018['Economie: Etablissements total'] -socio_economic_2018['Economie: Secteur primaire.1'] - socio_economic_2018['Economie: Secteur secondaire.1']
correct_primaire = pd.DataFrame(to_be_replace_primaire[0].values*correct_primaire.values, columns=to_be_replace_primaire.columns)
correct_secondaire = pd.DataFrame(to_be_replace_secondaire[0].values*correct_secondaire.values, columns=to_be_replace_primaire.columns)
correct_tertiaire = pd.DataFrame(to_be_replace_tertiaire[0].values*correct_tertiaire.values, columns=to_be_replace_primaire.columns)
#
correct_primaire1 = pd.DataFrame(to_be_replace_primaire1[0].values*correct_primaire1.values, columns=to_be_replace_primaire1.columns)
correct_secondaire1 = pd.DataFrame(to_be_replace_secondaire1[0].values*correct_secondaire1.values, columns=to_be_replace_primaire1.columns)
correct_tertiaire1 = pd.DataFrame(to_be_replace_tertiaire1[0].values*correct_tertiaire1.values, columns=to_be_replace_primaire1.columns)
socio_economic_2018['Economie: Secteur primaire'] = pd.DataFrame(socio_economic_2018['Economie: Secteur primaire'].values + correct_primaire[0].values, columns=['Economie: Secteur primaire']).values
socio_economic_2018['Economie: Secteur secondaire'] = pd.DataFrame(socio_economic_2018['Economie: Secteur secondaire'].values + correct_secondaire[0].values, columns=['Economie: Secteur secondaire']).values
socio_economic_2018['Economie: Secteur tertiaire'] = pd.DataFrame(socio_economic_2018['Economie: Secteur tertiaire'].values + correct_tertiaire[0].values, columns=['Economie: Secteur tertiaire']).values
#
socio_economic_2018['Economie: Secteur primaire.1'] = pd.DataFrame(socio_economic_2018['Economie: Secteur primaire.1'].values + correct_primaire1[0].values, columns=['Economie: Secteur primaire.1']).values
socio_economic_2018['Economie: Secteur secondaire.1'] = pd.DataFrame(socio_economic_2018['Economie: Secteur secondaire.1'].values + correct_secondaire1[0].values, columns=['Economie: Secteur secondaire.1']).values
socio_economic_2018['Economie: Secteur tertiaire.1'] = pd.DataFrame(socio_economic_2018['Economie: Secteur tertiaire.1'].values + correct_tertiaire1[0].values, columns=['Economie: Secteur tertiaire.1']).values
socio_economic_2018["Protection sociale: Taux d'aide sociale"] = socio_economic_2018["Protection sociale: Taux d'aide sociale"].astype(float)
def unify_communes_column_name_of_socio_economic(socio_economic):
socio_economic.rename(columns={'Commune': "Anlage_Ort # Emplacement de installation"}, inplace=True )
def remove_useless_cols_from_socio_economic(socio_economic):
labels = ["Code commune"]
labels.append("Population: Variation en %")
labels.append("Surface: Variation en ha")
socio_economic.drop(columns = labels, inplace = True)
def replace_non_val_by_national_value(socio_economic):
list_of_replacable_cols = ["Population: Densité de la population par km²",
"Population: Etrangers en %",
"Répartition par âge en %: 0-19 ans",
"Répartition par âge en %: 20-64 ans", "Répartition par âge en %: 65 ans ou plus",
"Mouvement de la population (en ‰): Taux brut de nuptialité",
"Mouvement de la population (en ‰): Taux brut de divortialité",
"Mouvement de la population (en ‰): Taux brut de natalité", "Mouvement de la population (en ‰): Taux brut de mortalité",
"Ménage: Taille moyenne des ménages en personnes", "Surface: Surfaces d'habitat et d'infrastructure en %",
"Surface: Surface agricole en %", "Surface: Surface boisée en %", "Surface: Surface improductive en %",
"Constructions et logements: Taux de logements vacants", "Constructions et logements: Nouveaux logements construits pour 1000 habitants",
"Protection sociale: Taux d'aide sociale", "Partis politiques en % (élections au Conseil national): PLR 2)",
"Partis politiques en % (élections au Conseil national): PDC","Partis politiques en % (élections au Conseil national): PS",
"Partis politiques en % (élections au Conseil national): UDC", "Partis politiques en % (élections au Conseil national): PEV/PCS",
"Partis politiques en % (élections au Conseil national): PVL", "Partis politiques en % (élections au Conseil national): PBD",
"Partis politiques en % (élections au Conseil national): PST/Sol.", "Partis politiques en % (élections au Conseil national): PES",
"Partis politiques en % (élections au Conseil national): Petits partis de droite"
]
bad = socio_economic.apply(lambda x: pd.to_numeric(x, errors='coerce'))
Swiss_stats = socio_economic.iloc[0,:]
for feature in list_of_replacable_cols:
socio_economic[feature].iloc[np.isnan(np.array(bad[feature]))] = Swiss_stats[feature]
def convert_columns_object (socio_economic) :
socio_economic["Partis politiques en % (élections au Conseil national): PLR 2)"] = socio_economic["Partis politiques en % (élections au Conseil national): PLR 2)"].astype(float)
socio_economic["Partis politiques en % (élections au Conseil national): PS"] = socio_economic["Partis politiques en % (élections au Conseil national): PS"].astype(float)
socio_economic["Partis politiques en % (élections au Conseil national): UDC"] = socio_economic["Partis politiques en % (élections au Conseil national): UDC"].astype(float)
socio_economic["Partis politiques en % (élections au Conseil national): PEV/PCS"] = socio_economic["Partis politiques en % (élections au Conseil national): PEV/PCS"].astype(float)
socio_economic["Partis politiques en % (élections au Conseil national): PVL"] = socio_economic["Partis politiques en % (élections au Conseil national): PVL"].astype(float)
socio_economic["Partis politiques en % (élections au Conseil national): PBD"] = socio_economic["Partis politiques en % (élections au Conseil national): PBD"].astype(float)
socio_economic["Partis politiques en % (élections au Conseil national): PST/Sol."] = socio_economic["Partis politiques en % (élections au Conseil national): PST/Sol."].astype(float)
socio_economic["Partis politiques en % (élections au Conseil national): PES"] = socio_economic["Partis politiques en % (élections au Conseil national): PES"].astype(float)
socio_economic["Partis politiques en % (élections au Conseil national): Petits partis de droite"] = socio_economic["Partis politiques en % (élections au Conseil national): Petits partis de droite"].astype(float)
def process_socio_economic(socio_economic):
unify_communes_column_name_of_socio_economic(socio_economic)
remove_useless_cols_from_socio_economic(socio_economic)
replace_non_val_by_national_value(socio_economic)
convert_columns_object(socio_economic)
def drop_rows_bigger_than(df, index):
df.drop(df.index[np.where(df.index > index)[0]], inplace = True)
# END OF PROCESS Socio_economic
# -----------------------------
#########################
# BEGIN OF PROCESS Merge#
#########################
def normalize_produktion_per_1000(merge):
merge["Produktion [kWh]**"] = merge["Produktion [kWh]**"] * 1000 / merge["Population: Habitants"]
def info_df(df):
df_no_ort = df.drop(columns = ['Anlage_Ort # Emplacement de installation'])
nans = np.isnan(df_no_ort.apply(lambda x: pd.to_numeric(x, errors='coerce')))
if(np.all(np.invert(nans))):
print("All values are set.")
else:
print("There is {} unset values.".format(np.sum(nans)))
print("There is {} data points".format(df['Anlage_Ort # Emplacement de installation'].size))
# END OF PROCESS Merge
# ----------------------
def run_data_cleaning():
print("Begin processing of PV Installations...")
# read PV_installations
PV_installations_2016 = pd.read_excel( "./raw_data/PV_installations/8650_2016.xlsx" )
PV_installations_2017 = pd.read_excel( "./raw_data/PV_installations/9310_2017.xlsx" )
PV_installations_2018 = pd.read_excel( "./raw_data/PV_installations/9669_2018.xlsx" )
#process pv_installations
PV_installations_2016 = process_PV_installations(PV_installations_2016)
PV_installations_2017 = process_PV_installations(PV_installations_2017)
PV_installations_2018 = process_PV_installations(PV_installations_2018)
print("Processing of PV Installations done!")
print("Begin processing of PV Annual Potential...")
# read PV_annual_potential_communes
PV_annual_potential_communes = pd.read_csv("./raw_data/PV_annual_potential_communes/PV_annual_potential_communes.csv")
#process PV_annual_potential_communes
process_PV_annual_potential_communes(PV_annual_potential_communes)
print("Processing of PV Annual Potential done!")
print("Begin processing of Electricity Price...")
# read communes_company_relation
communes_company_relation = pd.read_excel("./raw_data/electricity_price/communes_company_relation_2019.xlsx", skiprows=2)
#process electricity_price
process_communes_company_relation(communes_company_relation)
# read electricity price
electricity_price_2016 = pd.read_excel("./raw_data/electricity_price/Données brutes des tarifs 2016 (état au 11.02.2016).xlsx")
electricity_price_2017 = pd.read_excel("./raw_data/electricity_price/Rohdaten_Tarife_2017 (Stand 01.02.2017).xlsx", skiprows=1)
electricity_price_2018 = pd.read_excel("./raw_data/electricity_price/Rohdaten_Tarife_2018 (Stand 18.10.2018).xlsx", skiprows=1)
#process electricity_price
electricity_price_2016 = process_electricity_price(electricity_price_2016)
electricity_price_2017 = process_electricity_price(electricity_price_2017)
electricity_price_2018 = process_electricity_price(electricity_price_2018)
e_price_2016 = merge_electricity_price_with_communes_company_relation(electricity_price_2016, communes_company_relation)
e_price_2017 = merge_electricity_price_with_communes_company_relation(electricity_price_2017, communes_company_relation)
e_price_2018 = merge_electricity_price_with_communes_company_relation(electricity_price_2018, communes_company_relation)
print("Processing of Electricity Price done!")
print("Begin processing of Socio-Economic...")
# read socio_economic - use only once
socio_economic_2016 = pd.read_excel("./raw_data/socio_economic/socio_economic_2016.xlsx")
socio_economic_2017 = pd.read_excel("./raw_data/socio_economic/socio_economic_2017.xlsx")
socio_economic_2018 = pd.read_excel("./raw_data/socio_economic/socio_economic_2018.xlsx")
#process socio_economic
process_socio_economic(socio_economic_2016)
process_socio_economic(socio_economic_2017)
process_socio_economic(socio_economic_2018)
remove_features_in_socio_economic_2016_not_in_17_18(socio_economic_2016)
special_process_on_socio_economic_2018(socio_economic_2018)
#removes extra rows
drop_rows_bigger_than(socio_economic_2016, 2324)
drop_rows_bigger_than(socio_economic_2017, 2289)
drop_rows_bigger_than(socio_economic_2018, 2240)
print("Processing of Socio-Economic done!")
print("Merging of the data engaged...")
# merge PV installation with socio economic
merge_2016 = pd.merge(PV_installations_2016, socio_economic_2016, on="Anlage_Ort # Emplacement de installation", how='inner')
merge_2017 = pd.merge(PV_installations_2017, socio_economic_2017, on="Anlage_Ort # Emplacement de installation", how='inner')
merge_2018 = pd.merge(PV_installations_2018, socio_economic_2018, on="Anlage_Ort # Emplacement de installation", how='inner')
# merge PV installation/socio economic with annual potential per commune
merge_2016 = pd.merge(merge_2016, PV_annual_potential_communes, on="Anlage_Ort # Emplacement de installation", how='inner')
merge_2017 = pd.merge(merge_2017, PV_annual_potential_communes, on="Anlage_Ort # Emplacement de installation", how='inner')
merge_2018 = pd.merge(merge_2018, PV_annual_potential_communes, on="Anlage_Ort # Emplacement de installation", how='inner')
# merge PV installation/socio economic/annual potential per commune with electricity price
merge_2016 = pd.merge(merge_2016, e_price_2016, on="Anlage_Ort # Emplacement de installation", how='inner')
merge_2017 = pd.merge(merge_2017, e_price_2017, on="Anlage_Ort # Emplacement de installation", how='inner')
merge_2018 = pd.merge(merge_2018, e_price_2018, on="Anlage_Ort # Emplacement de installation", how='inner')
# multiple companies for single communes? ===>>> average for now
merge_2016 = merge_2016.groupby("Anlage_Ort # Emplacement de installation").mean().reset_index()
merge_2017 = merge_2017.groupby("Anlage_Ort # Emplacement de installation").mean().reset_index()
merge_2018 = merge_2018.groupby("Anlage_Ort # Emplacement de installation").mean().reset_index()
normalize_produktion_per_1000(merge_2016)
normalize_produktion_per_1000(merge_2017)
normalize_produktion_per_1000(merge_2018)
# save as csv
merge_2016.to_csv("merged_2016.csv", index=False)
merge_2017.to_csv("merged_2017.csv", index=False)
merge_2018.to_csv("merged_2018.csv", index=False)
print("Merge succesful! Merged files save under: {}, {} and {}".format("merged_2016.csv", "merged_2017.csv", "merged_2018.csv"))
print("merge 2016:")
info_df(merge_2016)
print("")
print("merge 2017:")
info_df(merge_2017)
print("")
print("merge 2018:")
info_df(merge_2018)
if __name__ == '__main__':
run_data_cleaning()

Event Timeline