DataFrame, MaxCompute için yapılandırılmış bir veri API'si sağlar. Bu konu, DataFrame nesneleri oluşturmanızı ve filtreleme, toplama ile birleştirme gibi yaygın veri işlemlerini adım adım gösterir.
Veri hazırlığı
Örneklerde sırasıyla kullanıcı, film ve değerlendirme verilerini içeren u.user, u.item ve u.data dosyaları kullanılır.
-
Tabloları oluşturun:
-
Kullanıcı verileri için
pyodps_ml_100k_userstablosu.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' ); -
Film verileri için
pyodps_ml_100k_moviestablosu.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' ); -
Değerlendirme verileri için
pyodps_ml_100k_ratingstablosu.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' )
-
-
Tunnel Upload özelliğini kullanarak yerel veri dosyalarını MaxCompute tablolarına aktarın. Tunnel işlemleri hakkında daha fazla bilgi için bkz. 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;
DataFrame işlemleri
pyodps_ml_100k_movies, pyodps_ml_100k_users ve pyodps_ml_100k_ratings tablolarını hazırladıktan sonra IPython ortamında DataFrame işlemlerini keşfedebilirsiniz.
IPython, Python gerektirir. Yüklemek için pip install IPython komutunu çalıştırın, ardından etkileşimli ortamı başlatmak için ipython komutunu çalıştırın.
-
Bir ODPS nesnesi oluşturun.
import os from odps import ODPS # Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set to your Access Key ID, # and the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set to your Access Key Secret. # We recommend that you avoid hardcoding the Access Key ID and Access Key Secret in your code. o = ODPS( os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point', ) -
Bir tablodan DataFrame nesnesi oluşturun.
from odps.df import DataFrame users = DataFrame(o.get_table('pyodps_ml_100k_users')); -
Sütun adlarını ve veri türlerini
dtypesözelliği ile görüntüleyin.print(users.dtypes)Çıktı:
odps.Schema { user_id int64 age int64 sex string occupation string zip_code string } -
İlk N satırı
headyöntemiyle önizleyin.print(users.head(10))Çıktı:
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 -
Belirli sütunlarla çalışmak için aşağıdaki yöntemlerden birini kullanın:
-
Bir sütun alt kümesi seçin.
print(users[['user_id', 'age']].head(5))Çıktı:
user_id age 0 1 24 1 2 53 2 3 23 3 4 24 4 5 33 -
Belirli sütunları hariç tutun.
print(users.exclude('zip_code', 'age').head(5))Çıktı:
user_id sex occupation 0 1 M technician 1 2 F other 2 3 M writer 3 4 M technician 4 5 F other -
Sütunları hariç tutun ve hesaplanmış sütunlar ekleyin. Örneğin,
sexdeğeriMise True, aksi takdirde False olansex_booladlı bir boolean sütun oluşturun.print(users.select(users.exclude('zip_code', 'sex'), sex_bool=users.sex == 'M').head(5))Çıktı:
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
-
-
Erkek ve kadın kullanıcı sayısını hesaplayın.
print(users.groupby(users.sex).agg(count=users.count()))Çıktı:
sex count 0 F 273 1 M 670 -
Kullanıcıları mesleğe göre gruplandırın, azalan düzende sıralayın ve en çok kullanılan ilk 10 mesleği görüntüleyin.
df = users.groupby('occupation').agg(count=users['occupation'].count()) df1 = df.sort(df['count'], ascending=False) print(df1.head(10))Çıktı:
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 31Daha kısa bir sözdizimi için
value_countsyöntemini de kullanabilirsiniz. Döndürülen satır sayısıoptions.df.odps.sort.limitile sınırlıdır. Daha fazla bilgi için bkz. Configuration.df = users.occupation.value_counts()[:10] print(df.head(10))Çıktı:
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 -
Üç tabloyu
joinile birleştirin ve sonucu pyodps_ml_100k_lens adlı yeni bir tabloya kaydedin.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)Çıktı:
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 }
DataFrame veri işleme
İlk olarak Iris veri kümesini indirin. Aşağıdaki adımlarda DataWorks içindeki bir PyODPS düğümü kullanılır. Daha fazla bilgi için bkz. Develop a PyODPS 3 task.
-
Test veri tablosu oluşturun.
DataWorks'te bir tablo oluşturun:
Business Flow bölmesinde MaxCompute öğesine sağ tıklayın ve Create Table seçeneğini belirleyin. Create Table iletişim kutusunda bir Path seçin, bir Name girin ve tablo düzenleyicisine gitmek için Create düğmesine tıklayın.
Düzenleme sayfasının sol üst köşesindeki DDL
simgesine tıklayın.-
Aşağıdaki DDL ifadesini girin ve tabloyu oluşturmak için ifadeyi çalıştırın.
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' ) ;
-
Test verilerini yükleyin.
-
Yeni tabloya sağ tıklayın, Import Data seçeneğini belirleyin ve indirdiğiniz veri kümesini yüklemek için Next düğmesine tıklayın.
Import Data iletişim kutusunda Veri Aktarma Yöntemi olarak Upload Local File, Dosya Biçimi olarak CSV seçin. İndirilen iris.csv dosyasını seçin. Sınırlayıcı olarak Comma, Kaynak Karakter Seti olarak GBK ve Başlangıç Satırı olarak 1 ayarlayın. İlk Satır Üst Bilgi İçeriyor mu sorusuna Yes seçeneğini işaretleyin. Veri önizlemesinin doğru olduğunu onayladıktan sonra Next düğmesine tıklayın.
Verileri aktarmak için Match by Position seçeneğine tıklayın.
-
Business Flow bölmesinde MaxCompute öğesine sağ tıklayın, Create Node seçeneğini belirleyin ve kodunuzu saklamak ve çalıştırmak için bir PyODPS düğümü oluşturmak üzere PyODPS 3 seçeneğini belirleyin.
-
Kodu girin ve Çalıştır simgesine
tıklayın. Kod çalıştıktan sonra sonuçları aşağıdaki Run log sekmesinde görüntüleyebilirsiniz. Kod aşağıdaki gibidir:from odps import ODPS from odps.df import DataFrame, output import os # Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set to your Access Key ID, # and the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set to your Access Key Secret. # We recommend that you avoid hardcoding the Access Key ID and Access Key Secret in your code. o = ODPS( os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point', ) # Create a DataFrame object named iris from the MaxCompute table. iris = DataFrame(o.get_table('pyodps_iris')) print(iris.head(10)) # Print part of the iris DataFrame. print(iris.sepallength.head(5)) # Use a custom function to calculate the sum of two columns in the iris DataFrame. print(iris.apply(lambda row: row.sepallength + row.sepalwidth, axis=1, reduce=True, types='float').rename('sepaladd').head(3)) # Specify the output names and types for the function. @output(['iris_add', 'iris_sub'], ['float', 'float']) def handle(row): # Use the yield keyword to return multiple output rows. yield row.sepallength - row.sepalwidth, row.sepallength + row.sepalwidth yield row.petallength - row.petalwidth, row.petallength + row.petalwidth # Print the first 5 rows of the result. axis=1 indicates a row-by-row operation. print(iris.apply(handle, axis=1).head(5))Sonuçlar:
# 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