Little boy questioned his mother, he asked what he can be in the future..with a sad smile, she tells him he can be anything he wants to be.... Boy said he’d become (an) astronaut and fly out into space crews around the universe he wanted to see the stars and also see other planets in outer space------------- "Why don’t we just keep dreaming, let’s keep our mind with dream and faith, as long as we wish we can make it come true, how old you are never forget your dream and keep dreaming "

Saturday 5 January 2019

Python : Fungsi dan Operasi dasar Pandas (Bagian 1)

Pandas (python data analysis liblary)

Pandas adalah salah satu liblary paling populer untuk data science, pandas memudahkan kita untuk mengolah data data berbentuk tabular yang tersimpan dalam baris dan kolom.
Pandas bersifat open source, menyediakan kinerja tinggi, struktur data yang kuat digunakan sebagai alat analisis data untuk bahasa pemrograman Python.
Dengan panda kita dapat dengan mudah merubah data (CSV, excel, JSON atau SQL) menjadi sebuah object data yang terdiri dari baris dan kolom yang disebut dengan DataFrame.
Fitur :
  • DataFrame Object untuk manipulasi data dengan pengindeksan terintegrasi.
  • Alat untuk membaca dan menulis data antara struktur data dalam memori dan berbagai format file.
  • Penyelarasan data dan penanganan terpadu pada kehilangan data.
  • Membentuk kembali dan memutar set data.
  • Seleksi berbasis label, pengindeksan fantastis, dan melakukan subset kumpulan data besar.
  • Penyisipan dan penghapusan kolom struktur data.
  • Memungkinkan operasi split-apply-combine pada Data set.
  • Menghubugkan dan menggabungkan Data set.
  • Pengindeksan hierarki untuk bekerja dengan data dimensi tinggi dalam struktur data dimensi rendah.
  • Fungsionalitas seri waktu: Pembuatan rentang tanggal dan konversi frekuensi.
  • Menyediakan penyaringan data (sorting dan filtering).

Nama pandas berasal dari istilah "panel data" yang merujuk pada istilah ekonometrik untuk set data multidimensi terstruktur. bukan diambil dari nama hewan asal negeri tirai bambu panda, apalagi dari merk minuman liang teh cap panda.

Requirement :

Saya sarankan menggunakan Anaconda Navigator, paket all-in-one dengan sistem antarmuka grafis (GUI) desktop yang mencakup tautan ke semua aplikasi termasuk dalam distribusi ini adalah Python, RStudio, iPython, Jupyter Notebook, JupyterLab, Spyder, Lem, dan Orange. Didalamnya sudah terdapat lebih dari 1400 liblary, termasuk Pandas, Numpy dan Matplotlib.
Python memiliki IDE bawaan pada paket installasinya yaitu IDLE, akan tetapi untuk lebih memudahkan kita dalam Manipulasi dan analisis data dengan Pandas, saya rekomendasikan anda menggunakan IDE Spyder. IDE yang dirancang khusus untuk seorang engineers dan scientist untuk keperluan analisis.
Spyder disertakan secara default termasuk dalam distribusi Anaconda Python, yang dilengkapi dengan semua yang kita butuhkan untuk memulai menuju Python Data Science.

Oke cukup.. Langsung saja, sebelum kita melakukan analis dan manipulasi data menggunakan pandas, pertama kita perlajari dasar dasar operasi dan fungsi pada pandas.
Enjoy!


1. Membuat Series

Series adalah array satu dimensi yang mampu menampung data jenis apa pun (integer, string, float, objek python, dll.). Label axis/label baris secara kolektif disebut indeks.
Membuat series dari sebuah List
import pandas as pd
import numpy as np

nilai = pd.Series([10,20,30,40,np.nan,50])
print(nilai)
Outputnya :
0    10.0
1   20.0
2    30.0
3    40.0
4     NaN
5    50.0
dtype: float64
Secara default, pandas secara otomatis memberi index pada setiap baris dari series

2. Membuat DataFrame

Struktur data tabel dua dimensi (baris dan kolom) yang dapat dirubah dan bersifat heterogen dan memiliki label pada setiap kolom dan baris.
Disini saya contohkan pembuatan DataFrame sederhana :

