Topik ini menjelaskan cara membuat dan mengelola objek DataFrame serta cara menggunakan DataFrame untuk memproses data.
Menyiapkan data
Topik ini menggunakan u.user, u.item, dan u.data sebagai contoh. File u.user berisi data pengguna, file u.item berisi data film, dan file u.data berisi data peringkat.
Buat tabel berikut:
pyodps_ml_100k_users: menyimpan data pengguna.CREATE TABLE IF NOT EXISTS pyodps_ml_100k_users ( user_id BIGINT COMMENT 'User ID', age BIGINT COMMENT 'Usia', sex STRING COMMENT 'Jenis kelamin', occupation STRING COMMENT 'Pekerjaan', zip_code STRING COMMENT 'Kode pos' );pyodps_ml_100k_movies: menyimpan data film.CREATE TABLE IF NOT EXISTS pyodps_ml_100k_movies ( movie_id BIGINT COMMENT 'Movie ID', title STRING COMMENT 'Judul film', release_date STRING COMMENT 'Tanggal rilis', video_release_date STRING COMMENT 'Tanggal rilis video', IMDb_URL STRING COMMENT 'IMDb URL', unknown TINYINT COMMENT 'Tidak diketahui', Action TINYINT COMMENT 'Aksi', Adventure TINYINT COMMENT 'Petualangan', Animation TINYINT COMMENT 'Animasi', Children TINYINT COMMENT 'Anak-anak', Comedy TINYINT COMMENT 'Komedi', Crime TINYINT COMMENT 'Kejahatan', Documentary TINYINT COMMENT 'Dokumenter', Drama TINYINT COMMENT 'Drama', Fantasy TINYINT COMMENT 'Fantasi', FilmNoir TINYINT COMMENT 'Film noir', Horror TINYINT COMMENT 'Horor', Musical TINYINT COMMENT 'Musik', Mystery TINYINT COMMENT 'Misteri', Romance TINYINT COMMENT 'Romansa', SciFi TINYINT COMMENT 'Fiksi ilmiah', Thriller TINYINT COMMENT 'Thriller', War TINYINT COMMENT 'Perang', Western TINYINT COMMENT 'Barat' );pyodps_ml_100k_ratings: menyimpan data peringkat.CREATE TABLE IF NOT EXISTS pyodps_ml_100k_ratings ( user_id BIGINT COMMENT 'User ID', movie_id BIGINT COMMENT 'Movie ID', rating BIGINT COMMENT 'Skor', timestamp BIGINT COMMENT 'Timestamp' )
Jalankan perintah Tunnel upload untuk mengimpor data dari file ke tabel MaxCompute. Untuk informasi lebih lanjut tentang perintah Tunnel, lihat Perintah Tunnel.
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;
Perform operations on DataFrame objects
Dalam topik ini, digunakan tabel berikut: pyodps_ml_100k_movies (data film), pyodps_ml_100k_users (data pengguna), dan pyodps_ml_100k_ratings (data peringkat). Contoh berikut menunjukkan cara melakukan operasi pada tabel-tabel ini di IPython.
Sebelum menggunakan IPython, pastikan Python sudah terinstal. IPython dikembangkan berdasarkan Python, sehingga Anda harus menginstal lingkungan Python terlebih dahulu. Setelah itu, instal IPython dengan perintah pip install IPython. Setelah instalasi selesai, jalankan perintah IPython untuk memulai lingkungan interaktif berbasis IPython dan mulai menulis kode Python.
Buat objek MaxCompute.
import os from odps import ODPS # Atur variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID ke ID AccessKey akun Alibaba Cloud Anda. # Atur variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET ke Rahasia AccessKey akun Alibaba Cloud. # Kami merekomendasikan agar Anda tidak langsung menggunakan ID AccessKey atau Rahasia AccessKey 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 dengan menentukan tabel.
from odps.df import DataFrame users = DataFrame(o.get_table('pyodps_ml_100k_users'));Kueri properti
dtypesuntuk melihat bidang objek DataFrame beserta tipe datanya.print(users.dtypes)Hasil berikut dikembalikan:
odps.Schema { user_id int64 age int64 sex string occupation string zip_code string }Gunakan metode
headuntuk mengambil N baris pertama data sebagai pratinjau cepat.print(users.head(10))Hasil berikut dikembalikan:
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 90703Jika tidak ingin melihat semua bidang, lakukan operasi berikut:
Tentukan bidang yang ingin dikueri.
print(users[['user_id', 'age']].head(5))Hasil berikut dikembalikan:
user_id age 0 1 24 1 2 53 2 3 23 3 4 24 4 5 33Kecualikan bidang tertentu.
print(users.exclude('zip_code', 'age').head(5))Hasil berikut dikembalikan:
user_id sex occupation 0 1 M technician 1 2 F other 2 3 M writer 3 4 M technician 4 5 F otherKecualikan bidang tertentu dan tambahkan bidang baru berdasarkan komputasi. Misalnya, tambahkan bidang
sex_booldan atur nilai sex_bool ke True jikasexadalahM. Jika nilai sex bukan M, atur sex_bool ke False.print(users.select(users.exclude('zip_code', 'sex'), sex_bool=users.sex == 'M').head(5))Hasil berikut dikembalikan:
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()))Hasil berikut dikembalikan:
sex count 0 F 273 1 M 670Untuk membagi pengguna berdasarkan pekerjaan, peroleh 10 pekerjaan dengan jumlah pengguna terbesar dan urutkan secara menurun berdasarkan jumlah pengguna.
df = users.groupby('occupation').agg(count=users['occupation'].count()) df1 = df.sort(df['count'], ascending=False) print(df1.head(10))Hasil berikut dikembalikan:
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 31Atau, gunakan metode
value_counts. Jumlah catatan yang dikembalikan dibatasi oleh parameteroptions.df.odps.sort.limit. Untuk informasi lebih lanjut, lihat Konfigurasi.df = users.occupation.value_counts()[:10] print(df.head(10))Hasil berikut dikembalikan:
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 31Joinketiga tabel dan simpan hasilnya sebagai 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)Hasil berikut dikembalikan:
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 }
Gunakan DataFrame untuk memproses data
Sebelum melanjutkan langkah-langkah berikut, unduh dataset Iris. Node PyODPS DataWorks digunakan dalam contoh ini. Untuk informasi lebih lanjut, lihat Mengembangkan Tugas PyODPS 3.
Buat tabel untuk menyimpan data uji.
Gunakan fitur manajemen tabel DataWorks untuk membuat tabel.
Di pojok kiri atas halaman pengeditan tabel, klik ikon
.Eksekusi pernyataan berikut untuk membuat tabel:
CREATE TABLE pyodps_iris ( sepallength double COMMENT 'panjang sepal (cm)', sepalwidth double COMMENT 'lebar sepal (cm)', petallength double COMMENT 'panjang petal (cm)', petalwidth double COMMENT 'lebar petal (cm)', name string COMMENT 'nama' ) ;
Unggah data uji.
Klik kanan nama tabel yang telah dibuat, dan pilih Import Data. Di kotak dialog Data Import Wizard, klik Next, lalu klik Browse untuk mengunggah dataset yang telah diunduh.

