我对北极是新手,需要专家的建议.我有一些工作代码,但我必须相信有一个更快和/或更优雅的方法来做到这一点.我有一个大的框架,其中有cik(int)、form(string)和period(date)等列.Form的值可以是"10—Q"或"10—K".每个cik将有许多行的2个表单类型,表示不同的周期. 最后我想说的是,对于每个cik组,只剩下最近的10—Q,只剩下最近的10—K.当然,如果10—K表格少于10张,所有表格都应该保留. 以下是我现在正在做的(它工作):

def filter_sub_for_11_rows_per_cik(df_):
    df = df_.sort('cik')
    # Keep only the last 10-Q
    q_filtered_df = df.group_by('cik').map_groups(
        lambda g:
        g.sort('period', descending=True).filter(pl.col('form').eq('10-Q')).head(1))
    # Keep the last up to 10 10-Ks
    k_filtered_df = df.group_by('cik').map_groups(
        lambda g:
        g.sort('period', descending=True)
        .filter(pl.col('form').eq('10-K'))
        .slice(0, min(10, g.filter(pl.col('form').eq('10-K')).shape[0]))
        )
    return pl.concat([q_filtered_df, k_filtered_df])

推荐答案

为了简化这个例子,我考虑一个有3个10—Q和2个10—K条目的双框,每个值为cik.我将 for each 由cik定义的组筛选最近的2个10—K行和最近的10—Q行.

import polars as pl
import datetime

df = pl.DataFrame({
    "cik": [0] * 5 + [1] * 5,
    "form": (["10-Q"] * 2 + ["10-K"] * 3) * 2,
    "period": [datetime.date(2021, 1, 1+day) for day in range(10)],
})
shape: (10, 3)
┌─────┬──────┬────────────┐
│ cik ┆ form ┆ period     │
│ --- ┆ ---  ┆ ---        │
│ i64 ┆ str  ┆ date       │
╞═════╪══════╪════════════╡
│ 0   ┆ 10-Q ┆ 2021-01-01 │
│ 0   ┆ 10-Q ┆ 2021-01-02 │
│ 0   ┆ 10-K ┆ 2021-01-03 │
│ 0   ┆ 10-K ┆ 2021-01-04 │
│ 0   ┆ 10-K ┆ 2021-01-05 │
│ 1   ┆ 10-Q ┆ 2021-01-06 │
│ 1   ┆ 10-Q ┆ 2021-01-07 │
│ 1   ┆ 10-K ┆ 2021-01-08 │
│ 1   ┆ 10-K ┆ 2021-01-09 │
│ 1   ┆ 10-K ┆ 2021-01-10 │
└─────┴──────┴────────────┘

为了过滤由cik定义的每个组的子帧,我们可以简单地使用pl.DataFrame.filterpl.Expr.over(定义组),如下所示.

(
    df
    .sort(by=["cik", "form", "period"], descending=[False, False, True])
    .filter(
        (
            ((pl.col("form") == "10-Q") & (pl.int_range(pl.len()) == 0)) |
            ((pl.col("form") == "10-K") & (pl.int_range(pl.len()) < 2))
        )
        .over("cik", "form")
    )
)
shape: (6, 3)
┌─────┬──────┬────────────┐
│ cik ┆ form ┆ period     │
│ --- ┆ ---  ┆ ---        │
│ i64 ┆ str  ┆ date       │
╞═════╪══════╪════════════╡
│ 0   ┆ 10-K ┆ 2021-01-05 │
│ 0   ┆ 10-K ┆ 2021-01-04 │
│ 0   ┆ 10-Q ┆ 2021-01-02 │
│ 1   ┆ 10-K ┆ 2021-01-10 │
│ 1   ┆ 10-K ┆ 2021-01-09 │
│ 1   ┆ 10-Q ┆ 2021-01-07 │
└─────┴──────┴────────────┘

Explanation.

  1. 对于由cikform定义的每个组,我们按照降序对DataFrame进行排序.
  2. 我们对行进行筛选,其中form为10—K且行索引小于2(0或1—with your data, you'd filter rows with row index less than 10),或form为10—K且行索引为0,即最近的条目.我们使用pl.Expr.over对定义cikform的每个组分别进行过滤(以确保每个表单的索引都被正确地重置).

Python相关问答推荐

在Pandas 日历中插入一行

仿制药的类型铸造

Matlab中是否有Python的f-字符串等效物

Gekko:Spring-Mass系统的参数识别

使用miniconda创建环境的问题

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

NP.round解算数据后NP.unique

Python键入协议默认值

numpy卷积与有效

如何将多进程池声明为变量并将其导入到另一个Python文件

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

Geopandas未返回正确的缓冲区(单位:米)

为什么'if x is None:pass'比'x is None'单独使用更快?

基于多个数组的多个条件将值添加到numpy数组

如何在Great Table中处理inf和nans

如何强制向量中的特定元素在Gekko中处于优化解决方案中

从嵌套极轴列的列表中删除元素

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

为什么我只用exec()函数运行了一次文件,而Python却运行了两次?