Checklist các bước chuẩn bị cho dự án Data Science

checklist dự án data science

Trong nhiều năm, tôi đã phát triển hàng trăm dự án Khoa học dữ liệu và Máy học. Quá trình đó không dễ dàng, và tôi đã mất rất nhiều thời gian để đúc kết những bài học quan trọng. Thế nên, tôi đã biên soạn danh sách các best practices để đảm bảo các dự án có thể duy trì và phát triển tiếp tục. Tôi xin chia sẻ chi tiết 16 đầu mục cho việc xây dựng và phát triển dự án của tôi. 

Tóm tắt

Trước khi chúng ta đi sâu vào chi tiết về từng mục, đây là tóm tắt của 16 bước:

Tìm hiểu chi tiết dự án Financial News Headlines

Trong đó bao gồm chi tiết lời giải, video và notebook để bạn làm theo từng bước

1. Lưu trữ dữ liệu, phần mềm và mã ở các vị trí khác nhau

Khi làm việc trên một dự án, chúng ta sẽ gặp phải ba loại tệp:

  1. Dữ liệu. Tất cả dữ liệu thô và bất kỳ kết quả dữ liệu trung gian nào (ví dụ: CSV, txt, SQL, v.v.)
  2. Artifacts. Bất kỳ tệp nào khác được tạo trong quá trình thực thi pipeline (ví dụ: mô hình được tuần tự hóa, báo cáo HTML với số liệu mô hình)
  3. Mã nguồn. Tất cả các tệp để hỗ trợ thực thi pipeline (ví dụ: .py, .R , sổ ghi chép Jupyter, tests)

Để giữ mọi thứ ngăn nắp, hãy tách từng nhóm thành các thư mục khác nhau; làm như vậy sẽ giúp bạn hiểu cấu trúc dự án dễ dàng hơn:

				
					# YES: separate data and artifacts from code
data/
    raw.csv
    ...
artifacts/
    model.pkl
    report.html
    ...
src/
    download_raw.py
    clean.py
    featurize.py
    fit.py
    ...
				
			
				
					# NO: mix data, artifacts and code
myproject/
    raw.csv
    model.pkl
    report.html
    download_raw.py
    clean.py
    featurize.py
    fit.py
    ...
				
			

2. Khai báo các đường dẫn và tham số cấu hình trong một tệp duy nhất

Pipeline của bạn cần tải dữ liệu thô của nó từ một nguồn cụ thể; hơn nữa, bạn có thể cần phải tương tác với các hệ thống khác (chẳng hạn như kho dữ liệu). Cuối cùng, bạn cần lưu trữ kết quả (hệ thống tệp cục bộ hoặc bộ nhớ từ xa). Một cách anti-pattern phổ biến là nhúng các tham số cấu hình này vào mã nguồn, dẫn đến các vấn đề sau:

  1. Mơ hồ: Việc không tiết lộ hệ thống bên ngoài che giấu các chi tiết triển khai thiết yếu, điều này có thể khiến các cộng sự bối rối: dữ liệu nằm ở đâu? Dự án này có cần quyền truy cập vào cụm Kubernetes không?
  2. Opacity: Nếu không có một nơi duy nhất để lưu trữ các tệp tạm thời, mỗi cộng sự có thể bắt đầu lưu các kết quả đầu ra ở các vị trí tùy ý, gây khó khăn cho việc tổ chức dự án.
  3. Dư thừa: Tài nguyên cơ sở hạ tầng (tức là kho dữ liệu, cụm Kubernetes) có khả năng được sử dụng nhiều lần, dẫn đến cấu hình trùng lặp nếu các thông số cấu hình không được tập trung.

: tập trung các đường dẫn và tham số cấu hình

				
					# config.yaml - located in the root folder

path:
    raw: /path/to/raw/
    processed: /path/to/processed/
    artifacts: /path/to/artifacts/

infrastructure:
    # important: do not include any
    # credentials (such as db passwords) here!
    cluster: cluster.my_company.com
    warehouse: warehouse.my_company.com
				
			

… sau đó đọc từ đây:

				
					# some_task.py

from pathlib import Path

# assume you created a load_config data that reads your config.yaml
from my_project import load_config
import pandas as pd

