推荐 :数据科学家对可复用Python代码的实用管理方法(附链接)

本文主要是介绍推荐 :数据科学家对可复用Python代码的实用管理方法(附链接),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:Matthew Mayo, KDnuggets  翻译:殷之涵  校对:欧阳锦


本文约3000字,建议阅读5分钟本文为大家介绍了四种关于复用Python代码的管理方法,以提高代码的效率及可读性等。

有很多不同的方法管理自己的代码,这取决于您的具体要求、个性、技术知识、所扮演角色和诸多其他因素。虽然经验丰富的开发人员可能有一套非常严格的方法可以跨多语言、项目和用例进行代码管理,但很少编写自己的代码的数据分析师由于缺乏必要性,可能会较为疏于代码管理。其实,在管理代码这件事情上并没有对错之分,这只是一个是否对您自己“有用”和“合适”的问题而已。

具体来说,我所指的“代码管理”是指您如何组织、存储和调用您自己编写的不同的代码段——这些代码段作为您对自己的编程工具箱的长期积累,是很有用的。编程的本质是自动化,因此如果一名编程者发现自己正在重复执行一些类似任务,那么就势必要考虑以某种方式对该任务的相关代码进行自动调用。

这就是我们经常要使用第三方库的原因。比如要使用支持向量机(SVM)算法时,我们不需要每次都把代码重新实现一遍;相反,我们可以使用一个库——也许是 Scikit-learn——这样我们就能好好利用众多前人随着时间推移所不断完善而成的智慧结晶了。

除了第三方库的使用,我们还要把这种“自动化思想”扩展到个人编程领域。您可能已经这样做了(我希望是的),但如果没有,以下是我作为一名数据科学家,对自己所写的可复用 Python 代码进行管理的几种固化下来的方法(按照最通用到最不通用来进行排序)。

自建代码库(Full-blown Libraries)

这是一种最通用的方法,也可以说是最“专业”的方法;然而,这并不意味着它适用于所有的情况。

如果您发现您在许多用例中都在频繁使用相同的功能,那么自己搭建一个代码库就是正确的选择。此外,如果您要复用的功能很容易参数化,那这个选择也十分合理;参数化的意思是,您可以通过编写和调用带有变量的通用函数来重复多次地处理任务,每次调用时都可以对变量进行重新定义。

举例说明,我经常发现我想在一个字符串中找到某个子字符串第 n 次出现的位置索引,但是并没有一个现成的Python标准库函数能支持这一需求。因此,我自己写了一段简单的代码,它接受一个字符串、一个子字符串以及我所求的第n次出现的“n”作为输入,返回值是字符串中子字符串第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 -= 1return start

由于我平日有很多文本处理类型的工作,所以我将上述函数连同一些经常使用的其他文本处理函数集合起来并创建了一个库,这个库就像其他任何Python 库一样被储存在我的计算机上,并且能够像其他任何库一样进行导入。创建库的方法虽然不难,但是步骤比较多,所以我就不做过多介绍了,感兴趣的读者可以参考这篇文章:

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

所以现在我有了一个名为textproc的自建代码库,我可以随时轻松地导入和使用我的find_nth函数,再也不用复制并粘贴整段代码到我编写的每个要用到它的程序中了。

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

此外,如果我想扩展这个库——即把更多函数添加进去,或者想更改现有的 find_nth函数的代码,我只需要在底层这一处进行修改后再重新导入即可(而不需要在所有调用之处都进行一次相应的修改)。

基于特定项目的共享脚本

有时候并不需要自建代码库,因为您想要复用的代码并没有当前项目以外的用途,但您确实需要在本项目中对它进行复用。在这种情况下,您可以将这些函数放在一个脚本中,然后简单地按名称导入该脚本即可。

我在读研究生期间编写了大量和无监督学习相关的代码,特别是k-means 聚类。我编写了用于簇中心初始化、数据点和簇中心之间的距离计算、簇中心重新计算等函数,并使用不同的算法对这些任务进行实现。我很快发现,将其中一些算法函数的副本各自保存在一个单独的脚本中以供调用并不是最佳选择,反而将它们先集中在一个脚本中再进行导入会更好。“共享脚本”这个工作方式与库几乎相同,但这个过程是基于特定路径的,并且仅适用于某一特定项目。

很快我就积累了不同簇中心初始化函数和距离计算函数的脚本,以及加载和处理数据的函数的脚本。随着这些代码变得越来越参数化和具有普适性,它们最终被放到了一个正式的库中。

