gpt4 book ai didi

python - 如何根据日期将多索引 df 分成 80/20 部分?

转载 作者:行者123 更新时间:2023-11-30 22:27:35 24 4
gpt4 key购买 nike

在我的 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)

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

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

但是,这不适用于多索引,它只是以 80/20 的比例剪切行。

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

有什么线索吗?

编辑:

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

import pandas as pd
import pandas_datareader.data as web

tickers = ['AAPL', 'AXP']

def get_data(tickers):
''' Dowloads daily O/H/L/C data for all symbols'''
def data(ticker):
return web.DataReader(ticker, 'yahoo')
datas = map(data, tickers)
return pd.concat(datas, keys=tickers, names=['Ticker', 'Date'])

stock_data = get_data(tickers)

最佳答案

这是一种方法:
首先按 groupby 代码获取测试组(索引级别 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中的所有记录,我们可以在多个索引上使用 bool 掩码来获取df_train

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

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

关于python - 如何根据日期将多索引 df 分成 80/20 部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46872385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com