3

一天中的那个时候,我的头撞在键盘上太久了,我会很感激任何建议。我的总体目标是摄取一个每小时温度的数据文件,其中有间隙。我想使用来自附近站点的温度线性回归来填补这些空白。但我想按年和按月执行此操作。因此,在这里的人们的帮助下,我已经能够做到这一点。现在我已经按年和月应用了线性回归函数,例如

Corr_grouped=DF_grouped.apply(lambda x: stats.linregress(x [Labels[0]], x [Labels[3]]))

这产生了以下输出,输出斜率、截距、r_value、p_value、std_err 并显示如下。

> 2010  1     (0.806190897504, 5.75672188581, 0.901179913935...
>       2     (0.739906365408, 8.05204746237, 0.894050112908...
>       3     (0.773199101365, 6.88505178697, 0.898475211997... ...
>       10    (0.87497855294, 4.10227036556, 0.939948762031,...
>       11    (0.793072407801, 6.38604194806, 0.923659962858...

我整天都在阅读找不到确切的解决方案。现在我的问题是如何将其应用回原始数据框。我想要 DF 中的一个新列,将线性回归 y=mx+c 应用到原始数据中的每一行,使用第 3 列作为输入,但是使用不同的特定系数(斜率、截距)来做到这一点每年和每月。任何想法最受欢迎:) 干杯杰森

编辑:太好了。所以DF看起来像这样。多年来,它每 30 分钟有一个时间戳。它有可能是 1 个或多个间隔的间隙 (NaN)。我需要使用与附近车站 (T_nearby) 的关系来填补原始列 (T_original) 中的空白。但这不是简单的替代。该地点通常相距一段距离,并且温度是相关的,但并不相同(即一个可能比 2oC 高)。所以必须先调整 T_nearby 站,然后再使用它来填补空白。

                        T_original  T_nearby
2010-01-01 00:00:00  25.87873       25.4
2010-01-01 00:30:00  25.73089       25.4
2010-01-01 01:00:00  25.56144       25.4
2010-01-01 01:30:00  NaN         25.4
2010-01-01 02:00:00  25.24789       25.6
2010-01-01 02:30:00  25.17758       25.4
2010-01-01 03:00:00  NaN         25.6
2010-01-01 03:30:00  NaN         25.6
2010-01-01 04:00:00  25.07633       25.6
2010-01-01 04:30:00  24.99211       25.5

我想按年和月细分分析。因此,对于每年的每个月计算 T_original 和 T_nearby 之间的线性回归拟合。这给出了上面具有线性回归参数的分组对象。例如 2010 年和第 1 个月,截距为 5.75,斜率为 0.806。

所以我想将这种关系应用到所有 Year=2010 和 Month=1 看起来像这样。然后对于 DF 的其余部分,每年的每个月都采用相同的方法。

    T_original      T_nearby    T_adjusted
1/01/2010 0:00  25.87873    25.4    26.2224
1/01/2010 0:30  25.73089    25.4    26.2224
1/01/2010 1:00  25.56144    25.4    26.2224
1/01/2010 1:30  NaN             25.4    26.2224
1/01/2010 2:00  25.24789    25.6    26.3836
1/01/2010 2:30  25.17758    25.4    26.2224
1/01/2010 3:00  NaN             25.6    26.3836
1/01/2010 3:30  NaN             25.6    26.3836
1/01/2010 4:00  25.07633    25.6    26.3836
1/01/2010 4:30  24.99211    25.5    26.303

然后我将使用 T_adjusted 列来填补 T_original 中的空白。谢谢杰森

4

1 回答 1

1

您的第一步是将分组对象与 DF 合并。为此,首先创建一个公共分组列。

对于分组对象:

from datetime import date
grouped['common'] = grouped.index.map(lambda x : date(x[0],x[1],1))

对于 DF:

DF['common'] = DF.index.map(lambda x : date(x.year,x.month,1))

现在您可以合并它:

merged = DF.merge(grouped)
del merged['common']

我不确定计算 T_adjusted 列的确切公式是什么,但现在回归参数与 T_nearby 值匹配,它可以通过数组运算来计算。

要使用 T_adjusted 填补 T_original 中的空白:

merged['T_original']=merged['T_original'].combine_first(merged['T_adjusted'])
于 2013-02-26T09:14:14.303 回答