- Membuat DataFrame dari data Dictionary
import pandas as pd
import numpy as np

dict = {"Negara": ["Indonesia", "Jepang", "India", "China", "Amerika Serikat"],
       "Ibu Kota": ["Jakarta", "Tokyo", "New Dehli", "Beijing", "Washington, D.C."],
       "Luas": [1905, 377972, 3287, 9597, 9834],
       "Populasi": [264, 143, 1252, 1357, 5298] }

brics = pd.DataFrame(dict)
print(brics)
Output :
            Negara          Ibu Kota    Luas  Populasi
0        Indonesia           Jakarta    1905       264
1           Jepang             Tokyo  377972       143
2            India         New Dehli    3287      1252
3            China           Beijing    9597      1357
4  Amerika Serikat  Washington, D.C.    9834      5298

- Membuat DataFrame berukuran 5 x 4 (5 baris x 4 kolom) yang diisi oleh nilai random.
import pandas as pd

dates = pd.date_range(start='2019-01-01', periods=5)
df = pd.DataFrame(np.random.randn(5,4), index=dates, columns=list('ABCD'))
print(df)
  • dates = pd.date_range(start='2019-01-01', periods=5), membuat list yang berisi range tanggal selama 5 periode.
  • df = pd.DataFrame(np.random.randn(5,4), index=dates, columns=list('ABCD')), membuat dataframe isinya adalah array 5x4 yang diisi nilai random. index diambil dari list dates, dan kolom header dari list 'ABCD'

Outputnya :
                   A         B         C         D
2019-01-01  0.138086  0.195403 -0.677908 -1.272343
2019-01-02  0.550584  0.165581 -0.112642 -1.107808
2019-01-03  0.218109 -0.743656 -1.370180  0.658061
2019-01-04 -0.816710  0.763614 -0.390805 -0.607026
2019-01-05 -2.406811  0.090444 -0.358237  1.216213

3. Membuat DataFrame dengan membaca CSV

Untuk membaca data set dari file CSV dan menjadikannya DataFrame kita menggunakan bantuan fungsi read_csv dari pandas.
import pandas as pd

data = pd.read_csv('http://samplecsvs.s3.amazonaws.com/SalesJan2009.csv')
print(data)
  • pd.read_csv akan membaca file dengan format CSV dan mengkonversi nya menjadi pandas DataFrame. secara default fungsi ini membaca file CSV comma delimited, jika CSV berformat selain comma delimited kita perlu menambahkan parameter sep=';' atau sep='|' , sesuai dengan separator pada file.
  • File CSV berasal dari file lokal ataupun file online melalui tautan.
  • Selain menggunakan read_csv, bisa juga menggunakan read_table sebagai alternatif.
