BI kurzus


In [1]:
import pandas as pd

In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:

Bővítőcsomagok importálása


In [1]:
import pandas as pd
import numpy as np

Előzetesen mentsük el valamelyik D3plus példa adatait a valami.json-ba


In [2]:
df=pd.read_json('valami.json')

In [3]:
df


Out[3]:
group name uj value
0 group 1 alpha 9 100
1 group 1 epsilon 9 500
2 group 2 gamma 9 40
3 group 1 zeta 9 1
4 group 2 delta 9 15
5 group 2 beta 9 70

Oszlop kiíratása


In [6]:
df[['group']]


Out[6]:
group
0 group 1
1 group 1
2 group 2
3 group 1
4 group 2
5 group 2

Sor kiíratása


In [7]:
df.loc[4]


Out[7]:
group    group 2
name       delta
uj             9
value         15
Name: 4, dtype: object

Új oszlop


In [10]:
df['uj']=9

In [11]:
df


Out[11]:
group name uj value
0 group 1 alpha 9 100
1 group 1 epsilon 9 500
2 group 2 gamma 9 40
3 group 1 zeta 9 1
4 group 2 delta 9 15
5 group 2 beta 9 70

Data frame exportálás


In [15]:
df.to_json('valami2.json')

Transzponált


In [16]:
df.T


Out[16]:
0 1 2 3 4 5
group group 1 group 2 group 2 group 2 group 1 group 1
name alpha beta gamma delta epsilon zeta
value 100 70 40 15 500 1
uj 9 9 9 9 9 9

In [17]:
df.T.to_json('valami3.json')

JSON formázás


In [12]:
import json

In [13]:
enyim=df.T.to_json()

pandas dataframe to_json függvény stringet generál


In [16]:
enyim


Out[16]:
'{"0":{"group":"group 1","name":"alpha","uj":9,"value":100},"1":{"group":"group 1","name":"epsilon","uj":9,"value":500},"2":{"group":"group 2","name":"gamma","uj":9,"value":40},"3":{"group":"group 1","name":"zeta","uj":9,"value":1},"4":{"group":"group 2","name":"delta","uj":9,"value":15},"5":{"group":"group 2","name":"beta","uj":9,"value":70}}'

Ezt átkonvertáljuk JSON-ba


In [17]:
enyimjson=json.loads(enyim)

In [18]:
enyimjson


Out[18]:
{u'0': {u'group': u'group 1', u'name': u'alpha', u'uj': 9, u'value': 100},
 u'1': {u'group': u'group 1', u'name': u'epsilon', u'uj': 9, u'value': 500},
 u'2': {u'group': u'group 2', u'name': u'gamma', u'uj': 9, u'value': 40},
 u'3': {u'group': u'group 1', u'name': u'zeta', u'uj': 9, u'value': 1},
 u'4': {u'group': u'group 2', u'name': u'delta', u'uj': 9, u'value': 15},
 u'5': {u'group': u'group 2', u'name': u'beta', u'uj': 9, u'value': 70}}

A JSON olyan mint egy szótár: vannak kulcsok (keys) és értékek (values)


In [19]:
enyimjson.keys()


Out[19]:
[u'1', u'0', u'3', u'2', u'5', u'4']

In [20]:
enyimjson.values()


Out[20]:
[{u'group': u'group 1', u'name': u'epsilon', u'uj': 9, u'value': 500},
 {u'group': u'group 1', u'name': u'alpha', u'uj': 9, u'value': 100},
 {u'group': u'group 1', u'name': u'zeta', u'uj': 9, u'value': 1},
 {u'group': u'group 2', u'name': u'gamma', u'uj': 9, u'value': 40},
 {u'group': u'group 2', u'name': u'beta', u'uj': 9, u'value': 70},
 {u'group': u'group 2', u'name': u'delta', u'uj': 9, u'value': 15}]

In [21]:
jsonlista=list(enyimjson.values())

In [22]:
jsonlista


Out[22]:
[{u'group': u'group 1', u'name': u'epsilon', u'uj': 9, u'value': 500},
 {u'group': u'group 1', u'name': u'alpha', u'uj': 9, u'value': 100},
 {u'group': u'group 1', u'name': u'zeta', u'uj': 9, u'value': 1},
 {u'group': u'group 2', u'name': u'gamma', u'uj': 9, u'value': 40},
 {u'group': u'group 2', u'name': u'beta', u'uj': 9, u'value': 70},
 {u'group': u'group 2', u'name': u'delta', u'uj': 9, u'value': 15}]

A dumps függvény újra stringet generál


In [24]:
json.dumps(jsonlista)


