2016-12-25 6 views
0

私のコードは正しくあり、正しく動作させるにはいくつかの困難があります。TypeError:系列を<type 'float'>に変換できません>

import scipy.special as sps 
import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 
from scipy.stats import norm 
from scipy.stats import gamma 
from math import exp 
######################################## 

### DADOS 


dados= [2.3572833,0.7383197,14.1423990,2.0310423,7.1052727,1.8851099,12.9464459,4.4056236,1.0471756,0.4672236] 

temp = pd.DataFrame(dados) 

########################################## 

def fx(x, t): 
    prod = 1.0 
    for i in range(0, len(x)): 
     prod *= ((t[0]/t[1])* exp(- (x[i]/t[1])) * exp(-t[0] * exp(-(x[i]/t[1])))) 
     return prod 

######################### 

def L(x, t): 
    n = len(x) 
    return fx(x,t) 


########################################## 

### MCMC 

def mcmc(N=[], k={"t1": 1, "t2": 1}, x=[]): 
    chute = {"t1": [1], "t2": [1]} 
    M = chute 
    hiper = {"t1": [0.1, 0.1], "t2": [0.1, 0.1]} 
    contador = {"t1": [], "t2": []} 

    thetas = M.keys() 
    for i in range(N - 1): 
     for j in thetas: 

      if j == "t1": 

       M[j].append(np.random.gamma(shape = M[j][-1], scale = k[j])) 
       lista = [ [ M[l][-1] for l in thetas] , [ M[l][-1] if l!=j else M[l][-2] for l in thetas ] ] 
       t1 = gamma.pdf(M[j][-1], a = hiper[j][0], scale = hiper[j][1]) * L(x, lista[0]) * gamma.pdf(M[j][-2], a = M[j][-1], scale = k[j]) 
       t2 = gamma.pdf(M[j][-2], a = hiper[j][0], scale = hiper[j][1]) * L(x, lista[1]) * gamma.pdf(M[j][-1], a = M[j][-2], scale = k[j])   

       teste = (t1/t2) 


      else: 

       M[j].append(np.random.gamma(shape = M[j][-1], scale = k[j])) 
       lista = [ [ M[l][-1] for l in thetas] , [ M[l][-1] if l!=j else M[l][-2] for l in thetas ] ] 
       t1 = gamma.pdf(M[j][-1], a = hiper[j][0], scale = hiper[j][1]) * L(x, lista[0]) * gamma.pdf(M[j][-2], a = M[j][-1], scale = k[j]) 
       t2 = gamma.pdf(M[j][-2], a = hiper[j][0], scale = hiper[j][1]) * L(x, lista[1]) * gamma.pdf(M[j][-1], a = M[j][-2], scale = k[j])   

       teste = (t1/t2) 

     if (min(1, teste) < np.random.uniform(low=0, high=1)) or (np.isinf(teste)) or (np.isnan(teste)): 
      M[j][-1] = M[j][-2] 
      contador[j].append(0) 
     else: 
      contador[j].append(1) 

    M = pd.DataFrame.from_dict(M) 
    contador = pd.DataFrame.from_dict(contador) 
    cont = contador.apply(sum) 
    print(cont) 

    return (M) 

N = int(input("Entre com o N: ")) 

MP = mcmc(N=N, x=temp) 

print(MP) 

私は解決できないエラーを生成します。

Traceback (most recent call last): 
    File "teste2.py", line 92, in <module> 
    MP = mcmc(N=N, x=temp) 
    File "teste2.py", line 71, in mcmc 
    t1 = gamma.pdf(M[j][-1], a = hiper[j][0], scale = hiper[j][1]) * L(x, lista[0]) * gamma.pdf(M[j][-2], a = M[j][-1], scale = k[j]) 
    File "teste2.py", line 40, in L 
    return fx(x,t) 
    File "teste2.py", line 32, in fx 
    prod *= ((t[0]/t[1])* exp(- (x[i]/t[1])) * exp(-t[0] * exp(-(x[i]/t[1])))) 
    File "/home/karlla/anaconda2/lib/python2.7/site-packages/pandas/core/series.py", line 78, in wrapper 
    "{0}".format(str(converter))) 