Output :
Transaction_date   Product     ...       Latitude   Longitude
0        1/2/09 6:17  Product1     ...      51.500000   -1.116667
1        1/2/09 4:53  Product1     ...      39.195000  -94.681940
2       1/2/09 13:08  Product1     ...      46.188060 -123.830000
3       1/3/09 14:44  Product1     ...     -36.133333  144.750000
4       1/4/09 12:56  Product2     ...      33.520560  -86.802500
5       1/4/09 13:19  Product1     ...      39.790000  -75.238060
6       1/4/09 20:11  Product1     ...      40.693610  -89.588890
7       1/2/09 20:09  Product1     ...      36.343330  -88.850280
8       1/4/09 13:17  Product1     ...      32.066667   34.766667
9       1/4/09 14:11  Product1     ...      48.883333    2.150000
10       1/5/09 2:42  Product1     ...      40.714170  -74.006390
11       1/5/09 5:39  Product1     ...      51.450000    5.466667
12       1/2/09 9:16  Product1     ...      29.423890  -98.493330
13      1/5/09 10:08  Product1     ...      43.695560 -116.353060
14      1/2/09 14:18  Product1     ...      40.032220  -74.957780
15       1/4/09 1:05  Product1     ...      53.677222   -6.319167
16      1/5/09 11:37  Product1     ...      45.416667  -75.700000
17       1/6/09 5:02  Product1     ...      17.383333   78.466667
18       1/6/09 7:45  Product2     ...      51.527210    0.145590
19       1/2/09 7:35  Product1     ...      40.760830 -111.890280
20      1/6/09 12:56  Product1     ...      53.500000   -2.216667
..               ...       ...     ...            ...         ...
980     1/19/09 4:55  Product1     ...      50.833333   -0.150000
981    1/28/09 22:02  Product1     ...     -39.591667  174.283333
982     1/4/09 18:57  Product1     ...     -28.050000  153.350000
983    1/12/09 20:31  Product1     ...      14.650000  -90.483333
984    1/24/09 12:00  Product1     ...      40.583333   -4.116667
985    1/28/09 11:19  Product1     ...      39.653610 -105.190560
986     1/7/09 17:48  Product1     ...      33.517220  -82.075830
987    1/23/09 12:42  Product2     ...     -33.633333  151.333333
988     1/7/09 19:48  Product2     ...     -33.883333  151.216667
989    1/26/09 11:19  Product1     ...      60.966667   25.666667
990     1/5/09 13:23  Product1     ...      48.216667   16.366667
991    1/26/09 13:41  Product1     ...      47.466667    8.300000
992    1/20/09 10:42  Product2     ...      53.650000   -1.783333
993    1/22/09 14:25  Product1     ...      54.583333   -5.933333
994     1/28/09 5:36  Product2     ...     -20.360278   57.366111
995      1/1/09 4:24  Product3     ...      42.946940  -76.429440
996     1/8/09 11:55  Product1     ...      52.083333    0.433333
997    1/12/09 21:30  Product1     ...      43.073060  -89.401110

[998 rows x 12 columns] 

Selain read_csv, pandas juga menyediakan tools IO (input output) lainnya yang digunakan untuk membaca data, diantaranya :

# Format Deskripsi Data Reader
1 Text CSV read_csv, read_table
2 Text JSON read_json
3 Text HTML read_html
4 Text Clipboard read_clipboard
5 Binary MS Excel read_excel
6 Binary HDF5 Format read_hdf
7 Binary Feather Format read_feather
8 Binary Parquet Format read_parquet
9 Binary Msgpack read_msgpack
10 SQL SQL read_sql, read sql_query,read_sql_table

4. Menampilkan DataFrame

Menampilkan tipe data dari setiap series pada DataFrame

In [64]: data.dtypes
Out[64]: 
Transaction_date     object
Product              object
Price                object
Payment_Type         object
Name                 object
City                 object
State                object
Country              object
Account_Created      object
Last_Login           object
Latitude            float64
Longitude           float64
dtype: object

Menampilkan data paling atas dan paling bawah.

Untuk menampilkan data DataFrame paling atas berdasarkan index-nya menggunakan fungsi head()
In [48]: data.head()
Out[48]: 
  Transaction_date   Product     ...       Latitude   Longitude
0      1/2/09 6:17  Product1     ...      51.500000   -1.116667
1      1/2/09 4:53  Product1     ...      39.195000  -94.681940
2     1/2/09 13:08  Product1     ...      46.188060 -123.830000
3     1/3/09 14:44  Product1     ...     -36.133333  144.750000
4     1/4/09 12:56  Product2     ...      33.520560  -86.802500
Sedangkan untuk data paling bawah menggunakan fungsi tail()
In [49]: data.tail()
Out[49]: 
    Transaction_date   Product    ...       Latitude  Longitude
993    1/22/09 14:25  Product1    ...      54.583333  -5.933333
994     1/28/09 5:36  Product2    ...     -20.360278  57.366111
995      1/1/09 4:24  Product3    ...      42.946940 -76.429440
996     1/8/09 11:55  Product1    ...      52.083333   0.433333
997    1/12/09 21:30  Product1    ...      43.073060 -89.401110

[5 rows x 12 columns]

Menampilkan index DataFrame

In [50]: data.index
Out[50]: RangeIndex(start=0, stop=998, step=1)

Menampilkan Column names DataFrame

