การอ้างอิงที่ดีที่สุดสำหรับรหัส Pandas ที่สะอาด

Nov 28 2022
วิธีที่สะอาดในการล้างข้อมูล Pandas สามารถแปลงแม้แต่ข้อมูลที่ยุ่งเหยิงที่สุดให้เป็นชุดข้อมูลแมชชีนเลิร์นนิงที่เก่าแก่ แม้ว่ากระบวนการนี้อาจค่อนข้างยุ่งเหยิง

วิธีที่สะอาดในการล้างข้อมูล

ภาพถ่ายโดย Precious Plastic Melbourne บน Unsplash

หมีแพนด้าสามารถแปลงแม้แต่ข้อมูลที่ยุ่งเหยิงที่สุดให้เป็นชุดข้อมูลแมชชีนเลิร์นนิงที่เก่าแก่ แม้ว่ากระบวนการนี้อาจค่อนข้างยุ่งเหยิง

รหัส Pandas อาจอ่านยากด้วยเหตุผลหลายประการ ประการแรก มีหลายวิธีในการทำงานพื้นฐานเดียวกันให้สำเร็จใน Pandas การย่อยข้อมูล การเพิ่มคอลัมน์ใหม่ การทิ้งคอลัมน์ การลบค่า Null และกระบวนการอื่นๆ สามารถทำได้หลายวิธี ซึ่งนำไปสู่โค้ดที่ไม่สอดคล้องกันและยุ่งเหยิง

การจัดการลำดับขั้นตอนการล้างข้อมูลอาจเป็นเรื่องที่ท้าทายใน Pandas รหัสล้างข้อมูลส่วนใหญ่ของฉันก่อนหน้านี้ในอาชีพการงานของฉันมีลักษณะดังนี้:

# Import data
df_raw = pd.read_csv("path/to/data/file.csv")

# Clean data
df_raw["id"] = df_raw["id"].astype(str)
df_merged = df_raw.merge(df2, on="id")
df_final = df_merged.drop(columns=["col_5", "col_6", "col_7"])

# Investigate data
df_agg = df_final.groupby("id").size()

สุดท้ายนี้ โค้ดของ Pandas อาจยุ่งเหยิงได้ เพราะหลายครั้งมีการเขียนแบบเร่งรีบ ไม่ว่าคุณจะอยากสร้างโมเดลและต้องการล้างชุดข้อมูลของคุณอย่างรวดเร็วก่อนล่วงหน้า หรือคุณมีชุดข้อมูลเอาต์พุตใหม่ที่คุณต้องการวิเคราะห์ เนื่องจากโดยทั่วไปแล้วนักวิทยาศาสตร์ข้อมูล Pandas เป็นหนทางสู่จุดจบ

ดังนั้นความลับในการเขียนโค้ด Pandas ที่สะอาดทุกครั้งคืออะไร สองคำ: วิธี การผูกมัด

ในบทความนี้ ฉันได้แบ่งปันคอลเล็กชันที่คัดสรรแล้วของวิธีการ Clean Pandas ที่ฉันใช้เพื่อประมวลผลล่วงหน้า ตรวจสอบ รวบรวม และวิเคราะห์ข้อมูล Twitter ที่ฉันใช้ในโครงการแยกต่างหากเพื่อฝึกโมเดล Transformer การวาดตัวอย่างเหล่านี้จะขยายความเข้าใจของคุณเกี่ยวกับวิธีการผูกมัดและใช้เป็นคู่มืออ้างอิงสำหรับคุณในการเขียนโค้ด Pandas ที่สะอาดของคุณเอง

พื้นฐานของแพนด้าที่สะอาด

ห้องสมุด Pandas มาพร้อมกับวิธีการในตัวมากมาย โปรดจำไว้ว่าใน Python เมธอดคือฟังก์ชันที่เป็นของออบเจกต์ของคลาสเฉพาะและถูกตรึงไว้กับอ็อบเจ็กต์เองdf.to_csv()เช่น เมธอดยังสามารถเชื่อมโยงได้ หมายความว่าคุณสามารถใช้เมธอดได้หลายวิธีกับออบเจกต์หนึ่งๆ ในคราวเดียว

new_df = (                          # Wrap everything in ()'s
    original_df                     # Name of data frame to modify
    .query("text_length > 140")     # Subset based on text length
    .sort_values(by="text_length")  # Sort entire df by text length
    .reset_index()                  # Reset index of subsetted df
)

  • มันทำให้โค้ดอ่านง่ายขึ้นมาก
  • ทำให้ไม่ต้องใช้เฟรมข้อมูลตัวกลางหลายตัว ซึ่งช่วยประหยัดหน่วยความจำ
  • ง่ายต่อการดีบัก เพียงแสดงความคิดเห็นเกี่ยวกับการปรับแต่ง data frame ทีละบรรทัดเพื่อดูว่าวิธีใดที่ทำให้คุณมีปัญหา

ฉันมีกรอบข้อมูลของทวีตดิบที่สร้างโดยวุฒิสมาชิกสหรัฐฯ ซึ่งฉันดึงข้อมูลผ่านTwitter API v2พร้อมข้อมูลรับรองการเข้าถึงที่ยกระดับ นี่คือข้อมูล:

