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
dinsdag 11 september 2018
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 lezendflookup1=xls_file.parse(sheet,skiprows=0,dtype=str)
je kan daarna altijd nog de datatypes aanpassen
per veld conversie
>>> string conversie naar datetimedfin=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.
# 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/
aggregations = { 'bsn':'nunique','bedrag': 'sum'}
df_zeng =dflever.groupby('code_voorziening').agg(aggregations)
df_zeng.rename(columns={"bsn": "aantal_klant_facturatie", "bedrag": "bedrag_gefactureerd"})
gebruik nunique
aggregations = { 'bsn':'nunique','bedrag': 'sum'}
Multi-index manier 2
Een andere manier is via reset_indexdata.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,))
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")
df_bsn = df_bsn[juistKolommen]
df_bsn=df_bsn*1
df_bsn['teller']=df_bsn[:].sum(axis=1)
df_pivot1.to_csv("produktenJeugd2017.csv",sep= ";",decimal= ",");
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>0df_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 pandasfactuurlines = 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=";")
Abonneren op:
Posts (Atom)
Datums bepalen adhv begin en einddatum in Dataframe
Voorbeeld op losse velden ####################################################################### # import necessary packages from datetime...
-
The Pandas loc indexer can be used with DataFrames for two different use cases: a.) Selecting rows by label/index b.) Selecting r...
-
how to use else if in lambda functions f = lambda x : 1 if x > 0 else 0 if x == 0 else - 1 dfGert.apply(lambda x: 1 ...
-
Het is mogelijk om op alle waarden in een kolom in een dataframe een eigen functie toe te passen. def mijnfunctie(waarde): code_list...