Rantaian Kaedah dengan pipe()
Tulis pipeline transformasi data yang mudah dibaca menggunakan pipe() untuk merantaikan fungsi tersuai bersama kaedah asli Pandas.
Rantaian Kaedah dengan pipe() ialah pelajaran Pandas & NumPy Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pandas & NumPy Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pandas & NumPy Academy merangkumi sejumlah 4 pelajaran.
Masalah dengan Pemboleh Ubah Perantaraan
Saluran pembersihan data tanpa pipe() sering mengumpulkan banyak pemboleh ubah perantaraan: df1 = clean(df), df2 = transform(df1), df3 = enrich(df2). Pemboleh ubah ini mengganggu ruang nama, menyukarkan penyahpepijatan dan mendorong pembangun menggunakannya semula secara tidak betul. Akibatnya, kod sukar dibaca dari atas ke bawah sebagai urutan transformasi.
import pandas as pd
df = pd.read_csv('orders.csv')
# Without pipe — intermediate variables everywhere
df1 = df.dropna(subset=['revenue'])
df2 = df1[df1['quantity'] > 0]
df3 = df2.assign(revenue_per_unit=df2['revenue'] / df2['quantity'])
print(df3.shape)Memperkenalkan pipe()
DataFrame.pipe(func) memanggil func(df) dan mengembalikan hasilnya, lalu membolehkan anda merantaikan fungsi tersuai dengan cara yang sama seperti merantaikan kaedah Pandas asli seperti .dropna().query(). Manfaat utamanya ialah setiap langkah transformasi dinyatakan dengan jelas dan mudah dibaca dari kiri ke kanan, atau dari atas ke bawah apabila diformatkan dengan tanda kurung, selaras dengan susunan logik saluran tersebut.
def drop_nulls(df):
return df.dropna(subset=['revenue'])
def filter_positive_qty(df):
return df[df['quantity'] > 0]
def add_revenue_per_unit(df):
return df.assign(revenue_per_unit=df['revenue'] / df['quantity'])
# With pipe — clean chain
df_clean = (df
.pipe(drop_nulls)
.pipe(filter_positive_qty)
.pipe(add_revenue_per_unit)
)
print(df_clean.shape)Menghantar Argumen melalui pipe()
Hantar argumen tambahan kepada fungsi yang disalurkan menggunakan argumen kata kunci selepas nama fungsi: df.pipe(func, arg1=val1). Tandatangan fungsi mesti menerima df sebagai parameter pertama. Fungsi berparameter menjadikan saluran boleh dikonfigurasikan: anda boleh mengubah ambang, nama lajur atau tingkah laku tanpa mengubah badan fungsi, hanya dengan mengubah argumen panggilan pipe.
def filter_by_region(df, regions):
return df[df['region'].isin(regions)]
def cap_revenue(df, upper):
df = df.copy()
df['revenue'] = df['revenue'].clip(upper=upper)
return df
df_result = (df
.pipe(filter_by_region, regions=['North', 'East'])
.pipe(cap_revenue, upper=1000)
)
print(df_result.shape)Mencampurkan pipe() dengan Kaedah Asli
Kelebihan pipe() ialah ia berintegrasi dengan lancar bersama kaedah Pandas natif dalam rantaian yang sama. Anda boleh mencampurkan .dropna(), .query(), .rename() dan .pipe(custom_func) dalam apa-apa susunan. Hal ini menjadikan rantaian tersebut ringkas (dengan menggunakan kaedah terbina dalam jika boleh) dan fleksibel (dengan menggunakan fungsi tersuai apabila kaedah terbina dalam tidak mencukupi).
df_result = (
df
.dropna(subset=['revenue', 'order_date'])
.query('quantity > 0')
.rename(columns={'unit_price': 'price'})
.pipe(add_revenue_per_unit)
.reset_index(drop=True)
)
print(df_result.head())Menyahpepijat Rantaian pipe()
Menyahpepijat rantaian yang panjang boleh menjadi sukar kerana anda tidak boleh memeriksa keadaan perantaraan dengan menambah pernyataan cetak di tengah-tengahnya. Salah satu penyelesaiannya ialah menulis fungsi nyahpepijat laluan terus yang mencetak maklumat bentuk dan lajur, kemudian mengembalikan DataFrame tanpa perubahan. Sisipkan fungsi ini pada mana-mana titik dalam rantaian untuk memeriksa keadaan pada langkah tersebut tanpa memutuskan rantaian.
def debug(df, label=''):
print(f'[{label}] shape: {df.shape}')
print(f'[{label}] columns: {df.columns.tolist()}')
return df
df_result = (
df
.pipe(drop_nulls)
.pipe(debug, label='after drop_nulls')
.pipe(filter_positive_qty)
.pipe(debug, label='after filter')
)
print('Done')Membina Pipeline Pembersihan Lengkap
Gabungkan semua langkah pembersihan ke dalam satu fungsi pipeline menggunakan pipe(). Membungkus rantaian itu dalam fungsi bernama clean_pipeline(df) menjadikan pipeline tersebut boleh diuji sebagai satu unit. Panggil fungsi itu dengan DataFrame mentah dan terima DataFrame yang bersih. Corak ini selaras dengan paradigma ETL (Extract, Transform, Load) yang digunakan dalam kejuruteraan data untuk sistem produksi.
def clean_pipeline(df):
return (
df
.dropna(subset=['order_id', 'revenue'])
.drop_duplicates(subset=['order_id'])
.query('quantity > 0 and revenue >= 0')
.pipe(add_revenue_per_unit)
.reset_index(drop=True)
)
df_clean = clean_pipeline(df)
print('Clean rows:', len(df_clean))Perbezaan Utama antara pipe() dengan apply()
pipe(func) menghantar keseluruhan DataFrame kepada func dan menjangkakan DataFrame (atau objek yang telah diubah) dikembalikan. apply(func, axis=1) menghantar satu baris pada satu-satu masa. Gunakan pipe() untuk transformasi seluruh DataFrame yang mengekalkan bentuk yang sama (atau mengubahnya dengan sengaja), dan gunakan apply() untuk pengiraan pada peringkat baris atau lajur. Kedua-duanya saling melengkapi, bukannya bersaing.
# pipe: receives the whole DataFrame
def scale_revenue(df, factor=1.0):
df = df.copy()
df['revenue'] = df['revenue'] * factor
return df
# apply: receives one row at a time
df['revenue_x2'] = df.apply(lambda row: row['revenue'] * 2, axis=1)
df_scaled = df.pipe(scale_revenue, factor=1.1)
print('pipe scales all rows at once; apply does row-by-row')Komponen Pipeline yang Boleh Digunakan Semula
Tulis setiap langkah pipeline sebagai fungsi tulen — tanpa keadaan global, menerima DataFrame dan mengembalikan DataFrame. Fungsi tulen mudah diuji secara unit: panggil fungsi itu dengan DataFrame ujian yang kecil, kemudian pastikan bentuk output dan nilai lajurnya betul. Pustaka fungsi pipeline yang telah diuji dan boleh digunakan semula dapat mempercepat analisis set data baharu yang mempunyai keperluan pembersihan yang serupa dengan ketara.
def normalise_strings(df, cols):
df = df.copy()
for col in cols:
df[col] = df[col].str.strip().str.lower()
return df
def parse_dates(df, cols):
df = df.copy()
for col in cols:
df[col] = pd.to_datetime(df[col])
return df
df_result = (
df
.pipe(normalise_strings, cols=['region', 'category'])
.pipe(parse_dates, cols=['order_date'])
)
print(df_result.dtypes)Merekod Langkah Pipeline dengan pipe()
Tambahkan pencatatan berstruktur dalam setiap fungsi pipeline supaya anda boleh mengaudit setiap transformasi dalam sistem produksi. Sertakan bilangan baris input, bilangan baris output dan apa-apa statistik yang berkaitan (contohnya, baris yang dibuang oleh penapis). Dengan ini, anda mendapat jejak lengkap bagi setiap pelaksanaan pipeline tanpa memerlukan pengatur cara aliran kerja luaran untuk jejak audit asas.
import logging
logging.basicConfig(level=logging.INFO)
def logged_dropna(df, subset):
before = len(df)
df = df.dropna(subset=subset)
after = len(df)
logging.info(f'dropna: {before - after} rows removed, {after} remaining')
return df
df_clean = df.pipe(logged_dropna, subset=['revenue'])
print('Logged pipeline complete.')Langkah Bersyarat dalam Pipeline
Kadangkala sesuatu langkah pembersihan hanya perlu dijalankan berdasarkan bendera atau kandungan data. Anda boleh menambah langkah bersyarat pada rantaian pipe dengan menyisipkan fungsi identiti-atau-transformasi: fungsi ini menyemak syarat, kemudian sama ada menggunakan transformasi atau mengembalikan DataFrame tanpa perubahan. Struktur rantaian kekal utuh sambil menyokong langkah pilihan.
def maybe_cap_revenue(df, cap=None):
if cap is None:
return df
df = df.copy()
df['revenue'] = df['revenue'].clip(upper=cap)
return df
CAPPING_ENABLED = True
CAP_VALUE = 1000 if CAPPING_ENABLED else None
df_result = df.pipe(maybe_cap_revenue, cap=CAP_VALUE)
print('Conditional step applied:', CAPPING_ENABLED)Mengeksport Hasil Pipeline
Langkah terakhir dalam rantaian pipe() selalunya ialah eksport. Anda boleh merantaikan fungsi eksport tersuai menggunakan pipe() atau terus memanggil kaedah eksport Pandas natif selepas rantaian itu. Penggunaan langkah pipe(save_to_parquet) menjadikan bahagian eksport sebahagian daripada dokumentasi rantaian dan memastikan eksport sentiasa dijalankan pada DataFrame akhir yang telah dibersihkan, bukannya versi perantaraan.
def save_parquet(df, path):
df.to_parquet(path, index=False)
print(f'Saved {len(df)} rows to {path}')
return df # return df so the chain can continue if needed
df_final = (
df
.pipe(clean_pipeline)
.pipe(save_parquet, path='orders_final.parquet')
)
print('Pipeline complete.')Semakan Pantas
Uji pemahaman anda tentang konsep Analisis Data daripada pelajaran ini.
Ulang Kaji Pelajaran
Dalam pelajaran ini, anda telah mempelajari: menggunakan pipe() untuk merantaikan fungsi tersuai dengan kaedah Pandas natif, membina langkah pipeline yang boleh digunakan semula, mempunyai parameter dan boleh diuji sebagai fungsi tulen, serta menambah catatan nyahpepijatan dan langkah bersyarat dalam rantaian pipe. Seterusnya, kita akan meneroka cara menstrukturkan langkah transformasi sebagai fungsi untuk pipeline ETL produksi.
Pelajari Python dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “Rantaian Kaedah dengan pipe()” percuma?
Ya — teks penuh “Rantaian Kaedah dengan pipe()” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pandas & NumPy Academy, tingkat taraf kepada CoddyKit PRO. Kursus Pandas & NumPy Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Rantaian Kaedah dengan pipe()”?
Tulis pipeline transformasi data yang mudah dibaca menggunakan pipe() untuk merantaikan fungsi tersuai bersama kaedah asli Pandas. Anda berlatih Pandas & NumPy Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Pandas & NumPy Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Pandas & NumPy Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Rantaian Kaedah dengan pipe()” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- apply() pada Lajur dan Baris
- apply() dengan GroupBy
- map() dan applymap() untuk Operasi Setiap Unsur
- Rantaian Kaedah dengan pipe()