maandag 16 december 2019

Voorbeeld Hoe genereer je een dataset uit naar jaar obv begin en einddatum

Voorbeeld 1


# -*- coding: utf-8 -*-
"""
Created on Mon Dec 16 10:19:04 2019

@author: wagene002
"""

#https://stackoverflow.com/questions/43832484/expanding-a-dataframe-based-on-start-and-end-columns-speed
import numpy as np
import pandas as pd
from datetime import timedelta
import datetime as dt


df = pd.DataFrame()
df['BEGIN_DATUM'] = [dt.datetime(2010, 4, 22), dt.datetime(2013, 4, 5)]
df['EIND_DATUM'] = [dt.datetime(2011, 4, 10), dt.datetime(2016, 12, 12)]
df['country'] = ['US', 'EU']
df['letter'] = ['a', 'b']

cols = list(df.columns)

#bepaal per regel het data id
df['data_id'] = np.arange(0, len(df))
df['BEGIN_JAAR']=df['BEGIN_DATUM'].map(lambda x:x.year)
df['EIND_JAAR']=df['EIND_DATUM'].map(lambda x:x.year)

#stop data in series
data_id = df['data_id']
start1 = df['BEGIN_JAAR']
end1 = df['EIND_JAAR']

#diff = ((end-start) / np.timedelta64(1, 'Y')).astype('int') + 1
#bepaal hoeveel jaren er voorkomen in een regel
diff = (end1-start1) + 1
#genereer het data_id uit per aantal gevonden jaren
repeated_id = np.repeat(data_id, diff)

time_df = pd.DataFrame(data={'data_id': repeated_id})
time_df = pd.merge(left=time_df, right=df[['data_id', 'BEGIN_JAAR','EIND_JAAR']], on=['data_id'])


time_df['year_id'] = np.arange(0, len(time_df))

min_year_id = time_df.groupby('data_id')['year_id'].min().reset_index().rename(columns={'year_id': 'min_year_id'})
time_df = pd.merge(left=time_df, right=min_year_id, on=['data_id'])
#years_to_add = (time_df['year_id'] - time_df['min_year_id']) * np.timedelta64(1, 'Y')
years_to_add = (time_df['year_id'] - time_df['min_year_id'])
time_df['JAARTAL'] = time_df['BEGIN_JAAR'] + years_to_add

#time_df = time_df[time_df['JAARTAL'].dt.dayofweek < 5]

dfuit = pd.merge(left=df, right=time_df[['data_id', 'JAARTAL']], on=['data_id'])
dfuit = dfuit[['JAARTAL']+cols]




ander werkend voorbeeld


# -*- coding: utf-8 -*-
"""
Created on Tue Dec 10 10:40:15 2019

@author: wagene002
"""

import numpy as np
import pandas as pd
from datetime import timedelta


xls_file=pd.ExcelFile(r'O:\Input\03_ZichtenGrip\LLV\rechten\__5__Grip op sociaal Recht.xlsx')

dfin=xls_file.parse(0,skiprows=0,dtype=str)

dfin=dfin.astype({'VD_Ingangsdatum': 'datetime64', 'VD_Einddatum': 'datetime64'})
dictVeldnamen={'Valid_BSN':'VALID_BSN','LR_BSN': 'BSN', 'VD_Ingangsdatum': 'BEGIN_DATUM','VD_Einddatum':'EIND_DATUM','Code_Bron': 'CODE_BRON'}
dfin.rename(columns=dictVeldnamen,inplace='true')
#Dit veld is niet goed. Deze gaan we juist berekenen
dfin.drop('JAAR', axis=1,inplace=True)
dfin.drop_duplicates(subset=None, keep='last', inplace=True)


dfin['VALID_BSN'].fillna('0',inplace=True)
dfin['BSN'].fillna('',inplace=True)

####dfin=dfin[dfin['BSN']=='233749172']

cols = list(dfin.columns)

