donderdag 29 november 2018

Geopandas en folium

Hoe maak je een colormap

from branca.colormap import linear

colormap = linear.YlGn_09.scale(
    geo_api_df['waarde'].min(),
    geo_api_df['waarde'].max())
print(colormap(5.0))
colormap


Maak een dict met kleuren afhankelijk van de colormap

color_dict = geo_api_df.set_index('code')['waarde'].to_dict()
type(color_dict)
colormap(color_dict['DX21'])
color_dict = {key: colormap(color_dict[key]) for key in color_dict.keys()}


Voeg de kleuren van de color_dict toe aan de geopandas dataframe als kolom

geo_api_df['feature']=geo_api_df['code'].map(color_dict)


Geopandas

import json
import pandas as pd
import geopandas as gpd
import requests
from shapely.geometry import shape
import matplotlib.pyplot as plt
import folium
%matplotlib inline

gebied_api_url = 'https://api.data.amsterdam.nl/gebieden/gebiedsgerichtwerken/'
#buurt_api_url = 'https://api.data.amsterdam.nl/gebieden/buurt/'

resp = requests.get(gebied_api_url)
json_data= requests.get(gebied_api_url).json()


geb_codes = pd.DataFrame(json_data['results']).drop(columns=['_display', '_links', 'dataset'])


geo_api_raw = []
for code in geb_codes['code']:
    geo_api_raw.append(  requests.get(gebied_api_url + code).json())

geo_api_df = pd.DataFrame(geo_api_raw)
geo_api_df.drop(columns=['_display', '_links', 'bbox', 'dataset', 'buurten'], inplace=True)
geo_api_df['geometry'] = geo_api_df['geometrie'].map(shape)
geo_api_df['stadsdeel_code'] = geo_api_df['stadsdeel'].map(lambda f: f['code'])
geo_api_df['stadsdeel_naam'] = geo_api_df['stadsdeel'].map(lambda f: f['naam'])

geo_api_df.drop(columns=['stadsdeel', 'geometrie'], inplace=True)
geo_api_df['waarde']=geo_api_df['code'].str[-1].astype(int)*100

crs = '+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.2369,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +units=m +no_defs'

gebieden_geo=gpd.GeoDataFrame(geo_api_df, crs=crs)


gebieden_geo.plot()


voorbeeld 1

map= folium.Map(location=[52.37, 4.90], tiles='Stamen Terrain', zoom_start=12)
map.add_child(folium.GeoJson(gebieden_geo),popup=)


Voorbeeld 2

map=folium.Map(location=[52.37, 4.90], tiles='Stamen Terrain', zoom_start=12)
map.choropleth(geo_data=gebieden_geo,data=gebieden_geo, columns=['code','waarde'],key_on='feature.properties.name',fill_color='YlGn',
              fill_opacity=10, line_opacity=0.2,threshold_scale=[0, 20, 30, 40, 50, 60],
             legend_name='Participation Rate (%))')
folium.LayerControl().add_to(map)
map

Voorbeeld 3

map=folium.Map(location=[52.37, 4.90], tiles='Stamen Terrain', zoom_start=12)
folium.GeoJson(
    gebieden_geo,
    style_function=lambda feature: {
        'fillColor': '#ffff00',
        'color': 'black',
        'weight': 2,
        'dashArray': '5, 5'
    }
).add_to(map)
map


Voorbeeld 4

map=folium.Map(location=[52.37, 4.90], tiles='Stamen Terrain', zoom_start=12)
folium.GeoJson(
    gebieden_geo,
    style_function=lambda feature: {
        'fillColor': '#ffff00',
        'color': 'black',
        'weight': 2,
        'dashArray': '5, 5'
    }
).add_to(map)
map

woensdag 14 november 2018

json en rest-api

roep rest-api aan

ophalen data


import json
import pandas as pd
import requests
gebied_api_url = 'https://api.data.amsterdam.nl/gebieden/gebiedsgerichtwerken/'
buurt_api_url = 'https://api.data.amsterdam.nl/gebieden/buurt/'
resp = requests.get(gebied_api_url)
json_data= requests.get(gebied_api_url).json()


json_data is nu een DICT object.

==> wil je de keys weten

json_data.keys()
Out[54]: dict_keys(['_links', 'count', 'results'])



haal alleen de key results op en stop in een pandas dataframe

