Python 查找每月相同分类的百分比

Python 查找每月相同分类的百分比,python,pandas,Python,Pandas,从分类算法中,我得到了日期和标识符变量(PERMNO)的每个可用组合的分类。我想得到的是下个月保持不变的分类百分比。也就是说,如果在某个月t,PERMNO得到分类“1”,那么我想验证t+1月的PERMNO的分类是否相同。以下是我的数据示例: date PERMNO class 1986-01-31 10137 1 1986-02-28 10137 1 1986-03-31 10137 2 1986-04-30 10137 2 1986-05-31 101

从分类算法中,我得到了日期和标识符变量(PERMNO)的每个可用组合的分类。我想得到的是下个月保持不变的分类百分比。也就是说,如果在某个月t,PERMNO得到分类“1”,那么我想验证t+1月的PERMNO的分类是否相同。以下是我的数据示例:

date        PERMNO  class
1986-01-31  10137   1
1986-02-28  10137   1
1986-03-31  10137   2
1986-04-30  10137   2
1986-05-31  10137   3
2019-07-31  93429   3
2019-08-31  93429   1
2019-09-30  93429   3
2019-10-31  93429   1
2019-11-30  93429   1
对于这个例子:对于PERMNO=10137,我们在第二行和第四行有与上个月相同的分类。让我们排除PERMNO的第一行,因为它永远不能与前一行相同,因为现在有前一行。因此,2/4=1/2收到与上月相同的分类。对于PERMNO=93429,我们在第10行中的分类与上月相同。->1/4

最重要的是,我想找到保持不变的总百分比。在这种情况下:3/8

我应该如何处理这个问题


作为一个附带问题:我如何才能查看每个分类标签?也就是说,“如果PERMNO在t月的分类为=“1”,那么PERMNO在t+1时的分类为“1”的时间百分比是多少?”

使用shift运算符将数据与“类别”列和“PERMNO”列上的前一行进行比较,以找出下一个月pemno列相同且类别相同的位置。这假设数据总是相隔一个月

((df["class"]==df["class"].shift(1)) & (df["PERMNO"]==df["PERMNO"].shift(1))).sum()
输出:

3

对于不总是相隔一个月的数据,可以将日期列转换为日期时间

df["date"] = pd.to_datetime(df["date"])
然后检查年份是否相同:

df["date"].dt.year == df["date"].dt.year.shift(1)
df["date"].dt.month == df["date"].dt.year.month(1)
月份是一样的:

df["date"].dt.year == df["date"].dt.year.shift(1)
df["date"].dt.month == df["date"].dt.year.month(1)
并以类似的方式应用这些过滤器

如果要对每组PERMNO进行更多计算,请尝试groupby运算符:

输入:

PERMNO = dict(list(df.groupby(df["PERMNO"])))
输出:

{10137:         date  PERMNO  class
 0 1986-01-31   10137      1
 1 1986-02-28   10137      1
 2 1986-03-31   10137      2
 3 1986-04-30   10137      2
 4 1986-05-31   10137      3,
 93429:         date  PERMNO  class
 5 2019-07-31   93429      3
 6 2019-08-31   93429      1
 7 2019-09-30   93429      3
 8 2019-10-31   93429      1
 9 2019-11-30   93429      1}