跳转至

所有文章

批量修改 Jupyter Notebook 的内容

有时需要批量替换许多 Jupyter Notebook 的内容,由于 Jupyter Notebook 并不是简单的文本文件,在读取和替换时并不像批量修改 Python 脚本那样方便。

本文介绍了使用 nbformat 批量修改 Jupyter Notebook 的内容的方法。

20231207155702

Python argparse 解析命令行参数为布尔值

在 Python 开发中,命令行参数解析是一个常见的需求,它允许我们以命令行的方式向程序传递参数,从而实现更灵活和可配置的程序设计。Python 提供了一个内置库 argparse,它简化了命令行参数解析的过程。

这篇帖子介绍过如何使用 argparse 解析命令行参数,本文将介绍如何指定命令行参数为布尔值类型。直接使用 type=bool 是无法实现的,而需要传入一个 callable 的对象,在其中编写将字符串转换为布尔值的逻辑。

image-20231122230439023

chat-data: 基于大语言模型的数据分析应用

在数据分析领域,Pandas 是最受欢迎的 Python 库之一。然而,许多数据分析任务可以利用人工智能模型进行自动化。PandasAI 库为流行的数据分析和处理工具 Pandas 添加了生成式人工智能功能,你可以与 DataFrame 进行对话,并得到想要的数据分析结果。

本文使用 Streamlit 构建了一个在线应用,用户可以上传 Excel/CSV 数据,在输入想要执行的数据分析任务后,便可得到图表等结果,以及生成该结果的相应代码。

chat-data

在 Python 中调用在线大模型 API

许多大模型都提供了在线 API 接口服务,我们可以在 Python 中调用它们。本文使用 openaichatllmdashscope 等包实现了对 OpenAI、讯飞星火、智谱 AI、百度、阿里通义千问的调用。用户只需在本地用 .env 文件存储 API Key 即可快速调用这些大模型。

image-20231031211003404

计算部分相关系数矩阵

本文使用相关系数的矩阵表达形式,实现了计算部分相关系数矩阵的加速算法,并实证检验了三种计算相关系数矩阵方法的运行速度。

  • 在计算部分相关系数矩阵时,自定义的加速算法 相比 Pandas .corr() 方法提速约 2180 倍,比 Numpy .corrcoef() 方法提速约 115 倍。
  • 在计算全部相关系数矩阵时,Numpy .corrcoef() 方法比自定义的加速算法略快 \(10\%\),比 Pandas .corr() 方法快约 20 倍。

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 中,函数可以接受不同类型的参数,包括位置参数和关键字参数。位置参数必须按照特定的顺序传递给函数,而关键字参数可以根据参数名指定。

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