将pandas.datetime64值进行线性拟合?

4

我有一个包含两列数据(年龄和日期)的dataframe,表示一个人的年龄和当前日期。我想从这些数据中近似计算出生日期。我考虑使用线性模型来拟合数据并找到其截距,但是这种方法并不直接可行。因为Pandas不再支持ols()函数。

import pandas as pd
import seaborn as sns
from pandas import Timestamp

age = [30, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 34, 34]
date = [Timestamp('2001-02-10 00:01:00'),
 Timestamp('2001-11-12 00:01:00'),
 Timestamp('2002-02-27 00:01:00'),
 Timestamp('2002-07-05 00:01:00'),
 Timestamp('2002-07-20 00:01:00'),
 Timestamp('2002-08-15 00:01:00'),
 Timestamp('2002-09-08 00:01:00'),
 Timestamp('2002-10-15 00:01:00'),
 Timestamp('2002-12-21 00:01:00'),
 Timestamp('2003-04-04 00:01:00'),
 Timestamp('2003-07-29 00:01:00'),
 Timestamp('2003-08-11 00:01:00'),
 Timestamp('2004-02-28 00:01:00'),
 Timestamp('2005-01-11 00:01:00'),
 Timestamp('2005-01-12 00:01:00')]

df = pd.DataFrame({'age': age, 'date': date})

sns.regplot(df.age, df.date)

抛出错误:

类型错误:此数据类型不允许减少操作“均值”

最佳方法是将数据转换为可适配的形式,然后将其转换回日期并估算置信区间。是否有任何可以直接处理pandas.Timestamps的包?例如scikit-learn?

1个回答

5
使用pd.to_numeric将其转换为Unix时间,即从1970-01-01开始的纳秒数。
import pandas as pd

df['date'] = pd.to_numeric(df.date)
sns.regplot(df.age, df.date)

这里输入图片描述

你可以用pd.to_datetime()轻松将其转换回日期。


示例:这是一个简单的线性拟合

import numpy as np
df['date'] = pd.to_numeric(df.date)
fit = np.polyfit(df.age, df.date, 1)

# Here's the predicted Birthday in unix time
np.polyval(fit, 0)
#4.966460634146548e+16

# Here's the same result transformed to a date.
pd.to_datetime(np.polyval(fit,0))
#Timestamp('1971-07-29 19:43:26.341465480')

1
尽管人们通常每年会增长1岁。因此,线性拟合的斜率应该固定为1年(转换为Unix时间?). :-) - Soren
@Sören 很好的观点,你只需要将截距设置为你的一个自由参数,并将斜率设置为一年中的纳秒数,因此使用 scipy.optimize 来拟合你的实际函数。那只是一个快速的示例。 - ALollz
完全没问题。这很容易做到。 - Soren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接