geb_codes = pd.DataFrame(json_data['results'])

Wil je nu weten welke keys (columnamen) er zijn van het dataframe
geb_codes.keys()Out[61]: Index(['_display', '_links', 'code', 'dataset', 'naam'], dtype='object')

Als je van dit pandas object alleen de code en de naam wil hebben dan drop je de andere

geb_codes.drop(columns=['_display', '_links', 'dataset'],inplace=True)

donderdag 25 oktober 2018

BO Data Services lokale variabelen en parameter

You can increase the flexibility and reusability of work flows and data flows by using local and global variables when you design your jobs



Alle reuasable objecten kunnen lokale variabelen hebben

Lokale variabelen kan je naar beneden doorgeven met parameters.

Objecten die lokale variabelen ontvangen moeten parameters definieren

Je moet op 1 nivo erboven de  parameter van een object vullen met een lokale variabele


WF    :    L1
|
|
DF : P1

In de WF moet je call P1=L1 doen; dus je geeft L1 door aan P1

dinsdag 11 september 2018

git

git

Van scratch af aan. Maak in windows een directory.
ga in directory staan en open command box

-  git clone https://git.datapunt.amsterdam.nl/jwagener/mypython.git

er wordt een directory aangemaakt

- cd mypython
- git status

kopieer files naar windows directory
- git add *
- git commit -m "Dit is een test"
- git push origin master

elke ochtend kan je uit master je eigen werkdirecotry verversen met
- git pull




credentials weer op orde brengen
git config credential.helper store

maandag 3 september 2018

excel inlezen en data selecties maken

opmerkingen 

let op dat bij het inlezen van Excel pandas waarschijnlijk automatisch allerlei conversies gaat uitvoeren. dit kan je voorkomen door bijv alles als string in te lezen

dflookup1=xls_file.parse(sheet,skiprows=0,dtype=str) 

je kan daarna altijd nog de datatypes aanpassen

per veld conversie

>>> string conversie naar datetime

 dfin=dfin.astype({'VD_Ingangsdatum': 'datetime64', 'VD_Einddatum': 'datetime64'})

>>> string conversie naar getal


dfjgd2['BEDRAG'] = dfjgd2['BEDRAG'].str.replace(',', '').astype(float)



bij inlexen conversie


Als je enkel bepaalde velden wil interpreteren dan doe je het als volgt

dflookup1=xls_file.parse(sheet,skiprows=0,dtype={'BSN': str,'GEB_PC_HNR':str,'JAAR':str})

Voorbeeldcode


import pandas as pd
import numpy as np

xls_file=pd.ExcelFile('..\\Factuur regels 303-Jgd 01-01-2016 tm 03-09-2018 dd 03-09-2018.xlsx')
dfnew=xls_file.parse('ZorgNed_FactRegl303')

 print(list(dfnew.columns))
lscolsnew = dfnew.columns.values


bjaar2017=dfnew['Factuurregel betrekking op jaar']==2017
bGefactureerd=df2017['Goedkeuren']=='Gefactureerd'
dfSelect=dfnew[bjaar2017 & bGefactureerd]

# Tel rijen: manier 1
rows,columns = dfSelect.shape
print('aantal rijen: ',rows )
# Tel rijen: manier 2
dfSelect['Factuurregel betrekking op jaar'].count()


dfSelect['Bedrag goedgekeurd'].sum()

#bij 1 rechthoekig haakje returned een Series object
dfSelect.groupby("Voorzieningsoort")['Bedrag goedgekeurd'].sum().sort_values()

#bij 2 rechthoekige haakjes wordt een dataframe gereturned
dfSelect.groupby("Voorzieningsoort")[['Bedrag goedgekeurd']].sum().sort_values(by='Bedrag goedgekeurd')

summarize aggregate and grouping

basis functies op dataset

# How many rows the dataset
data['item'].count()

# What was the longest phone call / data entry?
data['duration'].max()

# How many seconds of phone calls are recorded in total?
data['duration'][data['item'] == 'call'].sum()

# How many entries are there for each month?
data['month'].value_counts()
Out[41]: 
2014-11    230
2015-01    205
2014-12    157
2015-02    137
2015-03    101
dtype: int64

# Number of non-null unique network entries
data['network'].nunique()
 

group by 

op 1 variabele:

