I ont une trame de données de valeurs:Pandas - expansion fonction quantile inverse
df = pd.DataFrame(np.random.uniform(0,1,(500,2)), columns = ['a', 'b'])
>>> print df
a b
1 0.277438 0.042671
.. ... ...
499 0.570952 0.865869
[500 rows x 2 columns]
Je veux transformer ceci en remplaçant les valeurs de leur percentile, où le percentile est pris en charge la distribution de toutes les valeurs en avant lignes. c'est-à-dire, si vous faites df.T.unstack(), ce serait un échantillon en expansion pure. Cela peut être plus intuitif si vous considérez l'index comme DatetimeIndex, et je demande de prendre le percentile en expansion sur l'ensemble de l'historique transversal.
L'objectif est donc ce gars-là:
a b
0 99 99
.. .. ..
499 58 84
(Idéalement Je voudrais prendre la distribution d'une valeur sur l'ensemble de toutes les valeurs dans toutes les lignes avant et y compris cette ligne, donc pas exactement un percentile élargissons;. mais si nous ne pouvons pas que, c'est très bien)
J'ai une vraiment façon laide de le faire, où je transposer et désempiler le dataframe, générer un masque percentile, et superposer tha masque t sur la trame de données en utilisant une boucle pour obtenir les centiles:
percentile_boundaries_over_time = pd.DataFrame({integer:
pd.expanding_quantile(df.T.unstack(), integer/100.0)
for integer in range(0,101,1)})
percentile_mask = pd.Series(index = df.unstack().unstack().unstack().index)
for integer in range(0,100,1):
percentile_mask[(df.unstack().unstack().unstack() >= percentile_boundaries_over_time[integer]) &
(df.unstack().unstack().unstack() <= percentile_boundaries_over_time[integer+1])] = integer
J'ai essayé d'obtenir quelque chose plus rapide à travailler, en utilisant scipy.stats.percentileofscore() et pd.expanding_apply(), mais il est ne pas donner la bonne sortie et je me rend fou en essayant de comprendre pourquoi. C'est ce que j'ai joué avec:
perc = pd.expanding_apply(df, lambda x: stats.percentileofscore(x, x[-1], kind='weak'))
Quelqu'un at-il des idées sur pourquoi cela donne une sortie incorrecte? Ou un moyen plus rapide de faire tout cet exercice? Tout le monde aide beaucoup apprécié!
Qu'est-ce qui vous fait penser l'expansion de votre application donne des résultats erronés? Cela me semble correct au premier coup d'œil (à l'intérieur de chaque colonne, il ne semble pas permettre de combiner les lignes). Peut-être faire un appel 'np.random.seed()' avant de générer vos données afin que d'autres personnes puissent vérifier les résultats par rapport aux mêmes données? – Marius