Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

NOTEBOOKS TUTORIAL SAGEMATH

Views: 4549
%auto typeset_mode(True, display=False)
version()
SageMath version 7.5.beta0, Release Date: 2016-10-21
version()
'SageMath version 7.5.beta0, Release Date: 2016-10-21'

TRABALHANDO COM ARQUIVOS DE DADOS, CSV E DATAFRAMES

Arquivo de Dados (.DAT)

Um arquivo DAT é um arquivo de dados que é criado por um aplicativo de software e pode conter texto, imagens e outros tipos de dados. Um arquivo DAT pode ser usado como um backup para determinados tipos de arquivos e programas que podem ser restaurados mais tarde. Fonte: http://ptcomputador.com/

modos Descrição

r : Abre um arquivo somente para leitura. O ponteiro de arquivo é colocado no inicio do arquivo. Este é o modo padrão.

r+ : Abre um arquivo para leitura e escrita. O ponteiro de arquivo colocado no início do arquivo

w : Abre um arquivo somente para escrita. Substitui o arquivo se o arquivo existe. Se o arquivo não existir, cria um novo arquivo para a escrita.

w+ : Abre um arquivo para escrita e leitura. Substitui o arquivo existente se o arquivo existe. Se o arquivo não existir, cria um novo arquivo para leitura e escrita.

a+ : Abre um arquivo para ambos appending e leitura. O ponteiro do arquivo está no final do arquivo, se o arquivo existe. O arquivo é aberto no modo de acréscimo. Se o arquivo não existir, ele cria um novo arquivo para leitura e escrita.

Criação, Gravação e Leitura de Arquivos

Criando Arquivos de dados

SageMath assim como python, cria um arquivo ao tentar abrir um arquivo que não existe gravado no computador. A outra maneira é usando o comando %sh touch arquivo.dat ou !touch arquivo.dat.

# Criando com o comando touch do linux !touch arquivo.dat
# Criando o arquivo ao tentar abrir um arquivo que nao existe no disco arquivo_dados = open('arquivo.dat','w')
type(arquivo_dados)
<type 'file'>

Gravando dados

# abrir o arquivo. O modo 'ab+' permite leitura e gravação arquivo_dados = open('arquivo.dat','ab+')
# gravando uma string de dados no arquivo arquivo_dados.write('coisa') arquivo_dados.write('Eita, loucura!\n') # o '\n' salta uma linha arquivo_dados.write('Vai Brasil \n') arquivo_dados.write('level UP \n')
# Fechando o arquivo arquivo_dados.close()

Lendo arquivo

# Para ler direto o arquivo.dat gravado no disco, use o comando cat do linux !cat arquivo.dat
coisaEita, loucura! Vai Brasil level UP
# para ler atribuindo o conteúdo do arquivo a uma variável. arquivo_dados = open('arquivo.dat','a+')
# ler na forma de uma lista de dados arquivo_dados.readlines()
[coisaEita, loucura! , Vai Brasil , level UP ]

Se executar novamente vai aparecer vazio. Isto ocorre em funão do SageMath ler mais linhas do arquivo.

# sempre que abrir um arquivo este deve ser fechado arquivo_dados.close()

Se tentar ler a variável arquivo_dados ocorre erro pois o arquivo ja foi fechado. para evitar esse problema, atribua à leitura das linhas do arquivo uma variável. Ex:

var_linhas = arquivo_dados.readlines()

Acrescentar Dados ao Final do Arquivo

Abrir um arquivo para leitura e gravação (w+) inplica dizer que ao gravar novamente outros dados, pode ocorrer de perder todo o conteúdo gravado. Para evitar esse probmão, use o atributo a+ que permite gravar ao final do arquivo.

arquivo_dados = open('arquivo.dat','a+')
arquivo_dados.readlines()
[coisaEita, loucura! , Vai Brasil , level UP ]
# gravar dado arquivo_dados.write('8OMG')
arquivo_dados.close()
!cat arquivo.dat
coisaEita, loucura! Vai Brasil level UP 8OMG

Gravando dados numéricos em um arquivo texto

