PANDAS Link
A pandas egy adatkezelő python függvénykönyvtár/modul, amit a Data Scientistek és analystek is nagyon szeretnek.
Az adatokat excellhez hasonlatos táblázatos formában kezeli.
A táblázatoknak van fejlécük és indexük és ez meg is változtatható.
Heterogén adatokat tárolhatunk bennük: szöveges, számadat, igazságérték, dátum stb.
Az adatok típusa egy oszlopon belül sem kell, hogy azonos legyen.
A pandas remekül együttműködik a Python gépi tanuló könyvtárával (scikit-learn) és a legelterjedtebb vizualizációs könyvtárakkal (matplotlib, seaborn).
Használathoz előszór be kell tölteni a modulokat:
import pandas as pd ## konvenció szerint pd aliast használunk
%matplotlib inline
import matplotlib
import numpy as np
%matplotlib inline
import matplotlib
import numpy as np
Out[22]:
In [5]:
# Import
import pandas as pd
In [6]:
## csv olvasás + írás
user = pd.read_csv('ugyfelcsv1.csv', header=None, nrows=5) ## csv-ből olvasás, nincs fejlécsor, az első 5 sort
user ## megjelenítés
user.to_csv('ugyfelcsv1_kimenet.csv') ## csv-be mentés
In [7]:
## xls olvasás + írás
xlsx = pd.ExcelFile('telepules.xlsx') ## xls-ből olvasás
df = pd.read_excel(xlsx, 'telepules') ## aktív munkalap kijelőlése
df ## megjelenítés
df.to_excel('telepules_kimenet.xlsx', sheet_name='Tel') ## xls-be mentés
In [8]:
## alap infok (pandas)
print('Sor, oszlop szám' ,df.shape) ## sor és oszlopszám kiírása
print('index', df.index)
print('Oszlop nevek', df.columns)
print('ifo',df.info())
print('count',df.count())
print('cumsum', df.cumsum())
print('describe',df.describe())
In [11]:
import time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sqlite3
import numpy as np
##------------------------------- SQL alapok (SqLite)
sqlite_alapok = r"""
conn = sqlite3.connect(r"c:\Users\u23442\kl\sqlite\minta.db")
## Tábla létrehozás, ha még nem létezik
conn.execute("create table if not exists user (name text, age integer)")
## Beírás kurzoron keresztül
c = conn.cursor()
c.execute("INSERT INTO user VALUES ('User A', 42)")
c.execute("INSERT INTO user VALUES ('User B', 43)")
## Csoportos beírás
L = [('abcd_dfj', 300),
('cfgd_dyfj', 400),
('sdd_dfjh', 305)]
conn.executemany("insert into user values (?, ?)", L)
## Véglegesítés
conn.commit()
c.execute("SELECT * FROM user")
print('KIIRAS : ',c.fetchall()) ## KIIRAS : [('User A', 42), ('User B', 43)..
rows = c.execute("select * from user")
for row in rows:
print('Nevek : ',row[0]), ## Nevek : cfgd_dyfj
for row in conn.execute("select * from user"):
print('SOR : ',row) ## SOR : ('User A', 42)
## Kapcsolat bezárása
conn.close()
# ---------------------- Pandas
## pandas állományba írás
d = {'a': (1, 2, 101), 'b': (2, 2, 202), 'c': (3, 3, 303.123456789),'e': (3,2, 203),'f': (3, 3,103),'g': (2, 1,303)}
df=pd.DataFrame.from_dict(d, orient="index")
df.to_csv("data.csv")
## pandas állományból olvasás
df = pd.read_csv("data.csv")
d = df.to_dict()
print('Eredeti : ', df)
## mező átnevezés / sql: select mezo as ujmezo
df.columns = ['col2', 'col3', 'col4']
print('Átnevezett : ', df)
## egyediek kiválasztása / sql: select distinct
np.unique(df['col2'])
print('Egyedi : ', np.unique(df['col2']))
## dátumtra alakítás / sql: select CAST(col1 AS DATE) AS col2
print('Datumra alakítva : ', pd.to_datetime(df['col4']))
## tizedes pontosság változtatása / select CAST(col1 AS DECIMAL(15,4))
df['col4'] = df['col4'].round(4)
print('Átnevezett : ', df)
## szűrés rekordsorszám és mező sorszám alapján
szurt = df.iloc[0:3, 0:1] ## első három sor kiválasztása és csak a col2 oszlop
szurt.to_csv('my.output.csv', index = 0) ## fejlécsor kihagyása kiíráskor
print('Szűrt : ', szurt)
## első pár sor / sql:SELECT TOP 10
print('Csak az első három sor : ', df.head(3))
## csoportosított összeadás / sql: SELECT col1, col2 ,COUNT(*), agv(mezo)
print('összegzés : ',df.groupby(['col2']).agg({'col4':[np.size, np.mean]}))
## /sql: ROW_NUMBER() OVER (PARTITION BY col2, col3 ORDER BY col4 ASC) AS rn
df2 = df.assign(rn=df.sort_values(['col4'], ascending=True).groupby(['col2','col3']).cumcount() + 1)
print('Kiválasztási lista : ', df2)
## / sql: SELECT * FROM (SELECT t.*, ROW_NUMBER() OVER(PARTITION BY day ORDER BY total_bill DESC) AS rn WHERE rn < 3 ORDER BY day, rn;
df2 = df.assign(rn=df.sort_values(['col4'], ascending=False).groupby(['col3']).cumcount() + 1).query('rn < 3').sort_values(['col2','rn'])
print('Kiválasztási lista2 : ', df2)
## --------------- sűrések
/sql: UNION ALL
pd.concat([df1, df2])
/sql: UNION
pd.concat([df1, df2]).drop_duplicates()
"""
#st = ['foo', 'foobar', 'baz', 'qux','python', 'Guido Van Rossum'] * 10000
# print('st0 : ',st)
kl_segito="""
## Minta keresés tartalmazás
%time st1 = [x for x in st if x.startswith('foo')]
%time st2 = [x for x in st if x[:3] == 'foo']
%timeit [x for x in st if x.startswith('foo')]
%timeit [x for x in st if x[:3] == 'foo']
#print('st1 : ',st1)
#print('st2 : ',st2)
#----
import some_lib
reload(some_lib) ## megváltozott modul újra olvasása, friseb verzió betöltés kierőszakolása
class Message:
def __init__(self, msg):
self.msg = msg
def __repr__(self):
return 'Visszamondom neked : %s' % self.msg
x = Message('Mond vissza, kérlek.')
print(x)
## ------------------ numpy
data = ([[ 0.9526, -0.246 , -0.8856],[ 0.5639, 0.2379, 0.9104]])
data2= np.array(data)
print(data2.shape)
kl=np.empty((2, 3, 2))
print(kl)
kl = np.array([[1., 2., 3.], [4., 5., 6.]])
kl = kl*kl
print(kl)
"""
In [18]:
import numpy as np
import pandas as pd
url = (r'https://raw.github.com/pandas-dev/pandas/master/pandas/tests/io/data/csv/tips.csv')
tips = pd.read_csv(url)
tips.head()
Out[18]:
In [19]:
## SELECT total_bill, tip, smoker, time FROM tips LIMIT 5; # /sql =>
print(tips[['total_bill', 'tip', 'smoker', 'time']].head(5))
In [24]:
## SELECT *, tip/total_bill as szamolt FROM tips LIMIT 5; # új számolt mezővel bővítés /sql =>
print(tips.assign(szamolt=tips['tip'] / tips['total_bill']).assign(fuzott=tips['sex'] + ' / '+ tips['day']).head(5))
In [20]:
## SELECT * FROM tips WHERE size = 4 LIMIT 5; # Szűrés /sql =>
print(tips[tips['size'] == 4].head(5))
In [22]:
is_dinner = tips['time'] == 'Dinner'
print(is_dinner.value_counts())
In [23]:
tips[is_dinner].head(5)
Out[23]:
In [24]:
## SELECT * FROM tips WHERE time = 'Dinner' AND tip > 5.00; # Összetett szűrés és-es & /sql =>
print(tips[(tips['time'] == 'Dinner') & (tips['tip'] > 5.00)])
In [29]:
## SELECT * FROM tips WHERE size >= 5 OR total_bill > 45; # Összetett szűrés vagy-os | /sql =>
print(tips[(tips['size'] >= 5) | (tips['total_bill'] > 45)])
In [30]:
frame = pd.DataFrame({'col1': ['A', 'B', np.NaN, 'C', 'D'],
'col2': ['F', np.NaN, 'G', 'H', 'I']})
## SELECT * FROM frame WHERE col2 IS NULL; /sql =>
print(frame[frame['col2'].isna()])
In [32]:
## SELECT * FROM frame WHERE col1 IS NOT NULL; /sql =>
print(frame[frame['col2'].notna()])
In [35]:
## SELECT sex, count(*) FROM tips GROUP BY sex; /sql =>
print('Size : ', tips.groupby('sex').size())
print('Count : ', tips.groupby('sex')['total_bill'].count())
print('CountAll : ', tips.groupby('sex').count())
In [36]:
## SELECT day, AVG(tip), COUNT(*) FROM tips GROUP BY day; /sql =>
print(tips.groupby('day').agg({'tip': np.mean, 'day': np.size}))
In [37]:
## SELECT smoker, day, COUNT(*), AVG(tip) FROM tips GROUP BY smoker, day; /sql =>
print(tips.groupby(['smoker', 'day']).agg({'tip': [np.size, np.mean]}))
In [38]:
## JOIN
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
'value': np.random.randn(4)})
df2 = pd.DataFrame({'key': ['B', 'D', 'D', 'E'],
'value': np.random.randn(4)})
## SELECT * FROM df1 INNER JOIN df2 ON df1.key = df2.key; /sql =>
print(pd.merge(df1, df2, on='key'))
In [39]:
indexed_df2 = df2.set_index('key')
print(pd.merge(df1, indexed_df2, left_on='key', right_index=True))
In [40]:
## SELECT * FROM df1 LEFT OUTER JOIN df2 ON df1.key = df2.key; /sql =>
print(pd.merge(df1, df2, on='key', how='left'))
In [41]:
## SELECT * FROM df1 RIGHT OUTER JOIN df2 ON df1.key = df2.key; /sql =>
print(pd.merge(df1, df2, on='key', how='right'))
In [42]:
## SELECT * FROM df1 FULL OUTER JOIN df2 ON df1.key = df2.key; /sql =>
print(pd.merge(df1, df2, on='key', how='outer'))
In [43]:
df1 = pd.DataFrame({'city': ['Chicago', 'San Francisco', 'New York City'],
'rank': range(1, 4)})
df2 = pd.DataFrame({'city': ['Chicago', 'Boston', 'Los Angeles'],
'rank': [1, 4, 5]})
## union all
print(pd.concat([df1, df2]))
In [44]:
## union
print(pd.concat([df1, df2]).drop_duplicates())
In [ ]:
CSS beállítás:
~/.ipython/profile_default/static/custom/custom.css
~/.jupyter/custom/custom.css
C:\Users\YourUsername\Anaconda3\Lib\site-packages\notebook\static\custom\custom.css
~/.jupyter/custom/custom.css
C:\Users\YourUsername\Anaconda3\Lib\site-packages\notebook\static\custom\custom.css
/* GLOBALS */
@media (min-width: 600px)
body {
background-color: #fff;
position: absolute;
left: 0px;
right: 0px;
top: 0px;
bottom: 0px;
overflow: visible;
height: 100%;
width: 100%;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 13px;
line-height: 1.42857143;
color: #000;
}
body > #header {
position: relative;
z-index: 100;
background-color: #EEE;
}
.container { width: 90%; }
a {color: #3182bd;}
.notebook_app { background-color: #EEE; }
from IPython.display import HTML, display
def display_table(data):
html = "<table>"
html += r"<tr><th>1</th><th>2</th><th>3</th></tr>"
for row in data:
html += "<tr>"
for field in row:
html += r"<td>%s</td>"%(field)
html += r"</tr>"
html += r"</table>"
display(HTML(html))
data = [[1,2,3],[4,5,6],[7,8,9]]
display_table(data)
def display_table(data):
html = "<table>"
html += r"<tr><th>1</th><th>2</th><th>3</th></tr>"
for row in data:
html += "<tr>"
for field in row:
html += r"<td>%s</td>"%(field)
html += r"</tr>"
html += r"</table>"
display(HTML(html))
data = [[1,2,3],[4,5,6],[7,8,9]]
display_table(data)
from IPython.display import HTML
# HTML('<style>{}</style>'.format(open('custom.css').read())) --- külső stilus file használata
html = r"<style>.css-example { color: green; }</style> "
html += r"<span class='css-example'>Ez egy piros szöveg</span>"
display(HTML(html))
# HTML('<style>{}</style>'.format(open('custom.css').read())) --- külső stilus file használata
html = r"<style>.css-example { color: green; }</style> "
html += r"<span class='css-example'>Ez egy piros szöveg</span>"
display(HTML(html))
%%html
<style>.css-example { color: blue; }</style>
<span class='css-example'>Ez a szöveg más színű</span>
Interaktív kialakítás:
import ipywidgets as widgets
accordion = widgets.Accordion(children=[
widgets.IntSlider(),
widgets.Text(),
widgets.FloatSlider(
value=7.5,
min=0,
max=10.0,
step=0.1,
description='Test:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='.1f',),
widgets.DatePicker(
description='Pick a Date',
disabled=False)
])
accordion.set_title(0, 'Slider Int')
accordion.set_title(1, 'Text')
accordion.set_title(2, 'Slider Float')
accordion.set_title(3, 'Date picker')
accordion
accordion = widgets.Accordion(children=[
widgets.IntSlider(),
widgets.Text(),
widgets.FloatSlider(
value=7.5,
min=0,
max=10.0,
step=0.1,
description='Test:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='.1f',),
widgets.DatePicker(
description='Pick a Date',
disabled=False)
])
accordion.set_title(0, 'Slider Int')
accordion.set_title(1, 'Text')
accordion.set_title(2, 'Slider Float')
accordion.set_title(3, 'Date picker')
accordion
Megjegyzések
Megjegyzés küldése