在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            博客專欄

            EEPW首頁 > 博客 > 獨家 | 數(shù)據(jù)科學家對可復用Python代碼的實用管理方法(附鏈接)

            獨家 | 數(shù)據(jù)科學家對可復用Python代碼的實用管理方法(附鏈接)

            發(fā)布人:數(shù)據(jù)派THU 時間:2021-09-19 來源:工程師 發(fā)布文章

            作者:Matthew Mayo, KDnuggets

            翻譯:殷之涵

            校對:歐陽錦

            有很多不同的方法管理自己的代碼,這取決于您的具體要求、個性、技術(shù)知識、所扮演角色和諸多其他因素。雖然經(jīng)驗豐富的開發(fā)人員可能有一套非常嚴格的方法可以跨多語言、項目和用例進行代碼管理,但很少編寫自己的代碼的數(shù)據(jù)分析師由于缺乏必要性,可能會較為疏于代碼管理。其實,在管理代碼這件事情上并沒有對錯之分,這只是一個是否對您自己“有用”和“合適”的問題而已。

            具體來說,我所指的“代碼管理”是指您如何組織、存儲和調(diào)用您自己編寫的不同的代碼段——這些代碼段作為您對自己的編程工具箱的長期積累,是很有用的。編程的本質(zhì)是自動化,因此如果一名編程者發(fā)現(xiàn)自己正在重復執(zhí)行一些類似任務(wù),那么就勢必要考慮以某種方式對該任務(wù)的相關(guān)代碼進行自動調(diào)用。

            這就是我們經(jīng)常要使用第三方庫的原因。比如要使用支持向量機(SVM)算法時,我們不需要每次都把代碼重新實現(xiàn)一遍;相反,我們可以使用一個庫——也許是 Scikit-learn——這樣我們就能好好利用眾多前人隨著時間推移所不斷完善而成的智慧結(jié)晶了。

            除了第三方庫的使用,我們還要把這種“自動化思想”擴展到個人編程領(lǐng)域。您可能已經(jīng)這樣做了(我希望是的),但如果沒有,以下是我作為一名數(shù)據(jù)科學家,對自己所寫的可復用 Python 代碼進行管理的幾種固化下來的方法(按照最通用到最不通用來進行排序)。

            自建代碼庫(Full-blown Libraries)

            這是一種最通用的方法,也可以說是最“專業(yè)”的方法;然而,這并不意味著它適用于所有的情況。

            如果您發(fā)現(xiàn)您在許多用例中都在頻繁使用相同的功能,那么自己搭建一個代碼庫就是正確的選擇。此外,如果您要復用的功能很容易參數(shù)化,那這個選擇也十分合理;參數(shù)化的意思是,您可以通過編寫和調(diào)用帶有變量的通用函數(shù)來重復多次地處理任務(wù),每次調(diào)用時都可以對變量進行重新定義。

            舉例說明,我經(jīng)常發(fā)現(xiàn)我想在一個字符串中找到某個子字符串第 n 次出現(xiàn)的位置索引,但是并沒有一個現(xiàn)成的Python標準庫函數(shù)能支持這一需求。因此,我自己寫了一段簡單的代碼,它接受一個字符串、一個子字符串以及我所求的第n次出現(xiàn)的“n”作為輸入,返回值是字符串中子字符串第n次出現(xiàn)開始的位置索引(具體代碼出處見:

            https://stackoverflow.com/questions/1883980/find-the-nth-occurrence-of-substring-in-a-string)。

            def find_nth(haystack, needle, n):
                start = haystack.find(needle)
                while start >= 0 and n > 1:
                    start = haystack.find(needle, start+len(needle))
                    n -= 1
                return start

            由于我平日有很多文本處理類型的工作,所以我將上述函數(shù)連同一些經(jīng)常使用的其他文本處理函數(shù)集合起來并創(chuàng)建了一個庫,這個庫就像其他任何Python 庫一樣被儲存在我的計算機上,并且能夠像其他任何庫一樣進行導入。創(chuàng)建庫的方法雖然不難,但是步驟比較多,所以我就不做過多介紹了,感興趣的讀者可以參考這篇文章:

            https://medium.com/analytics-vidhya/how-to-create-a-python-library-7d5aea80cc3f

            所以現(xiàn)在我有了一個名為textproc的自建代碼庫,我可以隨時輕松地導入和使用我的find_nth函數(shù),再也不用復制并粘貼整段代碼到我編寫的每個要用到它的程序中了。

            from textproc import find_nth
            segment = line[:find_nth(line, ',', 4)].strip()

            此外,如果我想擴展這個庫——即把更多函數(shù)添加進去,或者想更改現(xiàn)有的 find_nth函數(shù)的代碼,我只需要在底層這一處進行修改后再重新導入即可(而不需要在所有調(diào)用之處都進行一次相應(yīng)的修改)。

            基于特定項目的共享腳本

            有時候并不需要自建代碼庫,因為您想要復用的代碼并沒有當前項目以外的用途,但您確實需要在本項目中對它進行復用。在這種情況下,您可以將這些函數(shù)放在一個腳本中,然后簡單地按名稱導入該腳本即可。

            我在讀研究生期間編寫了大量和無監(jiān)督學習相關(guān)的代碼,特別是k-means 聚類。我編寫了用于簇中心初始化、數(shù)據(jù)點和簇中心之間的距離計算、簇中心重新計算等函數(shù),并使用不同的算法對這些任務(wù)進行實現(xiàn)。我很快發(fā)現(xiàn),將其中一些算法函數(shù)的副本各自保存在一個單獨的腳本中以供調(diào)用并不是最佳選擇,反而將它們先集中在一個腳本中再進行導入會更好?!肮蚕砟_本”這個工作方式與庫幾乎相同,但這個過程是基于特定路徑的,并且僅適用于某一特定項目。

            很快我就積累了不同簇中心初始化函數(shù)和距離計算函數(shù)的腳本,以及加載和處理數(shù)據(jù)的函數(shù)的腳本。隨著這些代碼變得越來越參數(shù)化和具有普適性,它們最終被放到了一個正式的庫中。

            這似乎是事情的常見進展方式,至少根據(jù)我的經(jīng)驗是這樣的:您在腳本中編寫了一個滿足當下使用需要的函數(shù),然后使用它。隨著項目擴展,或者又接手了一個類似項目,您意識到現(xiàn)在使用一個相同的函數(shù)會很方便,所以該函數(shù)就被放入了一個腳本中以便導入和使用。如果這種用途在短期內(nèi)繼續(xù)發(fā)揮作用,并且您發(fā)現(xiàn)該函數(shù)具有更廣泛和更長期的用途,那么它就會被添加到現(xiàn)有庫中,或者成為一個新庫的基礎(chǔ)組成部分。

            導入簡單腳本這個方法在使用Jupyter Notebook時同樣有用,但在使用方式上有所不同。鑒于Jupyter Notebooks中大部分代碼內(nèi)容的臨時性、探索性和實驗性,我通常不會把一些notebooks作為模塊導入到其他notebooks中。如果我發(fā)現(xiàn)多個notebooks都經(jīng)常使用某些代碼片段,那我就會把這些代碼片段放入一個單獨腳本中,并存儲在這些notebooks所屬的同一文件夾下,然后將其導入到需要使用它們的notebooks中。這種方法對我來說會更合理一些,同時具有更高的穩(wěn)定性——相比于特定腳本,notebooks有更高的風險會被重新編輯,難以長期依賴。

            基于特定任務(wù)的模板

            我發(fā)現(xiàn)我經(jīng)常重復執(zhí)行一些相同的任務(wù),而這些任務(wù)并不適合參數(shù)化,或者參數(shù)化的性價比實在很低(需要付出的時間精力遠超所能得到的回報)。在這種情況下,我會把代碼進行模板化,或者標準化(boiler-plating)。比起我在本文開頭所提到的簡單復制粘貼——這些是我在所有情況下都想要避開的工作,模板化的做法顯然要復雜一些,但有時候這卻是正確的選擇。

            例如,我經(jīng)常需要進行列表化(listify)操作——即使我壓根不清楚待處理的Pandas DataFrame中的內(nèi)容,仍然需要確定列數(shù)和待輸入的列以完成相關(guān)函數(shù)的編寫,通常還需要對輸出進行調(diào)整——上述這些都表明編寫函數(shù)的確太耗時了。

            為了應(yīng)對這種情況,我編寫了一個可靈活更改的腳本模板,并把它放在了一個用于儲存此類模板的專用文件夾中。下面就是listify_df的代碼段,它能把 CSV 文件轉(zhuǎn)換成Pandas DataFrame,然后再輸出為所需的HTML文件。

            import pandas as pd
            # Read CSV file into dataframe
            csv_file = 'data.csv'
            df = pd.read_csv(csv_file)
            # Iterate over df, creating numbered list entries
            i = 1
            for index, row in df.iterrows():
            entry = '<b>' + str(i) + \
            '. <a href="' + \
            row['url'] + \
            '">' + \
            row['title'] + \
            '</a> + \
            '\n\n<blockquote>\n' + \
            row['description'] + \
            '\n</blockquote>\n'
            i += 1
            print(entry)

            在這個案例中,我們能夠看到清晰的文件名以及對文件夾的有序管理,是很有助于管理這些常用代碼段的。

            單行代碼和短代碼塊

            重復的單行代碼和短代碼塊總是難免出現(xiàn)在我們的日常工作中,為什么不想想辦法做些自動化呢?

            您可以在需要的時候使用文本擴展工具來插入簡短的“短語”。我會用AutoKey來管理這樣的短語,這些短語和一些觸發(fā)關(guān)鍵字相聯(lián)系,一旦輸入這些關(guān)鍵字,短語就會自動插入。

            AutoKey

            https://github.com/autokey/autokey

            例如,您在處理特定類型的項目時是否總是需要導入一批相同的庫?您可以通過輸入“#nlpimport”來設(shè)置處理特定任務(wù)所需的所有導入工作,這一輸入會被識別為觸發(fā)關(guān)鍵字并被替換為以下內(nèi)容:

            import sys, requests
            import numpy as np
            import pandas as pd
            import texthero
            import scattertext as st
            import spacy
            from spacy.lang.en.stop_words import STOP_WORDS
            from datasets import load_metric, list_metrics
            from transformers import pipeline
            from fastapi import FastAPI

            需要注意的是,一些 IDE 是具有這種自動插入功能的。我自己通常使用美化的文本編輯器來編寫代碼,所以對于我來說AutoKey是非常必要且有用的。如果您用的是具備此類功能的IDE,那就太好了。關(guān)鍵是,您再也不用總是寫一些重復的代碼了。

            以上就是我作為數(shù)據(jù)科學家對可復用 Python 代碼管理方法的概述。希望它們能對您有所幫助!

            編輯:王菁

            校對:汪雨晴

            *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



            關(guān)鍵詞: AI

            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