O comando write só grava dados de texto, para gravar dados numéricos temos que usar o numpy. Embora exista a possibilidade de usar a função 'pickle', os dados gravados no arquivo ficam de péssima visualização em um editor de textos.

import numpy as np np.savetxt('arquivo.txt', var_dados,fmt='%formato') np.loadtxt('arquivo.txt')

formato é a forma de apresentação dos dados:

i : inteiro f : float e : exponencial s : string
import numpy as np matriz = matrix([[1.01,2.5,3.9],[0.4,0.55,6.8],[7.0,8.0,9.89]]) np.savetxt('matriz_arquivo.txt', matriz,fmt='%f')
# testando np.loadtxt('matriz_arquivo.txt')
[[ 1.01 2.5 3.9 ] [ 0.4 0.55 6.8 ] [ 7. 8. 9.89]]
!cat matriz_arquivo.txt
1.010000 2.500000 3.900000 0.400000 0.550000 6.800000 7.000000 8.000000 9.890000

O problema com este código é que se outros dados forem salvos no arquivo, os dados anteriores serão apagados.

Acrescentando vários valores numéricos a um arquivo txt

Adaptado de Elton Lima (https://groups.google.com/d/msg/python-brasil/CohX4b9kuuU/OPtZrAP5AgAJ)
import numpy as np
matriz_1 = matrix([[9.0,9.0,9.0],[9.0,9.0,9.0],[9.0,9.0,9.0]]) arquivo = open('matriz_arquivo1.txt', 'ab+') np.savetxt(arquivo, matriz_1,fmt='%f') arquivo.close()
!cat matriz_arquivo1.txt
9.000000 9.000000 9.000000 9.000000 9.000000 9.000000 9.000000 9.000000 9.000000
matriz_2 = matrix([[1.0,1.0,1.0],[1.0,1.0,1.0],[1.0,1.0,1.0]]) arquivo = open('matriz_arquivo1.txt', 'ab+') np.savetxt(arquivo, matriz_2,fmt='%f') arquivo.close()
!cat matriz_arquivo1.txt
9.000000 9.000000 9.000000 9.000000 9.000000 9.000000 9.000000 9.000000 9.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
dados_matriz = np.loadtxt('matriz_arquivo1.txt') dados_matriz
[[ 9. 9. 9.] [ 9. 9. 9.] [ 9. 9. 9.] [ 1. 1. 1.] [ 1. 1. 1.] [ 1. 1. 1.]]

Agora podemos trabalhar com esses dados gravados em arquivo

# operações algebricas dados_matriz * 2
[[ 18. 18. 18.] [ 18. 18. 18.] [ 18. 18. 18.] [ 2. 2. 2.] [ 2. 2. 2.] [ 2. 2. 2.]]
# selecionar linhas ou elementos dados_matriz[5]
[ 1. 1. 1.]
dados_matriz[5,2]
1.01.0

Utilizando a forma de função

Adaptado de Elton Lima (https://groups.google.com/d/msg/python-brasil/CohX4b9kuuU/OPtZrAP5AgAJ)
import numpy as np matriz_1 = matrix([[9.0,9.0,9.0],[9.0,9.0,9.0],[9.0,9.0,9.0]]) matriz_2 = matrix([[1.0,2.0,3.0],[0.4,0.5,0.6],[7.0,8.0,9.0]]) def gravar_dados(arquivo, dados, atributo = "ab+"): with open(arquivo , atributo) as arquivo_txt: np.savetxt(arquivo_txt, dados, fmt='%f')
arquivo = "matriz_arquivo2.txt" gravar_dados(arquivo, matriz1) gravar_dados(arquivo, matriz2)
a = np.loadtxt(arquivo) a
[[ 9. 9. 9. ] [ 9. 9. 9. ] [ 9. 9. 9. ] [ 1. 2. 3. ] [ 0.4 0.5 0.6] [ 7. 8. 9. ]]
a*2
[[ 18. 18. 18. ] [ 18. 18. 18. ] [ 18. 18. 18. ] [ 2. 4. 6. ] [ 0.8 1. 1.2] [ 14. 16. 18. ]]

DataFrames

Os dataframes são objetos usados para guardar dados na forma de tabelas. Um data frame possui colunas nomeadas, sendo que todas as colunas possuem a mesma quantidade de linhas. DataFrame é a melhor forma de guardar informações pois além de manter uma boa formatação dos dados, ainda permite que seja gravado em arquivos do tipo CSV, que podem ser abertos e manipulados em softwares de planilha tipo excel ou calc.

O Pandas é uma biblioteca de software escrito para manipulação e análise de dados. Como diferencial, oferece estruturas e operações de dados para manipular tabelas numéricas e séries de tempo. Pandas é um software livre liberado sob a licença BSD. O nome é derivado do termo "dados em painel", um termo de econometria para conjuntos de dados estruturados multidimensionais.

Criar e Visualizar DataFrames

# Forma 1: import pandas as pd compC1 = pd.DataFrame() compC1['Nome_do_software'] = ['scilab','julia'] compC1['Ano'] = [2005,2012]
Error in lines 1-1 Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/smc_sagews/sage_server.py", line 968, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> ImportError: No module named pandas
compC1
Error in lines 1-1 Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/smc_sagews/sage_server.py", line 968, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> NameError: name 'compC1' is not defined
# Forma 2 (lista): import pandas as pd dados_lista = [['scilab','julia'],[2005,2012]] compC2 = pd.DataFrame(dados_lista, columns=['Nome_do_software', 'Ano'])
Error in lines 1-1 Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/smc_sagews/sage_server.py", line 968, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> ImportError: No module named pandas
compC2
Error in lines 1-1 Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/smc_sagews/sage_server.py", line 968, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> NameError: name 'compC2' is not defined
# Forma 3 (dicionário): import pandas as pd dados_dicionario = {'Nome_do_software' : ['scilab','julia'], 'Ano' : [2005,2012]} compC3 = pd.DataFrame(dados_dicionario)
compC3
Ano Nome_do_software
0 2005 scilab
1 2012 julia
# Forma 4: compC4 = pd.DataFrame({ 'Nome_do_software' : ['scilab','julia'], 'Ano' : [2005,2012] })
compC4
Ano Nome_do_software
0 2005 scilab
1 2012 julia

Outro Exemplo

# Nomes das colunas não podem ter espaço Softwares = pd.DataFrame() Softwares['Nome_do_software'] = ["Julia", "SageMath", "Maxima", "Octave","Maxima"] Softwares['Ano_de_lancamento'] = [2012, 2005, 1980, 2000, 1980] Softwares['Site'] = ["julialang.org","sagemath.org","maxima.org","gnu.org/octave", "maxima.org"] Softwares
Nome_do_software Ano_de_lancamento Site 0 Julia 2012 julialang.org 1 SageMath 2005 sagemath.org 2 Maxima 1980 maxima.org 3 Octave 2000 gnu.org/octave 4 Maxima 1980 maxima.org
# Visualizar cabeçalho das colunas Softwares
Nome_do_software Ano_de_lancamento Site
0 Julia 2012 julialang.org
1 SageMath 2005 sagemath.org
2 Maxima 1980 maxima.org
3 Octave 2000 gnu.org/octave
4 Maxima 1980 maxima.org
# saber os tipos dos elementos do dataframe. Aqui temos String (primeira coluna) e tipo Inteiro (segunda coluna) Softwares.Nome_do_software
0 Julia 1 SageMath 2 Maxima 3 Octave 4 Maxima Name: Nome_do_software, dtype: object
# informações sobre o dataframe Softwares.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 3 columns): Nome_do_software 5 non-null object Ano_de_lancamento 5 non-null object Site 5 non-null object dtypes: object(3) memory usage: 192.0+ bytes
Nome_do_software Ano_de_lancamento Site 0 Julia 2012 julialang.org 1 SageMath NaN sagemath.org 2 Maxima NaN maxima.org 3 Octave NaN gnu.org/octave 4 Maxima NaN maxima.org

Arquivos CSV

A melhor forma de trabalhar com dataframes é salva-los no formato "CSV". Comma-separated values (ou CSV) é um formato de arquivo que armazena dados tabelados, cujo grande uso data da época dos mainframes. Por serem bastante simples, os arquivos '.csv' são comuns em todas as plataformas de computador.

O CSV é um implementação particular de arquivos de texto separados por um delimitador, que usa a vírgula e a quebra de linha para separar os valores. O formato também usa as aspas em campos no qual são usados os caracteres reservados (vírgula e quebra de linha). Essa robustez no formato torna o CSV mais amplo que outros formatos digitais do mesmo segmento.Fonte: wikipedia.

Forma geral de um arquivo CSV na forma de texto:

nome_coluna_1 , nome_coluna_2 dado_0_col_1 , dado_0_col_2 dado_1_col_1 , dado_1_col_2

Uma forma prática de criar arquivos CSV é usando uma planilha (excel, calc-libreoffice/openoffice). Basta preencher os dados nas celulas e depois salvar como CSV.

Importar um Arquivo CSV

import pandas as pd nome_dataframe = pd.read_csv('arquivo.csv',index_col = 0)

coluna do index, corresponde a primeira coluna

import pandas as pd dataframesoft = pd.read_csv('Softwares1.csv',index_col = 0) dataframesoft
Error in lines 1-1 Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/smc_sagews/sage_server.py", line 968, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> ImportError: No module named pandas

Salvar dados em um Arquivo CSV

import pandas as pd # Nomes das colunas não podem ter espaço Softwares = pd.DataFrame() Softwares['Nome_do_software'] = ['Julia', 'SageMath', 'Maxima', 'Octave'] Softwares['Ano_de_lancamento'] = [2012, 2005, 1980, 2000] Softwares
Nome_do_software Ano_de_lancamento
0 Julia 2012
1 SageMath 2005
2 Maxima 1980
3 Octave 2000
# Salvando o dataframe em um Arquivo Softwares.to_csv('Softwares1.csv')
# Lendo os dados gravados no arquivo CSV gravado no disco pd.read_csv('Softwares1.csv',index_col=0)
Error in lines 1-1 Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/smc_sagews/sage_server.py", line 968, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> NameError: name 'pd' is not defined
# leitura direta %sh cat Softwares1.csv
,Nome_do_software,Ano_de_lancamento 0,Julia,2012 1,SageMath,2005 2,Maxima,1980 3,Octave,2000

Manipular Colunas, Linhas, Dados e Concatenar Dataframes

# Copia dataframe gravado em arquivo para variável dados1 import pandas as pd dados1 = pd.read_csv('dataframe.csv',index_col=0) dados1
Nome_do_software Ano
0 scilab 2005
1 julia 2012

Para adicionar uma nova coluna de dados ao DataFrame

# Adicionar uma nova coluna de dados dados1['Gostei'] = ['Sim', 'Sim'] dados1
Nome_do_software Ano Gostei
0 scilab 2005 Sim
1 julia 2012 Sim

Para deletar uma coluna

del nome_dataframe['nome_coluna1'], nome_dataframe['nome_coluna2'] nome_data_frame.pop('nome_coluna') ou nome_data_frame.pop(nome_dataframe.columns[indice_coluna]) nome_data_frame.drop(['nome_coluna1','nome_coluna2'],axis=1) para mais de uma coluna
del dados1['Gostei'], dados1['Ano'] dados1
Nome_do_software
0 scilab
1 julia
# deletar usando o pop dados1.pop(dados1.columns[0]) dados1
0 scilab 1 julia Name: Nome_do_software, dtype: object
0
1

Para alterar nome de uma coluna

nome_dataframe.rename(columns={'nome_coluna': 'novo_nome_coluna'})
dados1.rename(columns={"Nome_do_software": 'Soft_name'})
Soft_name Ano
0 scilab 2005
1 julia 2012

Para concatenar Dataframes

# Novo Dataframe import pandas as pd dados_novos = pd.DataFrame() dados_novos['Nome_do_sofware'] = ["octave","axiom"] dados_novos['Ano'] = [2000,1980] dados_novos
Nome_do_sofware Ano
0 octave 2000
1 axiom 1980
# Importanto o datafame gravado em arquivo CSV dados_data = pd.read_csv('dataframe.csv',index_col=0) dados_data
Nome_do_software Ano
0 scilab 2005
1 julia 2012
  • Horizontal

pd.concat([dados_novos, dados_data], axis = 1)
Nome_do_sofware Ano Nome_do_software Ano
0 octave 2000 scilab 2005
1 axiom 1980 julia 2012
  • Vertical

# veja que o indice aparece fora de ordem pd.concat([dados_novos, dados_data], axis = 0)
Ano Nome_do_software Nome_do_sofware
0 2000 NaN octave
1 1980 NaN axiom
0 2005 scilab NaN
1 2012 julia NaN
# o comando ignore_index = true coloca ordem no index pd.concat([dados_novos, dados_data], axis= 0 , ignore_index = True)
Ano Nome_do_software Nome_do_sofware
0 2000 NaN octave
1 1980 NaN axiom
2 2005 scilab NaN
3 2012 julia NaN

Adicionar Linhas

dados_data = pd.read_csv('dataframe.csv',index_col=0)

Para deletar linhas e linhas com dados repetidos

# deletar uma linha dados_data.drop([0])
Nome_do_software Ano
1 julia 2012
# deletar mais de uma linha dados_data.drop([0,1])
Nome_do_software Ano

Para ordenar os elementos de um Dataframe

dados_data.sort_index()
Nome_do_software Ano
0 scilab 2005
1 julia 2012

Renomear Index

dados_data
Nome_do_software Ano
0 scilab 2005
1 julia 2012
dados_data.index = ["Interpretado", "Compilado"] dados_data
Nome_do_software Ano
Interpretado scilab 2005
Compilado julia 2012

Visualizar Dados em um DataFrame

dataframesoft = pd.read_csv('Softwares1.csv',index_col = 0) dataframesoft
Nome_do_software Ano_de_lancamento
0 Julia 2012
1 SageMath 2005
2 Maxima 1980
3 Octave 2000
# Visualizando toda a primeira coluna dataframesoft['Nome_do_software']
0 Julia 1 SageMath 2 Maxima 3 Octave Name: Nome_do_software, dtype: object
# Visualizando toda a primeira coluna dataframesoft.Nome_do_software
0 Julia 1 SageMath 2 Maxima 3 Octave Name: Nome_do_software, dtype: object
# Visualizando toda a primeira coluna dataframesoft['Nome_do_software'][3]
Octave
# Visualizando toda a primeira coluna dataframesoft.Nome_do_software[3]
'Octave'
# Visualizar cabeçalho das colunas dataframesoft.columns
Index([u'Nome_do_software', u'Ano_de_lancamento'], dtype='object')
# total de dados do dataframe dataframesoft.size
8
# escolher um dado aletório dataframesoft.sample()
Nome_do_software Ano_de_lancamento 1 SageMath 2005
# numero de elementos dataframesoft.count()
Nome_do_software 4 Ano_de_lancamento 4 dtype: int64
# ver o conteúdo de uma linha dataframesoft.ix[2]
Nome_do_software Maxima Ano_de_lancamento 1980 Name: 2, dtype: object
# ver o conteúdo de várias linhas dataframesoft.ix[[1,2]]
Nome_do_software Ano_de_lancamento 1 SageMath 2005 2 Maxima 1980
#
<bound method DataFrame.rolling of Nome_do_software Ano_de_lancamento 0 Julia 2012 1 SageMath 2005 2 Maxima 1980 3 Octave 2000>

Filtro de dados

dataframesoft[dataframesoft > 2000]
Nome_do_software Ano_de_lancamento
0 Julia 2012.0
1 SageMath 2005.0
2 Maxima NaN
3 Octave NaN

Alterar Dados em um DataFrame

# abrir um dataframe gravado no disco para servir de base import pandas as pd dados_reta = pd.read_csv('dados_reta.csv')
Editar dados em uma DataFrame

Para editar um dado em um dataframe:

dataframe.nome_coluna[indice_dado] = novo_valor
dados_reta
x y 0 0.0 -0.183440 1 0.2 -0.131101 2 0.4 0.026888 3 0.8 0.110533 4 1.0 0.253945 5 1.2 0.257190 6 1.4 0.531889 7 1.6 0.579048 8 2.0 0.935181 9 2.2 0.916600 10 2.6 1.133286 11 2.8 1.268933 12 3.0 1.102029 13 3.4 1.133916
dados_reta.y[5] = 0 ; dados_reta.y[6] = 0 ; dados_reta
x y
0 0.0 -0.183440
1 0.2 -0.131101
2 0.4 0.026888
3 0.8 0.110533
4 1.0 0.253945
5 1.2 0.000000
6 1.4 0.000000
7 1.6 0.579048
8 2.0 0.935181
9 2.2 0.916600
10 2.6 1.133286
11 2.8 1.268933
12 3.0 1.102029
13 3.4 1.133916
Manipulação Algébrica

Com uma coluna de dados pode ser feita qualquer manipulação matemática. No exemplo, os dados da coluna de dados "x" serão multiplicados por 10.

dados_reta.y*10
0 -1.834404 1 -1.311012 2 0.268876 3 1.105327 4 2.539446 5 0.000000 6 0.000000 7 5.790482 8 9.351810 9 9.166003 10 11.332861 11 12.689333 12 11.020295 13 11.339162 Name: y, dtype: float64
# somando todo os elementos da coluna x sum(dados_reta.y)
7.9348968000363005
dados_reta.y.sum()
7.9348968000363005
# produto dos elementos da coluna y prod(dados_reta.y)
2.2146286331302067e-06
dados_reta.y.prod()
2.2146286331302067e-06
# potencia dos elementos dados_reta.y.pow(2)
0 0.033650 1 0.017188 2 0.000723 3 0.012217 4 0.064488 5 0.066147 6 0.282906 7 0.335297 8 0.874563 9 0.840156 10 1.284337 11 1.610192 12 1.214469 13 1.285766 Name: y, dtype: float64
# List Comprehensions [k^2 for k in dados_reta.y if k >= 1]
[1.2843373411737395, 1.6101916397432385, 1.2144689204631176, 1.2857658463717074]
Gráfico de dados
import pandas as pd dados_reta = pd.read_csv('dados_reta.csv') dados_reta
x y
0 0.0 -0.183440
1 0.2 -0.131101
2 0.4 0.026888
3 0.8 0.110533
4 1.0 0.253945
5 1.2 0.257190
6 1.4 0.531889
7 1.6 0.579048
8 2.0 0.935181
9 2.2 0.916600
10 2.6 1.133286
11 2.8 1.268933
12 3.0 1.102029
13 3.4 1.133916
point(zip(dados_reta.x,dados_reta.y),figsize=(4,3))

Aplicações

import pandas as pd

Um pesquisador deseja investigar todas as raízes das função f=x+x.2.sin(x)f = x + x.^2.*sin(x) num intervalo de 0 a 15.

# visualizar gráfico f = x + x^2*sin(x) plot(f, (x,0,15), figsize = (5,4), gridlines=True)
# Vetor de valores iniciais de X prox da raiz v = [(0,2),(2,4),(4,7),(8,10),(12,15)] # Dataframe que vai receber as raízes calculadas de tamanho 5. # O tipo dos dados são Array de Float64 Resultado1 = pd.DataFrame() Resultado1['Valor_x'] = [''] Resultado1['Raiz' ] = [''] Resultado1
Error in lines 2-2 Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/smc_sagews/sage_server.py", line 968, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> NameError: name 'pd' is not defined
# Vamos usar o find_root para calcular. for i in v: f.find_root(i[0],i[1])
0.0 3.4368289123266997 6.119024225042131 9.529904336449029 12.486196308339679
# outra forma like a python [f.find_root(i[0],i[1]) for i in v ]
[0.0, 3.4368289123266997, 6.119024225042131, 9.529904336449029, 12.486196308339679]

Outra forma usando Try except. Esta forma é interessante pois dá mais segurança ao código de tal forma que se a função não for contínua no intervalo será gerada uma exceção para este intervalo e o algoritmo continua.

# gerar os intervalos no formato de tupla intervalos=[(i, i+1) for i in range(0,20)] intervalos
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 19), (19, 20)]
raizes=[] for j in intervalos: a=j[0] b=j[1] try: root = find_root(f, a, b) except RuntimeError: continue raizes.append(root) print raizes
[0.0, 3.4368289123266766, 6.119024225042324, 9.529904336449029, 12.486196308339682, 15.771411695083252, 18.7963289139448]