I am working on the file "02-programs.ipynb".
The first task is:
This is an example of scope: the existence of variables, and their values, is restricted inside functions (and files).
You may note that above, we had a value of theta_d outside the function (from when we were working in the console), and a value of theta_d inside the function (as the input parameter). These do not have to match. If a variable is assigned a value inside the function then Python will take this "local" value. If not, Python will look outside the function. Two examples will illustrate this:
Can you write Python code for it?

x1 = 1.1

def print_x1():
    print(x1)

print(x1)
print_x1()

x2 = 1.2

def print_x2():
    x2 = 2.3
    print(x2)

print(x2)
print_x2()


I am working on the file "02-programs.ipynb".
The first task is:
This is effective for a single angle. If we want to repeat this for many angles, we could copy and paste the code. However, this is dangerous. We could make a mistake in editing the code. We could find a mistake in our original code, and then have to remember to modify every location where we copied it to. Instead we want to have a single piece of code that performs an action, and use that piece of code without modification whenever needed.
This is summarized in the "DRY" principle: do not repeat yourself. Instead, convert the code into a function and use the function.
We will define the function and show that it works, then discuss how:
Can you write Python code for it?

from math import pi

def degrees_to_radians(theta_d):
    """
    Convert an angle from degrees to radians.

    Parameters
    ----------

    theta_d : float
        The angle in degrees.

    Returns
    -------

    theta_r : float
        The angle in radians.
    """
    theta_r = pi / 180.0 * theta_d
    return theta_r


I am working on the file "02-programs.ipynb".
The first task is:
This is the same as the confusing case above, but now there is no ambiguity. Whilst it is good practice to match the order of the arguments to the function definition, it is only needed when you don't use the keywords. Using the keywords is always useful.
What if we said that we were going to assume that the gravitational field strength $g$ is nearly always going to be that of Earth, $9.8$ms${}^{-2}$? We can re-define our function using a default argument:
Can you write Python code for it?

def drop_time(height, speed, gravity=9.8):
    """
    Return how long it takes an object released from a height h,
    in a gravitational field of strength g, with initial vertical speed v,
    to hit the ground.

    Parameters
    ----------

    height : float
        Initial height h
    speed : float
        Initial vertical speed v
    gravity : float
        Gravitional field strength g

    Returns
    -------

    t : float
        Time the object hits the ground
    """

    return (speed + sqrt(speed**2 + 2.0*height*gravity)) / gravity


I am working on the file "02-programs.ipynb".
The first task is:
We can also access individual characters (starting from 0!), or a range of characters:
Can you write Python code for it?


I am working on the file "02-programs.ipynb".
The first task is:
We can convert numbers to strings using the str function.
Can you write Python code for it?


I am working on the file "02-programs.ipynb".
The first task is:
We can repeat strings using the * operator.
Can you write Python code for it?


I am working on the file "02-programs.ipynb".
The first task is:
We check that it works by printing the result for multiple angles:
Can you write Python code for it?


I am working on the file "02-programs.ipynb".
The first task is:
We see that variables are converted to their values (such as name and math.pi) and functions are called to get values (such as math.sin(x)), which are then converted to strings displayed on screen. However, functions (math.sin) and modules (math) are also "printed", in that a string saying what they are, and where they come from, is displayed.
Often we want to display useful information to the screen, which means building a message that is readable and printing that. There are many ways of doing this: here we will just look at the format command. Here is an example:
Can you write Python code for it?

print("Hello {}. We set x={}.".format(name, x))


I am working on the file "02-programs.ipynb".
The first task is:
You can put whatever you like in the docstring. The format used above in the degrees_to_radians function follows the numpydoc convention, but there are other conventions that work well. One reason for following this convention can be seen in spyder. Copy the function degrees_to_radians into the console, if you have not done so already. Then, in the top right part of the window, select the "Object inspector" tab. Ensure that the "Source" is "Console". Type degrees_to_radians into the "Object" box. You should see the help above displayed, but nicely formatted.
Going back to the function itself. After the comment, the code to convert from degrees to radians starts. Compare it to the original code typed directly into the console. In the console we had
python
from math import pi
theta_d = 30.0
theta_r = pi / 180.0 * theta_d
In the function we have
python
    theta_r = pi / 180.0 * theta_d
    return theta_r
The line
python
    from math import pi
is in the function file, but outside the definition of the function itself.
There are four differences.

The function code is indented by four spaces, or one tab.
The input parameter theta_d must be defined in the console, but not in the function. When the function is called the value of theta_d is given, but inside the function itself it is not: the function knows that the specific value of theta_d will be given as input.
The output of the function theta_r is explicitly returned, using the return statement.
The import statement is moved outside the function definition - this is the convention recommended by PEP8.

Aside from these points, the code is identical. A function, like a program, is a collection of Python statements exactly as you would type into a console. The first three differences above are the essential differences to keep in mind: the first is specific to Python (other programming languages have something similar), whilst the other differences are common to most programming languages.
Scope
Names used internally by the function are not visible externally....
Can you write Python code for it?


I am working on the file "02-programs.ipynb".
The first task is:
You can put whatever you like in the docstring. The format used above in the degrees_to_radians function follows the numpydoc convention, but there are other conventions that work well. One reason for following this convention can be seen in spyder. Copy the function degrees_to_radians into the console, if you have not done so already. Then, in the top right part of the window, select the "Object inspector" tab. Ensure that the "Source" is "Console". Type degrees_to_radians into the "Object" box. You should see the help above displayed, but nicely formatted.
You can put additional comments in your code - anything after a "#" character is a comment. The advantage of the docstring is how it can be easily displayed and built upon by other programs and bits of code, and the conventions that make them easier to write and understand.
Going back to the function itself. After the comment, the code to convert from degrees to radians starts. Compare it to the original code typed directly into the console. In the console we had
python
from math import pi
theta_d = 30.0
theta_r = pi / 180.0 * theta_d
In the function we have
python
    theta_r = pi / 180.0 * theta_d
    return theta_r
The line
python
    from math import pi
is in the function file, but outside the definition of the function itself.
There are four differences.

The function code is indented by four spaces, or one tab.
The input parameter theta_d must be defined in the console, but not in the function. When the function is called the value of theta_d is given, but inside the function itself it is not: the function knows that the specific value of theta_d will be given as input.
The output of the function theta_r is explicitly returned, using the return statement.
The import statement is moved outside the function definition - this is the convention recommended by PEP8.

Aside from these points, the code is identical. A function, like a program, is a collection of Python statements exactly as you would type into a console. The first three differences above...
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
A identidade mudou, isso significa que a variável a está referenciando outro objeto que foi criado quando executamos a += b.
Vamos ver agora um exemplo de objeto mutável:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Acessar atributos:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Classes
Vamos ver como é a sintaxe de definição de classes no Python, para isso vamos fazer alguns exemplos.
Começaremos por criar uma classe que representa um cão. Armazenaremos: o nome, a quantidade de patas, se o cão é carnívoro e se ele está nervoso.
Can you write Python code for it?

class Cão:
    qtd_patas = 4
    carnívoro = True
    nervoso = False

    def __init__(self, nome):
        self.nome = nome


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Como explicado na [py-intro] Aula 05 funções também são objetos. Na terminologia utilizada pelos livros isso quer dizer que, em Python, as funções são objetos de primeira classe ou cidadãos de primeira classe.
Can you write Python code for it?

def soma(a, b):
    """ retorna a + b """
    soma = a + b
    return soma

soma(1, 2)

soma


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Como não foi possível criar o número - por representar uma operação inválida (divisão por zero) para a linguagem - a variável c não foi atribuída a nenhum objeto:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Como vimos na aula dois do módulo de introdução strings são imutáveis e para alterar seu valor precisamos usar slicing:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Comparando a identidade de s antes e depois da mudança vemos que trata-se de objetos diferentes.
Variáveis
Variáveis são apenas referências para objetos, assim como acontece em Java. Variáveis são apenas rótulos (ou post-its) associados a objetos. Diferentemente de C ou Pascal as variáveis em Python não são caixas que armazenam objetos ou valores.
Por exemplo:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Lembrando mais uma vez que essas mudanças ocorrem somente na instância e não na classe:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Mesmo modificando a lista através da inserção e remoção de valores sua identidade continua a mesma.
Strings também são imutáveis:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Mudamos apenas o atributo nervoso da instância rex. O valor de Cão.nervoso continua o mesmo:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Métodos de instância, classe e estático
Por padrão os metódos de uma classe são métodos de instância (ou instance methods), isso significa que os métodos recebem, obrigatoriamente, uma instância da classe.
Como por exemplo:
Can you write Python code for it?

class ExemploInstancia:
    def metodo_instancia(self):
        print('Recebi {}'.format(self))


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Na primeira linha definimos uma classe de nome Cão.
Da segunda até a quarta linha definimos os atributos de classe qtd_patas, carnívoro, nervoso. Os atributos de classe representam dados que aparecem em todas as classes.
Na sexta linha definimos o inicializador (também pode ser chamado de construtor) que deve receber o nome do Cão.
Na última linha criamos o atributo da instância nome e associamos à string enviada para o construtor.
Vamos agora criar uma instância de Cão:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Não podemos acessar o nome, pois nome é um atributo que é associado somente a instâncias da classe.
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Não podemos chamar o método de instância somente com a classe:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Números são objetos:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
O dict também possui atributos de dados especiais como __class__, que armazena o nome da classe do objeto, e __doc__ que retém a docstring do objeto:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Podemos usar a função dir() para inspecionar os métodos e atributos do dict notas:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Podemos ver o bytecode que a função executa usando o módudlo dis (disassembly), enviando a função soma() como argumento da função dis.dis():
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Por fim também temos os métodos estáticos que funcionam como funções simples agregadas a objetos ou classes. Eles não recebem argumentos de forma automática:
Can you write Python code for it?

class Exemplo:
    @staticmethod
    def metodo_estático():
        print('Sou estátio e não recebo nada')

Exemplo.metodo_estático()


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Possuem métodos e atributos:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Precisamos criar uma instância para utilizá-lo:
Can you write Python code for it?

inst = ExemploInstancia()
inst.metodo_instancia()


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Só lembrando que os métodos especiais não devem ser chamados diretamente, os exemplos anteriores só servem para ilustrar o funcionamento e existência desses métodos. Caso você queira consultar a documentação de um objeto use a função help():
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Também podemos chamar o método a partir de uma instância dessa classe. Por ser um classmethod o método continuará a receber como argumento o objeto da classe e não a instância:
Can you write Python code for it?

inst = ExemploClasse()
inst.metodo_classe()


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Também podemos criar atributos dinamicamente para nossa instância rex:
Can you write Python code for it?

rex.sujo = True
rex.sujo