Out[24]:
'[{"group": "group 1", "name": "epsilon", "value": 500, "uj": 9}, {"group": "group 1", "name": "alpha", "value": 100, "uj": 9}, {"group": "group 1", "name": "zeta", "value": 1, "uj": 9}, {"group": "group 2", "name": "gamma", "value": 40, "uj": 9}, {"group": "group 2", "name": "beta", "value": 70, "uj": 9}, {"group": "group 2", "name": "delta", "value": 15, "uj": 9}]'

Fájlba mentés


In [44]:
open('ujvalami.json','w').write(json.dumps(jsonlista))


Out[44]:
367

In [45]:
df


Out[45]:
group name value uj
0 group 1 alpha 100 9
1 group 2 beta 70 9
2 group 2 gamma 40 9
3 group 2 delta 15 9
4 group 1 epsilon 500 9
5 group 1 zeta 1 9

Egy elem lekérdezése pandasból


In [46]:
df.loc[2]['name']


Out[46]:
'gamma'

Nem lehet egy elemet megváltoztatni, csak egy teljes oszlopot


In [47]:
df.loc[2]['name']='ujgamma'


C:\Anaconda2\envs\python3\lib\site-packages\ipykernel\__main__.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  if __name__ == '__main__':

In [48]:
df


Out[48]:
group name value uj
0 group 1 alpha 100 9
1 group 2 beta 70 9
2 group 2 gamma 40 9
3 group 2 delta 15 9
4 group 1 epsilon 500 9
5 group 1 zeta 1 9

In [52]:
ujlista=range(6)

Új oszlop


In [54]:
df['uj2']=ujlista

In [55]:
df


Out[55]:
group name value uj uj2
0 group 1 alpha 100 9 0
1 group 2 beta 70 9 1
2 group 2 gamma 40 9 2
3 group 2 delta 15 9 3
4 group 1 epsilon 500 9 4
5 group 1 zeta 1 9 5

Még egy új oszlop


In [56]:
df['uj3']=['a','b','c','d','t','d']

In [57]:
df


Out[57]:
group name value uj uj2 uj3
0 group 1 alpha 100 9 0 a
1 group 2 beta 70 9 1 b
2 group 2 gamma 40 9 2 c
3 group 2 delta 15 9 3 d
4 group 1 epsilon 500 9 4 t
5 group 1 zeta 1 9 5 d

Kis játék függvény: elment egy dataframe-et ujvalamix.json néven D3plus formátumban


In [25]:
def d3plus(df):
    open('ujvalamix.json','w').write(json.dumps(list(json.loads(df.T.to_json()).values())))
    print('oke')

In [26]:
d3plus(df)


oke

In [27]:
import pandas as pd
import html5lib

HTML táblázatok beolvasása


In [28]:
dfs=pd.read_html(r'https://hu.wikipedia.org/wiki/Marosvásárhely')

In [29]:
dfs[3]


Out[29]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 Marosvásárhely éghajlati jellemzői NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 Hónap Jan. Feb. Már. Ápr. Máj. Jún. Júl. Aug. Szep. Okt. Nov. Dec. Év
2 Rekord max. hőmérséklet (°C) 140 190 270 325 344 353 390 385 382 315 265 183 390
3 Átlaghőmérséklet (°C) −4,0 −1,8 40 97 148 177 194 188 146 92 37 13 90
4 Rekord min. hőmérséklet (°C) −32,8 −32,0 −27,3 −7,5 −1,6 03 46 27 −3,3 −8,4 −19,6 −25,9 −32,8
5 Forrás: Románia statisztikai évkönyve, 2006 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

In [30]:
dfs[9]


Out[30]:
0 1 2 3 4 5 6 7
0 Év Összesen Magyar Román Német Zsidó Roma Egyéb
1 1850 8 719 75,1% 13,5% 2,8% 2,9% 3,8% 1,9%
2 1880 12 883 88,9% 5,2% 3,5% NaN NaN 2,4%
3 1900 19 552 83,3% 11,6% 3,6% NaN NaN 1,5%
4 1910 25 517 89,3% 6,7% 2,4% NaN NaN 1,6%
5 1930 40 058 57,2% 26,7% 1,7% 12,1% 1,1% 1,2%
6 1966 86 464 70,9% 28,3% 0,6% NaN NaN 0,2%
7 1977 130 076 63,6% 34,8% 0,6% 0,4% 0,5% 0,1%
8 1992 164 445 51,4% 46,1% 0,3% 0,1% 2% 0,1%
9 2002 150 041 46,7% 50,3% 0,2% 0,1% 2,4% 0,2%
10 2011[16] 134 290 42,84% 49,17% 0,15% 0,05% 2,32% 5,47%

In [35]:
df=dfs[9]

In [36]:
df


