Python - AttributeError: 模块 'pandas' 没有属性 'ewm'

3

我试图运行以下代码,但出现了错误。

line 43, in <module> ups_avg = pd.ewm(ups, span=RSI_N)[-1] 
AttributeError: module 'pandas' has no attribute 'ewm

我正在使用最新的pandas模块。 请问如何修复第43行呢?谢谢。

from binance.client import Client    
import numpy as np    
import pandas as pd    
import smtplib    
import time    
import yaml    

CONFIG = yaml.load(open('./CONFIG.yml'))    
API_KEY = CONFIG['binance_api']['key']    
API_SECRET = CONFIG['binance_api']['secret']    
user = CONFIG['gmail']['user']    
passwd = CONFIG['gmail']['password']    

client = Client(API_KEY, API_SECRET)

# against ETH    
SYMBOLS = ('ADA', 'ADX', 'BAT', 'BCC', 'DASH', 'EOS', 'IOTA',

        'LTC', 'NEO', 'OMG', 'STORJ', 'XLM', 'NANO', 'XRP', 'XVG', 'ZEC')    
RSI_N = 14    
RSI_THRESHOLD = 8    
RUN_INTERVAL_MINS = 30

def send_email(rsi_values):    
    if len(rsi_values) > 0:        
        message = '\n'.join('{0:>8} {1:.2f}'.format(symbol, rsi) for (symbol, rsi) in rsi_values)    
        email_text = 'From: {0}\nTo: {1}\nSubject: Stock Recommendations\n\n{2}'.format(user, user, message)

        try:    
            server = smtplib.SMTP_SSL('smtp.gmail.com', 465)    
            server.ehlo()    
            server.login(user, passwd)    
            server.sendmail(user, user, email_text)    
            server.close()    
        except:    
            pass

while True:    
    rsi_values = []    
    for SYMBOL in SYMBOLS:    
        klines = client.get_historical_klines(SYMBOL + 'ETH', Client.KLINE_INTERVAL_30MINUTE, '{} hours ago UTC'.format((RSI_N + 3) // 2))    
        closings = np.asarray(klines, dtype=np.float)[-RSI_N - 1:, 4]        
        diffs = np.diff(closings)    
        ups = diffs.clip(min=0)    
        downs = diffs.clip(max=0)    
        ups_avg = pd.ewma(ups, span=RSI_N)[-1]    
        downs_avg = -pd.ewma(downs, span=RSI_N)[-1]    
        rs = ups_avg / downs_avg    
        rsi = 100 - 100 / (1 + rs)    
        rsi_values.append((SYMBOL, rsi))

    print('\n'.join('{0:>8} {1:.2f}'.format(symbol, rsi) for (symbol, rsi) in rsi_values))    
    rsi_values = list(filter(lambda x: x[1] < RSI_THRESHOLD, rsi_values))        
    send_email(rsi_values)        
    time.sleep(60 * RUN_INTERVAL_MINS)
8个回答

6
使用对象 dataframe.ewm().mean()。
ups.ewm(span=RSI_N)
Eg.
df = DataFrame({'B': [0, 1, 2, np.nan, 4]})
df.ewm(com=0.5).mean()

3

我曾经遇到过类似的问题,尝试对pandas dataframe进行指数加权移动平均值的计算。我假设你也是尝试通过"ups_avg"来计算"ups"的指数加权平均值。

以下示例针对一个虚构的dataframe解决了我的问题:

df_test = pd.DataFrame(data = np.arange(0,100))
df_test_ewma = df_test.ewm(span=2).mean()

1

Try this one:

df_test = pd.DataFrame(data = np.arange(0,100))
df_test_ewma = df_test.ewm(span=2).mean()

see the results for loss values


0

1
没有运气:第43行,在<module>中 ups_avg = pd.DataFrame.ewma(ups, span=RSI_N)[-1] AttributeError: 类型对象'DataFrame'没有属性'ewma' - mrWiga
如果我使用Pandas 0.18.0运行,我会得到这个FutureWarning:pd.ewm_mean已经不再支持ndarrays,并将在未来的版本中被删除downs_avg = -pd.ewma(downs, span=RSI_N)[-1] - mrWiga

0
尝试以下操作:
ups_avg = ups.ewm(span=RSI_N).mean() 
downs_avg = - downs.ewm(span=RSI_N).mean() 

0

显然,自0.18.0版本以来语法已经有了一些变化,你应该尝试以下代码:

`ups_avg = ups.ewm(span=RSI_N).mean()

downs_avg = - downs.ewm(span=RSI_N).mean() `


0

将ups转换为数据框

ups_avg = ups.ema(span=RSI_N).mean()


0

尝试使用

pd.DataFrame.ewm(ups, span=RSI_N).mean()

这个解决方案对我来说运行良好,因为pandas已经弃用了ewma。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接