这似乎是事情的常见进展方式,至少根据我的经验是这样的:您在脚本中编写了一个满足当下使用需要的函数,然后使用它。随着项目扩展,或者又接手了一个类似项目,您意识到现在使用一个相同的函数会很方便,所以该函数就被放入了一个脚本中以便导入和使用。如果这种用途在短期内继续发挥作用,并且您发现该函数具有更广泛和更长期的用途,那么它就会被添加到现有库中,或者成为一个新库的基础组成部分。

导入简单脚本这个方法在使用Jupyter Notebook时同样有用,但在使用方式上有所不同。鉴于Jupyter Notebooks中大部分代码内容的临时性、探索性和实验性,我通常不会把一些notebooks作为模块导入到其他notebooks中。如果我发现多个notebooks都经常使用某些代码片段,那我就会把这些代码片段放入一个单独脚本中,并存储在这些notebooks所属的同一文件夹下,然后将其导入到需要使用它们的notebooks中。这种方法对我来说会更合理一些,同时具有更高的稳定性——相比于特定脚本,notebooks有更高的风险会被重新编辑,难以长期依赖。

基于特定任务的模板

我发现我经常重复执行一些相同的任务,而这些任务并不适合参数化,或者参数化的性价比实在很低(需要付出的时间精力远超所能得到的回报)。在这种情况下,我会把代码进行模板化,或者标准化(boiler-plating)。比起我在本文开头所提到的简单复制粘贴——这些是我在所有情况下都想要避开的工作,模板化的做法显然要复杂一些,但有时候这却是正确的选择。

例如,我经常需要进行列表化(listify)操作——即使我压根不清楚待处理的Pandas DataFrame中的内容,仍然需要确定列数和待输入的列以完成相关函数的编写,通常还需要对输出进行调整——上述这些都表明编写函数的确太耗时了。

为了应对这种情况,我编写了一个可灵活更改的脚本模板,并把它放在了一个用于储存此类模板的专用文件夹中。下面就是listify_df的代码段,它能把 CSV 文件转换成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)

在这个案例中,我们能够看到清晰的文件名以及对文件夹的有序管理,是很有助于管理这些常用代码段的。

单行代码和短代码块

重复的单行代码和短代码块总是难免出现在我们的日常工作中,为什么不想想办法做些自动化呢?

您可以在需要的时候使用文本扩展工具来插入简短的“短语”。我会用AutoKey来管理这样的短语,这些短语和一些触发关键字相联系,一旦输入这些关键字,短语就会自动插入。

AutoKey

https://github.com/autokey/autokey

例如,您在处理特定类型的项目时是否总是需要导入一批相同的库?您可以通过输入“#nlpimport”来设置处理特定任务所需的所有导入工作,这一输入会被识别为触发关键字并被替换为以下内容:

import sys, requestsimport numpy as np
import pandas as pdimport texthero
import scattertext as stimport spacy
from spacy.lang.en.stop_words import STOP_WORDSfrom datasets import load_metric, list_metrics
from transformers import pipeline
from fastapi import FastAPI

需要注意的是,一些 IDE 是具有这种自动插入功能的。我自己通常使用美化的文本编辑器来编写代码,所以对于我来说AutoKey是非常必要且有用的。如果您用的是具备此类功能的IDE,那就太好了。关键是,您再也不用总是写一些重复的代码了。

以上就是我作为数据科学家对可复用 Python 代码管理方法的概述。希望它们能对您有所帮助!

译者简介:殷之涵(Jane),研究生毕业于康奈尔大学生物统计与数据科学专业,本科毕业于普渡大学精算与应用统计专业。

转自:数据派THU 公众号;

END


版权声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。


合作请加QQ:365242293  

数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。

这篇关于推荐 :数据科学家对可复用Python代码的实用管理方法(附链接)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943181

相关文章

Python练习04

目录 制作一个简易的注册登陆系统 实现过程         声明需要用到的库         构造一个判断用户文件是否存在的函数         构造一个存储用户文件的函数         制作UI         制作系统主体 运行效果 制作一个简易的注册登陆系统         通过所学知识制作一个简易的注册登陆系统,要求可以存储账户及密码,并且

Python实战开发及案例分析(23)—— 迭代加深

迭代加深搜索(Iterative Deepening Search,IDS)是一种结合了深度优先搜索(DFS)的内存效率和广度优先搜索(BFS)的完备性和最优性的搜索算法。它通过逐步增加深度限制来重复执行深度限制的深度优先搜索(Depth-Limited Search,DLS),结合了DFS的空间效率和BFS的完全性。IDS在找到目标节点时能够确保找到最短路径,尤其适用于有大量节点