Out[36]:
0 1 2 3 4 5 6 7
0 Év Összesen Magyar Román Német Zsidó Roma Egyéb
1 1850 8 719 75,1% 13,5% 2,8% 2,9% 3,8% 1,9%
2 1880 12 883 88,9% 5,2% 3,5% NaN NaN 2,4%
3 1900 19 552 83,3% 11,6% 3,6% NaN NaN 1,5%
4 1910 25 517 89,3% 6,7% 2,4% NaN NaN 1,6%
5 1930 40 058 57,2% 26,7% 1,7% 12,1% 1,1% 1,2%
6 1966 86 464 70,9% 28,3% 0,6% NaN NaN 0,2%
7 1977 130 076 63,6% 34,8% 0,6% 0,4% 0,5% 0,1%
8 1992 164 445 51,4% 46,1% 0,3% 0,1% 2% 0,1%
9 2002 150 041 46,7% 50,3% 0,2% 0,1% 2,4% 0,2%
10 2011[16] 134 290 42,84% 49,17% 0,15% 0,05% 2,32% 5,47%

In [37]:
df.loc[0]


Out[37]:
0          Év
1    Összesen
2      Magyar
3       Román
4       Német
5       Zsidó
6        Roma
7       Egyéb
Name: 0, dtype: object

In [38]:
df.columns


Out[38]:
Int64Index([0, 1, 2, 3, 4, 5, 6, 7], dtype='int64')

Oszlopok neveinek kicserélése


In [39]:
df.columns=df.loc[0]

In [40]:
df


Out[40]:
Év Összesen Magyar Román Német Zsidó Roma Egyéb
0 Év Összesen Magyar Román Német Zsidó Roma Egyéb
1 1850 8 719 75,1% 13,5% 2,8% 2,9% 3,8% 1,9%
2 1880 12 883 88,9% 5,2% 3,5% NaN NaN 2,4%
3 1900 19 552 83,3% 11,6% 3,6% NaN NaN 1,5%
4 1910 25 517 89,3% 6,7% 2,4% NaN NaN 1,6%
5 1930 40 058 57,2% 26,7% 1,7% 12,1% 1,1% 1,2%
6 1966 86 464 70,9% 28,3% 0,6% NaN NaN 0,2%
7 1977 130 076 63,6% 34,8% 0,6% 0,4% 0,5% 0,1%
8 1992 164 445 51,4% 46,1% 0,3% 0,1% 2% 0,1%
9 2002 150 041 46,7% 50,3% 0,2% 0,1% 2,4% 0,2%
10 2011[16] 134 290 42,84% 49,17% 0,15% 0,05% 2,32% 5,47%

Szeletelés a sorokban


In [41]:
de=df.loc[1:9]

In [42]:
de


Out[42]:
Év Összesen Magyar Román Német Zsidó Roma Egyéb
1 1850 8 719 75,1% 13,5% 2,8% 2,9% 3,8% 1,9%
2 1880 12 883 88,9% 5,2% 3,5% NaN NaN 2,4%
3 1900 19 552 83,3% 11,6% 3,6% NaN NaN 1,5%
4 1910 25 517 89,3% 6,7% 2,4% NaN NaN 1,6%
5 1930 40 058 57,2% 26,7% 1,7% 12,1% 1,1% 1,2%
6 1966 86 464 70,9% 28,3% 0,6% NaN NaN 0,2%
7 1977 130 076 63,6% 34,8% 0,6% 0,4% 0,5% 0,1%
8 1992 164 445 51,4% 46,1% 0,3% 0,1% 2% 0,1%
9 2002 150 041 46,7% 50,3% 0,2% 0,1% 2,4% 0,2%

Stringek átaáalkítás számokká, tizedes vessző miatt


In [43]:
ures=[]
for i in range(1,10):
    print(i)
    elso=int(de.loc[i]['Magyar'][:2])
    masodik=int(de.loc[i]['Magyar'][3:4])
    ures.append(elso+masodik/10.0)
    print(ures)


1
[75.1]
2
[75.1, 88.9]
3
[75.1, 88.9, 83.3]
4
[75.1, 88.9, 83.3, 89.3]
5
[75.1, 88.9, 83.3, 89.3, 57.2]
6
[75.1, 88.9, 83.3, 89.3, 57.2, 70.9]
7
[75.1, 88.9, 83.3, 89.3, 57.2, 70.9, 63.6]
8
[75.1, 88.9, 83.3, 89.3, 57.2, 70.9, 63.6, 51.4]
9
[75.1, 88.9, 83.3, 89.3, 57.2, 70.9, 63.6, 51.4, 46.7]

In [44]:
de['ujoszlop']=ures


C:\Anaconda2\lib\site-packages\ipykernel\__main__.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  if __name__ == '__main__':

In [45]:
open('mv2.json','w').write(json.dumps(list(json.loads(de.T.to_json()).values())))