【问题标题】:Linear Regression on Multiindex Pandas Dataframe in PythonPython中多索引熊猫数据框的线性回归
【发布时间】:2021-12-11 02:13:30
【问题描述】:

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

这是 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次,使用测试数据),而不是每个位置一次(测试数据中只有一个位置)。我相信问题出在我用来调用回归的方法上,但无法找到另一种方法来迭代并按纬度/经度对执行回归——感谢任何帮助!

【问题讨论】:

    标签: python pandas dataframe regression pandas-groupby


    【解决方案1】:

    我认为您的 regress 函数也有错误,因为在您的情况下 X 应该是一维向量。所以这里是固定的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 将具有与自身相同的轴长度。 Pandas Documentation

    因此,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)
    

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 2019-07-12
      • 2018-07-23
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 2017-02-22
      相关资源
      最近更新 更多