#bepaal per regel het data id
dfin['data_id'] = np.arange(0, len(dfin))
dfin['BEGIN_JAAR']=dfin['BEGIN_DATUM'].map(lambda x:x.year)
dfin['EIND_JAAR']=dfin['EIND_DATUM'].map(lambda x:x.year)


#stop data in series
data_id = dfin['data_id']
start = dfin['BEGIN_JAAR']
end = dfin['EIND_JAAR']

#diff = ((end-start) / np.timedelta64(1, 'Y')).astype('int') + 1
#bepaal hoeveel jaren er voorkomen in een regel
diff = (end-start)  + 1


#genereer het data_id uit per aantal gevonden jaren
repeated_id = np.repeat(data_id, diff)
time_df = pd.DataFrame(data={'data_id': repeated_id})
time_df = pd.merge(left=time_df, right=dfin[['data_id', 'BEGIN_JAAR','EIND_JAAR']], on=['data_id'])


time_df['year_id'] = np.arange(0, len(time_df))

min_year_id = time_df.groupby('data_id')['year_id'].min().reset_index().rename(columns={'year_id': 'min_year_id'})
time_df = pd.merge(left=time_df, right=min_year_id, on=['data_id'])
#years_to_add = (time_df['year_id'] - time_df['min_year_id']) * np.timedelta64(1, 'Y')
years_to_add = (time_df['year_id'] - time_df['min_year_id'])
time_df['JAAR'] = time_df['BEGIN_JAAR'] + years_to_add

#time_df = time_df[time_df['JAARTAL'].dt.dayofweek < 5]

dfuit = pd.merge(left=dfin, right=time_df[['data_id', 'JAAR']], on=['data_id'])
dfuit = dfuit[['JAAR']+cols]
dfuit.to_csv(r'O:\Output\01.Overstijgend\01_ZichtenGrip\LLV\rechten\RECHT_LLV.csv', sep=';')


















vrijdag 13 december 2019

voorbeeld :Hoe bepaal je overlap van begin en einddatums


voorbeeldcode1:

# maak testset
x=pd.date_range('1-1-2001','1-4-2001', freq='D')
y=pd.date_range('1-5-2001','1-6-2001', freq='D')
z=pd.date_range('1-7-2001','1-8-2001', freq='D')
w=pd.date_range('1-9-2001','1-11-2001', freq='D')


lst=[]
lst.append(x)
lst.append(y)
lst.append(z)
lst.append(w)
series=pd.Series(lst)

dfx=pd.DataFrame()
dfx['dates']=series

converteer datetimeindex
dfx['dates'].map(lambda x: x.strftime("%Y/%m/%d"))

maak een set
dfx['dates']=dfx.apply(lambda x: set(x['dates']),axis=1)


len(dfx)
geenjoin=True
for i in range(len(dfx)-1):
    dfx['dates'].iloc[i].intersection(dfx['dates'].iloc[i+1])
    print(dfx['dates'].iloc[i].isdisjoint(dfx['dates'].iloc[i+1]))
    geenjoin=dfx['dates'].iloc[i].isdisjoint(dfx['dates'].iloc[i+1]) &  geenjoin
print(geenjoin)

groupby dataframe zonder aggregatie

voorbeeld hoe om te gaan met Groupby object   

def func1(name,group):
    print(group)

df1.groupby(['BSN']).apply(lambda x: func1(x.name,x))




def func2(name,group):
    print(name)

df1.groupby(['BSN','CODE_VOORZIENING']).apply(lambda x: func2(x.name,x))

Voorbeeld Overloop datums binnen een groep


check overloop datums binnen een Groep

Uitgangspunt is dataframe df1 met begin en einddatum. Kort gezegd gaan we eerst een datetimeindex met alle datums in de datum_range opbouwen. Deze range kunnen we ook kleiner maken door spelingsparameters aan te passen

code:

spelingrechts=31
spelinglinks=31

#Genereer per regel alle lijst met alle datumvelden op
df1['myrange']=df1.apply(lambda x: pd.date_range(x['BEGIN_DATUM']+timedelta(days=spelinglinks),x['EIND_DATUM']-timedelta(days=spelingrechts), freq='D'),axis=1)


