2015-05-22 2 views
1

Я получаю Typecast - Ошибка, когда я пытаюсь преобразовать строки unicode, анализируется с сайта. Вот соответствующие codebits:Python: ValueError: не удалось преобразовать строку в float:

# special IPython command to prepare the notebook for matplotlib 

%matplotlib inline 

from fnmatch import fnmatch 

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import requests 
from pattern import web 

# set some nicer defaults for matplotlib 
from matplotlib import rcParams 

#these colors come from colorbrewer2.org. Each is an RGB triplet 
dark2_colors = [(0.10588235294117647, 0.6196078431372549, 0.4666666666666667), 
       (0.8509803921568627, 0.37254901960784315, 0.00784313725490196), 
       (0.4588235294117647, 0.4392156862745098, 0.7019607843137254), 
       (0.9058823529411765, 0.1607843137254902, 0.5411764705882353), 
       (0.4, 0.6509803921568628, 0.11764705882352941), 
       (0.9019607843137255, 0.6705882352941176, 0.00784313725490196), 
       (0.6509803921568628, 0.4627450980392157, 0.11372549019607843), 
       (0.4, 0.4, 0.4)] 

rcParams['figure.figsize'] = (10, 6) 
rcParams['figure.dpi'] = 150 
rcParams['axes.color_cycle'] = dark2_colors 
rcParams['lines.linewidth'] = 2 
rcParams['axes.grid'] = True 
rcParams['axes.facecolor'] = '#eeeeee' 
rcParams['font.size'] = 14 
rcParams['patch.edgecolor'] = 'none' 

def get_poll_xml(id): 
    poll = requests.get("http://charts.realclearpolitics.com/charts/"+str(id)+".xml").text 
    return poll 

import re 

def _strip(s): 

    return re.sub(r'[\W_]+', '', s) 

def plot_colors(xml): 

    dom = web.Element(xml) 
    result = {} 
    for graph in dom.by_tag('graph'): 
     title = _strip(graph.attributes['title']) 
     result[title] = graph.attributes['color'] 
    return result 

def rcp_poll_data(xml): 
    dates = [] 
    graph1 = [] 
    graph2 = [] 
    data = web.Element(xml) 
    for item in data.by_tag('series')[0].by_tag('value'): 
     dates.append(item.content) 
    for item in data.by_tag('graph')[0].by_tag('value'): 
     graph1.append(float(unicode(item.content))) 
    for item in data.by_tag('graph')[1].by_tag('value'): 
     graph2.append(float(unicode(item.content))) 
    return pd.DataFrame({'Date': pd.to_datetime(dates), data.by_tag('graph')[0].title: graph1, data.by_tag('graph')[1].title: graph2}) 

Когда я выполняю этот codepart:

print rcp_poll_data(get_poll_xml(1044)) 

Тогда я получаю следующее сообщение об ошибке:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-8-76ebd15c4a1d> in <module>() 
----> 1 print rcp_poll_data(get_poll_xml(1044)) 

<ipython-input-7-02e6590229d7> in rcp_poll_data(xml) 
    53   dates.append(item.content) 
    54  for item in data.by_tag('graph')[0].by_tag('value'): 
---> 55   graph1.append(float(unicode(item.content))) 
    56  for item in data.by_tag('graph')[1].by_tag('value'): 
    57   graph2.append(float(unicode(item.content))) 

ValueError: could not convert string to float: 

Я уже пытался преобразовать непосредственно float(item.count) или через строка float(string(item.count)), но я всегда получаю ошибку типа ...

Если кто-то может помочь или может отправить меня в тему, где я могу найти решение, я был бы рад. Я не знаю, где искать ошибку.

Thx

+0

Можете ли вы попробовать распечатать значение 'item.content' и' unicode (item.content) 'перед строкой 55? – shruti1810

ответ

0

Я проверил the xml file вы восстановить в своем коде и обнаружил, что value элементов, начинающиеся с xid="1824" не имеют никакого содержания, так что вы получите пустую строку, которая бросает свою ошибку при попытке преобразовать его к поплавку. Решение состоит в том, чтобы проверить, что содержимое item.content не пустое до преобразования в float.

for item in data.by_tag('graph')[0].by_tag('value'): 
    if item.content: 
     graph1.append(float(unicode(item.content))) 

В цикле for, следуя приведенному выше, вы должны сделать такую ​​же коррекцию.

+0

Благодарим за быстрый ответ, который исправил его. –