2017-10-22 16 views
1

私はこのようなマルチインデックス持っている:私はどうなる単一のインデックスDFで日付に基づいて80/20の部分でマルチインデックスを分割する方法は?私の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) 

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を分割するだけです。

手がかりはありますか?

編集:

は、これは私が(離れて、多くの二つ以上のティッカーから)問題のデータを取得する方法である:
最初のGET:ここ

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) 
+0

に変更されています。私はそれを再現しようとしています。小さな再現可能なデータセットと必要なデータセットを提供できますか? – MaxU

+0

@MaxU上記の – cJc

+0

をご覧ください。希望するデータセットは何ですか? – MaxU

答えて

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)] 

代わりに0.2は、8とによって置き換えられdf_testために同じコードを使用してascending=Falseascending=True

+0

は魅力的な作品です。 – cJc

+0

うれしいです。あなたが最も歓迎している – sgDysregulation

関連する問題