from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2024-02-07 / Aki Taanila
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.
# 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
Tuote | Varasto | Hinta | |
---|---|---|---|
0 | muikkukukko | 8 | 15 |
1 | lanttukukko | 10 | 12 |
2 | lihalörtsy | 5 | 3 |
3 | kasvislörtsy | 7 | 3 |
# Dataframen rivien ja sarkkeiden määrä
df.shape
(4, 3)
# Rivi-indeksi (dataframen vasemmanpuoleisin sarake)
# Jos rivi-indeksiä ei ole erikseen määritelty, niin se sisältää juoksevat numerot 0, 1, 2,...
df.index
RangeIndex(start=0, stop=4, step=1)
# Sarakeindeksi (dataframen sarakeotsikot)
df.columns
Index(['Tuote', 'Varasto', 'Hinta'], dtype='object')
Voin viitata dataframen yksittäisiin soluihin indeksinumeroilla. Huomaa, että indeksinumerot alkavat numerosta 0!
# Lanttukukon hinta indeksihaulla (1=lanttukukon rivi, 2=hinta-sarake)
df.iloc[1, 2]
12
# Tiedot lihalörtsyn riviltä (rivi 2)
df.iloc[2]
Tuote lihalörtsy Varasto 5 Hinta 3 Name: 2, dtype: object
Voin viitata tietokehikon yksittäisiin soluihin indeksien tunnuksilla.
# Siirrän tuote-sarakkeen arvot rivi-indeksin arvoiksi
df = df.set_index('Tuote')
df
Varasto | Hinta | |
---|---|---|
Tuote | ||
muikkukukko | 8 | 15 |
lanttukukko | 10 | 12 |
lihalörtsy | 5 | 3 |
kasvislörtsy | 7 | 3 |
# Lihalörtsyn tiedot
df.loc['lihalörtsy']
Varasto 5 Hinta 3 Name: lihalörtsy, dtype: int64
# Lihalörtsyn hinta
df.loc['lihalörtsy','Hinta']
3
# Hintatiedot muikkukukosta lanttukukkoon
df.loc['muikkukukko':'lanttukukko', 'Hinta']
Tuote muikkukukko 15 lanttukukko 12 Name: Hinta, dtype: int64
# Tuotteiden hinnat
# Kaksoispiste tarkoittaa, että otetaan mukaan kaikki rivit
df.loc[:, 'Hinta']
Tuote muikkukukko 15 lanttukukko 12 lihalörtsy 3 kasvislörtsy 3 Name: Hinta, dtype: int64
# 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()
Hinta | |
---|---|
Tuote | |
muikkukukko | 15 |
lanttukukko | 12 |
lihalörtsy | 3 |
kasvislörtsy | 3 |
Voin laskea dataframeen uusia sarakkeita olemassaolevien sarakkeiden pohjalta.
# Lasken tuotteiden varastoarvot Arvo-sarkkeeseen
df['Arvo'] = df['Varasto']*df['Hinta']
df
Varasto | Hinta | Arvo | |
---|---|---|---|
Tuote | |||
muikkukukko | 8 | 15 | 120 |
lanttukukko | 10 | 12 | 120 |
lihalörtsy | 5 | 3 | 15 |
kasvislörtsy | 7 | 3 | 21 |
# Lasken summan Arvo-sarakkeesta
df['Arvo'].sum()
276
# Kukkojen varastoarvo
df.loc['muikkukukko':'lanttukukko', 'Arvo'].sum()
240
# Lisään %-sarakkeen (tuotteen osuus varaston kokonaisarvosta)
df['%'] = df['Arvo']/df['Arvo'].sum()*100
df
Varasto | Hinta | Arvo | % | |
---|---|---|---|---|
Tuote | ||||
muikkukukko | 8 | 15 | 120 | 43.478261 |
lanttukukko | 10 | 12 | 120 | 43.478261 |
lihalörtsy | 5 | 3 | 15 | 5.434783 |
kasvislörtsy | 7 | 3 | 21 | 7.608696 |
Voin muotoilla dataframea muotoilukoodilla {:.0f}:
# Lisään dataframeen summarivin
df.loc['Yhteensä'] = df.sum()
# Esitän dataframen ilman desimaaleja käyttämällä muotoilukoodia
df.style.format('{:.0f}')
Varasto | Hinta | Arvo | % | |
---|---|---|---|---|
Tuote | ||||
muikkukukko | 8 | 15 | 120 | 43 |
lanttukukko | 10 | 12 | 120 | 43 |
lihalörtsy | 5 | 3 | 15 | 5 |
kasvislörtsy | 7 | 3 | 21 | 8 |
Yhteensä | 30 | 33 | 276 | 100 |
# T (transpose) vaihtaa dataframen rivit ja sarakkeet
df.T.style.format('{:.0f}')
Tuote | muikkukukko | lanttukukko | lihalörtsy | kasvislörtsy | Yhteensä |
---|---|---|---|---|---|
Varasto | 8 | 10 | 5 | 7 | 30 |
Hinta | 15 | 12 | 3 | 3 | 33 |
Arvo | 120 | 120 | 15 | 21 | 276 |
% | 43 | 43 | 5 | 8 | 100 |
Lisäksi opittiin laskemaan dataframeen uusia sarakkeita ja käyttämään muotoilukoodeja style.format-funktion yhteydessä.
Tutustu DataFrame-olion ohjesivuun: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html
Data-analytiikka Pythonilla https://tilastoapu.wordpress.com/python/