Topik ini menjelaskan cara membuat dan menggunakan objek DataFrame untuk pemrosesan data dasar.
Persiapan data
Topik ini menggunakan file u.user, u.item, dan u.data, yang masing-masing berisi data pengguna, film, dan rating.
-
Buat tabel:
-
Tabel
pyodps_ml_100k_usersuntuk data pengguna.CREATE TABLE IF NOT EXISTS pyodps_ml_100k_users ( user_id BIGINT COMMENT 'User ID', age BIGINT COMMENT 'Age', sex STRING COMMENT 'Gender', occupation STRING COMMENT 'Occupation', zip_code STRING COMMENT 'Zip code' ); -
Tabel
pyodps_ml_100k_moviesuntuk data film.CREATE TABLE IF NOT EXISTS pyodps_ml_100k_movies ( movie_id BIGINT COMMENT 'Movie ID', title STRING COMMENT 'Movie title', release_date STRING COMMENT 'Release date', video_release_date STRING COMMENT 'Video release date', IMDb_URL STRING COMMENT 'IMDb URL', unknown TINYINT COMMENT 'Unknown', Action TINYINT COMMENT 'Action', Adventure TINYINT COMMENT 'Adventure', Animation TINYINT COMMENT 'Animation', Children TINYINT COMMENT 'Children', Comedy TINYINT COMMENT 'Comedy', Crime TINYINT COMMENT 'Crime', Documentary TINYINT COMMENT 'Documentary', Drama TINYINT COMMENT 'Drama', Fantasy TINYINT COMMENT 'Fantasy', FilmNoir TINYINT COMMENT 'Film Noir', Horror TINYINT COMMENT 'Horror', Musical TINYINT COMMENT 'Musical', Mystery TINYINT COMMENT 'Mystery', Romance TINYINT COMMENT 'Romance', SciFi TINYINT COMMENT 'Sci-Fi', Thriller TINYINT COMMENT 'Thriller', War TINYINT COMMENT 'War', Western TINYINT COMMENT 'Western' ); -
Tabel
pyodps_ml_100k_ratingsuntuk data rating.CREATE TABLE IF NOT EXISTS pyodps_ml_100k_ratings ( user_id BIGINT COMMENT 'User ID', movie_id BIGINT COMMENT 'Movie ID', rating BIGINT COMMENT 'Rating', timestamp BIGINT COMMENT 'Timestamp' )
-
-
Gunakan Tunnel Upload untuk mengimpor file data lokal ke dalam tabel MaxCompute. Untuk informasi selengkapnya tentang operasi Tunnel, lihat Tunnel Commands.
Tunnel upload -fd | path_to_file/u.user pyodps_ml_100k_users; Tunnel upload -fd | path_to_file/u.item pyodps_ml_100k_movies; Tunnel upload -fd | path_to_file/u.data pyodps_ml_100k_ratings;
Operasi DataFrame
Anda kini memiliki tiga tabel: pyodps_ml_100k_movies (film), pyodps_ml_100k_users (pengguna), dan pyodps_ml_100k_ratings (rating). Contoh berikut dijalankan di IPython.
Pastikan Python telah diinstal. IPython dibangun di atas Python, sehingga diperlukan lingkungan Python. Kemudian, jalankan pip install IPython. Setelah itu, jalankan perintah ipython untuk memulai lingkungan interaktif dan mulai menulis serta menjalankan kode Python.
-
Buat objek ODPS.
import os from odps import ODPS # Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID diatur ke Access Key ID Anda, # dan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET diatur ke Access Key Secret Anda. # Kami menyarankan agar Anda tidak melakukan hardcoding Access Key ID dan Access Key Secret dalam kode Anda. o = ODPS( os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point', ) -
Buat objek DataFrame dari objek tabel.
from odps.df import DataFrame users = DataFrame(o.get_table('pyodps_ml_100k_users')); -
Gunakan properti
dtypesuntuk melihat kolom dan tipe datanya.print(users.dtypes)Output:
odps.Schema { user_id int64 age int64 sex string occupation string zip_code string } -
Gunakan metode
headuntuk melihat pratinjau N baris pertama.print(users.head(10))Output:
user_id age sex occupation zip_code 0 1 24 M technician 85711 1 2 53 F other 94043 2 3 23 M writer 32067 3 4 24 M technician 43537 4 5 33 F other 15213 5 6 42 M executive 98101 6 7 57 M administrator 91344 7 8 36 M administrator 05201 8 9 29 M student 01002 9 10 53 M lawyer 90703 -
Jika Anda tidak memerlukan semua kolom, gunakan salah satu metode berikut:
-
Pilih subset kolom.
print(users[['user_id', 'age']].head(5))Output:
user_id age 0 1 24 1 2 53 2 3 23 3 4 24 4 5 33 -
Kecualikan kolom tertentu.
print(users.exclude('zip_code', 'age').head(5))Output:
user_id sex occupation 0 1 M technician 1 2 F other 2 3 M writer 3 4 M technician 4 5 F other -
Kecualikan beberapa kolom dan tambahkan kolom terhitung baru. Misalnya, buat kolom boolean bernama
sex_boolyang bernilai True jika nilaisexadalahMdan False untuk nilai lainnya.print(users.select(users.exclude('zip_code', 'sex'), sex_bool=users.sex == 'M').head(5))Output:
user_id age occupation sex_bool 0 1 24 technician True 1 2 53 other False 2 3 23 writer True 3 4 24 technician True 4 5 33 other False
-
-
Hitung jumlah pengguna pria dan wanita.
print(users.groupby(users.sex).agg(count=users.count()))Output:
sex count 0 F 273 1 M 670 -
Kelompokkan pengguna berdasarkan pekerjaan, urutkan secara menurun, dan lihat 10 pekerjaan teratas berdasarkan jumlahnya.
df = users.groupby('occupation').agg(count=users['occupation'].count()) df1 = df.sort(df['count'], ascending=False) print(df1.head(10))Output:
occupation count 0 student 196 1 other 105 2 educator 95 3 administrator 79 4 engineer 67 5 programmer 66 6 librarian 51 7 writer 45 8 executive 32 9 scientist 31Sebagai alternatif, gunakan metode
value_countsuntuk sintaksis yang lebih ringkas. Jumlah baris yang dikembalikan oleh metode ini dibatasi oleh konfigurasioptions.df.odps.sort.limit. Untuk informasi selengkapnya, lihat Configuration.df = users.occupation.value_counts()[:10] print(df.head(10))Output:
occupation count 0 student 196 1 other 105 2 educator 95 3 administrator 79 4 engineer 67 5 programmer 66 6 librarian 51 7 writer 45 8 executive 32 9 scientist 31 -
Gunakan
joinuntuk menggabungkan ketiga tabel dan simpan hasilnya ke tabel baru bernama pyodps_ml_100k_lens.movies = DataFrame(o.get_table('pyodps_ml_100k_movies')) ratings = DataFrame(o.get_table('pyodps_ml_100k_ratings')) o.delete_table('pyodps_ml_100k_lens', if_exists=True) lens = movies.join(ratings).join(users).persist('pyodps_ml_100k_lens') print(lens.dtypes)Output:
odps.Schema { movie_id int64 title string release_date string ideo_release_date string imdb_url string unknown int64 action int64 adventure int64 animation int64 children int64 comedy int64 crime int64 documentary int64 drama int64 fantasy int64 filmnoir int64 horror int64 musical int64 mystery int64 romance int64 scifi int64 thriller int64 war int64 western int64 user_id int64 rating int64 timestamp int64 age int64 sex string occupation string zip_code string }
Pemrosesan data DataFrame
Pertama, unduh set data Iris. Bagian ini menggunakan node PyODPS di DataWorks. Untuk informasi selengkapnya, lihat Develop a PyODPS 3 task.
-
Buat tabel data uji.
Buat tabel di DataWorks:
-
Klik DDL
di pojok kiri atas halaman edit. -
Masukkan pernyataan DDL berikut, lalu jalankan pernyataan tersebut untuk membuat tabel.
CREATE TABLE pyodps_iris ( sepallength double COMMENT 'sepal length (cm)', sepalwidth double COMMENT 'sepal width (cm)', petallength double COMMENT 'petal length (cm)', petalwidth double COMMENT 'petal width (cm)', name string COMMENT 'name' ) ;
-
-
Unggah data uji.
-
Klik kanan tabel baru tersebut, pilih Import Data, lalu klik Next untuk mengunggah set data yang telah Anda unduh.
Di kotak dialog Import Data, atur Metode Impor Data menjadi Upload Local File dan Format File menjadi CSV. Pilih file iris.csv yang telah diunduh. Atur Delimiter menjadi Comma, Source Charset menjadi GBK, dan Start Row menjadi 1. Pilih Yes untuk First Row Is Header. Setelah memastikan pratinjau data sudah benar, klik Next.
-
Klik Match by Position untuk mengimpor data.
-
-
Di panel Business Flow, klik kanan MaxCompute, pilih Create Node, lalu pilih PyODPS 3 untuk membuat node PyODPS tempat menyimpan dan menjalankan kode Anda.
-
Masukkan kode dan klik ikon Run
. Setelah kode dijalankan, Anda dapat melihat hasilnya di tab Run log di bawah. Kodenya sebagai berikut:from odps import ODPS from odps.df import DataFrame, output import os # Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID diatur ke Access Key ID Anda, # dan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET diatur ke Access Key Secret Anda. # Kami menyarankan agar Anda tidak melakukan hardcoding Access Key ID dan Access Key Secret dalam kode Anda. o = ODPS( os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point', ) # Buat objek DataFrame bernama iris dari tabel MaxCompute. iris = DataFrame(o.get_table('pyodps_iris')) print(iris.head(10)) # Cetak sebagian dari DataFrame iris. print(iris.sepallength.head(5)) # Gunakan fungsi kustom untuk menghitung jumlah dua kolom dalam DataFrame iris. print(iris.apply(lambda row: row.sepallength + row.sepalwidth, axis=1, reduce=True, types='float').rename('sepaladd').head(3)) # Tentukan nama output dan tipe untuk fungsi tersebut. @output(['iris_add', 'iris_sub'], ['float', 'float']) def handle(row): # Gunakan kata kunci yield untuk mengembalikan beberapa baris output. yield row.sepallength - row.sepalwidth, row.sepallength + row.sepalwidth yield row.petallength - row.petalwidth, row.petallength + row.petalwidth # Cetak 5 baris pertama hasilnya. axis=1 menunjukkan operasi per baris. print(iris.apply(handle, axis=1).head(5))Hasil:
# print(iris.head(10)) sepallength sepalwidth petallength petalwidth name 0 4.9 3.0 1.4 0.2 Iris-setosa 1 4.7 3.2 1.3 0.2 Iris-setosa 2 4.6 3.1 1.5 0.2 Iris-setosa 3 5.0 3.6 1.4 0.2 Iris-setosa 4 5.4 3.9 1.7 0.4 Iris-setosa 5 4.6 3.4 1.4 0.3 Iris-setosa 6 5.0 3.4 1.5 0.2 Iris-setosa 7 4.4 2.9 1.4 0.2 Iris-setosa 8 4.9 3.1 1.5 0.1 Iris-setosa 9 5.4 3.7 1.5 0.2 Iris-setosa # print(iris.sepallength.head(5)) sepallength 0 4.9 1 4.7 2 4.6 3 5.0 4 5.4 # print(iris.apply(lambda row: row.sepallength + row.sepalwidth, axis=1, reduce=True, types='float').rename('sepaladd').head(3)) sepaladd 0 7.9 1 7.9 2 7.7 # print(iris.apply(handle,axis=1).head(5)) iris_add iris_sub 0 1.9 7.9 1 1.2 1.6 2 1.5 7.9 3 1.1 1.5 4 1.5 7.7