-1
votes

Calculer le retour moyen géométrique pour des lignes spécifiques

J'ai un fichier de données comme celui-ci.

       Date       price     mid      std         top             btm
     ..............
    1999-07-21  8.6912  8.504580    0.084923    9.674425    8.334735
    1999-07-22  8.6978  8.508515    0.092034    8.692583    8.324447
    1999-07-23  8.8127  8.524605    0.118186    10.760976   8.288234
    1999-07-24  8.8779  8.688810    0.091124    8.871057    8.506563
     ..............


1 commentaires

OK, il est possible que possible ajouter des données d'exemple pour 10 lignes avec une sortie attendue? Je pense que des colonnes inutiles doivent être supprimées des données d'échantillon.


3 Réponses :


1
votes

Utilisez série.diff avec < Code> série.where pour le fichier nan s: xxx

éditer:

Je pense avoir besoin de: xxx


2 commentaires

Désolé je viens de simplifier la question juste maintenant mais je trouve que je devrais être plus précis. S'il vous plaît voir ma question après l'édition.


@JAKE - Je ne sais pas si vous comprendrez votre question, mais si vous avez besoin de moyenne géométrique par 5 jours, utilisez roulant avec GMEAN Vérifier la solution.



0
votes

Vous pouvez atteindre cela en faisant la différence de prix code> et top code>, puis affectez ces valeurs qui sont A Nan code> ou valeur zéro:

import pandas as pd
import numpy as np

df = pd.DataFrame(...)

df['diff'] = df['price'] - df['top']

df.loc[df['diff'] <= 0, 'diff'] = np.NaN # or 0


1 commentaires

Désolé je viens de simplifier la question juste maintenant mais je trouve que je devrais être plus précis. S'il vous plaît voir ma question après l'édition.



0
votes

Voici une autre solution:

import pandas as pd
from functools import reduce

__name__ = 'RunScript'

ddict = {
    'Date':['1999-07-21','1999-07-22','1999-07-23','1999-07-24',],
    'price':[8.6912,8.6978,8.8127,8.8779],
    'mid':[8.504580,8.508515,8.524605,8.688810],
    'std':[0.084923,0.092034,0.118186,0.091124],
    'top':[9.674425,8.692583,10.760976,8.871057],
    'btm':[8.334735,8.324447,8.288234,8.506563],
    }


data = pd.DataFrame(ddict)


def geo_mean(iter):
    """
        Geometric mean function. Pass iterable
    """
    return reduce(lambda a, b: a * b, iter) ** (1.0 / len(iter))


def set_geo_mean(df):
    # Shift the price row down one period
    data['shifted price'] = data['price'].shift(periods=1)

    # Create a masked expression that evaluates price vs top
    masked_expression = df['price'] > df['top']

    # Return rows from dataframe where masked expression is true
    masked_data = df[masked_expression]

    # Apply our function to the relevant rows
    df.loc[masked_expression, 'geo_mean'] = geo_mean([masked_data['price'], masked_data['shifted price']])

    # Drop the shifted price data column once complete
    df.drop('shifted price', axis=1, inplace=True)


if __name__ == 'RunScript':
    # Call function and pass dataframe argument.
    set_geo_mean(data)


0 commentaires