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