maandag 13 maart 2017

Pandas

waarom Pandas

Pandas helps to carry out your entire data analysis workflow in Python without having to switch to a more domain specific language like R

Dataframe = pythonic analog of R's dataframe

Data-science met python gebruik dan PANDAS

dmv het manipuleren van python pandas dataframes kan

  • exploration data-analysis
  • data-wrangling
  • datapreprocessing
  • building models
  • visualization
https://jeffdelaney.me/blog/useful-snippets-in-pandas/
https://www.youtube.com/watch?v=8uK65aNfQ3I

Panda vs Numpy

Numpy: voor berekeningen met getallen. Vooral voor matrix en vector. Sci-kit
Pandas: voor gestructureerde data

import flat files

# Import pandas as pd
import pandas as pd

# Assign the filename: file
file = opa.csv'

# Read the file into a DataFrame: df
df = pd.read_csv(file)

#je kan ook een dataframe vullen via een  python dictionary

Basisfuncties

# Dataframe is about rows and columns

#geeft dimensies van rijen en kolommen
df.shape
 bijv : rows, columns =df.shape



# View the head of the DataFrame
print(df.head())

# View de last records
df.tail()


indexing and slicing

# print rij 2 to 4
df[2:5]

# print alle columns
df.columns
 print(list(dfnew.columns))

# print content column
df.windspeed
of
df['windspeed']