#Convert Datetimeindex to Index using specified date_format.
df1['myrange']=df1['myrange'].map(lambda x: x.strftime("%Y/%m/%d"))

df1=df1.sort_values(by='BEGIN_DATUM')


def maakPeriodesPerBSN(bsn,dfx):
    global myfile
    # Maak een set
    dfx['myrange']=dfx.apply(lambda x: set(x['myrange']),axis=1)
 #   ==> ga bepalen er een join is tussen de myrange records van de bsn
    geenoverlap=True
    lstbsnoverlap=[]  
    for i in range(len(dfx)-1):
        geenoverlap=dfx['myrange'].iloc[i].isdisjoint(dfx['myrange'].iloc[i+1]) &  geenoverlap
       
    if geenoverlap == False:
        f= open(myfile,"a+")
        f.write(str(bsn) + '\n')
        f.close
       
 

hoofdprogramma
       
myfile=r'C:\Users\wagene002\Documents\Python\grip\LLVverwerkenInput\guru99.txt'
f= open(myfile,"w+")  
f.seek(0)
f.truncate()
f.write('New run with spelinglinks/spelingrechts ==>' + str(spelinglinks) + '/' + str(spelingrechts) + '\n')
f.close()

df1.groupby(['BSN']).apply(lambda x: maakPeriodesPerBSN(x.name,x))
df1.groupby(['BSN','CODE_VOORZIENING']).apply(lambda x: maakPeriodesPerBSN(x.name,x))

data profiling stappen pandas

Volgende stappen voor data-profiling

df.info()  


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10035 entries, 0 to 10034
Data columns (total 8 columns):
VALID_BSN           10023 non-null object
BSN                 10023 non-null object
CODE_VOORZIENING    10035 non-null object
BEGIN_DATUM         10035 non-null datetime64[ns]
EIND_DATUM          10035 non-null datetime64[ns]
JAAR                10035 non-null object
CODE_BRON           10035 non-null object
BESTANDS_ID         10035 non-null object
dtypes: datetime64[ns](2), object(6)
memory usage: 627.3+ KB



Geeft weer
- aantal rijen
- data-types
- of er null values zijn

df.nunique

Geeft aantal unieke waarden

df.describe

geeft alleen statistische waarden van Numerical values



# ==> Analyse
df1.info()
df1.nunique()
print(df1.describe())




df1[df1['VALID_BSN'].isnull()]
df1[df1['VALID_BSN']=='0'].info()


df1[df1['BSN'].isnull()]
df1[df1['BSN']=='999999999']


dubbele records
df1[df1.duplicated(subset=None)]

dinsdag 10 december 2019

Pandas isna() vs isnull().



referring to pandas.DataFrame.isna() vs pandas.DataFrame.isnull(). Not to confuse with pandas.isnull(), which in contrast to the two above isn't a method of the DataFrame class.
These two DataFrame methods do exactly the same thing! Even their docs are identical. You can even confirm this in pandas' code.

But why have two methods with different names do the same thing?

This is because pandas' DataFrames are based on R's DataFrames. In R na and null are two separate things. Read this post for more information.
However, in python, pandas is built on top of numpy, which has neither na nor null values. Instead numpy has NaN values (which stands for "Not a Number"). Consequently, pandas also uses NaN values.

In short

  • To detect NaN values numpy uses np.isnan().
  • To detect NaN values pandas uses either .isna() or .isnull().
    The NaN values are inherited from the fact that pandas is built on top of numpy, while the two functions' names originate from R's DataFrames, whose structure and functionality pandas tried to mimic.

vrijdag 6 december 2019

topics cursus data modelleren

https://www.slideshare.net/RogierWerschkull


Ronald Damhof : Quadrant model


X-as  :  Data-deployment produktieproces:       push vs     pull

Y-as  : Ontwikkelstijl:    Systematisch   vs   Opportunistisch

