0

我正在尝试计算我的 df中weight的每个animal_id和的回归系数:cycle_nr

动物ID cycle_nr 饲料日期 重量
1003 8 2020-02-06 221
1003 8 2020-02-10 226
1003 8 2020-02-14 230
1004 1 2020-02-20 231
1004 1 2020-02-21 243

我尝试使用此源代码

import pandas as pd
import statsmodels.api as sm 


def GroupRegress(data, yvar, xvars):
    Y = data[yvar]
    X = data[xvars]
    X['intercept'] = 1.
    result = sm.OLS(Y, X).fit()
    return result.params

result = df.groupby(['animal_id', 'cycle_nr']).apply(GroupRegress, 'feed_date', ['weight'])

此代码失败,因为我的变量包含日期。

我接下来尝试了什么:

我想我可以创建一个数字列来代替我的日期列。我创建了一个简单的 count_id 列:

动物ID cycle_nr 饲料日期 重量 ID
1003 8 2020-02-06 221 1
1003 8 2020-02-10 226 2
1003 8 2020-02-14 230 3
1004 1 2020-02-20 231 4
1004 1 2020-02-21 243 5

然后我在这个专栏上进行了回归

result = df.groupby(['animal_id', 'cycle_nr']).apply(GroupRegress, 'id', ['weight'])

在此处输入图像描述

斜率计算看起来不错,但截距当然没有意义。

然后我意识到这种方法只有在测量间隔有规律的情况下才可用。在大多数情况下,间隔是 7 天,但有时是 10、14 或 21 天。

我删除了间隔不是 7 天的记录并重新运行了我的回归......它有效,但我讨厌我必须丢弃完美的数据。

我想知道是否有更好的方法可以将日期包含在回归中,或者可以更正日期的不同间隔。有什么建议么?

4

1 回答 1

0

我想知道是否有更好的方法可以将日期包含在回归中,或者可以更正日期的不同间隔。

  • 如果提要日期是字符串,则使用pandas.to_datetime创建一个日期时间系列。
  • 使用该新系列来计算喂食之间的实际时间差
  • 在回归中使用结果时间增量,而不是线性 制造序列。timedeltas 具有不同的属性(即微秒、天),可以根据您需要的分辨率使用这些属性。

我的第一直觉是分别为每个组生成Timedeltas。每组的第一次喂食当然是零时间。

甚至可能没有必要制作 Timedeltas - Numpy 或 Scipy 甚至可能是 Pandas 中可能有日期时间感知回归方法 - 我想必须有,这是一个足够常见的应用程序。

可以将 datetime Series 转换为序数值,而不是 Timedeltas,以便在回归中使用。

df = pd.DataFrame(
    {
        "feed_date": [
            "2020-02-06",
            "2020-02-10",
            "2020-02-14",
            "2020-02-20",
            "2020-02-21",
        ]
    }
)


>>> q = pd.to_datetime(df.feed_date)
>>> q
0   2020-02-06
1   2020-02-10
2   2020-02-14
3   2020-02-20
4   2020-02-21
Name: feed_date, dtype: datetime64[ns]
>>> q.apply(pd.Timestamp.toordinal)
0    737461
1    737465
2    737469
3    737475
4    737476
Name: feed_date, dtype: int64
>>>   
于 2021-07-16T13:44:23.460 回答