cfg = load_config()

raw_data = pd.read_parquet(Path(cfg['raw'], 'data.parquet'))

# do things...

path_to_report = Path(cfg['artifacts'], 'report', 'lastest.html')
path_to_report.write_text(report)
				
			

KHÔNG: các giá trị được mã hóa cứng sẽ khiến dự án của bạn khó khăn hơn

				
					import pandas as pd

# hardcoded path/to/raw!
raw_data = pd.read_parquet('pat/to/raw/data.parquet')
				
			

3. Lưu trữ thông tin đăng nhập một cách an toàn

Bạn không bao giờ được lưu trữ thông tin đăng nhập cơ sở dữ liệu (hoặc bất kỳ loại thông tin đăng nhập nào khác) trong các tệp văn bản thuần túy (bao gồm .py mã nguồn hoặc bất kỳ tệp cấu hình nào).

: Lưu trữ an toàn thông tin đăng nhập của bạn (ví dụ này sử dụng thư viện keyring)

				
					from my_project import load_locations

import psycopg2
import keyring


def open_db_conn():
    """Open a db connection
    Notes
    -----
    You have to store the credentials before running this function:
    >>> keyring.set_password("mydb", "username", "mypassword")
    """
    loc = load_locations()
    db = loc["servers"]["database"]
    dbname = db["name"]
    user = db["username"]
    host = db["host"]

    # securely retrieve db password
    password = keyring.get_password(dbname, user)

    conn = psycopg2.connect(dbname=dbname,
                            host=host,
                            user=user,
                            password=password)

    return conn
				
			

Sau đó, trong các tập lệnh của bạn:

				
					from my_project import open_db_conn

# securely load credentials, then open db connection
dbname, host, user, password = open_db_conn()

# do some stuff with the data
				
			

Thư viện keyring sử dụng kho thông tin xác thực hệ điều hành của bạn, an toàn hơn tệp văn bản thuần túy. Ví dụ trước chỉ lưu trữ mật khẩu, nhưng bạn có thể lưu trữ bất kỳ trường nào khác.

KHÔNG: thông tin xác thực được lưu trữ trong tệp nguồn

				
					import psycopg2

conn = psycopg2.connect(dbname='dbname',
                        host='data.company.com',
                        user='username',
                        # do not store passwords in plain text
                        password='mypassword')
				
			

4. Giữ cho kho lưu trữ của bạn sạch sẽ bằng cách sử dụng .gitignore tệp

Rất có thể, bạn đang lưu trữ mã của mình trong kho lưu trữ git. Do đó, điều cần thiết là chỉ định một .gitignore để giữ cho nó sạch sẽ. Thiếu tệp này có thể làm cho kho lưu trữ của bạn lộn xộn không cần thiết và có thể phá vỡ dự án cho đồng nghiệp của bạn (tức là nếu bạn cam kết một số tệp cấu hình phụ thuộc vào người dùng).

Những gì cần bao gồm trong .gitignore ? Đầu tiên, lấy mẫu Python từ Github, chứa khá nhiều thứ bạn cần. Sau đó, hãy đảm bảo rằng bạn cũng bao gồm các tiện ích mở rộng phổ biến để tránh vô tình sử dụng dữ liệu hoặc tệp cấu hình. Ví dụ: nếu dữ liệu thô của bạn có định dạng CSV / JSON và bạn có một số tệp cấu hình YAML phụ thuộc vào người dùng, hãy thêm các dòng sau:

				
					# data files
*.csv
*.json

# configuration files
*.yaml
				
			

Nếu bạn đã cam kết một số tệp đó, bạn có thể xóa chúng bằng các lệnh sau:

				
					git rm -r --cached .

git add .

git commit -m 'Applies new .gitignore'
				
			

Tìm hiểu chi tiết dự án Ukraine Mobile phones

Trong đó bao gồm chi tiết lời giải, video và notebook để bạn làm theo từng bước

điều này sẽ không xóa các tệp khỏi các cam kết trước đó. Làm như vậy từ git là CLI, nhưng công cụ BFG đơn giản hóa quy trình.

5. Tự động hóa luồng công việc dữ liệu