In [52]: data.columns
Out[52]: 
Index(['Transaction_date', 'Product', 'Price', 'Payment_Type', 'Name', 'City',
       'State', 'Country', 'Account_Created', 'Last_Login', 'Latitude',
       'Longitude'],
      dtype='object')

Menampilkan nilai DataFrame

In [53]: data.values
Out[53]: 
array([['1/2/09 6:17', 'Product1', '1200', ..., '1/2/09 6:08', 51.5,
        -1.1166667],
       ['1/2/09 4:53', 'Product1', '1200', ..., '1/2/09 7:49', 39.195,
        -94.68194],
       ['1/2/09 13:08', 'Product1', '1200', ..., '1/3/09 12:32',
        46.18806, -123.83],
       ...,
       ['1/1/09 4:24', 'Product3', '7500', ..., '3/1/09 7:21',
        42.946940000000005, -76.42944],
       ['1/8/09 11:55', 'Product1', '1200', ..., '3/1/09 7:28',
        52.0833333, 0.4333333],
       ['1/12/09 21:30', 'Product1', '1200', ..., '3/1/09 10:14',
        43.07306, -89.40111]], dtype=object)

Menampilkan statistik data

In [54]: data.describe()
Out[54]: 
         Latitude   Longitude
count  998.000000  998.000000
mean    39.015705  -41.337820
std     19.508572   67.389479
min    -41.465000 -159.485280
25%     35.816944  -87.991670
50%     42.320695  -73.730695
75%     51.050000    4.916667
max     64.837780  174.766667
Kenapa hanya statistik dari kolom latitude dan longitude saja yang ada statistik nya?! guess what?

Menampilkan statistik data termasuk object

Secara default fungsi descibe() hanya mengembalikan output data statistik hanya untuk series yang bertipe int dan float. untuk menampilkan series/data dengan tipe object digunakan parameter include['object']
In [55]: data.describe(include=['object'])
Out[55]: 
       Transaction_date   Product      ...      Account_Created    Last_Login
count               998       998      ...                  998           998
unique              987         4      ...                  976           977
top         1/5/09 5:33  Product1      ...         1/18/09 0:00  2/26/09 7:32
freq                  2       847      ...                    3             3
Statistik yang ditampilkan pun adalah yang relevan dengan operasi operasi pada tipe data string seperti count, unique, top, dan frequency

Menampilkan data secara transponse

In [57]: data.T
Out[57]: 
                             0                ...                                        997
Transaction_date     1/2/09 6:17              ...                              1/12/09 21:30
Product                 Product1              ...                                   Product1
Price                       1200              ...                                       1200
Payment_Type          Mastercard              ...                                       Visa
Name                    carolina              ...                                     Julia 
City                    Basildon              ...               Madison                     
State                    England              ...                                         WI
Country           United Kingdom              ...                              United States
Account_Created      1/2/09 6:00              ...                             11/17/08 22:24
Last_Login           1/2/09 6:08              ...                               3/1/09 10:14
Latitude                    51.5              ...                                    43.0731
Longitude               -1.11667              ...                                   -89.4011

[12 rows x 998 columns]

Mengurutkan DataFrame (sorting data)

Mengurutkan DataFrame berdasarkan kolom Latitude
In [59]: data.sort_values(by='Latitude')
Out[59]: 
    Transaction_date   Product     ...       Latitude   Longitude
703     1/3/09 14:17  Product2     ...     -41.465000  148.257222
981    1/28/09 22:02  Product1     ...     -39.591667  174.283333
402      1/8/09 0:04  Product1     ...     -39.066667  174.083333
662     1/1/09 21:40  Product1     ...     -38.416667  144.166667
389      1/1/09 8:09  Product1     ...     -37.833333  144.966667
  • Fungsi sort_values juga dapat ditulis dengan atau tanpa keyword 'by='
  • Secara default dataframe diurutkan dalam posisi Ascending (besar ke kecil), jika ingin data diurutkan secara Descending kita perlu menambahkan parameter ascending=False, menjadi data.sort_values('Latitude', ascending=False).
  • Untuk melakukan sorting DataFrame beberapa kolom sekaligus kita dapat menempatkan python list sebagai parameter pada fungsi sort_values, contoh : data.sort_values(['Latitude','Longitude']).

