Python中多索引Pandas数据框架的线性回归



我试图执行年温度随时间的回归,并获得每个纬度和经度坐标的斜率/线性趋势(由回归生成的数字)(完整的数据集有许多纬度/经度位置)。我想用这个斜率值替换每个位置的年份和温度。我的最终目标是用图解来描绘这些趋势。

下面是pandas多索引数据框架中的一些测试数据

tempanomaly
lat     lon     time_bnds   
-89.0   -179.0  1957    0.606364
1958    0.495000
1959    0.134286

这是我的目标:

lat     lon      trend  
-89.0   -179.0   -0.23604

这是回归函数

def regress(y):
#X is the year or index, y is the temperature
X=np.array(range(len(y))).reshape(len(y),1)
y = y.array
fit = np.polyfit(X, y, 1)
return (fit[0])

这里是我如何命名它的

reg = df.groupby(["lat", "lon"]).transform(regress)

我收到的错误是TypeError: Transform function invalid for data types。在调试过程中,我发现回归对每一行运行(使用测试数据运行3次),而不是对每个位置运行一次(测试数据中只有一个位置)。我认为问题在于我用来调用回归的方法,但无法找出另一种方法来迭代并通过纬度/纬度对执行回归-我感谢任何帮助!

我认为你的regress函数也有错误,因为在你的情况下X应该是1D向量。这里是固定的regress函数:

def regress(y):
#X is the year or index, y is the temperature
X = np.array(range(len(y)))
y = y.array
fit = np.polyfit(X, y, 1)
return (fit[0])

对于pandas.DataFrame.transform,生成的DataFrame将具有与self相同的轴长。熊猫文档

因此aggregate对于您的情况是一个更好的选择。

reg = df.groupby(["lat", "lon"]).aggregate(trend=pd.NamedAgg('tempanomaly', regress)).reset_index()

生产:

lat    lon    trend
-89.0  -179.0  -0.236039

,示例数据创建如下:

lat_lon = [(-89.0, -179.0), (-89.0, -179.0), (-89.0, -179.0)]
index = pd.MultiIndex.from_tuples(lat_lon, names=["lat", "lon"])
df = pd.DataFrame({
'time_bnds':[1957,1958,1959], 
'tempanomaly': [0.606364, 0.495000, 0.134286]
},index=index)

相关内容

  • 没有找到相关文章

最新更新