data.groupby('month')['duration'].sum()
 
 

op meerdere variabelen

 data.groupby(['month', 'item'])['date'].count()
 

output format group by

As a rule of thumb, if you calculate more than one column of results, your result will be a Dataframe. For a single column of results, the agg function, by default, will produce a Series.

You can change this by selecting your operation column differently:

# produces Pandas Series
data.groupby('month')['duration'].sum() 
of
data.groupby('JAAR')['BEDRAG'].agg('sum')) 
 
 # Produces Pandas DataFrame
 data.groupby('month')[['duration']].sum() # Produces Pandas DataFrame
of 
dfjgd2.groupby('JAAR')['BEDRAG'].agg(['sum'])
 
 

Opmaak aanpassen van grouping output

 
dfjgd2.groupby('JAAR')['BEDRAG'].sum().apply(lambda x: '{:.2f}'.format(x)) 
 
of

maak een dataframe
df1=dfjgd2.groupby('JAAR')['BEDRAG'].agg(['sum'])
 
pas toe op de kolom (series) 
df1['sum'].apply(lambda x: '{:.2f}'.format(x))

 Multi-Index 1

The groupby output will have an index or multi-index on rows corresponding to your chosen grouping variables. To avoid setting this index, pass “as_index=False” to the groupby operation.

data.groupby('month', as_index=False).agg({"duration": "sum"})

https://www.shanelynn.ie/summarising-aggregation-and-grouping-data-in-python-pandas/

Multi-index manier 2

Een andere manier is via reset_index

data.groupby('month', as_index=False).agg({"duration": "sum"})
data.reset_index(drop=False) 

Meerdere groepering op verschillende velden in 1x

aggregations = {   'bsn':'count','bedrag': 'sum'}
aggregations = {   'bsn':'nunique','bedrag': 'sum'}
df_zeng =dflever.groupby('code_voorziening').agg(aggregations)

df_zeng.rename(columns={"bsn": "aantal_klant_facturatie", "bedrag": "bedrag_gefactureerd"})



Unieke aantal tellen


gebruik nunique
aggregations = {   'bsn':'nunique','bedrag': 'sum'}

dinsdag 17 juli 2018

Bepaal voorziensoort combinaties

@author: wagenerj