TypeError: cannot convert the series to <type 'float'> 

私はすでにインターネット上で見つかったいくつかのことを試みましたが、うまくいかなかったのです。誰も私がこれをどのように修正できるか知っていますか?

+0

2.0の構文に完全には慣れていませんが、 'fx(dados、[1、2])の代わりに ' fx(x = dados、t = [1,1] 1]) ' –

+0

私は完全なコードを書いています。 – user20273

+1

そして、読み込むコードが多すぎます。それは 'float(pd.Series())'を実行しようとしますが、 'float()'は実行できません。[mcve] – FTP

答えて

1

使用print()機能でデータをテストする

def fx(x, t): 
    prod = 1.0 

    print('x:', type(x), x) 
    print('t:', type(t), t) 

    for i in range(0, len(x)): 
     print('i:', i) 
     print('x[i]:', type(x[i]), x[i]) 
     #print('x[0][i]:', type(x[0][i]), x[0][i]) 

     a = t[0]/t[1] 
     print('a:', type(a), a) 

     b = -(x[i]/t[1]) 
     print('b:', type(b), b) 

     exp_b = exp(b) 
     print('exp(b):', type(exp_b), exp_b) 

     c = -t[0] 
     print('c:', type(c), c) 

     prod *= a * exp_b * exp(c * exp_b) 
     print('prod:', type(prod), prod) 

    print('exit fx') 
    return prod 

I don't know what you try to do so maybe my result is wrong.

あなたは2次元DataFrameを持っていますが、1次元list


としてそれを扱うので、それがpandasに問題があることを示していますxDataFrameです。

あなたはx[i]あなたはおそらく列のi番目の要素を期待しています - 他の言葉element in row number "i"でなく、パンダのためにそうx[0]はあなたの列が、全列(シリーズ)からの最初の要素を与えるものではありませんget column with number/name 'i'を意味x[i]をどの番号/名前で"0"。 (しかしlen(x)はあなたの行ではなく、列の数を与えると同時に)

のでx[i]Seriesであり、あなたは

exp(Series) 

を持っているとPythonはfloatSeriesを変換する方法を知らないと、あなたを取得しますエラー。

あなたが

def fx(x, t): 
    prod = 1.0 
    for i in range(len(x)): 
     a = t[0]/t[1] 
     b = -(x[0][i]/t[1]) 
     exp_b = exp(b) 
     c = -t[0] 
     prod *= a * exp_b * exp(c * exp_b) 
    return prod 

、より良い

def fx(x, t): 
    prod = 1.0 

    print('x:', type(x), x) 
    print('t:', type(t), t) 

    for i in range(len(x)): 
     print('i:', i) 
     print('x[0][i]:', type(x[0][i]), x[0][i]) 

     a = t[0]/t[1] 
     print('a:', type(a), a) 

     b = -(x[0][i]/t[1]) 
     print('b:', type(b), b) 

     exp_b = exp(b) 
     print('exp(b):', type(exp_b), exp_b) 

     c = -t[0] 
     print('c:', type(c), c) 

     prod *= a * exp_b * exp(c * exp_b) 
     print('prod:', type(prod), prod) 

    print('exit fx') 
    return prod 

短い `コラム "0" からi番目の要素を取得するx[0][i]が必要


- 後range(len())

def fx(x, t): 
    prod = 1.0 

    a = t[0]/t[1] 
    c = -t[0] 

    for val in x[0]: 
     b = -(val/t[1]) 
     exp_b = exp(b) 
     prod *= a * exp_b * exp(c * exp_b) 

    return prod 

なしこの機能には何の問題もありませんが、他にも問題がありますが、あなたが何をしようとしているのか分かりません。

+0

'Series'オブジェクトはnumpy配列のように振る舞うことができるので、ループは必要ありません。 –

+0

@PaulHはい、 'numpy'と' pandas'は強力ですが、私はOPがこの関数で何をしようとしたのか分かりませんので、問題を見つけてそれを記述しようとしました。 – furas

関連する問題