Một dự án dữ liệu thường yêu cầu nhiều phép biến đổi dữ liệu. Do đó, tự động hóa toàn bộ quy trình là điều cần thiết để đảm bảo mã có thể tái tạo. Không có một phân tích hoàn toàn tự động nào sẽ gây ra rắc rối. Ví dụ: giả sử bạn phải đào tạo lại một mô hình trong một dự án do người khác viết, vì vậy bạn thấy dòng sau trong README.md:

				
					# train a model and export a report with results
python -m otherproject.model --type=random_forest --report=my_model.html
				
			

Nhưng sau đó gặp lỗi như sau:

				
					SQL Error [42P01]: ERROR: relation "training_set" does not exist
				
			

Tốt, bạn nên xây dựng các features trước khi cố gắng đào tạo một model, nhưng tại thời điểm này, bạn sẽ tự hỏi làm thế nào để làm điều đó.

Ploomber làm cho việc tự động hóa quy trình làm việc dữ liệu trở nên đơn giản, bạn có thể thêm bao nhiêu tập lệnh hoặc sổ ghi chép tùy thích, sau đó sắp xếp việc thực thi với:

				
					ploomber build
				
			

6. Khai báo phần phụ thuộc phần mềm

Các dự án Khoa học dữ liệu thường phụ thuộc vào các gói của bên thứ ba (ví dụ như pandas, scikit-learning); không khai báo chúng sẽ gây rắc rối cho bất kỳ cộng  mới nào. Bạn đã gặp lỗi này bao nhiêu lần rồi?

				
					ModuleNotFoundError: No module named 'X'
				
			

Mặc dù thông báo lỗi rất mô tả, nhưng đó là một phương pháp tuyệt vời để ghi lại tất cả các phần phụ thuộc cho bất kỳ ai cũng có thể nhanh chóng bắt đầu. Trong Python, bạn có thể làm được điều này thông qua tệp request.txt, chứa tên của một gói trong mỗi dòng. Ví dụ:

				
					pandas
scikit-learn
				
			

Sau đó, bạn có thể cài đặt tất cả các phụ thuộc với:

				
					pip install -r requirements.txt
				
			

Nếu bạn đang sử dụng Ploomber, bạn có thể sử dụng lệnh sau sẽ đảm nhận việc thiết lập môi trường ảo và cài đặt tất cả các phụ thuộc đã khai báo:

				
					ploomber install
				
			

7. Tách biệt các phụ thuộc sản xuất và phát triển

Thật tốt để giữ số lượng phụ thuộc ở mức tối thiểu. Dự án của bạn càng cần nhiều phụ thuộc thì khả năng gặp sự cố cài đặt càng cao. Một cách để đơn giản hóa việc cài đặt là chia các phần phụ thuộc của chúng ta thành hai nhóm:

  1. Các gói cần thiết để chạy pipeline – Đây là các gói cần thiết để chạy pipeline trong sản xuất.
  2. Các gói tùy chọn bắt buộc để phát triển pipeline – Đây là các gói tùy chọn bạn cần để làm việc trong dự án (ví dụ: xây dựng tài liệu, chạy sổ ghi chép Jupyter khám phá, chạy thử nghiệm, v.v.) nhưng không cần thiết trong quá trình sản xuất.

Đối với trường hợp của chúng tôi, bạn có thể muốn hai tệp giữ lại hai tệp phụ thuộc (giả sử là tệp tests.prod.txt tệp request.dev.txt). Sau đó, trong quá trình phát triển, bạn có thể chạy:

				
					pip install -r requirements.dev.txt
				
			

Và trong sản xuất:

				
					pip install -r requirements.prod.txt
				
			

Quan trọng: Khi chạy trong sản xuất, điều cần thiết là phải khai báo các phiên bản cụ thể của từng gói; bạn có thể sử dụng đóng băng pip để xuất tệp với các phiên bản cụ thể của từng gói được cài đặt. Nếu bạn muốn giải quyết rắc rối, bạn có thể sử dụng Ploomber và thực hiện cài đặt ploomber nó sẽ lưu trữ một tệp tin request.txt riêng biệt , (dev và prod) với các phiên bản cụ thể của từng gói.

8. Có một tệp README đầy đủ thông tin và ngắn gọn

