【问题标题】:Groupby and filter datasetGroupby 和过滤数据集
【发布时间】:2021-01-22 07:03:15
【问题描述】:
df  fruit   year price  vol  signifiance
0   apple   2010  1      5 
1   apple   2011  2      4   
2   apple   2012  3      3   
3   apple   2013  3      3   
4   apple   2014  3      3   
5   apple   2015  3      3   important
...
47   banana  2010  1      4

如果果年很重要,我想使用该重要果年前后 5 年的数据对价格进行回归。

例如对于苹果,从 2010 年到 2020 年的价格回归。

我试过了:

df = df.groupby('significance')
Y = df['price']
X = df['vol']
model = sm.OLS(Y,X)

【问题讨论】:

  • 每个fruit 组总是只有一个或零个important
  • 一个水果中可以有多个“重要”年份,但它们不会重叠。
  • 每组是否连续几年?
  • 有些水果的起始年份不同,但这是每个水果的年度数据

标签: python python-3.x pandas dataframe regression


【解决方案1】:

我相信你需要:

import statsmodels.api as sm

g = df.groupby('fruit')
for group in g.groups.keys():
    df1 = g.get_group(group)
    #filter years with important rows
    years = df1.loc[df1['signifiance'].eq('important'), 'year']
    print (years)
    
    #for each year get get years between 5 previous and 5 next years
    for year in years:
        data = df1[df1['year'].between(year - 5, year + 5)]
        print (data)

        #if returned data processing
        if not data.empty:
            X = data['vol'] 
            Y = data['price']
            model = sm.OLS(Y, X)
            results = model.fit()
            print (results.summary())

编辑:

import statsmodels.api as sm


def f(df1):
    m1 = df1['signifiance'].eq('important')
    years = df1.loc[m1, 'year']
    print (years)
    
    #for each year get get years between 5 previous and 5 next years
    for year in years:
        mask = df1['year'].between(year - 5, year + 5) & df1['vol'].notna() & df1['price'].notna()
        data = df1[mask] 
        # print (data)

        #if returned data processing
        if not data.empty:
            X = data['vol'] 
            Y = data['price']
            model = sm.OLS(Y, X)
            results = model.fit()
            # print (results.params)
            df1.loc[mask & m1, 'new'] = results.params.iat[0]
    return df1


df = df.groupby('fruit').apply(f)
print (df)

【讨论】:

  • “exog 包含 inf 或 nans”。 data.empty 不应该解决这个问题吗?
  • @asd - 嗯,一个想法是将df1[df1['year'].between(year - 5, year + 5)] 更改为df1[df1['year'].between(year - 5, year + 5) & df1['vol'].notna() & df1['price'].notna()]
  • 最后一件事,抱歉。有没有一种快速的方法可以将 vol 系数作为新列添加到 df 中的显着性列旁边?
  • @asd - 你觉得print (results.params) 吗?
  • 是的 results.params.vol worked 工作但理想情况下希望将其添加到原始 df 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2017-01-09
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
相关资源
最近更新 更多