TypeError: объект типа 'numpy.float64' не имеет len()

Я пытаюсь рассчитать индекс денежного потока для цены биткойна.

Для этого я использую gdax, pandas и pyti.

Вот мой код:

import gdax
import pandas as pd
from pyti.money_flow_index import money_flow_index as mfi

public_client = gdax.PublicClient()
historic = public_client.get_product_historic_rates('BTC-USD', granularity=60)
pd.set_option('display.max_rows', 30)
df = pd.DataFrame(historic)
df.columns = ['Time', 'Low', 'High', 'Open', 'Close', 'Volume']
df = df.head(n=30)

print(df, '\n')
close_data = df['Close'][0]
high_data = df['High'][0]
low_data = df['Low'][0]
volume_data = df['Volume'][0]
period = 14
print(mfi(close_data, high_data, low_data, volume_data, period))

Вот ошибка, которую я получаю:

Traceback (most recent call last):
  File "tiiii.py", line 18, in <module>
    print(mfi(close_data, high_data, low_data, volume_data, period))
  File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pyti\money_
flow_index.py", line 19, in money_flow_index
    close_data, high_data, low_data, volume
  File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pyti\catch_
errors.py", line 26, in check_for_input_len_diff
    arrays_len = [len(arr) for arr in args]
  File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pyti\catch_
errors.py", line 26, in <listcomp>
    arrays_len = [len(arr) for arr in args]
TypeError: object of type 'numpy.float64' has no len()

Изменить: ОК, теперь я использую:

close_data = df['Close']
high_data = df['High']
low_data = df['Low']
volume_data = df['Volume']

И вот что я получаю:

            0
0         NaN
1         NaN
2         NaN
3         NaN
4         NaN
5         NaN
6         NaN
..        ...
23  97.914228
24  97.816960
25  96.440309
26  94.668462
27  94.340548
28  91.255057
29  87.706573

[30 rows x 1 columns]

Я не понимаю порядок значений. Кроме того, почему я не получаю полный список?

P.S. Спасибо за помощь Rahul и timgeb!


person This play nay mm    schedule 17.03.2018    source источник
comment
Пожалуйста, не редактируйте свой вопрос как другой вопрос после того, как на него был дан ответ. Примите ответ, который решил исходную проблему, затем задайте новый вопрос (после надлежащего исследования и попыток).   -  person timgeb    schedule 17.03.2018
comment
Надеюсь, я не нарушил никаких правил. Я думал, что добавляю больше деталей к исходному вопросу.   -  person This play nay mm    schedule 17.03.2018
comment
Ну, иногда это приговор. Я бы сказал, что первоначальный вопрос заключался в том, как решить TypeError, и что ваш новый вопрос настолько отличается от решения TypeError, что требует нового поста.   -  person timgeb    schedule 17.03.2018
comment
Справедливо. Но не кажется ли вам, что публиковать почти тот же код снова бессмысленно?   -  person This play nay mm    schedule 17.03.2018


Ответы (2)


Функция money_flow_index вызывает check_for_input_len_diff и выдает ошибку в строке 26. когда он пытается накопить длину аргументов close_data, high_data, low_data, volume, которые вы предоставили money_flow_index (импортированы как mfi).

В комментариях указано, что эти аргументы должны быть наборами данных (или, по крайней мере, структурами данных с длиной), но вы предоставили число с плавающей запятой, которое не имеет длины.

person timgeb    schedule 17.03.2018

Я извлек функции из модуля pyti. Вот как ваш код на самом деле выполняется внутри модулей.

def money_flow_index (close_data, high_data, low_data, volume, period):
    check_for_input_len_diff(
        close_data, high_data, low_data, volume
    )

def check_for_input_len_diff(*args):
    arrays_len = [len(arr) for arr in args]

print(
    money_flow_index(
        close_data, high_data,
        low_data, volume_data, period
    )
)

Итак, money_flow_index нужен каждый аргумент как array. вы предоставляете numpy.float64

person Rahul    schedule 17.03.2018