Tệp README là điểm vào cho bất kỳ ai sử dụng pipeline; điều cần thiết phải có là một nguồn cung cấp thông tin để giúp các đồng nghiệp hiểu cách các tệp nguồn phù hợp như thế nào với nhau.

Những gì cần bao gồm trong tệp README? Thông tin cơ bản về dự án, ít nhất phải bao gồm mô tả ngắn gọn về dự án (nó làm gì?), Liệt kê các nguồn dữ liệu (dữ liệu đến từ đâu?) Và hướng dẫn chạy đường ống end-to-end .

Ví dụ:

				
					### Boston house value estimation project
This project creates a model to predict the value of a house using 
the Boston housing dataset: https://www.kaggle.com/c/boston-housing 
#### Running the pipeline
```sh
# clone the repo
git clone http://github.com/edublancas/boston-housing-project
# install dependencies
pip install -r requirements.txt
# run the pipeline
python run.py
```
				
			

9. Ghi lại code

Khi những người đóng góp mới tham gia dự án, tài liệu trở nên quan trọng hơn. Tài liệu tốt hỗ trợ bạn hiểu cách các phần khác nhau khớp với nhau. Hơn nữa, tài liệu hướng dẫn sẽ rất hữu ích để bạn nhanh chóng lấy được ngữ cảnh của đoạn mã bạn đã viết trước đó.

Nhưng tài liệu là con dao hai lưỡi; nó sẽ gây ra rắc rối nếu lỗi thời. Vì vậy, theo khuyến nghị chung, hãy giữ cho code của bạn đơn giản (tên biến tốt, hàm nhỏ) để những người khác có thể hiểu nó một cách nhanh chóng và có một số tài liệu tối thiểu để hỗ trợ nó.

Làm thế nào để lập tài liệu về mã? Thêm một chuỗi ngay bên cạnh định nghĩa hàm (hay còn gọi là chuỗi doc) để cung cấp mô tả cấp cao và truyền tải nhiều thông tin nhất có thể bằng chính mã.

				
					def remove_outliers(feature):
    """Remove outliers from pandas.Series by using the interquartile range
    Parameters
    ----------
    feature : pandas.Series
        Series to remove outliers from
    Returns
    -------
    pandas.Series
        Series without outliers
    """
    # actual code for computing features
    pass
				
			

Có nhiều định dạng docstring bạn có thể chọn, nhưng định dạng tiêu chuẩn trong cộng đồng khoa học Python (được sử dụng trong ví dụ trên) là numpydoc.

Khi bạn đã thêm một chuỗi doc, bạn có thể nhanh chóng truy cập nó từ Jupyter / IPython như sau:

				
					
# running this on Jupyter/IPython
# (does not work with the standard python interpreter)
?remove_outliers

# will print this...

# Remove outliers from pandas.Series by using the IQR rule

# Parameters
# ----------
# feature : pandas.Series
#     Feature to clean

# Returns
# -------
# pandas.Series
#     Clean version of the feature

# Examples
# --------
# >>> clean = remove_outliers(feature)
# File:      ~/path//<ipython-input-1-d0cbf0151fd4>
# Type:      function
				
			

10. Tổ chức kho lưu trữ của bạn theo cấu trúc phân cấp

Khi dự án của bạn tiến triển, cơ sở mã của bạn sẽ phát triển. Bạn sẽ có mã để khám phá dữ liệu, tải, tạo các tính năng, mô hình đào tạo, v.v. Bạn nên trải mã trong nhiều tệp và tổ chức các tệp đó là điều cần thiết; Hãy xem ví dụ sau:

				
					README.md
.gitignore
exploration-dataset-a.ipynb
exploration-dataset-b.ipynb
db.py
load.py
load_util.py
clean.py
clean_util.py
features.py
features_util.py
model.py
model_util.py
				
			

Cấu trúc phẳng khiến bạn khó hiểu chuyện gì đang xảy ra và các tệp liên quan với nhau như thế nào. Do đó, tốt hơn là nên có cấu trúc phân cấp như sau:

				
					README.md
.gitignore

# exploratory notebooks
exploration/
    dataset-a.ipynb
    dataset-b.ipynb

# utility functions
src/
    db.py
    load.py
    clean.py
    features.py
    model.py

