ใช้ Papermill ทำ Automation กับ Jupyter Notebooks
Tags: jupyter, papermill, automation
Published: 2020-09-07 08:53:40

---
title: ใช้ Papermill ทำ Automation กับ Jupyter Notebooks
published: true
description: Papermill เป็นเครื่องมือที่ทำให้เราสามารถทำ automation กับ Jupyter notebook ได้ และยิ่งไปกว่านั้นคือทำให้เราสามารถ integrate ตัว Jupyter notebook เข้ากับ workflow ได้อีกด้วย
tags: jupyter, papermill, automation
//cover_image: https://direct_url_to_image.jpg
---

## Background

ในยุคนี้เวลาที่ชาว Data Scientist อยากจะสื่อสารผลที่ได้จากการวิเคราะห์ข้อมูลกับฝั่ง Business หรืออยากที่จะสร้างโมเดลทำนายผลทางธุรกิจสักอย่างหนึ่ง [Jupyter Notebooks](https://jupyter.org/) จะเป็นอาวุธหรือเครื่องมือสำคัญที่ส่วนใหญ่เราจะหยิบเอามาใช้กัน ซึ่งข้อดีของเครื่องมือตัวนี้ก็คือมันสามารถเป็นทั้ง document เป็น live code รวมไปถึง visualization ภายในตัว

## Challenges

แต่อย่างไรก็ดี เครื่องมือตัวนี้ยังมีข้อจำกัดอยู่ที่ว่าเวลาที่เรา

* อยากจะเปลี่ยนแปลงค่า input บางค่า หรือว่ามีส่วนของโค้ดที่เราอยากไปดึงข้อมูลหลังจากจบเดือนนี้ หรือดึงโค้ดในวันสิ้นปี เราต้องเปิด notebook นั้นๆ ขึ้นมาในวันนั้นๆ แล้วสั่ง execute แต่ละ cell เอง
* อยากจะใช้ค่าจากผลการทดลองที่อยู่ใน notebook ของเพื่อนร่วมทีม สิ่งที่เราต้องทำก็คือไปเปิด notebook ของเพื่อน นั่งไล่ execute แต่ละ cell แล้วก็อปปี้ผลที่ได้มาแปะใน notebook ของเราเพื่อนำค่านั้นๆ ไปใช้งานต่อ

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

## Introducing Papermill

บทความนี้เลยอยากจะมาแนะนำเครื่องมือ open source ตัวหนึ่งที่ชื่อ [Papermill](https://papermill.readthedocs.io/) ครับ เค้าว่ามาแบบนี้

> Papermill is a tool for parameterizing and executing Jupyter Notebooks.

หมายความว่าเราสามารถที่จะ

1. กำหนด parameters และส่งเข้า notebook ของเราได้
1. สั่ง execute ตัว notebook ของเราได้

แน่นอนครับ เมื่อเรามีความสามารถแบบนี้ เราจึงสามารถทำ automation หรือจับเอา notebook ของเราเข้าไปรวมอยู่ใน automated workflow ได้แล้วน่ะสิ! ปัญหาที่เอ่ยถึงด้านบนก็ถูกแก้ไขไปเรียบร้อยแล้วด้วยเครื่องมือตัวนี้ครับ

สิ่งที่ Papermill ทำมีอยู่ 3 ขั้นตอนสั้นๆ คือ

1. รับ notebook มาพร้อมกับ parameters ที่เรากำหนด
1. ทำ execute ตัว notebook นั้นๆ ให้
1. บันทึกผลลัพธ์ไว้ใน notebook ไฟล์ใหม่

อยากลองเล่น? ไปดูหัวข้อถัดไปกันเลย~

## Getting Started with Papermill

ติดตั้ง Papermill กับ Jupyter Notebook ก่อนครับ

```sh
pip install papermill jupyter
```

เสร็จแล้วก็ให้เปิด server ของ Jupyter Notebook ขึ้นมา

```sh
jupyter notebook
```

เสร็จแล้วก็เขียนโค้ดตามปกติประมาณนี้

![Write some code in a Jupyter notebook](https://dev-to-uploads.s3.amazonaws.com/i/sj6fi64ofhwm534gn9zd.png)

ต่อไปให้เรากำหนด Tags ให้กับ cell ที่เราอยากให้เป็น parameters ครับ วิธีกำหนดก็ตามรูปด้านล่างนี้เลย กดที่ cell นั้นๆ ก่อน

![Set up tags for a cell](https://dev-to-uploads.s3.amazonaws.com/i/naxmsxdniwestzu6v49p.png)

ให้เราใส่ tag เป็นคำว่า `parameters` ครับ

![Name the tag "parameters"](https://dev-to-uploads.s3.amazonaws.com/i/uwcugwgq3zzdxd7bw7b1.png)

เสร็จแล้วให้เราไปที่ terminal แล้วสั่ง

```sh
papermill -p name 'Kan' -p x 9 -p y 8 main.ipynb output.ipynb
```

คำสั่งด้านบนนี้แปลว่าเรากำหนด parameters ตามนี้

* `name` ให้มีค่าเป็น string มีค่า `'Kan'`
* `x` ให้เป็น integer มีค่า 9
* `y` ให้เป็น integer มีค่า 8

พอรันเสร็จให้เราเปิดไฟล์ notebook ที่เราได้ออกมาใหม่ที่ชื่อ `output.ipynb` ดูครับ จะเป็นประมาณนี้

![Output from the execution using Papermill](https://dev-to-uploads.s3.amazonaws.com/i/qevk79a622t01dsxo50o.png)

เห็นได้ว่า Papermill มาแทรก cell ที่มี tag ชื่อ `injected-parameters` ไว้ข้างใต้ cell ของเราที่ tag ไว้ก่อนหน้านี้ ซึ่งทำให้ cell ถัดๆ ไปได้ใช้ค่า parameters ที่โดน inject เข้าไปแทนที่จะใช้ parameters ที่เรากำหนดไว้ตอนแรก

ดูเป็นวิธีที่ simple มากๆ แต่แก้ปัญหาได้เยอะเลยนะ งดงามมาก

ใครอยากเห็นโค้ดที่ใช้ในบทความนี้ ตามไปดูกันได้ที่ [hello-papermill](https://github.com/zkan/hello-papermill)

ใครที่ใช้ Papermill กันอยู่ อยากรู้จังว่าเอาไปใช้ใน use case ไหนกันบ้าง แชร์กันมาได้นะครับ ^^

ปล. ถ้าเราไม่ tag คำว่า `parameters` ที่ cell ของเราไว้ Papermill จะใส่ `injected-parameters` ไว้ที่ cell ด้านบนสุดให้