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 ..............
3 Réponses :
Utilisez éditer: p> Je pense avoir besoin de: p> série.diff code>
avec < Code> série.where code> pour le fichier nan code> s:
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 code> avec
GMEAN code> Vérifier la solution.
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
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.
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)
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.