4个Python库将你的数据科学项目提升到一个新的水平
在本文中,我将分享4个鲜为人知的Python库,我觉得它们没有得到应有的关注度,这些库可以帮助你将Data Science项目提高到一个新的水平。让我们开始吧,介绍顺序是:
1.argh – 创建无缝的CLIs2.tqdm – 简单进度栏3.msgpack – 二进制JSON,快速而小型4.*Redis简单缓存 *– 用于存储
我在文章结尾提到了一个奖励库!一定要检查一下。现在开始吧!
argh是argparse的包装,使用起来非常简单。给定一些功能定义后,argh会自动为你创建一个命令行界面。
首先,我们安装argh。可以使用pip轻松安装。
pip install argh
让我们创建一个简单的虚拟函数以帮助更好地理解argh:
import argh
def do_the_thing(required_arg, optional_arg=1, other_optional_arg=False): """ I am a docstring """ print((required_arg, type(required_arg))) print((optional_arg, type(optional_arg))) print((other_optional_arg, type(other_optional_arg)))
首先,我们导入argh,然后开始创建函数。请注意,我们可以为函数使用docstring编写自定义文档,稍后我们也可以在命令行中访问它。
如我们所见,函数使用3个变量作为参数。第一个没有默认值,因此它将被解释为必需参数,第二个具有默认值,恰好是一个整数,argh将识别它,第三个相同,但这是一个bool,argh将以不同的方式处理它。
现在,我们要使此函数可供某人从命令行调用。为此,在应该运行脚本的地方,执行以下操作:
if __name__ == '__main__': argh.dispatch_command(do_the_thing)
就是这样!这就是为函数创建CLI所要做的全部。你可以更好地控制自己的功能。
argh*还 提供了一个称为@ args.arg*的装饰器 ,你可以使用该装饰器为特定参数指定选项。你可以为这些参数指定一个简写形式以及一些帮助。
@argh.arg('--bool-arg-for-flag', '-b', help="Flip this flag for things")@argh.arg('arg_with_choices', choices=['one', 'two', 'three'])def do_the_other_thing(arg_with_choices, bool_arg_for_flag=False): print(arg_with_choices) print(bool_arg_for_flag)if __name__ == '__main__': argh.dispatch_command(do_the_other_thing)
同样,有时命令行界面为你提供它们接受的选项列表,而不只是接受任何输入,这是非常好的。在上面的代码中,这是使用'choices'参数并为其提供值列表来完成的。
这是它的创建者提供的argh模块的摘要,简要概述了它。
你可以在 此处https://pypi.org/project/argh 查看官方文档和许多深入的教程。
这是我的goto进度栏生成器。它非常易于使用,你可以嵌套循环,也可以轻松自定义进度条。在模块tqdm中,你最需要的2个最有用的功能是“ tqdm”和“ trange ”。现在,让我们开始探索这个很棒的软件包。安装tqdm:
pip install ipywidgets jupyter nbextension enable --py widgetsnbextensionjupyter labextension install @jupyter-widgets/jupyterlab-manager
通过执行此操作,可以激活JupyterLabs的ipywidgets插件。
之后,添加此单元格以在notebook中激活tqdm:
%%capturefrom tqdm import tqdm_notebook as tqdmtqdm().pandas()
有趣的事实:tqdm源自阿拉伯语taqaddum (تقدّم),意为“进步”,是西班牙语中的“我非常爱你”的缩写(te quiero demasiado )。
函数接受一个iterable,并在Python开始遍历它时生成一个进度条。下面是一个简单的例子:
from tqdm import tqdmimport timeL = list(range(10000))for ele in tqdm(L): time.sleep(0.2)
现在,trange()是 tqdm(range(x)) 的一个不错的选择。另外,你可以为嵌套循环创建多个进度条:
for i in trange(10): for j in trange(10, desc="inner_loop"): time.sleep(0.01)
一些有用的参数及其语法:
a)desc –用于指定创建的进度条的描述。
tqdm (self, iterable, desc= “Your description”)
b)total–用于指定预期的迭代次数(如果尚未指定或需要修改)。
tqdm (self, iterable, total= 500)
c)ncols –用于指定生成的进度条的宽度。如果未指定,则在窗口中保持动态。
tqdm (self, iterable, ncols= 50)
d)miniinterval – 用于更改最小进度显示更新。默认值为1/10秒。
tqdm (self, iterable, mininterval=3)
e)ascii – ASCII字符可用于填充进度栏。
tqdm ( self, iterable, ascii= “123456789$”, desc=”Your description” )
这只是称为MessagePack的序列化协议的Python客户端。
msgpack(https://msgpack.org/index.html)本质上就是JSON的二进制版本。它使你可以非常轻松地对数据进行序列化和反序列化,然后将其保存到字节数组或文件中。
几乎所有其他语言都具有MessagePack的实现,因此它具有与JSON文件相同的可移植性。
但是,由于msgpack将数据以二进制格式保存,因此你可以节省很多空间,尤其是当这些数据需要通过网络传输时。
这是MessagePack模块的正式说明:
你可以使用以下方法安装软件包:
pip install msgpack
现在让我们继续举例:
import msgpackimport jsonimport random
def msgpack_example(): example_dict = {i: random.random() for i in range(10000)} with open('json_file.json', 'w') as f: json.dump(example_dict, f) with open('json_file.json') as f: back_from_json = json.load(f) # Saving and loading with open('msgpack_file.msgpack', 'wb') as f: f.write(msgpack.packb(example_dict)) with open('msgpack_file.msgpack', 'rb') as f: back_from_msgpack = msgpack.unpackb(f.read())
我们在这里基本上要做的是创建一个浮点值字典,然后将其转储到JSON中并重新加载,还将其转储到MessagePack文件中并重新加载。
由于MessagePack为二进制格式,因此在打开它时,必须使用二进制格式“ b”。因此,你可以看到,使用msgpack真的很容易。我想指出的另一件事是关于文件的数据完整性:
# Data integrityprint(type(next(iter(back_from_json.keys()))))print(type(next(iter(back_from_msgpack.keys()))))
因此,输出为JSON的<class'str'>和MessagePack的<class'int'>。
我们知道JSON要求你具有字符串键,即使我们的原始数据在字典中具有整数键,JSON也会将其强制转换为字符串。而MessagePack维护数据的完整性并将其保持为整数类型。
我个人在使用JSON时曾多次遇到微妙的问题,而这甚至不算是一个问题。
其次,如果我们查看保存的文件,则JSON文件为275kb,消息包为117kb。现在这似乎还不是很多,但是当你使用越来越多的大型数据集并涉及网络时,这些空间上的节省就变得非常重要。
安装:
pip3 install git+https://github.com/YashSinha1996/redis-simple-cache.git
对于那些不熟悉Redis的人来说,这是一个内存中的键值存储,其数据访问延迟非常低。
顾名思义,redis_cache确实使用Redis进行缓存。要使用redis_cache,有两个装饰器- @cache_it*和@cache_it_json*。
两者之间的唯一区别是cache_it使用pickle序列化数据,cache_it_json不使用pickle,而是使用JSON。
import timefrom redis_cache import cache_it, cache_it_json
@cache_it(limit=1000, expire=5)def function_that_takes_a_long_time(i): print(f"function was called with input {i}") return i**2if __name__ == '__main__': for i in range(10): print(i, function_that_takes_a_long_time(2))
这是一个虚拟函数,可以帮助可视化需要很长时间才能执行的函数,然后运行一个循环将其调用10次。
使用@cache_it装饰器,并带有参数限制 ,在这种情况下,这意味着将仅缓存1000个唯一输入值。然后,如果使用更多不同的输入值调用该函数,则旧的输入值将开始被推送,而新的输入值将开始被添加。
在这种情况下,expire参数表示缓存超过5秒的所有内容都会被自动删除。
当你使用数据库并提取大量数据时,此模块最有用。这有助于防止数据过时。