# steps in your analysis
steps/
    load.py
    clean.py
    features.py
    model.py
				
			

11. Đóng gói mã của bạn

Bất cứ khi nào bạn chạy cài đặt pip, Python sẽ thực hiện các điều chỉnh cấu hình cần thiết để đảm bảo gói có sẵn cho trình thông dịch để bạn có thể sử dụng nó trong bất kỳ phiên Python nào bằng cách sử dụng nhập các câu lệnh. Bạn có thể đạt được chức năng tương tự cho các chức năng tiện ích của mình bằng cách tạo một gói Python; điều này mang lại cho bạn sự linh hoạt tuyệt vời để tổ chức mã của bạn và sau đó nhập nó vào bất cứ đâu.

Tạo một gói chỉ là thêm một setup.py. Ví dụ: nếu setup.py tồn tại trong my-project / bạn sẽ có thể cài đặt nó như thế này:

				
					pip install --editable my-project/
				
			

Lưu ý: Chúng tôi chuyển –editable cho Python để tải lại nội dung gói, vì vậy bạn sẽ sử dụng mã mới nhất bất cứ khi nào bạn cập nhật mã của mình và bắt đầu một phiên.

Sau khi gói được cài đặt, bạn có thể nhập gói đó giống như bất kỳ gói nào khác:

				
					from example_pkg import some_function

some_function()
view raw
				
			

Nếu bạn sửa đổi some_function, bạn sẽ phải khởi động lại phiên của mình để xem các thay đổi của mình (giả sử bạn cài đặt gói ở chế độ có thể chỉnh sửa), nếu sử dụng IPython hoặc Jupyter, bạn có thể tránh khởi động lại phiên bằng cách sử dụng tải tự động:

				
					
%load_ext autoreload
%autoreload 2

from example_pkg import some_function

some_function()

# edit some_function source code...

# this time it will run the updated code
some_function()
				
			

12. Giữ cho sổ tay Jupyter của bạn đơn giản

Sổ tay là một cách tuyệt vời để tương tác với dữ liệu, nhưng chúng có thể nhanh chóng vượt qua tầm tay. Nếu không được chăm sóc cẩn thận, bạn có thể sao chép mã giữa các sổ ghi chép và tạo ra các sổ tay nguyên khối lớn bị vỡ. Vì vậy, chúng tôi đã viết toàn bộ một bài viết về cách giữ jupyter sạch sẽ

13. Sử dụng logging module (không sử dụng print)

Ghi nhật ký là một thực hành cơ bản trong kỹ thuật phần mềm; nó giúp việc chẩn đoán và gỡ lỗi dễ quản lý hơn nhiều. Ví dụ sau đây cho thấy một kịch bản xử lý dữ liệu điển hình:

				
					import pandas as pd

df = pd.read_csv('data.csv')

# run some code to remove outliers

print('Deleted: {} outliers out of {} rows'.format(n_outliers, n_rows))
				
			

Vấn đề với ví dụ trên là sử dụng in . print sẽ gửi một luồng tới đầu ra tiêu chuẩn theo mặc định. Vì vậy, nếu bạn có một vài in trên mỗi tệp, thiết bị đầu cuối của bạn sẽ in ra hàng chục và hàng chục thông báo mỗi khi bạn chạy đường dẫn của mình. Bạn càng có nhiều câu lệnh in, việc xem qua nhiễu càng phức tạp và chúng sẽ trở thành những thông điệp vô nghĩa.

Sử dụng mô-đun logging thay thế. Trong số các tính năng phù hợp nhất của ghi nhật ký là: lọc tin nhắn theo mức độ nghiêm trọng, thêm dấu thời gian vào mỗi bản ghi, bao gồm tên tệp và dòng nơi bắt nguồn cuộc gọi ghi nhật ký, trong số những tính năng khác. Ví dụ dưới đây cho thấy cách sử dụng đơn giản nhất của nó:

				
					import logging
import pandas as pd

logger = logging.getLogger(__name__)
logging.basicConfig(filename='my.log', level=logging.INFO)

df = pd.read_csv('data.csv')

# remove outliers

logger.info('Deleted: {} outliers out of {} rows'.format(n_outliers, n_rows))
				
			