rex.idade = 5
rex.idade


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Tentamos concatenar o número 10 à string "1", porém uma exceção do tipo TypeError foi levantada dizendo que não foi possível converter um objeto int para str de forma implicita.
Em Javascript e PHP, linguagens que possuem tipagem fraca, não seria levantado uma exceção e o interpretador faria a conversão de um dos tipos. No Javascript (1.5) o resultado seria uma string "110" e no PHP (5.6) o número 11.
Aqui percebemos que a operação "1" + 10 pode produzir dois resultados: uma string ou um número. Conforme consta no Zen do Python: "In the face of ambiguity, refuse the temptation to guess" (Ao encontrar uma ambiguidade recuse a tentação de inferir) e é exatamente o que o Python faz: a linguagem recusa-se a inferir o tipo do resultado e levanta uma exceção.
Para fazermos esse exemplo funcionar precisamos converter os tipos explicitamente:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Tipagem dinâmica
Dizemos que uma linguagem possui tipagem dinâmica quando não é necessário especificar explicitamente os tipos das váriaveis. Os objetos possuem tipos, porém as variáveis podem referenciar objetos de quaisquer tipos. Verificações de tipos são feitas em tempo de execução e não durante a compilação.
Quando definimos uma função dobra(x) que retorna o valor recebido multiplicado por 2 podemos receber qualquer tipo de objeto como argumento:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Tipagem dos objetos
Tipagem forte
Os objetos em Python possuem tipagem forte, isso quer dizer que dificilmente são feitas conversões de tipos implícitas na realização de operações. Vamos ver alguns exemplos que ilustram esse conceito:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Tipos que não suportam multiplicação por inteiros levantarão exceção quando executados:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Vamos verificar a identidade dessa lista:
Can you write Python code for it?

id(lista)

lista.append(10)
lista.remove(2)
lista += [-4, -3]
lista

id(lista)


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
Vamos verificar seus atributos:
Can you write Python code for it?

rex.qtd_patas

rex.carnívoro

rex.nervoso

rex.nome


I am working on the file "02-python-oo/aula-01/Aula 01.ipynb".
The first task is:
sequências:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Agora vamos criar a classe GoldenRetriever como subclasse de cão. Os cachorros da raça golden retriever são conhecidos por serem muito inteligente e amigáveis. Seu nome retriever (pegador) por sua habilidade de pegar os alvos em jogos de caça sem danificá-los. Por esse motivo vamos implementar um método que permita os cães dessa raça pegar e devolver itens.
Can you write Python code for it?

class GoldenRetriever(Cão):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.itens = []

    def pega(self, item):
        """ busca/pega um item quando ordenado """
        self.itens.append(item)
        print('{} pegou {}'.format(self.nome, item))

    def devolve(self, item=None):
        """ devolve um item, caso o item não seja especificado retorna o último que pegou """
        if not self.itens:
            print('{} não está segurando item algum!'.format(self.nome))
            return

        if not item:
            item = self.itens.pop()
        elif item not in self.itens:
            print('{} não está segurando {}!'.format(self.nome, item))
            return
        else:
            self.itens.remove(item)
        print('{} devolve {}'.format(self.nome, item))
        return item


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Agora verificaremos o RedirectView.__mro__:
Can you write Python code for it?

from django.views.generic import RedirectView

RedirectView.__mro__


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Como vemos, o método chamado pela instância da classe D foi B.pong(), p|odemos chamar explicitamente C.pong() passando a instância como argumento explícito:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Devemos notar que usamos *args e **kwargs na definição da função (linha 2) para repassar a instanciação dos argumentos à classe Cão, dessa maneira se modificarmos esta classe e adicionarmos outros parâmetros, então GoldenRetriever também aceitará esses parâmetros, como podemos ver no seguinte exemplo que redefinimos a classe Cão:
Can you write Python code for it?

class Cão:
    qtd_patas = 4
    carnívoro = True
    nervoso = False

    def __init__(self, nome, data_nascimento=None):
        self.nome = nome
        self.data_nascimento = data_nascimento

    def latir(self, vezes=1):
        """ Latir do cão. Quanto mais nervoso mais late. """

        vezes += self.nervoso * vezes
        latido = 'Au! ' * vezes
        print('{}: {}'.format(self.nome, latido))


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
E herdam de Exception:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
E temos acesso aos métodos e atributos de GoldenRetriever:
Can you write Python code for it?

nana.itens

nana.pega('bola')

nana.itens

nana.devolve()

nana.devolve()


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Essa maneira de chamar métodos só é utilizando para resolver ambiguidade causada pela herança múltipla. O jeito recomendado de delegar chamadas de métodos a superclasses é usar a função embutida super(), pois é mais seguro e resistente a mudanças futuras, principalmente quando chamamos métodos em um framework ou em qualquer hierarquia de classes sobre a qual você não tenha controle.
Vamos ver como a função D.ping() se comporta:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Geralmente não precisamos sobreescreve métodos da superclasse Exception, pois muitas vezes criamos exceções para deixar o programa mais claro. Caso você queira criar um erro com novas funcionalidades consulte a documentação de Exception e a parte tutorial do python que fala sobre exceções.
Lidando com exceções
É possível escrever programas que lidem com exceções:
Can you write Python code for it?

a, b = 10, 0
a / b

try:
    a / b
except ZeroDivisionError:
    print('Olha a divisão por zero aí mano!')


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Linha 1: especificamos que a classe GoldenRetriever herda de Cão.
Linha 2: sobrescrevemos o construtor da superclasse.
Linha 3: repassamos os argumentos para o inicializador de Cão.
Linha 4: criamos um novo atributo itens às instâncias de GoldenRetriever
Por herdar da classe Cão a classe GoldenRetriever recebe todos os métodos e atributos do primeiro:
Can you write Python code for it?

nana = GoldenRetriever('Nana')
nana.nome

nana.nervoso

nana.carnívoro

nana.latir()

nana.latir(5)


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Para finalizar segue a lista de exceções padrão. A explicação de cada exceção está na documentação:
BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning
Herança múltipla
O Python oferece suporte a herança múltipla. A forma de usar herança múltipla é parecida com a herança simples, porém a subclasse herda de...
Can you write Python code for it?

class A:
    def ping(self):
        print('ping', self)

class B(A):
    def pong(self):
        print('pong', self)

class C(A):
    def pong(self):
        print('PONG', self)

class D(B, C):
    def ping(self):
        super().ping()
        print('post-ping:', self)

    def pingpong(self):
        self.ping()
        super().ping()
        self.pong()
        C.pong(self)

d = D()
d.pong()


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Para finalizar vamos criar a classe SãoBernardo que representa cães dessa mesma raça. Esta ficou famosa por diversos filmes de humor que passou dezenas de vezes em certo canal da TV aberta brasileira. Há lendas que dizem que, em países que nevam, o cão São Bernardo leva um pequeno barril de conhaque para resgatar viajantes perdidos na neve:
Can you write Python code for it?

class SãoBernardo(Cão):
    def __init__(self, *args):
        super().__init__(*args)
        self.doses = 10

    def servir(self):
        if self.doses == 0:
            raise ValueError("'Cabou a birita!")

        self.doses -= 1
        print('{} serve a birita (restam {} doses)'.format(self.nome, self.doses))

sansao = SãoBernardo('Sansão')
sansao.servir()

sansao.doses = 1
sansao.servir()

sansao.servir()


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Para verificar se o objeto é exatamente o tipo desejado é necessário usar a função embutida type():
Can you write Python code for it?

type(sansao) is SãoBernardo

type(sansao) is Cão

type(totó) is Cão


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Podemos criar nossas próprias exceções herdando de Exception:
Can you write Python code for it?

class MeuErro(Exception):
    pass

raise MeuErro('deu erro')


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Porém lidar com exceções dessa maneira não é recomendado, pois isso pode omitir o nome da exceção e mascarar erros reais! Um jeito melhor de trabalhar com exceções é tratar cada uma de uma maneira:
Can you write Python code for it?

b = "0"
try:
    a / b
except ZeroDivisionError:
    print('Não é possível dividir por 0')
except TypeError:
    print('Algum tipo está errado')

b = 0
try:
    a / b
except ZeroDivisionError:
    print('Não é possível dividir por 0')
except TypeError:
    print('Algum tipo está errado')


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Porém o tipo float não.
UML - Unified Modeling Language
O UML é um padrão de modelagem de software para diversos campos do desenvolvimento. O padrão possui diversos diagramas para expressar lógica de negócio e estrutura de programas. Para este curso veremos apenas Diagramas de Classe.
Vamos ver como fica o nosso código de cães em diagramas de classe:

A classe é representada por retângulo e é dividida por três partes:
1. Nome da classe
2. Atributos
3. Métodos
O símbolo antes dos métodos e atributos representa a visibilidade deles. Os símbolos e suas visibilidades são:
```
+ Público
Protegido
~ Pacote
- Privado
```
A seta vazada (existem 3 delas no exemplo) indicam relações de generalização e é usado para indicar se uma classe herda de outra.
Para esta aula iremos usar somente essa pequena parte do padrão de Diagrama de Classes, caso você queira saber mais pode ver este simples tutorial.
Exceptions
Antes de falar sobre herança múltipla, vamos falar primeiro sobre exceções. Exception é uma classe:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Precisamos recarregar a classe GoldenRetriever para ela herdar da nova superclasse:
Can you write Python code for it?

class GoldenRetriever(Cão):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.itens = []

    def pega(self, item):
        """ busca/pega um item quando ordenado """
        self.itens.append(item)
        print('{} pegou {}'.format(self.nome, item))

    def devolve(self, item):
        """ devolve um item, caso o item não seja especificado retorna o último que pegou """
        if not self.itens:
            raise ValueError('{} não está segurando item algum!'.format(self.nome))

        if item not in self.itens:
            raise ValueError('{} não está segurando {}!'.format(self.nome, item))

        self.itens.remove(item)
        print('{} devolve {}'.format(self.nome, item))
        return item

    def devolve_ultimo(self):
        if not self.itens:
            raise ValueError('{} não está segurando item algum!'.format(self.nome))

        return self.itens.pop()

from datetime import date

totó = GoldenRetriever('Totó', date(2016, 4, 4))
totó.data_nascimento

print(totó.data_nascimento)

fido = GoldenRetriever('Fido')
print(fido.data_nascimento)


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Primeiro foi chamado D.ping() que chama A.ping() e imprime post-ping
Depois foi chamado super().ping() que chama somente A.ping()
Foi chamado super().pong() que chamou B.pong()
E, por fim, C.pong(self) foi chamado diretamente, passando a instância de D.
Agora que entendemos como esse exemplo do problema do diagrama é rodado, podemos falar sobre como o Python resolve essa ambiguidade: percorrendo o grafo de herança de uma forma específica: o MRO - Method Resolution Order ou Ordem de Resolução dos Métodos.
O Python procura o método na própria classe, depois em cada superclasse (sem repetição, caso exista haja sobreposição na hierarquia) da esquerda para a direita, depois procura nas superclasses da superclasses da esquerda para direita até chegar a object (herdado por todas as classes).
Todos os objetos das classes possuem um atributo chamado __mro__ que apresenta uma tupla de referências às superclasses na ordem MRO, da classe atual até a classe object. Vamos ver qual é o MRO da classe D:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Python não tem suporte "nativo" a sobrecarga de métodos de mesmo nome. Isso se dá pois a linguagem possui outros métodos de emular essa funcionalidade, como: argumentos padrão e empacotamento de argumentos posicionais e nomeados.
No exemplo anterior, o método GoldenRetriever.devolve() poderia ser escrito com dois metódos: um que não recebe item GoldenRetriever.devolve(self) e outro que recebe um item GoldenRetriever.devolve(self, item). Isso não foi necessário, pois usamos argumento padrão.
Mas, se analisarmos a função devolve com cuidado logo percebemos que ela faz duas coisas diferentes - assim como em uma lista temos os métodos list.pop() e list.remove() e não somente um list.remove() que funciona para todos os casos. Seguindo as melhores práticas de programação seria melhor escrever duas funções diferentes para isso:
Can you write Python code for it?