5. Seleksi Data

Melakukan seleksi series/kolom dari sebuah DataFrame

Untuk melakukan seleksi sebuah kolom / series bisa mengguakan DataFrame.Series ataupun DataFrame['Series'].
In [24]: data.Product
Out[24]: 
0      Product1
1      Product1
2      Product1
3      Product1
4      Product2
5      Product1
Name: Product, Length: 998, dtype: object
In [25]: data['Product']
Out[25]: 
0      Product1
1      Product1
2      Product1
3      Product1
4      Product2
5      Product1
Name: Product, Length: 998, dtype: object
  • data.Product ataupun data['Product'] akan menampilkan data yang sama.
  • Tapi untuk melakukan seleksi dua atau lebih Series / kolom dengan format sintaks DataFrame['Series'] menjadi lebih mudah karena kita hanya perlu menempatkan list sebagai parameter pada fungsi ini.
Contoh seleksi dua series sekaligus
In [27]: data[['Product','Price']]
Out[27]: 
      Product Price
0    Product1  1200
1    Product1  1200
2    Product1  1200
3    Product1  1200
4    Product2  3600
5    Product1  1200
6    Product1  1200
7    Product1  1200
8    Product1  1200
9    Product1  1200
10   Product1  1200
11   Product1  1200
12   Product1  1200
13   Product1  1200
14   Product1  1200
15   Product1  1200
16   Product1  1200
17   Product1  1200
18   Product2  3600
19   Product1  1200
20   Product1  1200
..        ...   ...
980  Product1  1200
981  Product1  1200
982  Product1  1200
983  Product1  1200
984  Product1  1200
985  Product1  1200
986  Product1  1200
987  Product2  3600
988  Product2  3600
989  Product1  1200
990  Product1  1200
991  Product1  1200
992  Product2  3600
993  Product1  1200
994  Product2  3600
995  Product3  7500
996  Product1  1200
997  Product1  1200

[998 rows x 2 columns]

Melakukan seleksi baris berdasarkan label baris

In [28]: data[0:10]
Out[28]: 
  Transaction_date   Product     ...       Latitude   Longitude
0      1/2/09 6:17  Product1     ...      51.500000   -1.116667
1      1/2/09 4:53  Product1     ...      39.195000  -94.681940
2     1/2/09 13:08  Product1     ...      46.188060 -123.830000
3     1/3/09 14:44  Product1     ...     -36.133333  144.750000
4     1/4/09 12:56  Product2     ...      33.520560  -86.802500
5     1/4/09 13:19  Product1     ...      39.790000  -75.238060
6     1/4/09 20:11  Product1     ...      40.693610  -89.588890
7     1/2/09 20:09  Product1     ...      36.343330  -88.850280
8     1/4/09 13:17  Product1     ...      32.066667   34.766667
9     1/4/09 14:11  Product1     ...      48.883333    2.150000

Seleksi baris dan kolom tertentu

Contoh : Seleksi baris 0 sampai 10 dan kolom Transaction_date, Product, Price
In [29]: data.loc[0:10,['Transaction_date','Product','Price']]
Out[29]: 
   Transaction_date   Product Price
0       1/2/09 6:17  Product1  1200
1       1/2/09 4:53  Product1  1200
2      1/2/09 13:08  Product1  1200
3      1/3/09 14:44  Product1  1200
4      1/4/09 12:56  Product2  3600
5      1/4/09 13:19  Product1  1200
6      1/4/09 20:11  Product1  1200
7      1/2/09 20:09  Product1  1200
8      1/4/09 13:17  Product1  1200
9      1/4/09 14:11  Product1  1200
10      1/5/09 2:42  Product1  1200
In [30]: data.loc[0,['Transaction_date','Product','Price']]
Out[30]: 
Transaction_date    1/2/09 6:17
Product                Product1
Price                      1200
Name: 0, dtype: object

Bersambung...



2 comments:

  1. mas minta contoh data nya dong biar bisa dipelajari terima kasih :)

    ReplyDelete
  2. terima kasih kak, sangat membantu

    ReplyDelete