Lưu ý rằng Sử dụng logging yêu cầu một số cấu hình. Kiểm tra hướng dẫn cơ bản.

14. Kiểm tra mã của bạn

Kiểm tra đường ống dữ liệu là một thách thức, nhưng đây là một khoản đầu tư thời gian tốt vì nó trả về lâu dài vì nó cho phép bạn lặp lại nhanh hơn. Mặc dù đúng là rất nhiều mã sẽ thay đổi trong giai đoạn thử nghiệm của dự án của bạn (có thể làm cho các thử nghiệm của bạn lỗi thời), thử nghiệm sẽ giúp bạn đạt được tiến bộ nhất quán hơn.

Chúng tôi phải coi rằng các dự án Khoa học Dữ liệu là thử nghiệm và mục tiêu đầu tiên là xem liệu dự án đó có khả thi hay không, vì vậy bạn muốn có được ý tưởng càng sớm càng tốt. Tuy nhiên, mặt khác, việc thiếu hoàn toàn thử nghiệm có thể khiến bạn đưa ra kết luận sai, vì vậy bạn phải tìm ra sự cân bằng.

Ở mức tối thiểu, hãy đảm bảo rằng đường ống của bạn chạy end-to-end mỗi khi bạn hợp nhất với chi nhánh chính. Chúng tôi đã viết nhiều về thử nghiệm cho các dự án dữ liệu. Hãy xem bài viết của chúng tôi tập trung vào việc kiểm tra các dự án Khoa học dữ liệu và bài viết của chúng tôi đề cập đến các chi tiết cụ thể về việc kiểm tra các dự án Học máy.

15. Quan tâm đến chất lượng mã

Mọi người đọc mã thường xuyên hơn là viết nó. Để làm cho mã của bạn dễ đọc hơn, hãy sử dụng hướng dẫn kiểu.

Hướng dẫn phong cách là về tính nhất quán; họ thiết lập một bộ quy tắc tiêu chuẩn để cải thiện khả năng đọc. Các quy tắc như vậy phải thực hiện với độ dài dòng tối đa, khoảng trắng hoặc đặt tên biến. Hướng dẫn kiểu chính thức cho Python được gọi là PEP8; nếu bạn mở liên kết, bạn sẽ nhận thấy rằng đó là một tài liệu dài. May mắn thay, có nhiều cách tốt hơn để giúp bạn bắt kịp tốc độ.

pycodestyle là một công cụ tự động kiểm tra mã của bạn theo các quy tắc của PEP8. Nó sẽ quét các tệp nguồn của bạn và hiển thị cho bạn những dòng mã nào không tuân thủ PEP8. Trong khi pycodestyle giới hạn việc tìm kiếm các dòng không tuân thủ PEP8 để cải thiện khả năng đọc, có nhiều công cụ tổng quát hơn.

pyflakes là một công cụ cũng kiểm tra các lỗi thời gian chạy có thể xảy ra; nó có thể tìm thấy lỗi cú pháp hoặc các biến không xác định.

Nếu bạn muốn sử dụng cả pycodestylepyflakes, tôi khuyên bạn nên sử dụng flake8, kết hợp cả hai cùng với một công cụ khác để kiểm tra độ phức tạp của mã (một số liệu liên quan đến số lượng đường dẫn độc lập tuyến tính).

Bạn có thể sử dụng tất cả các công cụ trước đó thông qua giao diện dòng lệnh của chúng. Ví dụ: sau khi flake8 được cài đặt, bạn có thể kiểm tra tệp qua flake8 myfile.py. Để tự động hóa quá trình này, các trình soạn thảo văn bản và IDE thường cung cấp các plugin tự động chạy các công cụ này khi bạn chỉnh sửa hoặc lưu tệp và đánh dấu các dòng không tuân thủ. Đây là hướng dẫn cho VSCode dạng tự động

Là phần bổ sung cho kiểu linters, trình định dạng tự động cho phép bạn sửa các dòng không tuân thủ. Cân nhắc sử dụng màu đen. Bộ định dạng tự động có thể khắc phục hầu hết các vấn đề với mã của bạn để làm cho mã tuân thủ; tuy nhiên, vẫn có thể có những thứ bạn cần phải sửa theo cách thủ công, nhưng chúng tiết kiệm thời gian rất nhiều.