适用于 Windows 8/11 的 10 大最佳数据恢复软件工具:丢失文件和数据的有效解决方案

嘿!有没有过这样的时刻,当你点击一些你不想要的东西时,突然——哎呀!——你的一些照片或重要的东西就消失了?这就是“数据恢复”发挥作用的地方!把它想象成你的电脑的魔术。就像我们有时会发现我们的玩具藏在床底下一样,这个叫做数据恢复的很酷的东西可以帮助找到那些丢失的文件并将它们带回来!听起来很棒?让我们更深入地了解它! 现在,如果这发生在你身上,或者你只是对它感到好奇,那么你就来对地方了。在本指南中,

在vscode中新增代码模板用于开发vue3的组合式函数

useVue.code-snippets: {// Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // description. Add comma separated ids of the languages wh

SQL Server 数据查询优化技巧

目录 1、索引优化: 2、NULL 值判断避免全表扫描: 3、!= 或 <> 操作符避免全表扫描: 4、OR 连接条件避免全表扫描: 5、IN 和 NOT IN 避免全表扫描: 6、LIKE 查询优化: 7、参数使用避免全表扫描: 8、字段表达式操作避免全表扫描: 9、字段函数操作避免全表扫描: 10、不要在“=”左边进行函数、算术运算: 11、索引字段顺序使用避免全表扫描:

pdf阅读器哪个好用?4款高效阅读软件推荐

pdf阅读器哪个好用?在数字化时代的浪潮中,PDF文档凭借其卓越的跨平台兼容性、便捷的传输方式以及保持格式一致的稳定性,已经成为我们日常工作与学习的得力助手。在这样的背景下,选择一款功能强大、操作便捷的PDF阅读器,不仅能显著提高我们处理PDF文件的工作效率,更能带来流畅、舒适的阅读体验。下面,就为大家推荐几款值得一试的PDF阅读器。 软件一:嗨动PDF转换器(PC) ①简洁易用的界面设计:界

企业如何通过行列视生产数据应用系统实现生产革命

在当今竞争激烈的商业环境中,革新生产流程已成为企业提升效率、降低成本并维持市场竞争力的关键策略。多家行业领先的企业已经通过引入行列视系统来彻底改变他们的生产方式。行列视系统的实施不仅提高了这些企业的操作效率,同时也大幅度降低了运营成本,进一步促进了业务的整体增长和扩展。 行列视系统通过其高级的数据分析和报告功能,使企业能够实时监控生产活动,从而实现了生产过程的优化。以下是该系统实施后在各个方

Q1季度电饭煲家电行业线上市场(京东天猫淘宝)销售数据排行榜

鲸参谋监测的2024年Q1季度线上电商平台(天猫淘宝京东)电饭煲家电销售数据已出炉! 今年Q1季度,电饭煲销售成绩不如预期。根据鲸参谋数据显示,今年Q1季度在线上电商平台(淘宝天猫京东)电饭煲销量累计670万件,同比去年下滑了25%;销售额累计接近19亿元,同比去年下滑了21%。 *数据源于鲸参谋(来自公开渠道获取与统计,数据仅供参考) 在市场格局中,苏泊尔、美的、九阳三家品牌占据了

Python新手注意:避免常见错误,学会‘/’和‘\’的正确使用

Python 编程语言中的正反斜杠符号(‘/’和‘\’)是非常基础但又极其重要的元素,它们在不同的场合下扮演着不同的角色。了解这两个符号的意义和用法,对于编写清晰、有效的代码至关重要。 基础概念 正斜杠(‘/’) 正斜杠在 Python 中通常用作除法运算符。它将左边的数值除以右边的数值,并返回结果。例如: result = 10 / 5 # 结果是 2.0 除此之外,在 Pytho

人工智能引领工业园区智能化升级:AI视频监测助力安全生产管理

当前,许多工业园区面临着一个共同的挑战:大量的监控视频处于“沉睡”状态,无法主动预警风险,需要人工持续盯防。同时,由于生产现场工况复杂,高危场景的巡检工作不仅增加了人员的暴露频次,而且在遇到危险情况时,人员逃生变得尤为困难。这些问题也是工业园区在推进智能化进程中应该关注和解决的。 人工智能技术的崛起为这些问题的解决提供了新的思路。作为推进园区智能化升级的方法之一,人工智能正逐步改变工业园区的管理模