Hen*_*sen 5 python numpy linear-regression pandas
我想查看一些实体的趋势(SysNr)
我的数据跨越3年(2014,2015,2016)
我正在查看大量变量,但会将此问题限制为一个('res_f_r')
我的DataFrame看起来像这样
d = [
{'RegnskabsAar': 2014, 'SysNr': 1, 'res_f_r': 350000},
{'RegnskabsAar': 2015, 'SysNr': 1, 'res_f_r': 400000},
{'RegnskabsAar': 2016, 'SysNr': 1, 'res_f_r': 450000},
{'RegnskabsAar': 2014, 'SysNr': 2, 'res_f_r': 350000},
{'RegnskabsAar': 2015, 'SysNr': 2, 'res_f_r': 300000},
{'RegnskabsAar': 2016, 'SysNr': 2, 'res_f_r': 250000},
]
df = pd.DataFrame(d)
RegnskabsAar SysNr res_f_r
0 2014 1 350000
1 2015 1 400000
2 2016 1 450000
3 2014 2 350000
4 2015 2 300000
5 2016 2 250000
Run Code Online (Sandbox Code Playgroud)
我的愿望是对每个实体(SysNr)进行线性回归并返回斜率和截距
我想要的输出是上面的
SysNr intercept slope
0 1 300000 50000
1 2 400000 -50000
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
所以我不知道为什么我们的截距值会有所不同(也许是我犯了一个错误,或者您给定的数据不是您希望处理的完整数据),但是我建议您使用np.polyfit或您选择的工具(scikit -learn,scipy.stats.linregress,...)与groupby组合并应用:
In [25]: df.groupby("SysNr").apply(lambda g: np.polyfit(g.RegnskabsAar, g.res_f_r, 1))
Out[25]:
SysNr
1 [49999.99999999048, -100349999.99998075]
2 [-49999.99999999045, 101049999.99998072]
dtype: object
Run Code Online (Sandbox Code Playgroud)
之后,美化它:
In [43]: df.groupby("SysNr").apply(
...: lambda g: np.polyfit(g.RegnskabsAar, g.res_f_r, 1)).apply(
...: pd.Series).rename(columns={0:'slope', 1:'intercept'}).reset_index()
Out[43]:
SysNr slope intercept
0 1 50000.0 -1.003500e+08
1 2 -50000.0 1.010500e+08
Run Code Online (Sandbox Code Playgroud)
因为您在评论中的另一个答案上询问了如何处理某些年份的缺失年份SysNr:只需将其删除即可NaNs获得有效的线性回归。当然,您也可以根据您要实现的目标,用平均值左右的方式填充它们,但是从我的角度来看,这并没有帮助。
如果实体只有一年的数据,则不能对它进行线性回归。但是您可以(如果需要并且适合您的情况,请在需要时提供有关数据的更多信息)以某种方式将其他实体的斜率外推到该实体并计算截距。为此,您当然必须对实体的斜率分布进行一些假设(例如,线性,则sysNr 3的斜率将为-150000.0)。
| 归档时间: |
|
| 查看次数: |
3603 次 |
| 最近记录: |