#!/usr/bin/env python # coding: utf-8 # In[1]: from datetime import datetime print(f'Päivitetty {datetime.now().date()} / Aki Taanila') # # DataFrame # # Tästä muistiosta voit aloittaa vaikka et olisi koskaan koodannut Pythonilla. # # Paketti (kutsutaan myös kirjastoksi) on kokoelma valmista ohjelmakoodia, jota voin käyttää omissa ohjelmissani. Data-analytiikan peruspaketti on nimeltään **pandas**. # # Useimmat data-analytiikassa tarvittavat paketit sisältyvät Anacondaan ja Colabiin. Jos käytät Minicondaa, niin sinun pitää asentaa jokainen käytettävä paketti erikseen. # # Jos paketti on valmiiksi asennettu, niin voin tuoda sen käyttööni **import**-komennolla. Esimerkiksi `import pandas as pd` tuo pandas-paketin käyttööni siten että voin seuraavissa koodisoluissa viitata siihen lyhenteellä **pd**. # # Muistion solun voit suorittaa näppäinyhdistelmillä **ctrl-enter** (pysyt samassa solussa) tai **shift-enter** (siirryt seuraavaan soluun). # # Pandas-kirjaston keskeinen olio on **DataFrame** (muistuttaa taulukkolaskennan taulukkoa). Seuraavassa tutustun dataframe-olioon yksinkertaisen esimerkkidatan avulla. # In[2]: # Tuon data-analytiikan peruskirjaston import pandas as pd # Tallennan datan sanakirjaan (dictionary) # Sanakirjan ympärillä on aina aaltosulkeet {} # Listan ympärillä on aina hakasulkeet [] data = {'Tuote': ['muikkukukko', 'lanttukukko', 'lihalörtsy', 'kasvislörtsy'], 'Varasto': [8, 10, 5, 7], 'Hinta': [15, 12, 3, 3]} # Luon sanakirjasta dataframen, jonka nimeksi annan df df = pd.DataFrame(data) # Näytän dataframen df # In[3]: # Dataframen rivien ja sarkkeiden määrä df.shape # In[4]: # Rivi-indeksi (dataframen vasemmanpuoleisin sarake) # Jos rivi-indeksiä ei ole erikseen määritelty, niin se sisältää juoksevat numerot 0, 1, 2,... df.index # In[5]: # Sarakeindeksi (dataframen sarakeotsikot) df.columns # ## Indeksihaku iloc # # Voin viitata dataframen yksittäisiin soluihin indeksinumeroilla. Huomaa, että indeksinumerot alkavat numerosta 0! # In[6]: # Lanttukukon hinta indeksihaulla (1=lanttukukon rivi, 2=hinta-sarake) df.iloc[1, 2] # In[7]: # Tiedot lihalörtsyn riviltä (rivi 2) df.iloc[2] # ## Haku indeksin tunnuksella loc # # Voin viitata tietokehikon yksittäisiin soluihin indeksien tunnuksilla. # In[8]: # Siirrän tuote-sarakkeen arvot rivi-indeksin arvoiksi df = df.set_index('Tuote') df # In[9]: # Lihalörtsyn tiedot df.loc['lihalörtsy'] # In[10]: # Lihalörtsyn hinta df.loc['lihalörtsy','Hinta'] # In[11]: # Hintatiedot muikkukukosta lanttukukkoon df.loc['muikkukukko':'lanttukukko', 'Hinta'] # In[12]: # Tuotteiden hinnat # Kaksoispiste tarkoittaa, että otetaan mukaan kaikki rivit df.loc[:, 'Hinta'] # In[13]: # Jos tuloksena on indeksin lisäksi vain yhden sarakkeen tietoja, niin tulos ei ole dataframe, vaan series # Voin kuitenkin muuttaa tuloksen dataframeksi to_frame-funktiolla df.loc[:, 'Hinta'].to_frame() # ## Hieman laskentaa # # Voin laskea dataframeen uusia sarakkeita olemassaolevien sarakkeiden pohjalta. # In[14]: # Lasken tuotteiden varastoarvot Arvo-sarkkeeseen df['Arvo'] = df['Varasto']*df['Hinta'] df # In[15]: # Lasken summan Arvo-sarakkeesta df['Arvo'].sum() # In[16]: # Kukkojen varastoarvo df.loc['muikkukukko':'lanttukukko', 'Arvo'].sum() # In[17]: # Lisään %-sarakkeen (tuotteen osuus varaston kokonaisarvosta) df['%'] = df['Arvo']/df['Arvo'].sum()*100 df # Voin muotoilla dataframea muotoilukoodilla **{:.0f}**: # * Muotoilukoodi kirjotetaan aaltosulkujen väliin # * **:** on aloitusmerkki # * **.0** tarkoittaa 0 desimaalia # * **f** tarkoittaa liukulukua (float) # In[18]: # Lisään dataframeen summarivin df.loc['Yhteensä'] = df.sum() # Esitän dataframen ilman desimaaleja käyttämällä muotoilukoodia df.style.format('{:.0f}') # ## Rivien ja sarakkeiden vaihtaminen (transponointi) # In[19]: # T (transpose) vaihtaa dataframen rivit ja sarakkeet df.T.style.format('{:.0f}') # ## Luettelo muistikirjassa käytetyistä funktioista ja toiminnoista # # * Paketin tuonti **import**-toiminnolla; esimerkkinä **pandas**-paketin tuonti # * Merkkijono (**string**) kirjoitetaan heittomerkkien '' väliin (myös lainausmerkit "" käyvät). Merkkijonoja ovat esimerkiksi tiedostonimet, dataframen sarakeotsikot (muuttujien nimet), muuttujien tekstimuotoiset arvot. Huomaa kuitenkin, että Pythonin muuttujien nimiä ei kirjoitetan heittomerkkien väliin (esimerkiksi df, n jne.) # * Pythonin tietorakenne **lista**, joka kirjoitetaan hakasulkujen sisään # * Pythonin tietorakenne **sanakirja** (**dictionary**), joka kirjoitetaan aaltosulkujen sisään # * Pandas-kirjaston tietorakenteet **dataframe** ja **series** # * **pd.DataFrame()** dataframen luominen # * **df.shape** datan rivien ja sarakkeiden lukumäärät # * **df.index** dataframen vasemman reunan indeksi # * **df.columns** dataframen yläreunan indeksi # * **df.iloc[]** viittaus dataframen viipaleeseen indeksinumeroilla # * **df.set_index()** sarakkeen siirtäminen vasemman reunan indeksiin # * **df.loc[]** viittaus dataframen viipaleeseen indeksitunnuksilla # * **df.to_frame()** series-tyyppisen datan muuttaminen dataframeksi # * **df.sum()** summafunktio # * **df.style.format()** dataframen muotoilu # * **df.T** dataframen rivit sarakkeiksi ja päinvastoin # # Lisäksi opittiin laskemaan dataframeen uusia sarakkeita ja käyttämään muotoilukoodeja **style.format**-funktion yhteydessä. # ## Lisätietoa # # Tutustu DataFrame-olion ohjesivuun: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html # # Data-analytiikka Pythonilla https://tilastoapu.wordpress.com/python/