class GoldenRetriever(Cão):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.itens = []

    def pega(self, item):
        """ busca/pega um item quando ordenado """
        self.itens.append(item)
        print('{} pegou {}'.format(self.nome, item))

    def devolve(self, item):
        """ devolve um item, caso o item não seja especificado retorna o último que pegou """
        if not self.itens:
            raise ValueError('{} não está segurando item algum!'.format(self.nome))

        if item not in self.itens:
            raise ValueError('{} não está segurando {}!'.format(self.nome, item))

        self.itens.remove(item)
        print('{} devolve {}'.format(self.nome, item))
        return item

    def devolve_ultimo(self):
        if not self.itens:
            raise ValueError('{} não está segurando item algum!'.format(self.nome))

        return self.itens.pop()


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Spoiler: o tipo bool é derivado do tipo int. (veremos mais sobre isso na aula sobre python data model)
Can you write Python code for it?


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Também é possível multiplicar múltiplas exceções a serem tratadas:
Can you write Python code for it?

b = "0"
try:
    a / b
except (ZeroDivisionError, TypeError):
    print('Erro: tem que ver isso daí')


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Vamos brincar um pouco com o cão:
Can you write Python code for it?

rex = Cão('Rex')
rex.qtd_patas

rex.nome

rex.latir()

rex.latir(5)

rex.nervoso

rex.nervoso = True
rex.latir()

rex.latir(10)


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
Vamos testar a nova funcionalidade:
Can you write Python code for it?

toto = GoldenRetriever('Totó')
toto.nome

toto.itens

toto.pega('chinelo')

toto.pega('bola')

toto.itens

toto.devolve_ultimo()

toto.devolve('meia')

toto.devolve('chinelo')

toto.devolve_ultimo()


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
d.ping() chamou a função A.ping() (que imprimiu ping) e imprimiu post-ping
Agora vamos analisar as chamadas do método pingpong:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-02/Aula 02.ipynb".
The first task is:
É possível especificar uma variável para ser atribuída a uma exceção levantada e melhorar o tratamento do erro:
Can you write Python code for it?

a = {}
try:
    print(a['chave'])
except KeyError as exc:
    print(type(exc))  # imprime o tipo da exceção
    print(exc.args)  # mostra a tupla de argumentos que a exceção recebeu
    print(exc)  # imprime diretamente os argumento


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Agora que sabemos disso fica claro que, para nosso vetor ser desempacotado precisamos torná-lo iterável. Para isso podemos definir o método __iter__ que deve retornar um iterador:
```py
...
class Vetor:
    ...
def __iter__(self):
    return iter((self.x, self.y))

```
Nesse método definimos uma tupla composta pelos atributos x e y da instância do Vetor e retornamos o iterador da dessa tupla.
Essa implementação funciona, porém podemos usar geradores para deixar esse método mais simples e eficiente:
```py
...
class Vetor:
    ...
def __iter__(self):
    yield self.x; yield self.y

```
Para entender essa implementação é necessário conhecer o funcionamento de geradores, que veremos numa aula futura.
As operações que implementamos para nosso vetor não o alteram, mesmo quando usamos operadores acumulados:
Can you write Python code for it?

from exemplos.vetor2 import Vetor

v = Vetor(1, 2)
v, id(v)


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Antes de implementar essa funcionalidade precisamos entender como funciona o desempacotamento de sequências: o objeto a direita é iterado e cada variável a esquerda é atribuída ao item resultante dessa iteração.
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Ao invés disso:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Aproveitando o método __call__ que definimos podemos sortear chamado o objeto tombola sem chamar o método tombola.sorteia():
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Chamar geradores retorna objetos geradores que executam o código definido
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Classes
Can you write Python code for it?

class Foo:
    def bar(self):
        print('também posso ser chamado!')


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Comparação de vetores por valor:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
E nossa função o __add__ cria um novo objeto. Como queremos que nossa TombolaExpansivel seja mutável, precisamos definir o método __iadd__ para modificar a instância.
Aproveitando que vamos mexer no __iadd__ podemos melhorar nossa tombola para receber item de qualquer iterável e não somente de Tombola e suas subclasses:
Can you write Python code for it?

class TombolaExpansivel(Tombola):
    def __add__(self, other):
        if isinstance(other, Tombola):
            return TombolaExpansivel(self.inspeciona() + other.inspeciona())
        else:
            return NotImplemented

    def __iadd__(self, outro):
        if isinstance(outro, Tombola):
            outro_iteravel = outro.inspeciona()
        else:
            try:
                outro_iteravel = iter(outro)
            except TypeError:
                msg = "operando da direita no += deve ser {!r} ou um iterável"
                raise TypeError(msg.format(type(self).__name__))
        self.carrega(outro_iteravel)
        return self


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
E se saber quantas cartas há no baralho:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Ele é iterado uma vez e o resultado da iteração é atribuído a primeira variável:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Enumerá-lo!!!111!!!onze!!11!
Can you write Python code for it?

for carta in enumerate(baralho):
    print(carta)


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Essa classe VetorMutavel pode ser implementada da seguinte maneira:
```py
class VetorMutavel(Vetor):
def __iadd__(self, outro):
    if isinstance(outro, Vetor):
        self.x += outro.x
        self.y += outro.y
        return self
    return NotImplemented

def __imul__(self, outro):
    if isinstance(outro, Real):
        self.x *= outro
        self.y *= outro
        return self
    return NotImplemented

```
Emulando tipos chamáveis
Chamáveis são os tipos que podem ser chamados ou invocados quando escrevemos seu nome seguido por parentesis e podem receber argumentos. São chamáveis:

Funções:
Can you write Python code for it?

def chamavel():
    print('posso ser chamado')

chamavel()

type(chamavel)


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Essa comparação deveria retornar False, não levantar uma exceção. Podemos corrigir esse problema da seguinte maneira:
```py
import math
from numbers import Number
class Vetor:
    ...
def __eq__(self, outro):
    if isinstance(outro, Vetor):
        return self.x == outro.x and self.y == outro.y
    else:
        return NotImplemented

```
Agora podemos comparar Vetor com outros tipos:
Can you write Python code for it?

from exemplos.vetor2 import Vetor

Vetor(1, 3) == 8

Vetor(-2, 3) == [1, 2, 3]


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Esse exemplo usou a classe Vetor demonstrada a seguir, que implementa as operações demonstradas por meio dos métodos especiais __repr__, __abs__, __add__, __bool__, __eq__, __sub__ e __mul__:
```py
"""
Arquivo: 02-python-oo/aula-03/exemplos/vetor.py
Implementa um vetor bidimensional
"""
import math
class Vetor:
    def init(self, x=0, y=0):
        self.x = x
        self.y = y
def __repr__(self):
    return 'Vetor({!r}, {!r})'.format(self.x, self.y)

def __abs__(self):
    return math.hypot(self.x, self.y)

def __add__(self, v2):
    return Vetor(self.x + v2.x, self.y + v2.y)

def __bool__(self):
    return bool(self.x or self.y)

def __eq__(self, v2):
    return self.x == v2.x and self.y == v2.y

def __sub__(self, v2):
    return Vetor(self.x - v2.x, self.y - v2.y)

def __mul__(self, scalar):
    return Vetor(self.x * scalar, self.y * scalar)

```
O método __repr__ é responsável por retornar a representação do objeto para inspeção. Esse valor é usado no modo interativo e em debugers. Caso esse método não seja sobrescrito será exibido algo como <Vetor object at 0x123e9230>.
A representação do objeto é obtido a partir da função embutida repr(). É uma boa prática usar !r para obter a representação dos atributos do objeto, pois mostra a diferença fundamental entre Vector(1, 2) e Vector('1', '2') - a última não funcionará, pois os argumentos do construtor devem ser número e não str.
Também há o método __str__ que é utilizado para exibir o valor do objeto para o usuário final. Para entender melhor a diferença consulte esta thread do stack overflow que foi muito bem respondida pelos pythonistas Alex Martelli e Martijn Peters.
Esse exemplo contém alguns problemas:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Geradores:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Misturando:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Na linha 3 verificamos se o objeto somado é uma instância de Tombola, isso permite que nossa TombolaExpansivel seja somada com Tombola e todas suas subclasses:
Can you write Python code for it?

tombola_exp = TombolaExpansivel(range(1, 11))
tombola_exp.inspeciona()


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
No exemplo anterior tentamos multiplicar um int por um Vetor, porém foi levantada uma exceção já que o tipo int não sabe multiplicar por Vetor. Apenas Vetor sabe multiplicar por escalar.
Para resolver esse problema precisamos antes entender como funciona x * y:
1. Se x tiver x.__mul__, chama x.__mul__(y) e devolve o resultado a menos que seja NotImplemented
2. Se x não tiver x.__mul__, ou sua chamada devolver NotImplemented, verifica se y possui __rmul__, chama y.__rmul__(x) e devolve o resultado, a menos que seja NotImplemented
3. Se y não tiver __rmul__, ou sua chamada devolver NotImplented, levanta TypeError com uma mensagem unsupported operand type(s)
O método __rmul__ é chamado de versão refletida, reversa ou direita (do inglês right) de __mul__.
Para corrigir precisamos adicionar o método __rmul__ à clase Vetor:
```py
import math
class Vetor:
    ...
def __mul__(self, escalar):
    return Vetor(self.x * escalar, self.y * escalar)

def __rmul__(self, outro):
    return self * outro

```
Porém, ao adicionar esse código acontece outro problema:
Can you write Python code for it?

from exemplos.vetor2 import Vetor

Vetor(1, 2) * Vetor(2, 4)


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
O desempacotamento facilita ainda mais nossa vida se tivessemos uma lista de vetores:
Can you write Python code for it?

from random import randint

lista_vetores = [Vetor(x=randint(-10, 10), y=randint(-10, 10)) for _ in range(5)]
lista_vetores


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
O objeto permanece o mesmo, seu valor que é alterado.
Matemáticamente não faz muito sentido ter um vetor mutável, mas para entendermos melhor esses conceitos vamos fazer um VetorMutável, como subclasse de Vetor, que altere o valor do vetor quanto as operações += e *= forem usadas implementando os métodos __iadd__ e __imul__:
Can you write Python code for it?

from exemplos.vetor2 import VetorMutavel

vm = VetorMutavel(2, 3)
vm, id(vm)

vm += VetorMutavel(-1, 4)
vm, id(vm)

vm *= -2
vm, id(vm)


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Os operadores "aritméticos" (como +, * etc.) também podem ser aplicados a outros objetos para realizar operações que fazem sentido a esse objetos. Como por exemplo em listas e strings, em que o operador + realiza a concatenação:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Para mostrar como isso funciona vamos implementar uma tombola expansível que torne possível juntar os itens dessa tombola com outra tombola ou um iterável.
Vamos definir o método __add__ para permitir a "soma" de tombolas:
Can you write Python code for it?

class TombolaExpansivel(Tombola):
    def __add__(self, other):
        if isinstance(other, Tombola):
            return TombolaExpansivel(self.inspeciona() + other.inspeciona())
        else:
            return NotImplemented


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Podemos acessar as cartas do baralho por índice:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Podemos fazer verificações booleanas com o vetor:
Can you write Python code for it?

if v1:
    print('v1 existe e possui valor')

if not Vetor(0, 0):
    print('vetor não possui valor')
else:
    print('alguma coisa deu errado')


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Podemos somar a instância de TombolaExpansivel com Tombola e suas subclasses:
Can you write Python code for it?

outra_tombola = tombola_exp + Tombola(range(11, 21))
outra_tombola.inspeciona()

mais_tombolas = tombola_exp + TombolaExpansivel(range(11, 16))
mais_tombolas.inspeciona()


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Podemos somar vetores usando o operador +:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Sobrescrevendo o método __add__ já é possível usar a soma atribuída, porém haverá um problema indesejado:
Can you write Python code for it?