https://www.scamander.com/nl/wp-content/uploads/2016/11/dutch-het-data-kwadranten-model-interview-ronald-damhof-1.pdf

DWH

A data warehouse is a subject-oriented, integrated, time-variant and non-volatile collection of data in support of management's decision making process. 

Subject-Oriented: A data warehouse can be used to analyze a particular subject area. For example, "sales" can be a particular subject.

Integrated: A data warehouse integrates data from multiple data sources. For example, source A and source B may have different ways of identifying a product, but in a data warehouse, there will be only a single way of identifying a product.

Time-Variant: Historical data is kept in a data warehouse. For example, one can retrieve data from 3 months, 6 months, 12 months, or even older data from a data warehouse. This contrasts with a transactions system, where often only the most recent data is kept. For example, a transaction system may hold the most recent address of a customer, where a data warehouse can hold all addresses associated with a customer.

Non-volatile:
 Once data is in the data warehouse, it will not change. So, historical data in a data warehouse should never be altered.


Trend: steeds meer alleen Time Variant and non-volatile  (datalake)

Probleem 1: Modellering niet aangepast aan Datascience behoeften.
Voor deze groep meer halffabrikaten maken voor DS

Data-driven

Vroeger Eckhoff piramide leidend
data --> info--> knowledge --> wisdom

Modern  :  info   --> data --> info
dat die je hebt is slechts een specifiek verzameling van de werkelijkheid.  Deze selectie kan veel bepalen . Focus je dus niet alleen op de de data. 

Datagedreven werken is rare term.   ---> Barry Devlin "Business Unintelligence"

Dat vraagt ook om een andere benadering van data intelligence en data warehousing. Zijn boek Business Unintelligence slaat op de weinig slimme manier waarop organisaties met data omgaan. Want het gaat verder dan de data, ook intuïtie speelt bijvoorbeeld een rol. Je zou niet moeten worden gedreven door data, maar geïnformeerd worden door informatie.”


ELT vs ETL

2 definities
def1:  ETL ---deel verwerking gebeurt op aparte applicatieserver en data weer terug naar DBserver en ELT is verwerking gebeurt ook op DB server

def2:  ELT heeft betrekking op volgordelijkheid. Eerst de CM of datalake vullen (time variant, non volatile) dan DWH


Ensemble modelling

 Trend: dimensioneel modelleren niet meer gebruiken voor DWH laag maar alleen voor DM laag. Nieuwe modellingstechnieken zogenaamde Ensemble modelling bijv DV. Deze technieken zijn nog niet goed uitgewerkt of slecht geimplementeerd (Datavault)

based on Unified Decompositie

Let op genereren van DV uit bronsysteem is verdacht. DV moet ontworpen worden

BEAM methodiek : Cavas modelleren

Semantische laag

Is vaak niet los te zien van de tool die gebrukt wordt

master data

Sleutel die voor alles geldt.


degenerated dimensie : kassabon + kassabonregel. Waarom. geen beschrijvende waarde



dinsdag 3 december 2019

in bods een python script aanroepen

$G_TEXT = exec('cmd', '\\\\swappams2820.basis.lan\IVS_BI_Ontwikkel\data\Input\03_ZichtenGrip\Continuum\anaconda3\python \\\\swappams2820.basis.lan\IVS_BI_Ontwikkel\data\Input\03_ZichtenGrip\python\scripts\Versleutel_csv_to_csv.py',8);
print('#########################################################');
print('[$G_TEXT]');



alleen versie
$G_TEXT = exec('cmd', '\\\\swappams2820.basis.lan\IVS_BI_Ontwikkel\data\Input\03_ZichtenGrip\Continuum\anaconda3\python --version',8);
print('#########################################################');
print('[$G_TEXT]');

dinsdag 22 oktober 2019

BODS: via script files kopieren naar andere directory of naar een REMOTE systeem

Om via Bods files in een specifieke directory te kopieren naar een andere directory of naar een Remote systeem kan je het volgende doen




In sc_filelist:


