在数据科学领域,Python因其强大的库和框架而广受欢迎。然而,并非所有的库都得到了应有的关注。本文将介绍四个不太为人知但功能强大的Python库,它们可以帮助数据科学项目达到新的高度。此外,文末还会提到一个额外的库,它可能会引起兴趣。
1. argh - 创建无缝命令行界面
argh是一个围绕argparse的包装器,使用起来非常简单。给定一个函数定义,argh可以为自动创建命令行界面。首先,使用pip安装argh。
pip install argh
让创建一个简单的虚拟函数来更好地理解argh:
import argh
def do_the_thing(required_arg, optional_arg=1, other_optional_arg=False):
"""这是一个文档字符串"""
print((required_arg, type(required_arg)))
print((optional_arg, type(optional_arg)))
print((other_optional_arg, type(other_optional_arg)))
首先导入argh,然后开始创建函数。注意,可以使用文档字符串为函数编写自定义文档,稍后也可以在命令行中访问这些文档。函数接受三个变量作为参数。第一个没有默认值,因此它将被解释为必需参数;第二个有默认值,是一个整数,argh会识别这一点;第三个是布尔值,argh会以不同的方式处理它。
现在希望这个函数可以被别人从命令行调用。要做到这一点,在脚本应该运行的地方,这样做:
if __name__ == '__main__':
argh.dispatch_command(do_the_thing)
就是这样!这就是创建函数的CLI所需要做的全部。可以获得更多对函数的控制。argh还提供了一个名为@args.arg的装饰器,使用它可以为特定参数指定选项。可以为这些参数指定简写以及一些帮助信息。
@argh.arg('--bool-arg-for-flag', '-b', help="翻转这个标志以执行操作")
@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模块的创建者对它的简要总结:
可以在这里查看官方文档和许多深入的教程。
2. tqdm - 易于使用的进度条生成器
这是常用的进度条生成器。它非常容易使用,可以嵌套循环,并且可以轻松自定义进度条。从tqdm模块中,最需要的两个最有用的函数是tqdm和trange。现在,让开始探索这个很棒的包。安装tqdm:
pip install ipywidgets
jupyter nbextension enable --py widgetsnbextension
jupyter labextension install @jupyter-widgets/jupyterlab-manager
通过这样做,可以激活JupyterLabs的ipywidgets插件。之后添加这个单元格以在笔记本中激活tqdm:
%%capture
from tqdm import tqdm_notebook as tqdm
tqdm().pandas()
有趣的事实:tqdm源自阿拉伯语单词taqaddum(تقدّم),意思是“进步”,并且是西班牙语“爱太多”(te quiero demasiado)的缩写。
tqdm()函数接受一个可迭代对象,并在Python开始迭代它时生成一个进度条。这里有一个简单的例子:
from tqdm import tqdm
import time
L = list(range(10000))
for ele in tqdm(L):
time.sleep(0.2)
tqdm(range(x))的一个不错的替代品是trange()。此外,可以为嵌套循环创建多个进度条:
for i in trange(10):
for j in trange(10, desc="inner_loop"):
time.sleep(0.01)
一些有用的参数及其语法:
- desc - 用于指定创建的进度条的描述。
- total - 用于指定预期的迭代次数,如果尚未指定或需要修改。
- ncols - 用于指定生成的进度条的宽度。如果未指定,则保持动态窗口。
- miniinterval - 用于更改最小进度显示更新。默认值为1/10秒。
- ascii - ASCII字符可以用来填充进度条。
tqdm(self, iterable, ascii=“123456789$”, desc=”Your description”)
3. msgpack - 二进制JSON,快速且小巧
这是一个Python客户端,用于一个名为MessagePack的序列化协议。msgpack本质上是一个二进制版本的JSON。它使可以轻松地序列化和反序列化数据,将其保存到字节数组或文件中。几乎所有其他语言都有MessagePack的实现,因此它具有与JSON文件相似的可移植性。
然而,因为msgpack以二进制格式保存数据,可以获得很多空间节省,特别是当这些数据需要通过网络传输时。
这是MessagePack模块的官方描述:
pip install msgpack
现在让来看一些例子:
import msgpack
import json
import 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)
# 保存和加载
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真的很容易。还想指出的是关于文件的数据完整性:
print(type(next(iter(back_from_json.keys()))))
print(type(next(iter(back_from_msgpack.keys()))))
输出分别是JSON的
其次,如果看保存的文件,JSON文件是275kb,而MessagePack是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 time
from 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**2
if __name__ == '__main__':
for i in range(10):
print(i, function_that_takes_a_long_time(2))
这是一个虚拟函数,帮助可视化一个执行时间很长的函数,然后运行一个循环调用它10次。使用@cache_it装饰器,带有limit参数,意味着在这种情况下,只有1000个唯一的输入值将被缓存,然后如果函数被调用超过5秒,任何缓存的数据将自动被删除。