id(tombola_exp), tombola_exp.inspeciona()

tombola_exp += Tombola(range(11, 16))
id(tombola_exp), tombola_exp.inspeciona()


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Sorteando 5 cartas (pode haver repetição):
Can you write Python code for it?

mao = [choice(baralho) for _ in range(5)]
mao


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Sorteando um item da maneira clássica:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Sorteio de cartas usando o módulo random:
Can you write Python code for it?

from random import choice

choice(baralho)

choice(baralho)

choice(baralho)


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Usar o operador de subtração:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Valor absoluto (distância do vetor até a origem):
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Vamos criar nossa tombola que armazena os números de 1 a 20:
Can you write Python code for it?


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Vemos que as identidades dos objetos atribuidos a tombola_exp são diferentes. Isso por que a atribuição acumulada, por padrão, na verdade faz:
Can you write Python code for it?

tombola_exp = tombola_exp + Tombola(range(16, 21))

tombola_exp.inspeciona()


I am working on the file "02-python-oo/aula-03/Aula 03.ipynb".
The first task is:
Verificaremos seus itens:
Can you write Python code for it?


I am working on the file "02-rErVofVBAPandVBIPandMDAPonCircle.ipynb".
The first task is:
It seems that the vectors do not indicate the same directions: only the $\boldsymbol r_\mathrm{V}$ vector is perfectly controlled. Alternatively to VBAP, VBIP could be done, which just takes the square roots of the panning gains obtained from VBAP, before normalization.
Can you write Python code for it?

for n in range(0,Npts):
    gn=vectorpan(xys[:,n],xyls,qh.simplices)
    gn=np.abs(gn)
    # new line inserted just for VBIP:
    gn=np.sqrt(gn)
    gn/=np.sqrt(np.sum(gn))
    g[:,n]=gn

p3=figure(title="r vector direction VBIP",plot_width=300,plot_height=250)
p4=figure(title="r vector width VBIP",plot_width=300,plot_height=250,x_range=[-180,180],y_range=[0,100])

r=r_vector(g,phils)
mr=np.sqrt(np.sum(r**2,0))
p3.line(phis*180/np.pi,np.arctan2(r[0,:],r[1,:])*180/np.pi,legend_label="rV",line_width=2)
p4.line(phis*180/np.pi,2*np.arccos(mr)*180/np.pi,legend_label="2acos||rV||",line_width=2)
r=r_vector(g**2,phils)
mr=np.sqrt(np.sum(r**2,0))
p3.line(phis*180/np.pi,np.arctan2(r[0,:],r[1,:])*180/np.pi,legend_label="rE",color="red",line_width=2)
p4.line(phis*180/np.pi,2*np.arccos(mr)*180/np.pi,legend_label="2acos||rE||",color="red",line_width=2)
p3.legend.location="top_left"
p4.legend.background_fill_alpha = 0.5
show(p3)
show(p4)


I am working on the file "02-rErVofVBAPandVBIPandMDAPonCircle.ipynb".
The first task is:
This vector model is now applied on an example using 5 equally spaced loudpeaker on the horizon and panning for all directions from $-180^\circ\dots180^\circ$. It shows again the directions and widths displayed by $\boldsymbol r_\mathrm{V,E}$.
Can you write Python code for it?

from scipy.spatial import ConvexHull
from bokeh.plotting import figure, output_file, show
from bokeh.io import output_notebook

L=5
Npts=200
phils=np.arange(0,L)*2*np.pi/L
xyls=np.array([np.cos(phils),np.sin(phils)])
phis=np.linspace(-np.pi*0.99,np.pi,Npts)
xys=np.array([np.cos(phis),np.sin(phis)])
g=np.zeros([L,Npts])
qh=ConvexHull(xyls.T)
for n in range(0,Npts):
    gn=vectorpan(xys[:,n],xyls,qh.simplices)
    gn=np.abs(gn)
    gn/=np.sqrt(np.sum(gn))
    g[:,n]=gn

output_notebook()
p1=figure(title="r vector direction VBAP",plot_width=300,plot_height=250)
p2=figure(title="r vector width VBAP",plot_width=300,plot_height=250,x_range=[-180,180],y_range=[0,100])

r=r_vector(g,phils)
mr=np.sqrt(np.sum(r**2,0))
p1.line(phis*180/np.pi,np.arctan2(r[0,:],r[1,:])*180/np.pi,legend_label="rV",line_width=2)
p2.line(phis*180/np.pi,2*np.arccos(mr)*180/np.pi,legend_label="2acos||rV||",line_width=2)
r=r_vector(g**2,phils)
mr=np.sqrt(np.sum(r**2,0))
p1.line(phis*180/np.pi,np.arctan2(r[0,:],r[1,:])*180/np.pi,legend_label="rE",color="red",line_width=2)
p2.line(phis*180/np.pi,2*np.arccos(mr)*180/np.pi,legend_label="2acos||rE||",color="red",line_width=2)
p1.legend.location="top_left"
p2.legend.background_fill_alpha = 0.5
show(p1)
show(p2)


I am working on the file "02-rErVofVBAPandVBIPandMDAPonCircle.ipynb".
The first task is:
Vector measures for arbitrarily many loudspeakers
The vector measures are easily extended to more than 2 loudspeakers, i.e., to
\begin{equation}
\boldsymbol{r}\mathrm{V}=
\frac{\sum{l=1}^\mathrm{L}g_l\,\boldsymbol\theta_l}{\sum_{l=1}^\mathrm{L}g_l},
\qquad\qquad
\boldsymbol{r}\mathrm{E}=
\frac{\sum{l=1}^\mathrm{L}g_l^2\,\boldsymbol\theta_l}{\sum_{l=1}^\mathrm{L}g_l^2}.
\end{equation}
Can you write Python code for it?

def r_vector(g,theta):
    L=theta.size
    thx=np.sin(theta[:])
    thy=np.cos(theta[:])
    rx=np.dot(thx,g).T
    ry=np.dot(thy,g).T
    normalizer=sum(g,0)
    rx/=normalizer
    ry/=normalizer
    return np.array([rx,ry])


I am working on the file "02-randomization.ipynb".
The first task is:
Complete Random Assignment
If, instead, we'd like to assign exactly $m$ of $N$ units to the treatment group, we can use complete random assignment. Here, as before, each unit has an identical probability of being assigned to the treatment group. Gerber and Green describe three ways to implement complete random assignment:

randomly select units until there are $m$ of them in the treatment group
enumerate all of the possible ways to select $m$ of $N$ units and randomly select one of those allocations
randomly order the $N$ units and select the first $m$

Let's show examples for the second and third approaches.
Enumerate
There are
$$\frac{n!}{r!(n - r)!} = \frac{10!}{5!5!} = 252$$
possible ways to select 5 of 10 units.
We can enumerate these combinations using the itertools module.
Can you write Python code for it?

from math import factorial

possible_combinations = factorial(10) / (factorial(5) * factorial(10 - 5))

import random
from itertools import combinations

# enumerate the possible ways to select m of N units
enumerated = list(combinations(range(10), 5))

# randomly select one of those allocations
random.seed(42)
select = random.randint(0, possible_combinations-1)
treatment = enumerated[select]
print(list(treatment))


I am working on the file "02-randomization.ipynb".
The first task is:
Here, using the seed of 42, units 1, 3, 4, 5, and 8 get assigned to the treatment group.
Randomly Order
Can you write Python code for it?

units = list(range(10))
random.seed(42)
random.shuffle(units)
units[:5]


I am working on the file "02-randomization.ipynb".
The first task is:
This counts the number of successes—think of "success" as being assigned to the treatment group—in 10 independent trials, where success occurs 50% of the time.
Each time you run the cell above, you'll get a different result—it's not always 5! This is a drawback of simple random assignment.

[Y]ou could flip a coin to assign each of 10 [units] to the treatment condition, but there is only a 24.6% chance of ending up with exactly 5 [units] in treatment and 5 in control (Gerber and Green, 2012)

So that others may reproduce our assignments, we can use a random seed. This is highly recommended, though, in practice, we won't use np.random.binomial(). (Note: I'll always use 42 as the seed.)
Can you write Python code for it?


I am working on the file "02-trees/exercise.ipynb".
The first task is:
As we see, bootstrapping samples tends to keep almost constant (on average) the amount of correlation of the predictions from different trees within the randon forest. On the other hand, not bootstrapping tends to increase the correlation as "max_features" increase.
BaggingClassifier
Can you write Python code for it?

# # BaggingClassifier

# from sklearn.ensemble import RandomForestClassifier

# param_range = range(1,X.shape[1])

# list_mean_corr_rfc = []
# list_std_corr_rfc = []
# list_mean_corr_rfc_no_bootstrap = []
# list_std_corr_rfc_no_bootstrap = []

# for mf in param_range:

#     rfc = RandomForestClassifier(n_estimators = 100, n_jobs=-1, max_features=mf)
#     rfc_no_bootstrap = RandomForestClassifier(n_estimators = 100, n_jobs=-1, bootstrap=False, max_features=mf)

#     corr_rfc = corr_from_trees(rfc, X_train, y_train, X_test)
#     corr_rfc_no_bootstrap = corr_from_trees(rfc_no_bootstrap, X_train, y_train, X_test)

#     mean_corr_rfc = np.mean(corr_rfc, axis=0)
#     std_corr_rfc = np.std(corr_rfc, axis=0)
#     mean_corr_rfc_no_bootstrap = np.mean(corr_rfc_no_bootstrap, axis=0)
#     std_corr_rfc_no_bootstrap = np.std(corr_rfc_no_bootstrap, axis=0)

#     list_mean_corr_rfc.append(mean_corr_rfc)
#     list_std_corr_rfc.append(std_corr_rfc)
#     list_mean_corr_rfc_no_bootstrap.append(mean_corr_rfc_no_bootstrap)
#     list_std_corr_rfc_no_bootstrap.append(std_corr_rfc_no_bootstrap)

# list_mean_corr_rfc = np.array(list_mean_corr_rfc)
# list_std_corr_rfc = np.array(list_std_corr_rfc)
# list_mean_corr_rfc_no_bootstrap = np.array(list_mean_corr_rfc_no_bootstrap)
# list_std_corr_rfc_no_bootstrap = np.array(list_std_corr_rfc_no_bootstrap)

# plt.plot(param_range, list_mean_corr_rfc, label='Bootstrap True', lw=4, color='forestgreen')
# plt.plot(param_range, list_mean_corr_rfc + list_std_corr_rfc, param_range, list_mean_corr_rfc - list_std_corr_rfc, alpha=0.5, ls="--", color='forestgreen')
# plt.plot(param_range, list_mean_corr_rfc_no_bootstrap, label='Bootstrap False', lw=4, color='darkviolet')
# plt.plot(param_range, list_mean_corr_rfc_no_bootstrap + list_std_corr_rfc_no_bootstrap, param_range, list_mean_corr_rfc_no_bootstrap - list_std_corr_rfc_no_bootstrap, alpha=0.5, ls="--", color='darkviolet')

# plt.xlabel("Max features")
# plt.ylabel("Correlation between trees")

# plt.legend(loc='best')


I am working on the file "02-trees/exercise.ipynb".
The first task is:
Question 1
Correlation between trees. This question is about investigating the correlation between decision trees and how this effects an ensemble constructed from them. There are three methods
for adding randomisation to the tree growing process:

grow each tree on a bootstrap sample
for each tree select a subset of features at random
pick the best random split point