# Vul Variabelen
$G_DirNaamNieuw        = '\\\\swappams2820.basis.lan\IVS_BI_Ontwikkel\data\Output\01.Overstijgend\01_ZichtenGrip\WMONED\beschikte_voorziening\\Overzetten\\';
#$G_DirNaamInVerwerking = '\\\\swappams2820.basis.lan\IVS_BI_Ontwikkel\data\02 InVerwerking\\';
$G_DirNaamVerwerkt     = '\\\\swappams2820.basis.lan\IVS_BI_Ontwikkel\data\Output\01.Overstijgend\01_ZichtenGrip\WMONED\beschikte_voorziening\verwerkt\\';
$G_FileNaam            = 'dummy*';
$G_COUNTER             = 0;
#$G_LAAD_DATUM          = sysdate();


#Maak een lijst aan met bestanden. Seperator is |.
wait_for_file(  $G_DirNaamNieuw || $G_FileNaam,1000,1000,-1,$G_FileList,$G_ListSize,'|');


#Staging tabel legen.
#sql('OJZSTGA1', 'truncate table DWH_DOEL.JW_STG_GEBIED_WIJK');


print('==================================== 01 ====================================');
print('$G_DirNaamNieuw        = [$g_DirNaamNieuw]');
#print('$G_DirNaamInVerwerking = [$G_DirNaamInVerwerking]');
print('$G_DirNaamVerwerkt     = [$G_DirNaamVerwerkt]');
print('$G_FileNaam            = [$g_FileNaam]');
print('$G_COUNTER             = [$G_COUNTER]');
#print('$G_LAAD_DATUM          = [$G_LAAD_DATUM]');
print('$G_FileList            = [$G_FileList]');
print('$G_ListSize            = [$G_ListSize]');




WL_inlezen_bestanden

while conditie==>   ($G_COUNTER != $G_ListSize)

Kopie naar ander directory 


#Maak een lijst aan met bestanden. Seperator is |.
$G_FolderFileNaam = word_ext($G_FileList,$G_COUNTER +1,'|' );

#Bepaal de filenaam door de foldernaam er af te halen.
$G_FileNaam       = substr($G_FolderFileNaam,length($G_DirNaamNieuw)+1,length( $G_FolderFileNaam) );

#$G_FileNaam       = substr($G_FolderFileNaam,index($G_FolderFileNaam, '01 Nieuw/' ,1)+9,length( $G_FolderFileNaam) );
#$G_GEBIED         = word_ext($G_FileNaam,1,'_');
#$G_WIJK           = word_ext($G_FileNaam,2,'_');


# Verplaats bestand naar verwerkt en voeg de verwerkingsdatum en tijdstip toe aan het bestandsnaam.
$G_MV_BRON = $G_DirNaamNieuw    || $G_FileNaam ;
$G_MV_DOEL = $G_DirNaamVerwerkt || $G_FileNaam ;
# file copy : werkt met volledige padnamen in specifiek padformaat
# $G_MV_BRON ==>  \\swappams2820.basis.lan\IVS_BI_Ontwikkel\data\Output\01.Overstijgend\01_ZichtenGrip\WMONED\beschikte_voorziening\Overzetten\dummy1.txt

file_copy($G_MV_BRON,$G_MV_DOEL,1);

print('==================================== 02 ====================================');

print('$G_COUNTER          = [$G_COUNTER]');
print('$G_FolderFileNaam   = [$G_FolderFileNaam]');
print('$G_FileNaam         = [$G_FileNaam]');
#print('$G_GEBIED           = [$G_GEBIED]');
print('$G_MV_BRON          = [$G_MV_BRON]');
print('$G_MV_DOEL          = [$G_MV_DOEL]');

$G_COUNTER= $G_COUNTER +1;


Kopie naar een external systeem(bijv FTP)


maak eerst File Location aan bijv ftp. en definieer ook een local directory. Deze directory zet je de bestanden neer die later getransporteerd worden met het copy remote commando in het script





















script SC_COPY_naar_EXTERNAL





