使用 Groupby 将分布拟合到 Python Pandas DF

Fit Distribution to Python Pandas DF with Groupby

我在数据框 'df 中有这样的每小时数据,它的大小很大 (3418896,9)。我需要将 weibull 分布拟合到数据,但我需要按 'plant_name'、'month' 和 'year'.

对输出(形状、位置、比例)进行分组
       plant_name  business_name business_code maint_region_name  wind_speed_ms            mos_time dataset  month  year
0  MAPLE RIDGE II  UNITED STATES           USA              EAST          10.06 2021-09-22 13:00:00    ERA5      9  2021
1  MAPLE RIDGE II  UNITED STATES           USA              EAST          10.04 2021-09-22 12:00:00    ERA5      9  2021
2  MAPLE RIDGE II  UNITED STATES           USA              EAST           9.84 2021-09-22 11:00:00    ERA5      9  2021
3  MAPLE RIDGE II  UNITED STATES           USA              EAST          10.67 2021-09-22 10:00:00    ERA5      9  2021
4  MAPLE RIDGE II  UNITED STATES           USA              EAST          11.47 2021-09-22 09:00:00    ERA5      9  2021

我需要 'df' 每个 plant_name、月、年的形状、比例值。我在下面尝试过这个,但我只得到一个形状和比例的值,我需要一个单独的形状,每个 plant_name、月份和年份的比例。这是我的尝试,它只为形状提供一个数字,比例:

from scipy.stats import weibull_min

shape, loc, scale = weibull_min.fit(ncData.groupby(['plant_name','month','year']).apply(lambda x:x['wind_speed_ms']), floc=0)

shape
Out[21]: 2.2556719467040596

scale
Out[22]: 7.603953856897537

我不知道如何使用 groupby 'plant'name'、'month'、'year' 将输出发送到 'shape' 和 'scale' 参数。非常感谢您花时间帮助我做一些我可以尝试的事情。

这应该有效

import pandas as pd
from scipy.stats import weibull_min

# function applied to each ('plant_name','month','year') group
def fit_weibull(g):
    # get wind speed data from the group
    data = g['wind_speed_ms']
    # fit weibull_min to the group wind data
    params = weibull_min.fit(data)
    # Return the fit parameters as a Series (each parameter will correspond to a different column)
    return pd.Series(params, index=['shape', 'loc', 'scale'])

fit_params = ncData.groupby(['plant_name', 'month', 'year']).apply(fit_weibull)