ทีนี้มาทำการผูกมัดเพื่อทำความสะอาด ในการโทรเพียงครั้งเดียวนี้ เราจะเลือกและวางคอลัมน์ จัดรูปแบบคอลัมน์วันที่ ล้างข้อความดิบของทวีต นับความยาวข้อความ รวมสองเฟรมข้อมูล วางแถวที่ซ้ำกัน เปลี่ยนชื่อคอลัมน์ เรียงลำดับชื่อคอลัมน์ใหม่ จัดเรียงตามวันที่ และวางแถวทั้งหมดที่ทวีตยาวเป็นศูนย์

คุณอาจคุ้นเคยกับวิธีการเหล่านี้เป็นส่วนใหญ่ บางทีวิธีที่สำคัญที่สุดในที่นี้คือ.assign()ซึ่งช่วยให้คุณสร้างคอลัมน์ใหม่หรือเขียนทับคอลัมน์เก่าได้ ฉันใช้assign()วิธีนี้เพื่อจุดประสงค์สองประการเป็นหลัก

  1. การเปลี่ยนประเภทข้อมูลของคอลัมน์ที่มีอยู่:
  2. .assign(column_name=original_df["column_name"].astype(str)
    

    .assign(new_column=original_df["column_name"].apply(function_name)
    

หลังจากนำห่วงโซ่สัตว์ประหลาดนั้นไปใช้กับข้อมูลดิบของ Twitter เราก็มีกรอบข้อมูลที่เป็นระเบียบเรียบร้อยและอ่านได้ที่เราต้องการตรวจสอบ

วิธีการง่ายๆ.info()ให้ข้อมูลจำนวนที่น่าทึ่งเกี่ยวกับ data frame ของคุณ รวมถึง:

  • จำนวนแถว (และช่วงดัชนี)
  • จำนวนคอลัมน์
  • ชื่อของคอลัมน์
  • ชนิดข้อมูลของคอลัมน์
  • จำนวนค่าที่ไม่ใช่ค่า Null ต่อคอลัมน์
  • การใช้ความจำ

วิธี การ.describe()นี้จะแสดงภาพรวมของค่าจริงและการกระจายของข้อมูลในแต่ละคอลัมน์ของคุณ นำ.describe()ไปใช้กับคอลัมน์ตามประเภทข้อมูลเพื่อให้ได้ผลลัพธ์ที่สะอาดขึ้น ดังที่แสดงด้านล่าง:

ผลลัพธ์จากการเรียก.describe()ใช้dtype="object"นั้นไม่ได้เจาะลึกเป็นพิเศษ เนื่องจากคอลัมน์id, username, และtextมีค่าสตริงมากกว่าข้อมูลที่จัดหมวดหมู่ อย่างไรก็ตาม ค่าแถวสำหรับpartyคอลัมน์อาจแสดงรูปแบบที่เป็นไปได้

การรวมและวิเคราะห์ข้อมูล

การรวมข้อมูลในตัวแปรตามหมวดหมู่มักจะเป็นส่วนแรกของการวิเคราะห์ใดๆ ที่ฉันดำเนินการสำหรับโครงการ NLP ตัวแปรที่ชัดเจนที่สุดในการรวมในชุดข้อมูลทวีตpartyคือ

ต่อไป มาดูการรวมขั้นสูงเพิ่มเติม การ ผูกมัด.groupby()และ.agg()ฟังก์ชันตามลำดับเช่นนี้ทำให้เข้าใจการรวมโดยรวมได้ง่ายขึ้น:

หลังจากใช้การรวมแล้ว ดัชนีผลลัพธ์จะอ่านยาก วิธี.pipe()นี้เป็นวิธีที่แพนด้าสะอาดใช้ฟังก์ชันกับกรอบข้อมูลทั้งหมด

บทสรุป

กุญแจสำคัญในการเขียนโค้ด Pandas ที่สะอาดคือการบังคับตัวเองให้ใช้ วิธี การผูกมัด การทำเช่นนี้จะทำให้โค้ดของคุณอ่านและตีความได้ง่ายขึ้น แก้ไขจุดบกพร่องได้ง่ายขึ้น และยังประหยัดหน่วยความจำอีกด้วย ดังที่บทความนี้ได้แสดงให้เห็นแล้ว คุณสามารถใช้วิธีการเชื่อมโยงในทุกส่วนของวงจรชีวิตข้อมูล รวมถึงการล้าง การตรวจสอบ การรวม และการวิเคราะห์ข้อมูล สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการผูกมัดของเมธอด โปรดดูแหล่งข้อมูลด้านล่าง

ทรัพยากร

  • รหัสสนับสนุนสำหรับบทความนี้
  • หมีแพนด้าที่มีประสิทธิภาพโดย Matt Harrison
  • แพนด้าสมัยใหม่
  • เอกสารแพนด้า

(1) M. Newhauser วุฒิสมาชิก DistilBERT ทวีต (2022)

(2) T. Augspurger, Modern Pandas (ตอนที่ 1) (2016).

(3) M. Harrison & T. Petrou, ตำราอาหาร Pandas 1.x: สูตรที่ใช้ได้จริงสำหรับการคำนวณทางวิทยาศาสตร์ การวิเคราะห์อนุกรมเวลา และการวิเคราะห์ข้อมูลเชิงสำรวจโดยใช้ Python (ฉบับที่สอง) (2020)

(4) Python Software Foundation, 9. คลาส (2022)

(5) Twitter, เอกสาร Twitter API (2022)

ต้องการเชื่อมต่อ?

ติดต่อฉันทางLinkedIn ✍️