#  geeft type van column
type(df['windspeed']

#alleen paar kolumns
df[['event']['windspeed']]


Operations Pandas

# maximum,mean
df['temperature']. max()

#geef statistics data
df.describe()

Select data in dataframe

#  soort SQL

where clause

df[df.temperature>=32]

# geef regel met  max temperatur
df[df.temperature==df['temperature'].max()]

# geef alleen regels waar een kolomwaarde NIET in een lijst is
df_debet_tmp=df_debet[~df_debet.ID_FACTUURREGEL.isin(lst_debet_found)]



#  geef alleen bepaalde columns in het resultaat 
df['day'].[df.temperature==df['temperature'].max()]


 a= df_credit[df_credit['C_FACTUUR']=='22501-05-1731-05-17JH04Jgd-Verblijf jeu']

Maak een subset

#geef columns van dataframe
orders.columns

#maak een subset
orders_subset = Dataframe(orders, columns=['Row id', Order Id],

orders_subset.head()

Indexes

elke dataframe heeft een INTEGER index die loopt van 0 tm mx (bijv 5)

bij df.index krijg je dan te zien start=0 en stop =6  < dus 1 lager dan de werkelijke 5

standaard zijn de indexen getallen van 0 tm 5 maar je kan de index ook veranderen. bijv naar dag
df.set_index(['day']      it returns a new dataframe als je wilt dat deze df zelf veranderd dan
 df.set_index(['day', inplace=True


dan is het mogelijk
df.loc['1/4/2017']


df.reset_index(inplace=true)

Als index meerdere gelijke waarden bevat, dan toon hij deze bij selectie met loc


Group by (split apply combine)

# groeperen op city
g=df.groupby('city')

g is ad dataframegroupby objects. er worden 3 groupen gecreerd
index newyork bevat dataframe
index paris bevat dataframe


for city, city_df in g:
      print(city)
      print(city_df)

# benaderen spefiek dataframe

g.get_group('Paris') geeft dataframe met group

# geef per city de max values

g.max()

#  split / apply/combine

split: in datagroupen per city
apply:  som operations op alle groupen
combine: combine result in datafaframe

#  Inline printen
%matplotlib inline
g.plot

Concatenate

je kan 2 of meerdere dataframes concateneren tot 1 dataframe

df = pd.concat([india_weather],[us_weather])

de indexen worden dan overgenomen van de bestaande dataframes. Dus dan heb je 2x zelfde getallen. Wil je een nieuwe nummering van de indexen dan moet je
df = pd.concat([india_weather],[us_weather], ignore_index=True)

# additonal Index
df = pd.concat([india_weather],[us_weather],keys=["india","us" )
hij maakt nu een extra index aan india en us

df.loc["us"]

AXIS
standaard is bij de conatenate de axis is 0 (append as row_. Dat betekent dat de rijen van het ene dataframe geplakt worden bij het andere dataframe. handig als je 2 dataframes van verschillende steden met zelfde kenmerken onder elkaar wil plakken. maar als je 2 dataframes van de zelfde steden heb met verschillende kenmerken. Wil je ze niet onder elkaar maar dan wil je de kenmerken op 1 regel. Dit doe je door de AXIS op 1 te zetten.(Append as column)

df.concate([temp_df],[wind_df],axis=1)

er wordt gematched bij rowindex
wat gebeurt als order

Voorbeeld
df_credit_small =pd.DataFrame(df_credit['ID_FACTUURREGEL'])
# er wordt automatisch een Serieobject gemaakt bij 1 columnnaam door Python, daarom weer een dataframe van maken
df_lst_debet_found=pd.DataFrame(lst_debet_found,columns=['ID_FACTUURREGEL']) 
df_credits_debets=pd.concat([df_credit_small,df_lst_debet_found] ,ignore_index=True)
#df_credits_debets=df_credit_small.append(pd.DataFrame(lst_debet_found,columns=['ID_FACTUURREGEL']),ignore_index=True)

creddeblist=df_credits_debets['ID_FACTUURREGEL'].tolist()

Merge

Gelijk aan SQL JOIN. dataframes kan je ook mergen. dan worden de column geappend en dit gebeurt op basis van de ON velden

df3=pd.merge(df1,df2, on="city")

Werkt als een INNER JOIN default

een OUTER join doe je via
df3=pd.merge(df1,df2, on="city", how="outer")

LEFT outer    : how = "left"

indicator="true" : geeft aan waar de join vandaan komt

suffixes=('_left', '_right')



Pivot

pivot allows you to transform or reshape data

maak een nieuwe shape , wat wil je op je x-as als index en wat wil je als column

 df.pivot(index='"data",columns="city")
 df.pivot(index='"data",columns="city", values="humidity") geef alleen humidity

Pivot table

pivot table is used to summarize and aggregate data inside a dataframe


df.pivot_table(index="city",columns="date", aggfunc="sum")


df.pivot_table(index=pd.grouper(freq='M', key='date'),columns='city')  via frequentie wordt er een maand van de index gemaakt


Handling missing data(Nan)

https://www.youtube.com/watch?v=EaGbS7eWSs0

als je datumvelden inleest in panda krijgen ze allemaal een string value. Als je dit wil veranderen dan inlezen met  parse_dates

df=pd.read_csv("" weather_data.csv",parse_dates=["day"]

#zet day als index in de dataframe
df.set_index('day', inplace=True)

# interpolate to make a guess on missing values using interpolation
Replace all Nan values with a gues vallue

new_dfdf.fillna(0)

#different values for different columns, then use dictionary instead of value
new_df=df.fillna({ 'temperature':0,'windspeed':0,'event': 'no-event'})

#geef missing value de waarde van vorige
new_df=df.fillna(method="ffill")

# backward fill
 new_df=df.fillna(method="bfill")

# Coping rows horizontally.
 new_df=df.fillna(method="bfill", axis="columns")

Maar 1 x kopieren van waarde 
 new_df=df.fillna(method="ffill",limit=1)

How to make better guess with interpolate instead with fill

new_df=df.interpolate()

new_df=df.interpolate(method="time")


drop rows with missing values
df.dropna()

df.dropna(how="all")

als je 2 valid values hebt dan niet droppen
df.dropna(thres=2)

Vul datum index aan en reindex
dt=pd.date_range("01-01-2017","01-11-2017")
idx =pd.DatetimeIndex(dt)
df=df.reindex(idx)

 

 

  Iteratie dataframe

for index, row in df.iterrows():
   ....:     print row['c1'], row['c2']
 

let op. als je alleen index of row doet krijg je andere dataypes


met index,row

for  index,row in df.iterrows():
         print(type(index))
         print(type(row))
    
<class 'numpy.int64'>
<class 'pandas.core.series.Series'>
<class 'numpy.int64'>
<class 'pandas.core.series.Series'> 


met alleen row  of alleen index


for  row in df.iterrows():
    print(type(row))
   
<class 'tuple'>
<class 'tuple'>

for  index in df.iterrows():
    print(type(index))
  
<class 'tuple'>
<class 'tuple'>


 Dus als je per rij van een PANDAS dataframe  de values wil doorlopen gebruik dan de volgende constructie


szsql="insert into TESTFACTUUR VALUES ("
values=""


methode1
for  index,row in df.iterrows():
        for myrow in row:
            values= values + "'" + str(myrow) + "'"


methode 2
for  index,row in df.iterrows():
            for t1 in df.iloc[index]:
                values= values + "'" + str(t1) + "'"



Uitleg Dataframe en indexen

Index
Verwarring benaderen
df.ozone        of
df ['Ozone']

standaard altijd index beginnend bij 0 maar je kan ook zefl een index maken. bijv index month

Selecteren rij kolom

Voor het selecteren van een rij kan je iloc of loc gebruiken


df ['Ozone'].iloc[2]   : los van de index pak de zoveelste rij
df ['Ozone'].loc["Pietj"]    : zoek deze waarde op in index


voor het selecteren van een kolom kan je gewoon de kolomnaam pakken
print(df["Fourth"])


selecteren specifiek veld

Let’s say you have a DataFrame like this one
   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9
And you want to access the value that is at index 0, in column ‘A’.
Well, here are the various options that exist to get your value 1 back:

# Using `iloc[]`
print(df.iloc[0][0])

# Using `loc[]`
print(df.loc[0]['A'])

# Using `at[]`
print(df.at[0,'A'])

# Using `iat[]`
print(df.iat[0,0])

# Using `get_value(index, column)`
print(df.get_value(0, 'A'))


Kolommen zoeken met hoogste waarde


df.loc[df.values.argmax(axis=0)]


joinen van dataframes

allerlei opties kan je meegeven bijv type join etc. Doe Shift + TAB voor uitleg in IPython. er zijn 2 methods om te joinen

via JOIN : dan moet je bij een dataframe specifieke indexkolomen opgeven

df1 = pd.DataFrame({
    'col1': [1,2,3,4,5,6],
    'cat': ['a','b','c','d','e','f']
}).set_index('cat')

df2 = pd.DataFrame({
    'col2': [7,8,9,10,11,12],
    'cat': ['a','b','c','d','e','f']
}).set_index('cat')

df1.join(df2)



col1 col2
cat

a 1 7
b 2 8
c 3 9
d 4 10
e 5 11
f 6 12


 via MERGE

 df1 = pd.DataFrame({
    'col1': [1,2,3,4,5,6],
    'cat': ['a','b','c','d','e','f']
})

df2 = pd.DataFrame({
    'col2': [7,8,9,10,11,12],
    'cat2': ['a','b','c','d','e','f']
})

via merge .


df1.merge(df2, left_on='cat', right_on='cat2')



Extraaatjesaanmaken Dataframe


 df1 = pd.DataFrame({
    'col1': [1,2,3,4,5,6],
    'cat': ['a','b','c','d','e','f']
})

mapping_dict={1:2,3:2,np.nan:0)

of df2['col3']=df2.col1.map(mappng_dict)



Geen opmerkingen:

Een reactie posten

Datums bepalen adhv begin en einddatum in Dataframe

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