Pilih Match by location dan klik Import Data.
Klik alur kerja yang diinginkan, klik kanan MaxCompute, lalu pilih Create Node > PyODPS 3 untuk membuat node PyODPS guna menyimpan dan menjalankan kode.
Tulis kode dan klik ikon
. Hasil dapat dilihat di bagian Runtime Log di panel bawah. Detail kode:from odps import ODPS from odps.df import DataFrame, output import os # Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID diatur ke ID AccessKey pengguna, # dan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET diatur ke Rahasia AccessKey pengguna, # kami tidak merekomendasikan langsung menggunakan string ID AccessKey dan Rahasia AccessKey. 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 iris dari tabel MaxCompute. iris = DataFrame(o.get_table('pyodps_iris')) print(iris.head(10)) # Tampilkan sebagian isi iris. print(iris.sepallength.head(5)) # Gunakan fungsi yang ditentukan pengguna untuk menghitung jumlah dua kolom iris. print(iris.apply(lambda row: row.sepallength + row.sepalwidth, axis=1, reduce=True, types='float').rename('sepaladd').head(3)) # Tentukan nama dan tipe keluaran fungsi. @output(['iris_add', 'iris_sub'], ['float', 'float']) def handle(row): # Gunakan kata kunci yield untuk mengembalikan beberapa baris hasil. yield row.sepallength - row.sepalwidth, row.sepallength + row.sepalwidth yield row.petallength - row.petalwidth, row.petallength + row.petalwidth # Tampilkan hasil lima baris pertama. axis=1 menunjukkan bahwa sumbu kolom diperluas secara horizontal. print(iris.apply(handle, axis=1).head(5))Hasil berikut dikembalikan:
# 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