Ugrás a fő tartalomra

Python Pandas használata









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


Out[22]:
subjectszinttipuscsoport
0knime3a1
1Python4b1
2R nyelv3a2
3Java2c2
4PHP5d1
5JS1d3
6CSS4d1




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())


SQL és Pandas szintaktika összevetése

















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]:
total_billtipsexsmokerdaytimesize
016.991.01FemaleNoSunDinner2
110.341.66MaleNoSunDinner3
221.013.50MaleNoSunDinner3
323.683.31MaleNoSunDinner2
424.593.61FemaleNoSunDinner4
In [19]:
## SELECT total_bill, tip, smoker, time FROM tips LIMIT 5;  # /sql =>
print(tips[['total_bill', 'tip', 'smoker', 'time']].head(5))
   total_bill   tip smoker    time
0       16.99  1.01     No  Dinner
1       10.34  1.66     No  Dinner
2       21.01  3.50     No  Dinner
3       23.68  3.31     No  Dinner
4       24.59  3.61     No  Dinner
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))
   total_bill   tip     sex smoker  day    time  size   szamolt        fuzott
0       16.99  1.01  Female     No  Sun  Dinner     2  0.059447  Female / Sun
1       10.34  1.66    Male     No  Sun  Dinner     3  0.160542    Male / Sun
2       21.01  3.50    Male     No  Sun  Dinner     3  0.166587    Male / Sun
3       23.68  3.31    Male     No  Sun  Dinner     2  0.139780    Male / Sun
4       24.59  3.61  Female     No  Sun  Dinner     4  0.146808  Female / Sun
In [20]:
## SELECT * FROM tips WHERE size = 4  LIMIT 5;  # Szűrés /sql =>
print(tips[tips['size'] == 4].head(5))
    total_bill   tip     sex smoker  day    time  size
4        24.59  3.61  Female     No  Sun  Dinner     4
5        25.29  4.71    Male     No  Sun  Dinner     4
7        26.88  3.12    Male     No  Sun  Dinner     4
11       35.26  5.00  Female     No  Sun  Dinner     4
13       18.43  3.00    Male     No  Sun  Dinner     4
In [22]:
is_dinner = tips['time'] == 'Dinner'
print(is_dinner.value_counts())
True     176
False     68
Name: time, dtype: int64
In [23]:
tips[is_dinner].head(5)
Out[23]:
total_billtipsexsmokerdaytimesize
016.991.01FemaleNoSunDinner2
110.341.66MaleNoSunDinner3
221.013.50MaleNoSunDinner3
323.683.31MaleNoSunDinner2
424.593.61FemaleNoSunDinner4
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)])
     total_bill    tip     sex smoker  day    time  size
23        39.42   7.58    Male     No  Sat  Dinner     4
44        30.40   5.60    Male     No  Sun  Dinner     4
47        32.40   6.00    Male     No  Sun  Dinner     4
52        34.81   5.20  Female     No  Sun  Dinner     4
59        48.27   6.73    Male     No  Sat  Dinner     4
116       29.93   5.07    Male     No  Sun  Dinner     4
155       29.85   5.14  Female     No  Sun  Dinner     5
170       50.81  10.00    Male    Yes  Sat  Dinner     3
172        7.25   5.15    Male    Yes  Sun  Dinner     2
181       23.33   5.65    Male    Yes  Sun  Dinner     2
183       23.17   6.50    Male    Yes  Sun  Dinner     4
211       25.89   5.16    Male    Yes  Sat  Dinner     4
212       48.33   9.00    Male     No  Sat  Dinner     4
214       28.17   6.50  Female    Yes  Sat  Dinner     3
239       29.03   5.92    Male     No  Sat  Dinner     3
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)])
     total_bill    tip     sex smoker   day    time  size
