Python: How to code an exponential moving average?

前端 未结 2 967
鱼传尺愫
鱼传尺愫 2021-01-06 08:50

I want to do calculations on three columns of a dataframe df. In order to do that I want run a price of assets (cryptocurrencies) list in a three column table i

相关标签:
2条回答
  • 2021-01-06 09:23

    In your loop for i,column in enumerate(column_by_search): you iterate over the elements in your column_by_search list, that is column takes on the values "BTC", "ETH", "DASH" in turn. Thus, len(column) will give you the length of the string "BTC", which is 3 in fact.

    Try df[column] instead, that will return a list with the elements in the desired column and you can iterate over it.

    0 讨论(0)
  • 2021-01-06 09:33

    pandas.stats.moments.ewma from the original answer has been deprecated.

    Instead you can use pandas.DataFrame.ewm as documented here.


    Below is a complete snippet with random data that builds a dataframe with calculated ewmas from specified columns.

    Code:

    # imports
    import pandas as pd
    import numpy as np
    
    np.random.seed(123)
    
    rows = 50
    df = pd.DataFrame(np.random.randint(90,110,size=(rows, 3)), columns=['BTC', 'ETH', 'DASH'])
    datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist()
    df['dates'] = datelist 
    df = df.set_index(['dates'])
    df.index = pd.to_datetime(df.index)
    
    def ewmas(df, win, keepSource):
        """Add exponentially weighted moving averages for all columns in a dataframe.
    
        Arguments: 
        df -- pandas dataframe
        win -- length of ewma estimation window
        keepSource -- True or False for keep or drop source data in output dataframe
    
        """
    
        df_temp = df.copy()
    
        # Manage existing column names
        colNames = list(df_temp.columns.values).copy()
        removeNames = colNames.copy()
    
        i = 0
        for col in colNames:
    
            # Make new names for ewmas
            ewmaName = colNames[i] + '_ewma_' + str(win)   
    
            # Add ewmas
            #df_temp[ewmaName] = pd.stats.moments.ewma(df[colNames[i]], span = win)
            df_temp[ewmaName] = df[colNames[i]].ewm(span = win, adjust=True).mean()
    
            i = i + 1
    
        # Remove estimates with insufficient window length
        df_temp = df_temp.iloc[win:]
    
        # Remove or keep source data
        if keepSource == False:
            df_temp = df_temp.drop(removeNames,1)
    
        return df_temp
    
    # Test run
    df_new = ewmas(df = df, win = 22, keepSource = True)
    print(df_new.tail())
    

    Output:

                 BTC  ETH   DASH  BTC_ewma_22  ETH_ewma_22    DASH_ewma_22
    dates                                                             
    2017-02-15   91   96    98    98.752431    100.081052     97.926787
    2017-02-16  100  102   102    98.862445    100.250270     98.285973
    2017-02-17  100  107    97    98.962634    100.844749     98.172712
    2017-02-18  103  102    91    99.317826    100.946384     97.541684
    2017-02-19   99  104    91    99.289894    101.214755     96.966758
    

    Plot using df_new[['BTC', 'BTC_ewma_22']].plot():

    0 讨论(0)
提交回复
热议问题