You can use RandomForestClassifier, BaggingClassifier, and ExtraTreesClassifier to achieve various different sets of the above three strategies.
Show how the average amount of correlation between the trees in the ensemble varies as a function of bootstrap yes/no, number of max_features, and picking the best split point at random or not.
Pick one of the classification datasets from http://scikit-learn.org/stable/modules/classes.html#module-sklearn.datasets.
Can you write Python code for it?

from scipy.stats import pearsonr

def corr_from_trees(classifier, X_train, y_train, X_test):
    clf_fit = classifier.fit(X_train, y_train)
    num_est = len(clf_fit.estimators_)
    siz = int(num_est*(num_est-1)/2)
    corr_array = np.zeros(siz)
    for i in range(num_est):
        # Calculate the prediction from the i-th tree of the forest
        pr_i = clf_fit.estimators_[i].predict(X_test)
        for j in range(i+1,num_est):
            pr_j = clf_fit.estimators_[j].predict(X_test)
            # Calculate the Pearson correlation coefficient between the predictions of trees i and j
            indx_corr_array_i_j = k = int((num_est*(num_est-1)/2) - (num_est-i)*((num_est-i)-1)/2 + j - i - 1)
            corr_array[indx_corr_array_i_j] = pearsonr(pr_i, pr_j)[0]

    return corr_array

# Load the dataset and split it in training and test set

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.model_selection import validation_curve
from sklearn.model_selection import StratifiedKFold

diabetes = load_diabetes()

X = diabetes.data
y = diabetes.target

# unused
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=66)


I am working on the file "02-trees/exercise.ipynb".
The first task is:
Question 2
Compare the feature importances calculated by a RandomForestClassifier, ExtraTreesClassifier and GradientBoostedTreesClassifier on the digits dataset. You might have to tune n_estimators to get good performance. Which parts of the images is the most important and do you agree with the interpretation of the classifiers? (Bonus) Do the importances change if you change to problem to be a classification problem of odd vs even digit?
You can load the data set with: http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html#sklearn.datasets.load_digits
Can you write Python code for it?


I am working on the file "02-widgets-answers.ipynb".
The first task is:
Add to the funtion to allow amplitude to be varied and add in an additional slider to vary both f and a
Hint you might want to limit the magnitude of 'y' in the plot - look up matplotlib
Can you write Python code for it?

def pltsin(f,a):
    plt.plot(x,a * sin(2*pi*x*f))

interact(pltsin, f=(1, 10, 0.1), a=(1, 10, 0.1))


I am working on the file "02-widgets-answers.ipynb".
The first task is:
Climate data
Can you write Python code for it?

f=Dataset('ncep-data/air.sig995.2013.nc')

air=f.variables['air'] #get variable

plt.imshow(air[364,:,:])  #display first timestep

def sh(time):
    plt.imshow(air[time,:,:])

#now make it interactive

interact(sh, time=(0,364,1))

# Browse variable

def sh(var='air', time=0):
    f=Dataset ('ncep-data/'+var+'.sig995.2013.nc')
    vv=f.variables[var]
    plt.imshow(vv[time,:,:])

# Give a list of varibles

variabs= ['air','uwnd','vwnd','rhum']

# Now interact with it

interact(sh, time=(0,355,1), var=variabs)

# Browse variable

def sh(var='air', year="2013", time=0):
    f=Dataset ('ncep-data/'+var+'.sig995.'+year+'.nc')
    vv=f.variables[var]
    plt.imshow(vv[time,:,:])

# Create a list of years

years= [str(x) for x in range (2013,2016)]
years = ['2013', '2014', '2015']

# Give a list of varibles

variabs= ['air','uwnd','vwnd','rhum']

# Now interact with it

interact(sh, time=(0,355,1), var=variabs, year=years)


I am working on the file "02. Linear Regression.ipynb".
The first task is:
Based on the visualization about, we can see that there is a positive relationship between pizza diameter and price.
Training a Simple Linear Regression Model
We use scikit-learn to train our first model
Can you write Python code for it?

from sklearn.linear_model import LinearRegression

# Training Data
# X is the explanatory variable data structure
X = [[6], [8], [10], [14], [18]]

# Y is the response variable data structure
y = [[7], [9], [13], [17.5], [18]]

# Create and fil the model
model = LinearRegression()

# Fit the model to the training data
model.fit(X, y)

# Make a prediction about how much a 12 inch pizza should cost
test_X = [12]
prediction = model.predict(test_X)

print 'A 12\" pizza should cost: $%.2f' % prediction[0]