Các loại linters khác

Có sẵn các loại linters khác; một trong những loại phổ biến nhất là pylint, nó tương tự như flake8, nhưng nó cung cấp một phân tích phức tạp hơn. Ngoài ra, có một số công cụ cụ thể khác, chẳng hạn như bandit, tập trung vào việc tìm kiếm các vấn đề bảo mật (ví dụ: mật khẩu được mã hóa cứng). Cuối cùng, nếu bạn muốn tìm hiểu thêm, hãy xem trang web Cơ quan chất lượng mã Python trên Github.

16. Xóa mã chết và không thể truy cập

Tạo thói quen xóa mã chết (mã có đầu ra không bao giờ được sử dụng) và không thể truy cập (mã không bao giờ được thực thi).

Một ví dụ về mã chết xảy ra khi chúng ta gọi một hàm nhưng chúng ta không bao giờ sử dụng đầu ra của chúng:

				
					def process_data(data):
    stats = compute_statistics(data)
    pivoted = pivot(data)
    # we are not using the stats variable!
    return transform(pivoted)
				
			

Trong ví dụ trước của chúng tôi, compute_st Statistics là mã chết vì chúng ta không bao giờ sử dụng đầu ra (stats). Vì vậy, hãy loại bỏ nó:

				
					def process_data(data):
    pivoted = pivot(data)
    return transform(pivoted)
				
			

Chúng tôi đã loại bỏ stats = compute_stosystem (dữ liệu), nhưng chúng tôi nên kiểm tra xem chúng tôi có đang gọi compute_st Statistics ở bất kỳ nơi nào khác hay không. Nếu không, chúng ta nên loại bỏ định nghĩa của nó.

Điều cần thiết là xóa mã ngay tại chỗ vì thời gian càng trôi qua, việc tìm ra các loại vấn đề này càng phức tạp. Một số thư viện giúp phát hiện mã chết, nhưng tốt hơn hết bạn nên làm điều đó ngay khi chúng tôi nhận thấy.

Tôi hy vọng những đề xuất này sẽ giúp bạn cải thiện quy trình làm việc của mình. Khi bạn đã quen với chúng, bạn sẽ thấy rằng việc giữ cho codebase của bạn có thể bảo trì được sẽ làm tăng năng suất của bạn về lâu dài. 

Bài viết gốc: The Data Science checklist: Best practices for maintainable data science projects

Link bài viết gốc.

Biên dịch & Biên tập: Mary

Bài viết có hữu ích không?

Các bài viết liên quan

zoosk-vs-pof service

Chinese Brides: Ideal Mythology and you will Details about Chinese Mail-order Brides

flirt4free sito di incontri

Un arnese da dungeon di abile botta fetish

how to see who likes you on tinder review

ten. Allow her to generate have confidence in you

love ru sign in

18 Wedding Class Games Your guests Would like

militarycupid-recenze Seznamka

six. Sign-up online dating sites and you can qualities one to target rich website subscribers

Escort escort orlando

Do not get myself wrong; I'm an individual guy who's towards the matchmaking

adventure-dating-nl MOBIELE SITE

There is no better method to finish your day instead of sharing that it meme gif with your loved ones?

fastflirting Zaloguj si?

The working platform are right for small hookups

puerto-rico-chat-rooms dating

Ways to get an effective screenwriting broker and you can manager action six: choose wisely

sites-de-rencontre-mexicains avis

Paree list acquisition habitation 2021 — au Top 10+ demande a placer quand d’achat d’une logement

quickflirt kosten

Lass mich daruber erzahlen ruhen Eltern, entsprechend Die leser man sagt, sie seien, Jedoch befinden Die Kunden, entsprechend Eltern schuften

writers-dating dating

Amid all this, Ghanaian ladies are nonetheless thought to be beautiful and you will classic

Bình luận của bạn

© Copyright 2021 - Công ty Đào tạo và Hướng nghiệp thông minh Miedu

Sign Up and Start Learning

Hạn sử dụng đến 20/01/2022

TÌM HIỂU khóa
Full Stack data Science
-30%

Bảo hành học tập trọn đời cho người chuyển đổi công việc!