Bepaal hoevaak een bepaalde combinatie van voorzieningsoortenin voorkomt bij een client
en sorteer naar voorkomens
"""

import pandas as pd
#factuurlines = pd.read_csv("C:\\Users\\wagenerj\\Documents\\MyPython\\Data\\grip\\df_debet_geschoond.csv",sep=";",engine='python')
jeugdlines= pd.read_csv("\\\\basis.lan\\amsterdam\\IVSociaal\\17.BusinessIntelligence\\09.InterneProjecten\\ZichtEnGripOpSociaal\\Output bestanden\\met vzcode en leveringsvorm\\GRIP_Jeugd_2017_19062018_inclGI.csv",sep=",",engine='python')


jeugdlines["teller"]=1
jeugdlines

df_bsn_vzsoort=pd.pivot_table(jeugdlines,index=("C_CLIENT"),columns=("N_SRT_VOORZ"),values="teller",aggfunc="count")
df_bsn_vzsoort

#zet alle vxsoorten groter dan 1 op 1
df_bsn_vzsoort=df_bsn_vzsoort>0
df_bsn_vzsoort=df_bsn_vzsoort*1

#
vzsoort_list=df_bsn_vzsoort.columns


df_bsn_vzsoort['aantal_voorz']=df_bsn_vzsoort[:].sum(axis=1)
#filter clienten met slechts 1 voorziening eruit
df_bsn_vzcombi=df_bsn_vzsoort[df_bsn_vzsoort['aantal_voorz']>1]
#haal nu het veld aantal_voorz eruit.
#list comprehension in python: Gebruik om het veld teller te verwijderen
juistKolommen = [k for k in df_bsn_vzcombi.columns if k is not 'aantal_voorz']
df_bsn_vzcombi=df_bsn_vzcombi[juistKolommen]

#voeg nieuw veld toe waarbij alle 1 en 0 achter elkaar geplakt worden
df_bsn_vzcombi['voorz_combi']=df_bsn_vzcombi[:].astype(str).apply('-'.join, axis=1)

df_bsn_vzcombi=df_bsn_vzcombi.reset_index()

df_bsn_vzcombi1=df_bsn_vzcombi.groupby(by="voorz_combi")["C_CLIENT"].count()
df_bsn_vzcombi2 = df_bsn_vzcombi1.reset_index()

df_bsn_vzcombi2=df_bsn_vzcombi2.sort_values(by="C_CLIENT",ascending=False)
df_bsn_vzcombi2 = df_bsn_vzcombi2.reset_index()

#manier 1
mycodes=[]
for index,row in df_bsn_vzcombi2.iterrows():
    code_list=row["voorz_combi"].split("-")
    codering=[]
    for num,code in enumerate(code_list, start=0):
        #print(vzsoort_list[num],code)
        if code=="1" : codering.append(vzsoort_list[num])
    mycodes.append(codering)
df_bsn_vzcombi2["mycodes"]=mycodes

#manier 2 de meest efficiente
def hercoderen(waarde, lijst):
    code_list=waarde.split("-")
    codering=[]
    for num,code in enumerate(code_list, start=0):
        #print(vzsoort_list[num],code)
        if code=="1" : codering.append(lijst[num])   
    return codering

mycodes=[]
df_bsn_vzcombi2["mycodes2"]=df_bsn_vzcombi2["voorz_combi"].apply(hercoderen, args=(vzsoort_list,))

maandag 16 juli 2018

Eigen functie toepassen op dataframe


Het is mogelijk om op alle waarden in een kolom in een dataframe een eigen functie toe te passen.

def mijnfunctie(waarde):
    code_list=waarde.split("-")
    return code_list

df_bsn_vzcombi2["mycodes2"]=df_bsn_vzcombi2["voorz_combi"].apply(mijnfunctie)

>>>>> hierbij wordt de waarde in df_bsn_vzcombi2["voorz_combi"] doorgegeven als eerste argument aan de functie


>>>>> Je kan ook andere argumenten doorgegeven aan de functie via args




def hercoderen(waarde, lijst):
    code_list=waarde.split("-")
    codering=[]
    for num,code in enumerate(code_list, start=0):
        #print(vzsoort_list[num],code)
        if code=="1" : codering.append(lijst[num])   
    return codering

mycodes=[]
df_bsn_vzcombi2["mycodes2"]=df_bsn_vzcombi2["voorz_combi"].apply(hercoderen, args=(vzsoort_list,))

dinsdag 10 juli 2018

Panda truukjes: pivoteren dataframe velden verwijderen of volgorde aanpassen

handig https://www.shanelynn.ie/summarising-aggregation-and-grouping-data-in-python-pandas/


import pandas
factuurlines = pd.read_csv("df_debet_geschoond.csv",sep=";",engine='python' )

factuurlines["BEDR_FACT__GOEDGEKEURD"].sum()

a=factuurlines.groupby('C_CLIENT')


pd.pivot_table(factuurlines,index="N_PRODUCTCODE",values="BEDR_FACT__GOEDGEKEURD")
pd.pivot_table(factuurlines,index=("C_CLIENT","N_SRT_VOORZ","C_VOORZ","N_PRODUCTCODE"),values="BEDR_FACT__GOEDGEKEURD")
df_pivot1=pd.pivot_table(factuurlines,index=("C_CLIENT","N_SRT_VOORZ","C_VOORZ","N_PRODUCTCODE"),values="BEDR_FACT__GOEDGEKEURD",aggfunc="sum",margins = True, margins_name= 'Total count')
# altijd de pivot resetten: dataframe weer normaliseren.de velden waarop gegroepeerd wordt zijn als index concated.
df_pivot1=df_pivot1.reset_index()

df_pivot1['iets'] = df_pivot1['groterDan1000']*10
df_bsn=pd.pivot_table(factuurlines,index=("C_CLIENT"),columns="C_VOORZ",values="ORGANISATIE",aggfunc="count")

nieuw veld aan begin dataframe toevoegen

mycol=pd.Index(['VALID_BSN']).append(dflookup1.columns)


#list comprehension in python: Gebruik om het veld teller te verwijderen

juistKolommen = [k for k in df_bsn.columns if k is not 'teller']
df_bsn = df_bsn[juistKolommen]


# Hoe tel ik per bsn het aantal unieke produkten

df_bsn=df_bsn>0
df_bsn=df_bsn*1
df_bsn['teller']=df_bsn[:].sum(axis=1)



df_pivot1.to_csv("produktenJeugd2017.csv",sep= ";",decimal= ",");

pandas dataframe and CSV

Importeer CSV naar Dataframe

import pandas
factuurlines = pd.read_csv("df_debet_geschoond.csv",sep=";",engine='python' )

toelichting engine=python
“Error tokenising data. C error: EOF inside string starting at line”.

There was an erroneous character about 5000 lines into the CSV file that prevented the Pandas CSV parser from reading the entire file. Excel had no problems opening the file, and no amount of saving/re-saving/changing encodings was working. Manually removing the offending line worked, but ultimately, another character 6000 lines further into the file caused the same issue.

The solution was to use the parameter engine=’python’ in the read_csv function call. The Pandas CSV parser can use two different “engines” to parse CSV file – Python or C (default).



Exporteer Daframe naar CSV

 df_debet_geschoond.to_csv("df_debet_geschoond.csv", sep=";")

woensdag 4 juli 2018

PYTHON CODE

lijst = []
lst_credit_not_found = []
for i in range( int(df_credit['SRLNO'].max() +1)):
    df_credit_group = df_credit[df_credit['SRLNO']==i]
    df_debet_tmp=df_debet[~df_debet.ID_FACTUURREGEL.isin(lijst)]
    for index, row in df_credit_group.iterrows():
        rows,columns =df_debet_tmp[df_debet_tmp["C_FACTUUR"]==row["C_FACTUUR"]].shape
        if rows<1:
            lst_credit_not_found.append(df_debet_tmp[df_debet_tmp["C_FACTUUR"]==row["C_FACTUUR"]].iloc[0]["ID_FACTUURREGEL"])
        else:
            lijst.append(df_debet_tmp[df_debet_tmp["C_FACTUUR"]==row["C_FACTUUR"]].iloc[0]["ID_FACTUURREGEL"])


'werkend
lijst = []
for i in range( int(df_credit['SRLNO'].max() +1)):
    df_credit_group = df_credit[df_credit['SRLNO']==i]
    df_debet_tmp=df_debet[~df_debet.ID_FACTUURREGEL.isin(lijst)]
    for index, row in df_credit_group.iterrows():
        lijst.append(df_debet_tmp[df_debet_tmp["C_FACTUUR"]==row["C_FACTUUR"]].iloc[0]["ID_FACTUURREGEL"])

vrijdag 18 mei 2018

statistiek

Bias: onzuiverheid

gemmiddelde vs mediaan (middelste waarde in een gesorteerde gegevensset)

standdarddeviatie= geeft spreiding aan in een gegevensset. de gemiddelde afstand van de gegevens tov het gemiddelde

percentiel van een score
 is het percentage waarden in de gegevensset dat onder deze score ligt. Bijv jouw score ligt op het  90% percentiel dwz dat 90% vd kandidaten lager scoorde dan jij

Standaardscore (Z-score):
geeft het aantal std deviaties boven of onder het gemiddelde. handige manier om resultaten in juiste verhouding te presenteren.

Verdeling/distriubtie waarin niet alleen alle mogelijke waarden vd gegevensset worden weergegeven maar ook hoe vaak elke waarde voorkomt.

Normale verdeling. Bekende verdeling, gebaseerd op continue numerieke gegevens zonder vaste stappen of sprongen.


Foutmarge
geeft maximaal te verwachten afwijking aan in vergelijking met een onderzoek van de gehele populatie. Meestal in percenten. dit heeft niets te maken met echte fouten, je krijgt altijd een foutmarge , als je minder dan de een complete populatie onderzoekt, ook al voer je het perfect statistisch uit

Parameter:
statistiek wordt  vaak gebruikt om een parameter van een populatie te schatten opbv een onderzochte steekproef, waarna je iets probeert te zeggen over de overeenkomstige waarde van de gehele populatie


Betrouwbaarheidsinterval: statistisch resultaat , bijv een gemiddelde of een percentage, waarbij je foutmarge optelt en aftrekt. Verzameling waarden waar een bepaalde populatieparameter zeer waarschijnlijk binnen valt. 

Datums bepalen adhv begin en einddatum in Dataframe

Voorbeeld op losse velden  ####################################################################### # import necessary packages from datetime...