#Maak een lijst aan met bestanden. Seperator is |.
$G_FolderFileNaam = word_ext($G_FileList,$G_COUNTER +1,'|' );

#Bepaal de filenaam door de foldernaam er af te halen.
$G_FileNaam       = substr($G_FolderFileNaam,length($G_DirNaamNieuw)+1,length( $G_FolderFileNaam) );

#$G_FileNaam       = substr($G_FolderFileNaam,index($G_FolderFileNaam, '01 Nieuw/' ,1)+9,length( $G_FolderFileNaam) );
#$G_GEBIED         = word_ext($G_FileNaam,1,'_');
#$G_WIJK           = word_ext($G_FileNaam,2,'_');


# Verplaats bestand naar verwerkt en voeg de verwerkingsdatum en tijdstip toe aan het bestandsnaam.
$G_MV_BRON = $G_DirNaamNieuw    || $G_FileNaam ;
$G_MV_DOEL = $G_DirNaamVerwerkt || $G_FileNaam ;
# file copy : werkt met volledige padnamen in specifiek padformaat
# $G_MV_BRON ==>  \\swappams2820.basis.lan\IVS_BI_Ontwikkel\data\Output\01.Overstijgend\01_ZichtenGrip\WMONED\beschikte_voorziening\Overzetten\dummy1.txt

copy_to_remote_system('FTPHans', $G_FileNaam );

print('==================================== 02 ====================================');

print('$G_COUNTER          = [$G_COUNTER]');
print('$G_FolderFileNaam   = [$G_FolderFileNaam]');
print('$G_FileNaam         = [$G_FileNaam]');
#print('$G_GEBIED           = [$G_GEBIED]');
print('$G_MV_BRON          = [$G_MV_BRON]');
print('$G_MV_DOEL          = [$G_MV_DOEL]');

$G_COUNTER= $G_COUNTER +1;



woensdag 4 september 2019

data-gedreven organisatie Informatie

wat is data driven:
Wat is de waarde in mijn data


BI levert alleen informatie over het verleden.

Datascience kan voorspellen en eventueel actie ondernemen. er is altijd een domein expert nodig om Business proces te begrijpen.

Datascience moet goed ingericht worden in organisatie. Gebruik wat je hebt en bouw daar op voort.

Een oplossing is Datavirtualisatie. leverancier Connected Data groep tool Tibco of Denodo


tools:
Rapidminer of Knime

Neuraal netwerk: ingewikkeld stelsel van knopen en gewichten. Je past steeds de gewichten aan totdat resultaat OK is.wordt vooral bij gezichtsherkenning spraaakherkenning gebruikt.

Crafting featerus
https://opensource.google.com

projects Tensorflow


4 rollen
datascientist  ---klassiek en citizen

data engineer :   Etl ontwerkep 2.0  masterdata modelleren, cloud kennis

data-analist  ---   voorwerk met de buisiness, brug tussen business en datascienties

data-architect


woensdag 16 januari 2019

In BODS script oracle aanroepen


In BODS script oracle aanroepen


sql('OJZSTGA1_BTL',' begin createPivotTable(\'CONTROLELIJST_BESCHIKTE_VOORZIENING_JGD_2017\',\'voorzieningsoort\',\'c\'); end; ');

sql('OJZSTGA1_BTL','begin suffie(); end;');



sql('OJZSTGA1', 'truncate table DWH_DOEL.JW_STG_GEBIED_WIJK');

woensdag 9 januari 2019

BO HTML and Javascript


2 Knopjes om naar 1e rapport en 2e rapport te springen

<input type = "button"  value ="Go to Report2" onclick="gotoReport(1)">
<br>
<br>
<input type = "button"  value ="Go to Report1" onclick="gotoReport(0)">
<script>
function gotoReport(n) {
this.parent.selectReport(n);
}
</script>



woensdag 2 januari 2019

BO 42 Cross Table

BO4.2


ga naar een tabel en turn into Cross table




Daarna nog even een section op de hoofdcategorie column en het resultaat is het volgende




Daarna kan je de velden nog mooi opmaken met Formatting