2017-03-22 1 views
0

J'utilise le code suivant pour calculer les quartiles d'une donnée ensemble donné:Python: Get index de tableau de quartiles

#!/usr/bin/python 

import numpy as np 

series = [1,2,2,2,2,2,2,2,2,2,2,5,5,6,7,8] 

p1 = 25 
p2 = 50 
p3 = 75 

q1 = np.percentile(series, p1) 
q2 = np.percentile(series, p2) 
q3 = np.percentile(series, p3) 

print('percentile(' + str(p1) + '): ' + str(q1)) 
print('percentile(' + str(p2) + '): ' + str(q2)) 
print('percentile(' + str(p3) + '): ' + str(q3)) 

La fonction quantile renvoie les quartiles, cependant, je voudrais aussi obtenir le les index utilisés pour marquer les limites des quartiles. Est-ce qu'il y a un moyen de faire ça?

+1

Les données sont-elles toujours triées? Ou bien, cette question n'aurait pas de sens, à moins que je ne manque quelque chose. Mais si * est * trié, vous pouvez calculer directement l'index. –

+0

@ juanpa.arrivillaga Oui, les données sont toujours triées. – nautical

Répondre

0

Essayez ceci:

import numpy as np 
import pandas as pd 
series = [1,2,2,2,2,2,2,2,2,2,2,5,5,6,7,8] 
thresholds = [25,50,75] 
output = pd.DataFrame([np.percentile(series,x) for x in thresholds], index = thresholds, columns = ['quartiles']) 
output 

En faisant une trame de données, vous pouvez affecter assez facilement l'index.

+0

Je ne suis pas sûr de savoir comment cela répond à la question ...Je ne suis pas sûr de comprendre la question ... –

+0

@ juanpa.arrivillaga J'ai supposé que la question était de structurer la sortie ... – Rose

0

En supposant que les données sont toujours triées (merci @ juanpa.arrivillaga), vous pouvez utiliser la méthode rank de la classe Pandas . rank() prend plusieurs arguments. L'un d'eux est pct:

pct: booléen, par défaut False

pourcentage Computes rang des données

Il existe différentes façons de calculer le rang de pourcentage. Ces méthodes sont contrôlées par l'argument method:

méthode

: { 'moyenne', 'min', 'max', 'premier', 'dense'}

Vous devez la méthode "max":

max: rang le plus élevé dans le groupe

regard du LET à la sortie du rank() méthode avec ces paramètres:

import numpy as np 
import pandas as pd 

series = [1,2,2,2,2,2,2,2,2,2,2,5,5,6,7,8] 

S = pd.Series(series) 
percentage_rank = S.rank(method="max", pct=True) 
print(percentage_rank) 

Cela vous donne essentiellement le percentile pour chaque entrée dans le Series:

0  0.0625 
1  0.6875 
2  0.6875 
3  0.6875 
4  0.6875 
5  0.6875 
6  0.6875 
7  0.6875 
8  0.6875 
9  0.6875 
10 0.6875 
11 0.8125 
12 0.8125 
13 0.8750 
14 0.9375 
15 1.0000 
dtype: float64 

Afin de récupérer l'index pour les trois centiles, vous regardez le premier élément dans le Series qui a un rang de pourcentage égal ou supérieur au percentile qui vous intéresse. L'index de cet élément est l'index dont vous avez besoin.

index25 = S.index[percentage_rank >= 0.25][0] 
index50 = S.index[percentage_rank >= 0.50][0] 
index75 = S.index[percentage_rank >= 0.75][0] 

print("25 percentile: index {}, value {}".format(index25, S[index25])) 
print("50 percentile: index {}, value {}".format(index50, S[index50])) 
print("75 percentile: index {}, value {}".format(index75, S[index75])) 

Cela vous donne la sortie:

25 percentile: index 1, value 2 
50 percentile: index 1, value 2 
75 percentile: index 11, value 5 
0

Depuis les données sont triées, vous pouvez simplement utiliser numpy.searchsorted pour retourner les indices à laquelle insérer les valeurs pour maintenir l'ordre. Vous pouvez spécifier quel 'côté' insérer les valeurs.

>>> np.searchsorted(series,q1) 
1 
>>> np.searchsorted(series,q1,side='right') 
11 
>>> np.searchsorted(series,q2) 
1 
>>> np.searchsorted(series,q3) 
11 
>>> np.searchsorted(series,q3,side='right') 
13