ไลบรารี DataFrame สำหรับ Python อย่าง Ibis เลิกใช้แบ็กเอนด์ Pandas และ Dask
(ibis-project.org)- จะเลิกใช้แบ็กเอนด์
pandasและdaskและมีแผนลบออกในเวอร์ชัน 10.0 - ไม่มีความต่างด้านฟังก์ชันระหว่างแบ็กเอนด์
pandasกับแบ็กเอนด์ DuckDB ที่เป็นค่าเริ่มต้น และ DuckDB มีประสิทธิภาพสูงกว่ามาก - ยังสามารถใช้ pandas DataFrame เป็นรูปแบบสำหรับรับส่งข้อมูลใน Ibis ได้ แต่จะไม่รองรับการรันคิวรีด้วย
pandas - ตรรกะส่วนใหญ่ใช้ได้กับแบ็กเอนด์
daskเช่นกัน และdaskก็ยังเป็นโปรเจ็กต์ที่ยอดเยี่ยมซึ่งควรใช้งานต่อไปนอก Ibis
ทำไมต้อง pandas? และประวัติของ Ibis
- ในช่วงแรกของ Ibis มีเพียงแบ็กเอนด์ Impala เท่านั้น
- มีการเพิ่มแบ็กเอนด์ Postgres เข้ามา แต่การติดตั้งซับซ้อน ทำให้ผู้ใช้ลองใช้ Ibis ได้ไม่สะดวก
- จำเป็นต้องมีวิธีทดลองใช้ API ของ Ibis ได้โดยไม่ต้องมีโครงสร้างพื้นฐานเพิ่มเติมนอกเหนือจากโน้ตบุ๊ก
- ในเวลานั้น การเชื่อมต่อแบ็กเอนด์
pandasซึ่งเป็นเอนจิน DataFrame แบบ in-memory เพียงตัวเดียว คือคำตอบที่ชัดเจน
ความยากของแบ็กเอนด์ Pandas
- แม้
pandasจะเป็นตัวเลือกที่ดีที่สุดในเวลานั้น แต่ก็ไม่สอดคล้องกับโมเดลการวิเคราะห์ข้อมูลของ Ibis มากนัก - แบ็กเอนด์
pandasแตกต่างจากแบ็กเอนด์อื่นโดยพื้นฐาน และมีโค้ดเฉพาะกรณีมากที่สุด pandasโดยธรรมชาติเป็นเอนจินที่ทำงานแบบประมวลผลทันที ขณะที่ Ibis ใช้โมเดลการทำงานแบบหน่วงเวลา- การทำให้อินเทอร์เฟซของ
pandasทำงานในรูปแบบหน่วงเวลาเป็นเรื่องยาก - แบ็กเอนด์
pandasช้ากว่าแบ็กเอนด์อื่น และต้องใช้โค้ดหลายพันบรรทัดเพื่อรองรับสิ่งนี้ NaNของpandasและNULLของ Ibis เป็นแนวคิดที่ต่างกันโดยพื้นฐาน แต่กลับต้องถูกปฏิบัติราวกับเป็นสิ่งเดียวกัน- ใน
pandasมีการใช้ NaN เป็นตัวแทนของค่าที่หายไป แต่สิ่งนี้ทำให้เกิดปัญหาความเข้ากันได้กับแบ็กเอนด์อื่น NULLหมายถึงค่าที่หายไป ส่วน NaN หมายถึงไม่ใช่ตัวเลข ซึ่งเป็นคนละแนวคิดกันโดยสิ้นเชิง
- ใน
- ไทป์ใหม่ของ
pandasที่อิงกับ Arrow เป็นการปรับปรุงครั้งใหญ่ แต่ก็ยังมีปัญหาอยู่
สร้างความสับสนให้ผู้ใช้ใหม่
- ผู้คนมักชอบสิ่งที่คุ้นเคย
- เมื่อเริ่มใช้ Ibis ครั้งแรก ผู้ใช้ต้องเลือกทั้ง Ibis และแบ็กเอนด์พร้อมกัน
- ผู้ใช้ใหม่มักรายงานว่า "Ibis ช้า"
- สาเหตุส่วนใหญ่มาจากการใช้แบ็กเอนด์
pandas - หากใช้ DuckDB หรือ Polars ก็น่าจะเริ่มต้นได้ง่ายกว่ามาก
ความเท่าเทียมด้านความสามารถ
- เหตุผลที่หนักแน่นที่สุดในการถอดแบ็กเอนด์
pandasออกคือความซ้ำซ้อน - แบ็กเอนด์ DuckDB สามารถคิวรี pandas DataFrame ได้อย่างราบรื่น รองรับ UDF ได้หลายรูปแบบ และอ่านเขียนฟอร์แมตได้หลากหลาย เช่น parquet, CSV, JSON
- DuckDB ติดตั้งง่าย รันได้ในเครื่อง локอล เร็วมาก และทำงานร่วมกับระบบนิเวศ Python ได้ดี
สรุปโดย GN⁺
- การเลือก DuckDB เป็นแบ็กเอนด์เริ่มต้นดูเป็นการตัดสินใจที่ชาญฉลาดมาก เพราะติดตั้งง่าย รันในเครื่องได้ เร็วมาก และทำงานร่วมกับระบบนิเวศ Python ได้ดี ซึ่งนี่ก็เป็นเหตุผลเดียวกับที่ Ibis เคยเพิ่ม
pandasเป็นแบ็กเอนด์ในตอนแรก - การที่
pandasยังสามารถใช้เป็นฟอร์แมตสำหรับรับส่งข้อมูลได้ ถือเป็นข่าวดีสำหรับผู้ใช้pandasเดิม เพราะไม่จำเป็นต้องทิ้งโค้ดเดิมทั้งหมด - อย่างไรก็ตาม การไม่ใช้
pandasสำหรับรันคิวรีอีกต่อไปดูเป็นทิศทางที่ถูกต้อง โมเดลการทำงานแบบ eager ของpandasไม่สอดคล้องกับโมเดลแบบ lazy ของ Ibis ทำให้แบ็กเอนด์pandasมักช้ากว่าการใช้pandasโดยตรงเสียอีก - เมื่อ Ibis รองรับแบ็กเอนด์มากขึ้นเรื่อย ๆ การดูแลรักษาโค้ดที่ปรับให้เข้ากับแบ็กเอนด์เฉพาะก็จะยิ่งยากขึ้น การถอดแบ็กเอนด์
pandasออกจะช่วยให้โค้ดเบสสะอาดขึ้นและดูแลรักษาง่ายขึ้น - หากการใช้แบ็กเอนด์ DuckDB สามารถทดแทนความสามารถทั้งหมดของ
pandasได้ ก็แทบไม่เห็นเหตุผลที่จะต้องคงแบ็กเอนด์pandasไว้ แถมยังอาจสร้างความสับสนให้ผู้ใช้ใหม่ได้อีกด้วย
2 ความคิดเห็น
ความจริงก็คือหลายคนยังคงใช้ pandas ที่คุ้นเคยที่สุดอยู่เยอะเหมือนเดิมครับ,,
ความคิดเห็นจาก Hacker News
NaN เป็นผลลัพธ์ของ 0/0 ซึ่งหมายความว่ามีค่าอยู่ แต่ไม่สามารถทราบค่าได้อย่างแม่นยำ
Noneของ Python แตกต่างจากทั้ง NaN และ NULLมีเอนจินประมวลผลที่ดีกว่า pandas อยู่มาก
ในช่วงไม่กี่เดือนที่ผ่านมา ได้แทนที่ pandas ด้วย ibis ในโปรเจ็กต์ใหม่
ฟีเจอร์ multi-index ของ pandas ทรงพลังที่สุด
สงสัยว่าเคยพิจารณา Polars หรือไม่
pandas สามารถขยายไปยังคอลัมน์ชนิดใหม่ได้
คุณค่าของ Ibis ไม่ได้อยู่ที่การใช้ DuckDB ได้
ไม่ค่อยเคยได้ยินเกี่ยวกับ Ibis มากนัก
API ของไลบรารี pandas ไม่ได้ใช้งานได้อย่างเป็นธรรมชาติเสมอไป
เหตุผลที่ใช้ pandas คืออีโคซิสเต็มที่เชื่อมต่อกันครบ