介绍

在Polar中,我想要做相当复杂的查询,我想通过将操作划分为方法来简化过程.在此之前,我需要了解如何为这些函数提供多个列和变量.

示例数据

# Libraries
import polars as pl
from datetime import datetime

# Data
test_data = pl.DataFrame({
    "class": ['A', 'A', 'A', 'B', 'B', 'C'],
    "date": [datetime(2020, 1, 31), datetime(2020, 2, 28), datetime(2021, 1, 31),
              datetime(2022, 1, 31), datetime(2023, 2, 28),
              datetime(2020, 1, 31)],
    "status": [1,0,1,0,1,0]
})

问题所在

对于每一组,我想知道参考日期是否与数据框日期栏中的年-月重叠.

我想做这样的事情.

# Some date
reference_date = datetime(2020, 1, 2)

# What I would expect the query to look like
(test_data
 .groupby("class")
 .agg([
    pl.col("status").count().alias("row_count"), #just to show code that works
    pl.lit(reference_date).alias("reference_date"),
    pl.col(["date", "status"])
        .apply(lambda group: myfunc(group, reference_date))
        .alias("point_in_time_status")
 ])
)

# The desired output
pl.DataFrame({
  "class": ['A', 'B', 'C'],
  "reference_date": [datetime(2020, 1, 2), datetime(2020, 1, 2), datetime(2020, 1, 2)],
  "point_in_time_status": [1,0,0]
})

但我就是找不到对群体进行操作的任何解决方案.有些人建议使用pl.struct,但这只会输出一些奇怪的对象,没有列或要处理的任何内容.

同一运算的R中的示例

# Loading library
library(tidyverse)

# Creating dataframe
df <- data.frame(
 date = c(as.Date("2020-01-31"), 
          as.Date("2020-02-28"), as.Date("2021-01-31"), 
          as.Date("2022-01-31"), as.Date("2023-02-28"), 
          as.Date("2020-01-31")), 
 status = c(1,0,1,0,1,0), 
 class = c("A","A","A","B","B","C"))

# Finding status in overlapping months
ref_date = as.Date("2020-01-02")

df %>%
  group_by("class") %>%
  filter(format(date, "%Y-%m") == format(ref_date, "%Y-%m")) %>%
  filter(status == 1)

推荐答案

这应该适用于表达式

reference_date = datetime(2020, 1, 2)
(
    test_data
    .group_by('class', maintain_order=True)
    .agg(
       point_in_time_status = (
         (pl.col('date').dt.month_start() == pl.lit(reference_date).dt.month_start()) & 
         (pl.col('status')==1)
       ).any(),
       reference_date = pl.lit(reference_date)
    )
)

我使用的是month_start方法,而不是转换为字符串格式,因为如果可以避免,字符串的性能不会特别好.您可以在agg中看到,我们正在寻找date‘S月的第一天与reference date’S月的第一天相同的时间&如果状态==1.这都是在括号中,然后聚合any函数应用于每class个应用的时间.最后,我们在reference_date列中添加,以在输出中获得该值.如果你愿意,你可以调换那些的顺序.

你可以把它变成一个方法,但你应该用Polars表达式来做,否则你将失go Polars给表带来的效率yield .然后可以用猴子将它们修补到pl.Expr名称空间或create your own namespace

例如,您可以这样做:

def myFunc(self, reference_date, status):
    return (
        (self.dt.month_start()==reference_date.dt.month_start()) &
        (status==1)
    ).any()
pl.Expr.myFunc=myFunc
(
    test_data
    .group_by('class', maintain_order=True)
    .agg(
        point_in_time_status = pl.col('date').myFunc(
         pl.lit(reference_date), pl.col('status')
        ),
        reference_date=pl.lit(reference_date)
    )
)

Python相关问答推荐

只需使用Python在图像中保留 colored颜色 范围区域

脚注在Python中使用regex导致错误匹配

如何计算部分聚合数据的统计数据

键盘.任务组

Python -Polars库中的滚动索引?

根据网格和相机参数渲染深度

如何在BeautifulSoup中链接Find()方法并处理无?

使用numpy提取数据块

Pystata:从Python并行运行stata实例

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

numba jitClass,记录类型为字符串

Python中的嵌套Ruby哈希

使用groupby Pandas的一些操作

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

如何在UserSerializer中添加显式字段?

当点击tkinter菜单而不是菜单选项时,如何执行命令?

索引到 torch 张量,沿轴具有可变长度索引

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

将scipy. sparse矩阵直接保存为常规txt文件

lityter不让我输入左边的方括号,'