Adat feldolgozás ... előtti lépések
Adattisztítás
Átnevezés
Rendezés és átrendezés
Adattípus-konverziók
Adatok duplikálásának megszüntetése
Hiányzó vagy érvénytelen adatok kezelése
Szűrés az adatok kívánt részhalmazára
Adatátalakítás
hosszú adatformátum
széles adatformátum
Excel hagyatékként pivot és unpivot funkciónak is nevezzük ezt a transzformációt
Széles formátum :
Tulajdonságok külön oszlopokban jelennek meg
(több tulajdonság egy re tőbb oszlop, egyre szélesebb tábla)
date AA BB CC 0 05/03 1 2 3 1 06/03 4 5 6 2 07/03 7 8 9 3 08/03 5 7 1
Hosszú formátum:
Az egyestulajdonságok jelző tulajdonságok alapján ismételve jelennek meg
(a törzs adat ismétlés miatt egyre a több tulajdonság egyre nagyobb rekordszámot foglal)
date variable value 0 05/03 AA 1 1 06/03 AA 4 2 07/03 AA 7 3 08/03 AA 5 4 05/03 BB 2 5 06/03 BB 5 6 07/03 BB 8 7 08/03 BB 7 8 05/03 CC 3 9 06/03 CC 6 10 07/03 CC 9 11 08/03 CC 1
Adatgazdagítás
Új oszlopok hozzáadása: Függvények használata a meglévő oszlopokból származó adatokon új értékeket teremteni
Adatforgatások: Folyamatos adatok vagy diszkrét adatok forgatása sok különbözőséggel az értékeket tartománycsoportokba helyezi, ami engedés közben diszkrétté teszi az oszlopot szabályozzuk az oszlopban lehetséges értékek számát
Összesítés: Az adatok összegzése és összegzése
Újra mintavétel: idősoros adatok összesítése meghatározott időközönként
Példák a wide -> long és long -> wide trannszformációkra
### melt és wide_to_long használata a transformáció wide -> long:
## transformáció Long to Wide: pd.pivot(df, index=, columns=, values=)
## transformáció Wide to Long: pd.melt(df, id_vars=, value_vars=, var_name=, value_name=, ignore_index=)
df1 = pd.DataFrame({
'date' : ['05/03', '06/03', '07/03', '08/03'],
'AA' : [1, 4, 7, 5],
'BB' : [2, 5, 8, 7],
'CC' : [3, 6, 9, 1]
}).set_index('date')
df11 = pd.DataFrame({
'date' : ['05/03', '06/03', '07/03', '08/03'],
'AA' : [1, 4, 7, 5],
'BB' : [2, 5, 8, 7],
'CC' : [3, 6, 9, 1]
}).set_index('date')
df1 = df1.reset_index()
l1 = pd.melt(df1, id_vars='date', value_vars=['AA', 'BB', 'CC'])
l11 = df11.unstack().reset_index()
print('--------------------------------------- Long to Wide ---------------------------------------')
print(df1)
print('-----------melt-----------')
print(l1)
print('-----------unstac (.melt was 8 times faster than .unstack.reset_index()-----------')
print(l11)
print('-----------------------wide_to_long---------------------------------')
df2 = pd.DataFrame({
'famid': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'birth': [1, 2, 3, 1, 2, 3, 1, 2, 3],
'ht_one': [2.8, 2.9, 2.2, 2, 1.8, 1.9, 2.2, 2.3, 2.1],
'ht_two': [3.4, 3.8, 2.9, 3.2, 2.8, 2.4, 3.3, 3.4, 2.9]
})
l2 = pd.wide_to_long(df2, stubnames='ht', i=['famid', 'birth'], j='age',
sep='_', suffix=r'\w+')
print(df2)
print('----------------------')
print(l2)
print('--------------------------------------- Long to Wide ---------------------------------------')
raw_data = {'patient': [1, 1, 1, 2, 2],
'obs': [1, 2, 3, 1, 2],
'treatment': [0, 1, 0, 1, 0],
'score': [6252, 24243, 2345, 2342, 23525]}
df3 = pd.DataFrame(raw_data, columns = ['patient', 'obs', 'treatment', 'score'])
l3 = df3.pivot(index='patient', columns='obs', values='score')
print(df3)
print('----------------------')
print(l3)
=>
--------------------------------------- Long to Wide --------------------------------------- date AA BB CC 0 05/03 1 2 3 1 06/03 4 5 6 2 07/03 7 8 9 3 08/03 5 7 1 -----------melt----------- date variable value 0 05/03 AA 1 1 06/03 AA 4 2 07/03 AA 7 3 08/03 AA 5 4 05/03 BB 2 5 06/03 BB 5 6 07/03 BB 8 7 08/03 BB 7 8 05/03 CC 3 9 06/03 CC 6 10 07/03 CC 9 11 08/03 CC 1 -----------unstac (.melt was 8 times faster than .unstack.reset_index()----------- level_0 date 0 0 AA 05/03 1 1 AA 06/03 4 2 AA 07/03 7 3 AA 08/03 5 4 BB 05/03 2 5 BB 06/03 5 6 BB 07/03 8 7 BB 08/03 7 8 CC 05/03 3 9 CC 06/03 6 10 CC 07/03 9 11 CC 08/03 1 -----------------------wide_to_long--------------------------------- famid birth ht_one ht_two 0 1 1 2.8 3.4 1 1 2 2.9 3.8 2 1 3 2.2 2.9 3 2 1 2.0 3.2 4 2 2 1.8 2.8 5 2 3 1.9 2.4 6 3 1 2.2 3.3 7 3 2 2.3 3.4 8 3 3 2.1 2.9 ---------------------- ht famid birth age 1 1 one 2.8 two 3.4 2 one 2.9 two 3.8 3 one 2.2 two 2.9 2 1 one 2.0 two 3.2 2 one 1.8 two 2.8 3 one 1.9 two 2.4 3 1 one 2.2 two 3.3 2 one 2.3 two 3.4 3 one 2.1 two 2.9 --------------------------------------- Long to Wide --------------------------------------- patient obs treatment score 0 1 1 0 6252 1 1 2 1 24243 2 1 3 0 2345 3 2 1 1 2342 4 2 2 0 23525 ---------------------- obs 1 2 3 patient 1 6252.0 24243.0 2345.0 2 2342.0 23525.0 NaN
## transformáció Long to Wide: pivot , pivot_table, crosstab
import pandas as pd
import numpy as np
fruits = ['apple','apple', 'pear','pear','plum']
colors = ['green','green','red','yellow','red']
tastes = ['sour','bitter','sweet','sour', 'sweet']
calories = np.round(np.random.normal(50,10,5), decimals = 0)
df = pd.DataFrame({'fruit': fruits,
'color': colors,
'taste': tastes,
'calories': calories})
p1 = df.pivot(index='fruit', columns='taste', values='calories')
p2 = df.pivot_table(index = 'fruit', columns = 'color', values = 'calories', aggfunc = 'sum', fill_value = 0)
p3 = df[['fruit', 'taste', 'calories']].set_index(['fruit','taste']).unstack()
#p4 = pd.crosstab(df['fruit'], df['color'])
p4 = pd.crosstab(index = df.fruit, columns = df.color, values = df.calories, aggfunc = 'sum').round(0)
print(df.head())
print('\n------pivot----------')
print(p1.head())
print('\n------pivot_table----------')
print(p2.head())
print('\n------unstack----------')
print(p3.head())
print('\n------crosstab----------')
print(p4.head())
=>
fruit color taste calories 0 apple green sour 67.0 1 apple green bitter 38.0 2 pear red sweet 45.0 3 pear yellow sour 51.0 4 plum red sweet 41.0 ------pivot---------- taste bitter sour sweet fruit apple 38.0 67.0 NaN pear NaN 51.0 45.0 plum NaN NaN 41.0 ------pivot_table---------- color green red yellow fruit apple 105 0 0 pear 0 45 51 plum 0 41 0 ------unstack---------- calories taste bitter sour sweet fruit apple 38.0 67.0 NaN pear NaN 51.0 45.0 plum NaN NaN 41.0 ------crosstab---------- color green red yellow fruit apple 105.0 NaN NaN pear NaN 45.0 51.0 plum NaN 41.0 NaN
Bach futtatás anaconda környezetben:
rem echo off
rem cls
rem "%windir%\System32\cmd.exe" /k
""C:\ProgramData\Anaconda3\Scripts\activate.bat" "C:\ProgramData\Anaconda3" && python "c:\Users\kecskemetil\Documents\prg\python\kiv_telj_napi.py""
Link:
https://github.com/klajosw/python/blob/master/kl_py_pandas_etl_09.ipynb
Megjegyzések
Megjegyzés küldése