59        48.27   6.73    Male     No   Sat  Dinner     4
125       29.80   4.20  Female     No  Thur   Lunch     6
141       34.30   6.70    Male     No  Thur   Lunch     6
142       41.19   5.00    Male     No  Thur   Lunch     5
143       27.05   5.00  Female     No  Thur   Lunch     6
155       29.85   5.14  Female     No   Sun  Dinner     5
156       48.17   5.00    Male     No   Sun  Dinner     6
170       50.81  10.00    Male    Yes   Sat  Dinner     3
182       45.35   3.50    Male    Yes   Sun  Dinner     3
185       20.69   5.00    Male     No   Sun  Dinner     5
187       30.46   2.00    Male    Yes   Sun  Dinner     5
212       48.33   9.00    Male     No   Sat  Dinner     4
216       28.15   3.00    Male    Yes   Sat  Dinner     5
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()])
  col1 col2
1    B  NaN
In [32]:
## SELECT * FROM frame WHERE col1 IS NOT NULL;    /sql =>
print(frame[frame['col2'].notna()])
  col1 col2
0    A    F
2  NaN    G
3    C    H
4    D    I
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())
Size     :  sex
Female     87
Male      157
dtype: int64
Count    :  sex
Female     87
Male      157
Name: total_bill, dtype: int64
CountAll :          total_bill  tip  smoker  day  time  size
sex                                             
Female          87   87      87   87    87    87
Male           157  157     157  157   157   157
In [36]:
## SELECT day, AVG(tip), COUNT(*) FROM tips GROUP BY day; /sql =>
print(tips.groupby('day').agg({'tip': np.mean, 'day': np.size}))
           tip  day
day                
Fri   2.734737   19
Sat   2.993103   87
Sun   3.255132   76
Thur  2.771452   62
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]}))
              tip          
             size      mean
smoker day                 
No     Fri    4.0  2.812500
       Sat   45.0  3.102889
       Sun   57.0  3.167895
       Thur  45.0  2.673778
Yes    Fri   15.0  2.714000
       Sat   42.0  2.875476
       Sun   19.0  3.516842
       Thur  17.0  3.030000
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'))
  key   value_x   value_y
0   B -1.551345  1.328343
1   D -2.079102  1.324529
2   D -2.079102 -1.423345
In [39]:
indexed_df2 = df2.set_index('key')
print(pd.merge(df1, indexed_df2, left_on='key', right_index=True))
  key   value_x   value_y
1   B -1.551345  1.328343
3   D -2.079102  1.324529
3   D -2.079102 -1.423345
In [40]:
## SELECT * FROM df1 LEFT OUTER JOIN df2   ON df1.key = df2.key;  /sql =>
print(pd.merge(df1, df2, on='key', how='left'))
  key   value_x   value_y
0   A  1.642389       NaN
1   B -1.551345  1.328343
2   C  0.665297       NaN
3   D -2.079102  1.324529
4   D -2.079102 -1.423345
In [41]:
## SELECT * FROM df1 RIGHT OUTER JOIN df2   ON df1.key = df2.key;   /sql =>
print(pd.merge(df1, df2, on='key', how='right'))
  key   value_x   value_y
0   B -1.551345  1.328343
1   D -2.079102  1.324529
2   D -2.079102 -1.423345
3   E       NaN  0.280305
In [42]:
## SELECT * FROM df1 FULL OUTER JOIN df2   ON df1.key = df2.key; /sql =>
print(pd.merge(df1, df2, on='key', how='outer'))
  key   value_x   value_y
0   A  1.642389       NaN
1   B -1.551345  1.328343
2   C  0.665297       NaN
3   D -2.079102  1.324529
4   D -2.079102 -1.423345
5   E       NaN  0.280305
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]))
            city  rank
0        Chicago     1
1  San Francisco     2
2  New York City     3
0        Chicago     1
1         Boston     4
2    Los Angeles     5
In [44]:
## union
print(pd.concat([df1, df2]).drop_duplicates())
            city  rank
0        Chicago     1
1  San Francisco     2
2  New York City     3
1         Boston     4
2    Los Angeles     5
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


/* 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)

 


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>.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













Megjegyzések