跳转至

所有文章

Python 3.12 新特性:@override 装饰器

Python 3.12 引入了 @override 装饰器,可以用来指定该方法是用来覆盖基类方法的。

新特性简介

在继承基类后,如果我们想覆盖基类中的某个方法 original(),我们可以改写该方法。然而,如果我们不小心将方法名拼写错误为 ooooriginal(),即一个基类中不存在的方法,那么当调用子类的 original() 方法时,实际上会调用基类中的方法,而且程序不会产生错误。这种情况下,我们可能无法察觉到问题的存在。

为了解决这个问题,我们可以使用 @override 注解来明确表示方法的覆盖关系。这样程序会检查 ooooriginal() 方法是否在基类中存在。由于 ooooriginal() 方法并未在基类中定义,程序会报错,从而帮助我们发现错误。

简而言之,使用 @override 注解可以帮助我们检测覆盖方法是否正确,避免潜在的错误。

Pandas 根据日期进行分组

问题背景:有一个分钟级别索引的数据框,需要根据日期进行分组聚合计算。

  1. 简单的 .groupby('datetime') 无法实现按日期分组。
  2. .groupby(pd.Grouper(level='datetime', freq='D')) 会为原始数据中不存在的日期填充空值(例如,在股票数据中,周末、节假日等非交易日会被填充为空值)。
    • 如果分组后调用的是 .mean(),则会出现这个问题。
    • 如果分组后调用的是 .transform('mean'),则不存在这个问题。

本文记录了可以正确根据日期进行分组的方法。

image-20231008235016433

Python 使用 * 以强制调用者使用关键字参数

在 Python 中,函数可以接受不同类型的参数,包括位置参数和关键字参数。位置参数必须按照特定的顺序传递给函数,而关键字参数可以根据参数名指定。

在某些情况下,我们可能希望定义一个函数,其中一部分参数只能以关键字形式指定。为此,我们可以使用独立的 * 号来分隔这些参数。

使用 pyflyby 自动管理导入包

在编写 Python 代码时,尤其是在构建复杂的项目时,你是否遇到过这些问题:

  • 忘记 import 某个包了;

  • import 了很多包,但不知道哪些是可以删掉的?

Python 开发过程中,我们经常需要导入一些第三方包或自定义的模块。但是,手动导入这些包和模块有时候会变得非常繁琐和冗长。由 D. E. Shaw group 贡献的开源工具 pyflyby 可以自动为我们管理这些导入,帮助我们轻松解决这些问题!

Kapture 2023-09-16 at 13.23.00

Python @lru_cache 内置 LRU 缓存

Python 内置模块 functools 的一个高阶函数 @lru_cache 是一个为函数提供缓存功能的装饰器,缓存 maxsize 组传入参数,在下次以相同参数调用时直接返回上一次的结果。用以节约高开销或 I/O 函数的调用时间。

在递归计算斐波那契数列的第 30 项时,使用 @lru_cache 可使速度提升约 400 万倍。

image-20230916231919961

Pandas 向前与居中滚动计算

Pandas 中的 rolling 默认是向后(也就是向上)获取滚动窗口,如果需要向前(也就是向下)或者居中(也就是同时向上和向下)获取滚动窗口,则可以分别使用 pd.api.indexers.FixedForwardWindowIndexercenter=True 来实现。

本文还使用了 .shift(-1) 实现向前或者居中获取滚动窗口,并对比了这种方法与上述方法所得结果的差异。

data forward_using_FixedForwardWindowIndexer forward_using_shift center_using_center center_using_shift
0 1.0 3.0 3.0 3.0 3.0
1 2.0 2.0 2.0 3.0 3.0
2 NaN 4.0 4.0 6.0 6.0
3 4.0 9.0 9.0 9.0 9.0
4 5.0 5.0 NaN 9.0 NaN

计算机教育中缺失的一课:The shell

大学里的计算机课程通常专注于讲授从操作系统到机器学习这些学院派的课程或主题,而对于如何精通工具这一主题则往往会留给学生自行探索。在这个系列课程中,我们讲授命令行、强大的文本编辑器的使用、使用版本控制系统提供的多种特性等等。学生在他们受教育阶段就会和这些工具朝夕相处(在他们的职业生涯中更是这样)。

因此,花时间打磨使用这些工具的能力并能够最终熟练地、流畅地使用它们是非常有必要的。

精通这些工具不仅可以帮助您更快的使用工具完成任务,并且可以帮助您解决在之前看来似乎无比复杂的问题。