2016-10-04 3 views
0

J'ai deux données. On a des transactions boursières (des choses comme la date d'achat, le prix d'achat, la date de vente, le prix de vente). L'autre base de données a tous les prix dans l'ordre de la date avec un index de la hiérarchie de ['symbol', 'date'] indexing 'close' prix appelé dfPrice.Tranche une trame de données avec un index de hiérarchie

Ne sachant pas une meilleure façon de soumettre une dataframe à ce groupe, je me suis fait un enregistrement des 10 premières lignes par:

ra = dfPrice.to_records() 

ce qui donne un ra de:

rec.array([('A', Timestamp('2000-09-01 00:00:00'), 39.84), 
('A', Timestamp('2000-09-05 00:00:00'), 39.8), 
('A', Timestamp('2000-09-06 00:00:00'), 38.63), 
('A', Timestamp('2000-09-07 00:00:00'), 39.84), 
('A', Timestamp('2000-09-08 00:00:00'), 38.15), 
('A', Timestamp('2000-09-11 00:00:00'), 36.54), 
('A', Timestamp('2000-09-12 00:00:00'), 35.41), 
('A', Timestamp('2000-09-13 00:00:00'), 35.41), 
('A', Timestamp('2000-09-14 00:00:00'), 35.89), 
('A', Timestamp('2000-09-15 00:00:00'), 36.7)], 
     dtype=[('symbol', 'S1'), ('date', 'O'), ('close', '<f8')]) 

vous pouvez obtenir le dfPrice par:

dfPrice = DataFrame(ra) 
dfPrice.set_index(['symbol', 'date'], inplace=True) 

ce que je veux est d'utiliser le bu y date et date de vente et de rechercher le prix minimum dans l'intervalle j'ai détenu le stock. Si j'ai acheté l'action 'A' le 2000-09-07 et l'ai vendue le 2000-09-14 (en la gardant pendant le week-end sans aucune entrée de prix), j'ai pensé que je pourrais obtenir le prix minimum sur cet intervalle en utilisant quelque chose comme:

minPrice = dfPrice.min['A', '2000-09-07':'2000-09-14'] 

La réponse est 35.41.

J'ai regardé Stack Overflow, mais est venu vide. Que puis-je utiliser pour obtenir ce que je veux?

+0

J'ai modifié votre question. S'il vous plaît, faites un effort pour mettre votre texte en majuscule: vous constaterez à long terme que cela va beaucoup profiter à la réception de votre question. –

Répondre

0

Il pourrait y avoir un moyen de faire plus simple, mais je réussi à obtenir advanced indexing au travail en utilisant un tuple pour vos indices hiérarchiques:

>>> dfPrice[('A','2000-09-07'):('A','2000-09-14')] 
        close 
symbol date    
'A' 2000-09-07 39.84 
     2000-09-08 38.15 
     2000-09-11 36.54 
     2000-09-12 35.41 
     2000-09-13 35.41 
     2000-09-14 35.89 
>>> dfPrice[('A','2000-09-07'):('A','2000-09-14')].min() 
close 35.41 
dtype: float64 

Donc, pour que vous devez utiliser l'indexation avancée pour découpez dans votre deuxième niveau d'index, et vous devez appliquer la méthode .min() à une trame de données découpée en tranches (plutôt que d'essayer de placer les indices dans l'appel à .min()).

+0

J'ai essayé ceci avec le grand dataframe (plus de 2.000.000 lignes) un message d'erreur a été obtenu: KeyError: 'Key length (2) était supérieur à MultiIndex lexsort depth (0)' et je ne comprends pas pourquoi - aucune aide? – jeff97005

+0

J'ai essayé ceci avec le grand dataframe (plus de 2.000.000 lignes) un message d'erreur a été obtenu: KeyError: 'Key length (2) était plus grand que MultiIndex lexsort depth (0)'. J'expérimente que j'ai trouvé que cela fonctionne avec 100 lignes et ne fonctionne pas avec 1000 lignes. existe-t-il un travail pour les grandes bases de données? – jeff97005

+0

@ jeff97005 Si cela fonctionne dans le cas le plus petit, il pourrait y avoir quelque chose de mal avec votre grand. Êtes-vous sûr que la grande structure de données a correctement la même hiérarchie? Pouvez-vous comparer le 'dfPrice.index' pour le petit et le grand cas? Je veux dire en regardant 'dfPrice.index.names',' dfPrice.index.levels', etc. –