如何根据日期拆分80/20部分的多索引df?

时间:2017-10-22 09:12:18

标签: python pandas scikit-learn

在我的df中,我有一个像这样的多索引:

val _email = ObservableField<String>()
var email: String
    get() = _email.get()
    set(value) = _email.set(value)

//use
fun login(view: View) {
    val emailVal = email
}

在单个索引df上我会这样做:

df.index.names
FrozenList([u'Ticker', u'Date'])

<class 'pandas.core.frame.DataFrame'>
MultiIndex: 189667 entries, (AAPL, 1992-08-31 00:00:00) to (^DJI, 2017-08-31 00:00:00)

然而,这不适用于multiindex,它只是在80/20中削减行。

注意:我不想随机抽样,只需根据日期拆分80/20。

任何线索?

修改

这是我获取相关数据的方式(除了两个以上的代码之外):

from sklearn.model_selection import train_test_split
df_train, df_test = train_test_split(df, test_size=0.2, shuffle=False)

1 个答案:

答案 0 :(得分:3)

这是一种方法:
首先通过groupby ticker(索引级别0)获取测试组,然后按日期(降序)对每个结果组进行排序,然后使用选择获取前20%的数据

df_test = stock_data.groupby(level=0).apply(
    lambda group: group.sort_index(
        ascending=False).iloc[:int(len(group) * .2)]
).reset_index(level=0, drop=True)

df_train将是stock_data中的所有记录而不是df_test中的记录,我们可以在多个索引上使用布尔掩码获取df_train

df_train = stock_data[~stock_data.index.isin(df_test.index)]

或者为df_test使用相同的代码,其中.2替换为8,ascending=False替换为ascending=True