我有一个包含多个列的数据框以及一个日期列。日期格式为12/31/15,我将其设置为日期时间对象。
我将datetime列设置为索引,并希望对数据帧的每个月执行回归计算。
我认为这样做的方法是将数据框分成多个基于月份的数据框,存储到数据框列表中,然后对列表中的每个数据框执行回归。
我使用了groupby,它成功地按月拆分了数据帧,但我不确定如何正确地将groupby对象中的每个组转换为数据帧,以便能够在其上运行我的回归函数。
是否有人知道如何根据日期将数据框拆分为多个数据框,或者更好地解决我的问题?
这是我到目前为止编写的代码
import pandas as pd
import numpy as np
import statsmodels.api as sm
from patsy import dmatrices
df = pd.read_csv('data.csv')
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
df = df.set_index('date')
# Group dataframe on index by month and year
# Groupby works, but dmatrices does not
for df_group in df.groupby(pd.TimeGrouper("M")):
y,X = dmatrices('value1 ~ value2 + value3', data=df_group,
return_type='dataframe')
答案 0 :(得分:4)
如果必须循环,则需要在迭代groupby
对象时解压缩密钥和数据框:
import pandas as pd
import numpy as np
import statsmodels.api as sm
from patsy import dmatrices
df = pd.read_csv('data.csv')
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
df = df.set_index('date')
请注意group_name
使用此处:
for group_name, df_group in df.groupby(pd.Grouper(freq='M')):
y,X = dmatrices('value1 ~ value2 + value3', data=df_group,
return_type='dataframe')
如果你想避免迭代,请查看Paul H's gist中的笔记本(参见他的评论),但使用apply
的一个简单例子是:
def do_regression(df_group, ret='outcome'):
"""Apply the function to each group in the data and return one result."""
y,X = dmatrices('value1 ~ value2 + value3',
data=df_group,
return_type='dataframe')
if ret == 'outcome':
return y
else:
return X
outcome = df.groupby(pd.Grouper(freq='M')).apply(do_regression, ret='outcome')
答案 1 :(得分:3)
这是每年一次。
import pandas as pd
import dateutil.parser
dfile = 'rg_unificado.csv'
df = pd.read_csv(dfile, sep='|', quotechar='"', encoding='latin-1')
df['FECHA'] = df['FECHA'].apply(lambda x: dateutil.parser.parse(x))
#http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases
#use to_period
per = df['FECHA'].dt.to_period("Y")
#group by that period
agg = df.groupby([per])
for year, group in agg:
#this simple save the data
datep = str(year).replace('-', '')
filename = '%s_%s.csv' % (dfile.replace('.csv', ''), datep)
group.to_csv(filename, sep='|', quotechar='"', encoding='latin-1', index=False, header=True)