I am working on the file "02. Linear Regression.ipynb".
The first task is:
Now that we can clearly see the prediction error (in red) made by our model (in blue), it's important to quantify the overall error through a formal definition of residual sum of squares.
We do this by summing the squared residuals for all of our training examples (we square the residuals because we don't care whether the error is in the positive or negative direction).
$$RSS = \sum_{i=1}^n\big(y_{i} - f(x_{i})\big)^2 $$
Where:
- $y_{i}$ is the observed value
- $f(x_{i})$ is the predicted value.
A related measure of model error is mean squared error, which is simply the mean of the residuals:
$$MSE = \dfrac{1}{n}\sum_{i=1}^n\big(y_{i} - f(x_{i})\big)^2 $$
Let's go ahead and implement RSS and MSE using numpy:
Can you write Python code for it?

import numpy as np
rrs = np.sum((model.predict(X) - y) ** 2)
mse = np.mean((model.predict(X) - y) ** 2)

print 'Residual sum of squares: %.2f' % rrs
print 'Mean squared error: %.2f' % mse


I am working on the file "02. Linear Regression.ipynb".
The first task is:
The sklearn.linear_model.LinearRegression class is an estimator. Given a new value of the explanatory variable, estimators predict a response value. All estimators have the fit() and predict() methods
fit() is used to learn the parameters of a model, while predict() predicts the value of a response variable given an explanatory variable value.
The mathematical specification of a simple regression model is the following:
$${y} = \alpha+ \beta{x}$$
Where:
- ${y}$: The predicted value of the response variable. In this case, the price of the pizza.
- ${x}$: The explanatory variable. In this case, the diameter of the pizza in inches.
- $\alpha$: The y-intercept term.
- $\beta$: The coefficient term (i.e. the slope of the line).
Can you write Python code for it?

# instantiate a pyplot figure object
plt.figure()

# re-plot a scatter plot
plt.title('Figure 2. Pizza price plotted against diameter')
plt.xlabel('Diameter in inches')
plt.ylabel('Price in dollars')
plt.plot(X, y, 'k.')
plt.axis([0, 25, 0, 25])
plt.grid(True)

# create the line of fit
line_X = [[i] for i in np.arange(0, 25)]
line_y = model.predict(line_X)
plt.plot(line_X, line_y, '-b')
plt.show()


I am working on the file "02. Linear Regression.ipynb".
The first task is:
Training a model to learn the values of the parameters for simple linear regression to create the best unbiased estimator is called ordinary least squares or linear least squares. To get a better idea of what "best unbiased estimator" is estimating in the first place, let's define what is needed to fit a model to training data.
Evaluating the Fitness of a Model with a Cost Function
How do we know that the parameter values specified by a particular model is doing well or poorly? In other words, how can we assess which parameters produced the best-fitting regression line?
Cost Function / Loss Function
The cost function or loss function provides a function that measures the error of a model. In order to find the best-fitting regression line, the goal is to minimize the sum of the differences between the predicted prices and the corresponding observed prices of the pizzas in the training set, also known as residuals or training errors.
We can visualize the residuals by drawing a vertical line from the observed price and the predicted price. Fortunately, matplotlib provides the vlines() that takes the x, ymin, and ymax arguments to draw a vertical line on a plot. We re-create Figure 2 but with the residuals this time.
Can you write Python code for it?

# instantiate a pyplot figure object
plt.figure()

# re-plot a scatter plot
plt.title('Figure 3. Pizza price plotted against diameter')
plt.xlabel('Diameter in inches')
plt.ylabel('Price in dollars')
plt.plot(X, y, 'k.')
plt.axis([0, 25, 0, 25])
plt.grid(True)

# create the line of fit
line_X = [[i] for i in np.arange(0, 25)]
line_y = model.predict(line_X)
plt.plot(line_X, line_y, '-b')

# create residual lines
for x_i, y_i in zip(X, y):
    plt.vlines(x_i[0], y_i[0], model.predict(x_i), colors='r')

plt.show()


I am working on the file "02. Parte 2/09. Clase 9/09Class NB (diego-pc's conflicted copy 2017-09-20).ipynb".
The first task is:
2. Uso de Pandas para descargar datos de precios de cierre
Bajar datos en forma de función
Can you write Python code for it?

def get_historical_closes(ticker, start_date, end_date):
    p = web.DataReader(ticker, "yahoo", start_date, end_date).sort_index('major_axis')
    d = p.to_frame()['Adj Close'].reset_index()
    d.rename(columns={'minor': 'Ticker', 'Adj Close': 'Close'}, inplace=True)
    pivoted = d.pivot(index='Date', columns='Ticker')
    pivoted.columns = pivoted.columns.droplevel(0)
    return pivoted


I am working on the file "02. Parte 2/09. Clase 9/09Class NB (diego-pc's conflicted copy 2017-09-20).ipynb".
The first task is:
Nota: Para descargar datos de la bolsa mexicana de valores (BMV), el ticker debe tener la extensión MX.
Por ejemplo: MEXCHEM.MX, LABB.MX, GFINBURO.MX y GFNORTEO.MX.
3. Formulación del riesgo de un portafolio
Can you write Python code for it?

def calc_daily_returns(closes):
    return np.log(closes/closes.shift(1))[1:]

daily_returns=calc_daily_returns(closes)
daily_returns.plot(figsize=(8,6));

mean_daily_returns = pd.DataFrame(daily_returns.mean(),columns=['Mean'],index=daily_returns.columns)
mean_daily_returns

cov_matrix = daily_returns.cov()
cov_matrix

#robust_cov_matrix= pd.DataFrame(skcov.EmpiricalCovariance().fit(daily_returns).covariance_,columns=daily_returns.columns,index=daily_returns.columns)
#robust_cov_matrix= pd.DataFrame(skcov.EllipticEnvelope().fit(daily_returns).covariance_,columns=daily_returns.columns,index=daily_returns.columns)
#robust_cov_matrix= pd.DataFrame(skcov.MinCovDet().fit(daily_returns).covariance_,columns=daily_returns.columns,index=daily_returns.columns)
robust_cov_matrix= pd.DataFrame(skcov.ShrunkCovariance().fit(daily_returns).covariance_,columns=daily_returns.columns,index=daily_returns.columns)
robust_cov_matrix


I am working on the file "02. Parte 2/09. Clase 9/09Class NB.ipynb".
The first task is:
2. Uso de Pandas para descargar datos de precios de cierre
Bajar datos en forma de función
Can you write Python code for it?


I am working on the file "02. Parte 2/09. Clase 9/09Class NB.ipynb".
The first task is:
4. Optimización de portafolios
Can you write Python code for it?

num_portfolios = 25000
r=0.0001
results = np.zeros((3+len(assets),num_portfolios))
for i in range(num_portfolios):
    #Pesos
    weights = np.array(np.random.random(4))
    weights /= np.sum(weights)

    #Rendimiento y volatilidad
    portfolio_return = mean_daily_returns.T.dot(weights) * 252
    portfolio_std_dev = np.sqrt(np.dot(weights.T,np.dot(robust_cov_matrix, weights))) * np.sqrt(252)

    #Resultados
    results[0,i] = portfolio_return
    results[1,i] = portfolio_std_dev
    #Sharpe
    results[2,i] = (results[0,i]-r) / results[1,i]
    #Iteraciones
    for j in range(len(weights)):
        results[j+3,i] = weights[j]

results_frame = pd.DataFrame(results.T,columns=(['Rendimiento','SD','Sharpe']+list(daily_returns.columns)))

#Sharpe Ratio
max_sharpe_port = results_frame.iloc[results_frame['Sharpe'].idxmax()]
#Menor SD
min_vol_port = results_frame.iloc[results_frame['SD'].idxmin()]

plt.scatter(results_frame.SD,results_frame.Rendimiento,c=results_frame.Sharpe,cmap='RdYlBu')
plt.xlabel('Volatility')
plt.ylabel('Returns')
plt.colorbar()
#Sharpe Ratio
plt.scatter(max_sharpe_port[1],max_sharpe_port[0],marker=(5,1,0),color='r',s=1000);
#Menor SD
plt.scatter(min_vol_port[1],min_vol_port[0],marker=(5,1,0),color='g',s=1000);

pd.DataFrame(max_sharpe_port)

pd.DataFrame(min_vol_port)


I am working on the file "02. Parte 2/09. Clase 9/09Class NB.ipynb".
The first task is:
Nota: Para descargar datos de la bolsa mexicana de valores (BMV), el ticker debe tener la extensión MX.
Por ejemplo: MEXCHEM.MX, LABB.MX, GFINBURO.MX y GFNORTEO.MX.
3. Formulación del riesgo de un portafolio
Can you write Python code for it?


I am working on the file "02. Parte 2/10. Clase 10/10Class NB.ipynb".
The first task is:
2. Uso de Pandas para descargar datos de precios de cierre
Bajar datos en forma de función
Can you write Python code for it?


I am working on the file "02. Parte 2/10. Clase 10/10Class NB.ipynb".
The first task is:
Nota: Para descargar datos de la bolsa mexicana de valores (BMV), el ticker debe tener la extensión MX.
Por ejemplo: MEXCHEM.MX, LABB.MX, GFINBURO.MX y GFNORTEO.MX.
3. Formulación del riesgo de un portafolio
Can you write Python code for it?

def calc_daily_returns(closes):
    return np.log(closes/closes.shift(1))[1:]

daily_returns=calc_daily_returns(closes)
daily_returns

daily_returns_b=calc_daily_returns(closes)
yb=0.000001
daily_returns_b['BOND']=yb*np.ones(daily_returns.index.size)
daily_returns_b

mean_daily_returns = pd.DataFrame(daily_returns.mean(),columns=['Mean'],index=daily_returns.columns)
mean_daily_returns

mean_daily_returns_b = pd.DataFrame(daily_returns_b.mean(),columns=['Mean'],index=daily_returns_b.columns)
mean_daily_returns_b

cov_matrix = daily_returns.cov()
cov_matrix

daily_returns.corr().stack().sort_values(axis=0, ascending=True, kind='quicksort')

cov_matrix_b = daily_returns_b.cov()
cov_matrix_b

#robust_cov_matrix= pd.DataFrame(skcov.EmpiricalCovariance().fit(daily_returns).covariance_,columns=daily_returns.columns,index=daily_returns.columns)
#robust_cov_matrix= pd.DataFrame(skcov.EllipticEnvelope().fit(daily_returns).covariance_,columns=daily_returns.columns,index=daily_returns.columns)
#robust_cov_matrix= pd.DataFrame(skcov.MinCovDet().fit(daily_returns).covariance_,columns=daily_returns.columns,index=daily_returns.columns)
robust_cov_matrix= pd.DataFrame(skcov.ShrunkCovariance().fit(daily_returns).covariance_,columns=daily_returns.columns,index=daily_returns.columns)
robust_cov_matrix

robust_cov_matrix_b= pd.DataFrame(np.insert((np.insert(skcov.ShrunkCovariance().fit(daily_returns).covariance_,len(assets),0,axis=0)),len(assets),0,axis=1)
,columns=daily_returns_b.columns,index=daily_returns_b.columns)
robust_cov_matrix_b


I am working on the file "02. Parte 2/11. Clase 11/11Class NB.ipynb".
The first task is:
Inclusión de un bono
Can you write Python code for it?

results_frame_optim_b = portfolio_func.optimal_portfolio_b(daily_returns,10000,r,0.000001)

#Sharpe Ratio
max_sharpe_port_optim_b = results_frame_optim_b.iloc[results_frame_optim_b['Sharpe'].idxmax()]
#Menor SD
min_vol_port_optim_b = results_frame_optim_b.iloc[results_frame_optim_b['SD'].idxmin()]

pd.DataFrame(max_sharpe_port_optim_b)

pd.DataFrame(min_vol_port_optim_b)

#Markowitz
plt.scatter(results_frame_optim_b.SD,results_frame_optim_b.Returns,c=results_frame_optim_b.Sharpe,cmap='RdYlBu');
plt.xlabel('Volatility')
plt.ylabel('Returns')
plt.colorbar()
#Sharpe Ratio
plt.scatter(max_sharpe_port_optim_b[1],max_sharpe_port_optim_b[0],marker=(5,1,0),color='r',s=1000);
#SD
plt.scatter(min_vol_port_optim_b[1],min_vol_port_optim_b[0],marker=(5,1,0),color='g',s=1000);


I am working on the file "02. Parte 2/12. Clase 12/12Class NB.ipynb".
The first task is:
1. Gráficos del Pay Off de opciones Call y Put europeas
En primer lugar, para poder bajar precios y información sobre opciones de Yahoo, es necesario cargar algunos paquetes de Python. En este caso, el paquete principal será Pandas. También, se usarán el Scipy y el Numpy para las matemáticas necesarias y, el Matplotlib y el Seaborn para hacer gráficos de las series de datos.
Can you write Python code for it?

def call_payoff(ST, K):
    return max(0, ST-K)

call_payoff(25, 30)

def call_payoffs(STmin, STmax, K, step=1):
    maturities = np.arange(STmin, STmax+step, step)
    payoffs = np.vectorize(call_payoff)(maturities, K)
    df = pd.DataFrame({'Strike': K, 'Payoff': payoffs}, index=maturities)
    df.index.name = 'Precio de maduración'
    return df

call_payoffs(10,25,15)

def plot_call_payoffs(STmin, STmax, K, step=1):
    payoffs = call_payoffs(STmin, STmax, K, step)
    plt.ylim(payoffs.Payoff.min() - 10, payoffs.Payoff.max() + 10)
    plt.ylabel("Payoff")
    plt.xlabel("Precio de maduración")
    plt.title('Payoff call, Precio strike={0}'.format(K))
    plt.xlim(STmin, STmax)
    plt.plot(payoffs.index, payoffs.Payoff.values);

plot_call_payoffs(10, 25, 15)

def put_payoff(ST, K):
    return max(0, K-ST)

put_payoff(25, 30)

def put_payoffs(STmin, STmax, K, step=1):
    maturities = np.arange(STmin, STmax+step, step)
    payoffs = np.vectorize(put_payoff)(maturities, K)
    df = pd.DataFrame({'Strike': K, 'Payoff': payoffs}, index=maturities)
    df.index.name = 'Precio de maduración'
    return df

put_payoffs(10,25,15)

def plot_put_payoffs(STmin, STmax, K, step=1):
    payoffs = put_payoffs(STmin, STmax, K, step)
    plt.ylim(payoffs.Payoff.min() - 10, payoffs.Payoff.max() + 10)
    plt.ylabel("Payoff")
    plt.xlabel("Precio de maduración")
    plt.title('Payoff put, Precio strike={0}'.format(K))
    plt.xlim(STmin, STmax)
    plt.plot(payoffs.index, payoffs.Payoff.values);

plot_put_payoffs(10, 25, 15)

def call_pnl_buyer(ct, K, STmin, STmax, step = 1):
    maturities = np.arange(STmin, STmax+step, step)
    payoffs = np.vectorize(call_payoff)(maturities, K)
    df = pd.DataFrame({'Strike': K, 'Payoff': payoffs, 'Prima': ct, 'PnL': payoffs-ct}, index=maturities)
    df.index.name = 'Precio de maduración'
    return df

call_pnl_buyer(12, 15, 10, 35)

def call_pnl_seller(ct, K, STmin, STmax, step = 1):
    maturities = np.arange(STmin, STmax+step, step)
    payoffs =...


I am working on the file "02. Parte 2/12. Clase 12/12Class NB.ipynb".
The first task is:
2. Gráficos de estrategias
Ejemplo (Hull) Un inversionista adquiere en $\$3$ una opción de compra a tres meses con un precio de ejercicio de $\$30$, y vende en $\$1$ una opción de compra a tres meses con un precio de $\$35$. El beneficio derivado de esta estrategia de diferencial alcista es de $\$5$ si el precio de la acción esta por encima de $\$35$ y de cero si está por debajo de $\$30$. Si el precio de la acción está entre $\$30$ y $\$35$, el beneficio es la cantidad en la cual el precio de ejercicio excede a $\$30$. El costo de la estategia es de $\$2$, por tanto la utilidad es de
Un inversionista adquiere en $\$3$ una opción de compra a tres meses con un precio de ejercicio de $\$30$
Can you write Python code for it?

plot_pnl(call_pnl_buyer(3, 30, 25, 40), "call", "comprador")


I am working on the file "02. Parte 2/12. Clase 12/12Class NB.ipynb".
The first task is:
Vende en $\$1$ una opción de compra a tres meses con un precio de $\$35$
Can you write Python code for it?

plot_pnl(call_pnl_seller(1, 35, 25, 40), "call", "comprador")

def bull_call(ct_short, K_short, ct_long, K_long, STmin, STmax, step = 1):
    maturities = np.arange(STmin, STmax+step, step)
    payoffs_cl = np.vectorize(call_payoff)(maturities, K_long)
    payoffs_cs = np.vectorize(call_payoff)(maturities, K_short)
    df = pd.DataFrame({'Strike': K_long, 'Payoff': payoffs_cs, 'Prima': ct_long-ct_short, 'PnL': payoffs_cl-ct_long+(ct_short-payoffs_cs)}, index=maturities)
    df.index.name = 'Precio de maduración'
    return df


I am working on the file "02. Parte 2/13. Clase 13/.ipynb_checkpoints/05Class NB-checkpoint.ipynb".
The first task is:
1. Uso de Pandas para descargar datos de precios de cierre
Ahora, en forma de función
Can you write Python code for it?


I am working on the file "02. Parte 2/13. Clase 13/.ipynb_checkpoints/05Class NB-checkpoint.ipynb".
The first task is:
Una vez cargados los paquetes, es necesario definir los tickers de las acciones que se usarán, la fuente de descarga (Yahoo en este caso, pero también se puede desde Google) y las fechas de interés. Con esto, la función DataReader del paquete pandas_datareader bajará los precios solicitados.
Nota: Usualmente, las distribuciones de Python no cuentan, por defecto, con el paquete pandas_datareader. Por lo que será necesario instalarlo aparte. El siguiente comando instala el paquete en Anaconda:
*conda install -c conda-forge pandas-datareader *
Can you write Python code for it?

data=get_historical_closes(['AA','AAPL','AMZN','MSFT','KO','NVDA', '^GSPC'], '2011-01-01', '2016-12-31')
closes=data[['AA','AAPL','AMZN','MSFT','KO','NVDA']]
sp=data[['^GSPC']]
closes.plot(figsize=(8,6));


I am working on the file "02. Parte 2/13. Clase 13/.ipynb_checkpoints/06Class NB-checkpoint.ipynb".
The first task is:
2. Generador congruencial lineal
Can you write Python code for it?


I am working on the file "02. Parte 2/13. Clase 13/.ipynb_checkpoints/06Class NB-checkpoint.ipynb".
The first task is:
3. Método de Box-Muller
Can you write Python code for it?

def bm(n):
    m=2**31-1
    a=16807
    c=0
    seed=2**30
    x = np.zeros(n+1)
    x[0]=seed
    for i in range(1,n+1):
        x[i] = (a * x[i-1]+c)%m
    u=x[1:]/m
    u1=u[:int((n/2))]
    u2=u[int(n/2):]
    nn=np.concatenate((np.sqrt(-2*np.log(1-u1))*np.cos(2*np.pi*u2), np.sqrt(-2*np.log(1-u1))*np.sin(2*np.pi*u2)),axis=0)
    return nn

y=bm(100000)
sns.distplot(y, color="b", fit=stats.norm);


I am working on the file "02. Parte 2/13. Clase 13/.ipynb_checkpoints/06Class NB-checkpoint.ipynb".
The first task is:
Ejemplo
Can you write Python code for it?


I am working on the file "02. Parte 2/13. Clase 13/.ipynb_checkpoints/06Class NB-checkpoint.ipynb".
The first task is:
Generado Randu (Usado por IBM)
Can you write Python code for it?

x=lcg(10000, m=2**31, a=2**16+3, c=0, seed=3)
sns.distplot(x, color="b", fit=stats.uniform);


I am working on the file "02. Parte 2/13. Clase 13/.ipynb_checkpoints/06Class NB-checkpoint.ipynb".
The first task is:
Generador mínimo estándar
Can you write Python code for it?

x=lcg(10000)
sns.distplot(x, color="b", fit=stats.uniform);


I am working on the file "02. Parte 2/13. Clase 13/.ipynb_checkpoints/07Class NB-checkpoint.ipynb".
The first task is:
2. Modelo normal para los rendimientos
Can you write Python code for it?

mu=daily_returns.mean().AAPL
sigma=daily_returns.std().AAPL
ndays = 360
ntraj=10
dates=pd.date_range('20170101',periods=ndays)
simret = pd.DataFrame(sigma*np.random.randn(ndays,ntraj)+mu,index=dates)
simret

simdata=(data.loc['2016-12-30',:].AAPL)*np.exp(simret.cumsum())
simdata

simdata.plot(figsize=(8,6));

pd.concat([data,simdata]).plot(figsize=(8,6));


I am working on the file "02. Parte 2/13. Clase 13/.ipynb_checkpoints/07Class NB-checkpoint.ipynb".
The first task is:
3. Simulación usando el histograma de los rendimientos
Can you write Python code for it?

ndays = 360
ntraj=10
#
values,indices=np.histogram(daily_returns,bins=250)
values=values.astype(np.float32)
weights=values/np.sum(values)
ret=np.random.choice(indices[1:],ndays*ntraj,p=weights)
#
dates=pd.date_range('20170101',periods=ndays)
simret = pd.DataFrame(ret.reshape((ndays,ntraj)),index=dates)
simret

simdata=(data.loc['2016-12-30',:].AAPL)*np.exp(simret.cumsum())
simdata

pd.concat([data,simdata]).plot(figsize=(8,6));

kde = KernelDensity(kernel='gaussian', bandwidth=0.001).fit(daily_returns)
ndays = 360
ntraj=10
#
ret=kde.sample(n_samples=ndays*ntraj, random_state=None)
#
dates=pd.date_range('20170101',periods=ndays)
simret = pd.DataFrame(ret.reshape((ndays,ntraj)),index=dates)
simret

simdata=(data.loc['2016-12-30',:].AAPL)*np.exp(simret.cumsum())
simdata

pd.concat([data,simdata]).plot(figsize=(8,6));


I am working on the file "02. Parte 2/13. Clase 13/13Class NB.ipynb".
The first task is:
2. Modelo normal para los rendimientos
Can you write Python code for it?

huber = sm.robust.scale.Huber()
returns_av, scale = huber(daily_returns)
mu=daily_returns.mean().AAPL
sigma=daily_returns.std().AAPL
ndays = 360
ntraj=10000
K1=160
K2=180

mu=daily_returns.mean().AAPL
sigma=daily_returns.std().AAPL
dates=pd.date_range('20170101',periods=ndays)
simret = pd.DataFrame(sigma*np.random.randn(ndays,ntraj)+mu,index=dates)
simdata=(data.loc['2016-12-30',:].AAPL)*np.exp(simret.cumsum())
ST=simdata.tail(1)
ind=np.digitize(ST.values[0],np.array([0, K1, K2, ST.values.max()+1]))
freq=(np.array([sum(ind==1),sum(ind==2),sum(ind==3)])/ntraj)*100

bar_labels = ['ST<K1', 'K1<ST<K2', 'ST>K2']
x_pos = list(range(len(bar_labels)))
plt.bar(x_pos,freq);
plt.grid();
plt.xticks(x_pos, bar_labels);


I am working on the file "02. Parte 2/13. Clase 13/13Class NB.ipynb".
The first task is:
4. Uso de la distrubición empírica aproximada con un método de kernel
Can you write Python code for it?

kde = KernelDensity(kernel='gaussian', bandwidth=0.001).fit(daily_returns)
ret=kde.sample(n_samples=ndays*ntraj, random_state=None)
#
dates=pd.date_range('20170101',periods=ndays)
simret = pd.DataFrame(ret.reshape((ndays,ntraj)),index=dates)
simdata=(data.loc['2016-12-30',:].AAPL)*np.exp(simret.cumsum())
ST=simdata.tail(1)
ind=np.digitize(ST.values[0],np.array([0, K1, K2, ST.values.max()+1]))
freq=(np.array([sum(ind==1),sum(ind==2),sum(ind==3)])/ntraj)*100

bar_labels = ['ST<K1', 'K1<ST<K2', 'ST>K2']
x_pos = list(range(len(bar_labels)))
plt.bar(x_pos,freq);
plt.grid();
plt.xticks(x_pos, bar_labels);


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/02Class NB-checkpoint.ipynb".
The first task is:
Nota: Para descargar datos de la bolsa mexicana de valores (BMV), el ticker debe tener la extensión MX.
Por ejemplo: MEXCHEM.MX, LABB.MX, GFINBURO.MX y GFNORTEO.MX.
2. Gráficos útiles de los rendimientos
Se calculan los rendimientos de todos los activos considerados. De nuevo, para una sucesión de precios ${S_t}{t=0}^{n}$, el rendimiento simple $R_t$ se define como el el cambio porcentual
$$
R_t=\frac{S_t-S{t-1}}{S_{t-1}}
$$
para $t=1,\ldots,n$.
Otro rendimiento usado con frecuencia es el rendimiento continuamente compuesto o rendimiento logaritmico. Éste, está definido como
$$
r_t=\ln(1+R_t)
$$
donde $R_t$ es el rendimiento simple. Es fácil darse cuenta que $r_t=\ln\left(\frac{S_t}{S_{t-1}}\right)$.
Can you write Python code for it?

allA=assets['Adj Close']
R = ((allA - allA.shift(1))/allA)[1:]
r=np.log(1+R)

R.describe()

min_periods = 20
vol = R.rolling(window=min_periods).std()*np.sqrt(min_periods)
vol.plot(figsize=(8, 6));

rolling_corr =R['AAPL'].rolling(window=10).corr(R['MSFT']).dropna()
rolling_corr.plot(figsize=(8, 6));

f, axes = plt.subplots(2, 2, figsize=(15, 7), sharex=True)
# Plot a simple histogram with binsize determined automatically
sns.distplot(R['AA'], color="b", fit=stats.norm, norm_hist=True, ax=axes[0, 0])
sns.distplot(R['AAPL'], color="r", fit=stats.norm, norm_hist=True, ax=axes[0, 1])
sns.distplot(R['MSFT'], color="g", fit=stats.norm, norm_hist=True, ax=axes[1, 0])
sns.distplot(R['^GSPC'], color="m", fit=stats.norm, norm_hist=True, ax=axes[1, 1])
plt.tight_layout()

sns.set(style="ticks")
sns.pairplot(R);

sns.jointplot("MSFT", "MSFT",data=R, color="k").plot_joint(sns.kdeplot, zorder=0, n_levels=60);

sns.jointplot("AA", "MSFT",data=R, color="k").plot_joint(sns.kdeplot, zorder=0, n_levels=60);

sns.jointplot("AAPL", "MSFT",data=R, color="k").plot_joint(sns.kdeplot, zorder=0, n_levels=60);

sns.jointplot("^GSPC", "MSFT",data=R, color="k").plot_joint(sns.kdeplot, zorder=0, n_levels=60);

sns.lmplot(x="AA", y="MSFT", truncate=True, size=5, data=R);

sns.lmplot(x="AAPL", y="MSFT", truncate=True, size=5, data=R);

sns.lmplot(x="^GSPC", y="MSFT", truncate=True, size=5, data=R);

g = sns.PairGrid(R, y_vars=["MSFT"], x_vars=["AA", "AAPL", "^GSPC"], size=4)
g.map(sns.regplot, color=".3");


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/02Class NB-checkpoint.ipynb".
The first task is:
Una vez cargados los paquetes, es necesario definir los tickers de las acciones que se usarán, la fuente de descarga (Yahoo en este caso, pero también se puede desde Google) y las fechas de interés. Con esto, la función DataReader del paquete pandas_datareader bajará los precios solicitados.
Nota: Usualmente, las distribuciones de Python no cuentan, por defecto, con el paquete pandas_datareader. Por lo que será necesario instalarlo aparte. El siguiente comando instala el paquete en Anaconda:
*conda install -c conda-forge pandas-datareader *
Can you write Python code for it?

#Descargar datos de Yahoo! finance
#Tickers
tickers = ['AA','AAPL','MSFT', '^GSPC']
# Fuente
data_source = 'yahoo'
# Fechas: desde 01/01/2014 hasta 12/31/2016.
start_date = '2014-01-01'
end_date = '2016-12-31'
# Usar el pandas data reader. El comando sort_index ordena los datos por fechas
assets = (web.DataReader(tickers, data_source, start_date, end_date)).sort_index('major_axis')
assets


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/03Class NB-checkpoint.ipynb".
The first task is:
3. Gráficos del Pay Off
Can you write Python code for it?


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/03Class NB-checkpoint.ipynb".
The first task is:
Una vez cargados los paquetes, es necesario definir los tickers de las acciones que se usarán, la fuente de descarga (Yahoo en este caso, pero también se puede desde Google) y las fechas de interés. Con esto, la función DataReader del paquete pandas_datareader bajará los precios solicitados.
Nota: Usualmente, las distribuciones de Python no cuentan, por defecto, con el paquete pandas_datareader. Por lo que será necesario instalarlo aparte. El siguiente comando instala el paquete en Anaconda:
*conda install -c conda-forge pandas-datareader *
Can you write Python code for it?


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/04Class NB-checkpoint.ipynb".
The first task is:
4. Optimización de portafolios
Can you write Python code for it?

def f(x): return 2+x**2

scopt.fmin(f, 10)

def negative_sharpe_ratio_n_minus_1_stock(weights,returns,risk_free_rate):
    """
    Given n-1 weights, return a negative sharpe ratio
    """
    weights2 = sp.append(weights, 1-np.sum(weights))
    return -sharpe_ratio(returns, weights2, risk_free_rate)

def optimize_portfolio(returns, risk_free_rate):
    w0 = np.ones(returns.columns.size-1, dtype=float) * 1.0 / returns.columns.size
    w1 = scopt.fmin(negative_sharpe_ratio_n_minus_1_stock, w0, args=(returns, risk_free_rate))
    final_w = sp.append(w1, 1 - np.sum(w1))
    final_sharpe = sharpe_ratio(returns, final_w, risk_free_rate)
    return (final_w, final_sharpe)

optimize_portfolio(annual_returns, 0.0003)

def objfun(W, R, target_ret):
    stock_mean = np.mean(R,axis=0)
    port_mean = np.dot(W,stock_mean)
    cov=np.cov(R.T)
    port_var = np.dot(np.dot(W,cov),W.T)
    penalty = 2000*abs(port_mean-target_ret)
    return np.sqrt(port_var) + penalty

def calc_efficient_frontier(returns):
    result_means = []
    result_stds = []
    result_weights = []
    means = returns.mean()
    min_mean, max_mean = means.min(), means.max()
    nstocks = returns.columns.size
    for r in np.linspace(min_mean, max_mean, 150):
        weights = np.ones(nstocks)/nstocks
        bounds = [(0,1) for i in np.arange(nstocks)]
        constraints = ({'type': 'eq', 'fun': lambda W: np.sum(W) - 1})
        results = scopt.minimize(objfun, weights, (returns, r), method='SLSQP', constraints = constraints, bounds = bounds)
        if not results.success: # handle error
            raise Exception(result.message)
        result_means.append(np.round(r,4)) # 4 decimal places
        std_=np.round(np.std(np.sum(returns*results.x,axis=1)),6)
        result_stds.append(std_)
        result_weights.append(np.round(results.x, 5))
    return {'Means': result_means, 'Stds': result_stds, 'Weights': result_weights}

frontier_data = calc_efficient_frontier(annual_returns)

def plot_efficient_frontier(ef_data):
    plt.figure(figsize=(12,8))
 ...


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/04Class NB-checkpoint.ipynb".
The first task is:
5. ETF
Can you write Python code for it?

etf=get_historical_closes(['PICK','IBB','XBI','MLPX','AMLP','VGT','RYE','IEO','AAPL'], '2014-01-01', '2014-12-31')
etf.plot(figsize=(8,6));

daily_returns_etf=calc_daily_returns(etf)
daily_returns_etf

daily_returns_etf_mean=1000*daily_returns_etf.mean()
daily_returns_etf_mean

daily_returns_etf_std=daily_returns_etf.std()
daily_returns_etf_std

daily_returns_ms=pd.concat([daily_returns_etf_mean, daily_returns_etf_std], axis=1)
daily_returns_ms

from sklearn.cluster import KMeans

random_state = 10
y_pred = KMeans(n_clusters=4, random_state=random_state).fit_predict(daily_returns_ms)

plt.scatter(daily_returns_etf_mean, daily_returns_etf_std, c=y_pred);
plt.axis([-1, 1, 0.01, 0.03]);

import scipy.cluster.hierarchy as hac

daily_returns_etf.corr()

Z = hac.linkage(daily_returns_etf.corr(), 'single')

# Plot the dendogram
plt.figure(figsize=(25, 10))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('sample index')
plt.ylabel('distance')
hac.dendrogram(
    Z,
    leaf_rotation=90.,  # rotates the x axis labels
    leaf_font_size=8.,  # font size for the x axis labels
)
plt.show()


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/04Class NB-checkpoint.ipynb".
The first task is:
Nota: Para descargar datos de la bolsa mexicana de valores (BMV), el ticker debe tener la extensión MX.
Por ejemplo: MEXCHEM.MX, LABB.MX, GFINBURO.MX y GFNORTEO.MX.
3. Formulación del riesgo de un portafolio
Can you write Python code for it?

def calc_daily_returns(closes):
    return np.log(closes/closes.shift(1))[1:]

daily_returns=calc_daily_returns(closes)
daily_returns.plot(figsize=(8,6));

daily_returns.corr()

def calc_annual_returns(daily_returns):
    grouped = np.exp(daily_returns.groupby(lambda date: date.year).sum())-1
    return grouped

annual_returns = calc_annual_returns(daily_returns)
annual_returns

def calc_portfolio_var(returns, weights=None):
    if (weights is None):
        weights = np.ones(returns.columns.size)/returns.columns.size
    sigma = np.cov(returns.T,ddof=0)
    var = (weights * sigma * weights.T).sum()
    return var

calc_portfolio_var(annual_returns)

def sharpe_ratio(returns, weights = None, risk_free_rate = 0.015):
    n = returns.columns.size
    if weights is None: weights = np.ones(n)/n
    var = calc_portfolio_var(returns, weights)
    means = returns.mean()
    return (means.dot(weights) - risk_free_rate)/np.sqrt(var)

sharpe_ratio(annual_returns)


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/04Class NB-checkpoint.ipynb".
The first task is:
Una vez cargados los paquetes, es necesario definir los tickers de las acciones que se usarán, la fuente de descarga (Yahoo en este caso, pero también se puede desde Google) y las fechas de interés. Con esto, la función DataReader del paquete pandas_datareader bajará los precios solicitados.
Nota: Usualmente, las distribuciones de Python no cuentan, por defecto, con el paquete pandas_datareader. Por lo que será necesario instalarlo aparte. El siguiente comando instala el paquete en Anaconda:
*conda install -c conda-forge pandas-datareader *
Can you write Python code for it?

closes=get_historical_closes(['AA','AAPL','MSFT','KO'], '2010-01-01', '2016-12-31')
closes

closes.plot(figsize=(8,6));


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/11Class NB-checkpoint.ipynb".
The first task is:
4. Optimización de portafolios
Can you write Python code for it?

N=5000
results_frame_optim = portfolio_func.optimal_portfolio(daily_returns,N,r)

#Montecarlo
plt.scatter(results_frame.SD,results_frame.Returns,c=results_frame.Sharpe,cmap='RdYlBu')
plt.xlabel('Volatility')
plt.ylabel('Returns')
plt.colorbar()
#Markowitz
plt.plot(results_frame_optim.SD, results_frame_optim.Returns, 'b-o');

#Sharpe Ratio
max_sharpe_port_optim = results_frame_optim.iloc[results_frame_optim['Sharpe'].idxmax()]
#Menor SD
min_vol_port_optim = results_frame_optim.iloc[results_frame_optim['SD'].idxmin()]

#Markowitz
plt.scatter(results_frame_optim.SD,results_frame_optim.Returns,c=results_frame_optim.Sharpe,cmap='RdYlBu');
plt.xlabel('Volatility')
plt.ylabel('Returns')
plt.colorbar()
#Sharpe Ratio
plt.scatter(max_sharpe_port_optim[1],max_sharpe_port_optim[0],marker=(5,1,0),color='r',s=1000);
#SD
plt.scatter(min_vol_port_optim[1],min_vol_port_optim[0],marker=(5,1,0),color='g',s=1000);

pd.DataFrame(max_sharpe_port_optim)

pd.DataFrame(min_vol_port_optim)


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/12Class NB-checkpoint.ipynb".
The first task is:
2. Uso de Pandas para descargar datos de precios de cierre
Una vez cargados los paquetes, es necesario definir los tickers de las acciones que se usarán, la fuente de descarga (Yahoo en este caso, pero también se puede desde Google) y las fechas de interés. Con esto, la función DataReader del paquete pandas_datareader bajará los precios solicitados.
Nota: Usualmente, las distribuciones de Python no cuentan, por defecto, con el paquete pandas_datareader. Por lo que será necesario instalarlo aparte. El siguiente comando instala el paquete en Anaconda:
*conda install -c conda-forge pandas-datareader *
3. Formulación del riesgo de un portafolio y simulación Montecarlo
Can you write Python code for it?

r=0.0001
results_frame = portfolio_func.sim_mont_portfolio(daily_returns,100000,r)

#Sharpe Ratio
max_sharpe_port = results_frame.iloc[results_frame['Sharpe'].idxmax()]
#Menor SD
min_vol_port = results_frame.iloc[results_frame['SD'].idxmin()]

plt.scatter(results_frame.SD,results_frame.Returns,c=results_frame.Sharpe,cmap='RdYlBu')
plt.xlabel('Volatility')
plt.ylabel('Returns')
plt.colorbar()
#Sharpe Ratio
plt.scatter(max_sharpe_port[1],max_sharpe_port[0],marker=(5,1,0),color='r',s=1000);
#Menor SD
plt.scatter(min_vol_port[1],min_vol_port[0],marker=(5,1,0),color='g',s=1000);

pd.DataFrame(max_sharpe_port)

pd.DataFrame(min_vol_port)


I am working on the file "02. Parte 2/15. Clase 15/.ipynb_checkpoints/12Class NB-checkpoint.ipynb".
The first task is:
4. Optimización de portafolios
Can you write Python code for it?


I am working on the file "02. Parte 2/15. Clase 15/13Class NB.ipynb".
The first task is:
2. Uso de Pandas para descargar datos de precios de cierre
Una vez cargados los paquetes, es necesario definir los tickers de las acciones que se usarán, la fuente de descarga (Yahoo en este caso, pero también se puede desde Google) y las fechas de interés. Con esto, la función DataReader del paquete pandas_datareader bajará los precios solicitados.
Nota: Usualmente, las distribuciones de Python no cuentan, por defecto, con el paquete pandas_datareader. Por lo que será necesario instalarlo aparte. El siguiente comando instala el paquete en Anaconda:
*conda install -c conda-forge pandas-datareader *
3. Formulación del riesgo de un portafolio y simulación Montecarlo
Can you write Python code for it?


I am working on the file "02.1 Scaling and Normalization.ipynb".
The first task is:
Preprocessing
Can you write Python code for it?


I am working on the file "02.1 Scaling and Normalization.ipynb".
The first task is:
Scaling training and test data the same way
Can you write Python code for it?

from sklearn.datasets import make_blobs
# make synthetic data
X, _ = make_blobs(n_samples=50, centers=5, random_state=4, cluster_std=2)
# split it into training and test set
X_train, X_test = train_test_split(X, random_state=5, test_size=.1)

# plot the training and test set
fig, axes = plt.subplots(1, 3, figsize=(13, 4))
axes[0].scatter(X_train[:, 0], X_train[:, 1],
                c='b', label="training set", s=60)
axes[0].scatter(X_test[:, 0], X_test[:, 1], marker='^',
                c='r', label="test set", s=60)
axes[0].legend(loc='upper left')
axes[0].set_title("original data")

# scale the data using MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)

# visualize the properly scaled data
axes[1].scatter(X_train_scaled[:, 0], X_train_scaled[:, 1],
                c='b', label="training set", s=60)
axes[1].scatter(X_test_scaled[:, 0], X_test_scaled[:, 1], marker='^',
                c='r', label="test set", s=60)
axes[1].set_title("scaled data")

# rescale the test set separately, so that test set min is 0 and test set max is 1
# DO NOT DO THIS! For illustration purposes only
test_scaler = MinMaxScaler()
test_scaler.fit(X_test)
X_test_scaled_badly = test_scaler.transform(X_test)

# visualize wrongly scaled data
axes[2].scatter(X_train_scaled[:, 0], X_train_scaled[:, 1],
                c='b', label="training set", s=60)
axes[2].scatter(X_test_scaled_badly[:, 0], X_test_scaled_badly[:, 1], marker='^',
                c='r', label="test set", s=60)
axes[2].set_title("improperly scaled data")