Trasponer una matriz en Python

La definción técnica del término matriz traspuesta es «el resultado de reordenar la matriz original mediante el cambio de filas por columnas y las columnas por filas en una nueva matriz». Imaginemos que tenemos un array en Python tal que así:

x = [[1,2,3],
  [2,3,1],
  [3,1,2]]

Ahora queremos meter esa matriz en otra variable, pero tras trasponerla. Si bien en la mayoría de los lenguajes es posible trasponer la matriz utilizando una serie de bucles anidados, en Python podremos hacerlo de forma muy sencilla sirviéndonos de la función zip() y el operador *. Para almacenar la matriz traspuesta en otra variable bastaría con hacer:

y=zip(*x)

Y solo con esa línea ya habría traspuesto nuestra matriz original.

Escribir un fichero Excel desde Python

Hace ya unos años, cuando hablábamos mucho de PHP por aquí (mi vida laboral me llevó a tener que centrarme en el SQL y el javascript principalmente) vimos cómo importar y exportar ficheros de Excel con PHP. Pero ¿cómo podemos escribir un fichero de Excel usando Python?

Hay muchas librerías para realizar esta tarea, yo en mi caso he elegido XslxWriter, que podéis descargar desde este enlace. También es muy popular xlrd/xlwt, aunque creo que solo permite exportar en formato xls, pero tiene la parte positiva de permitir importar datos.

Veamos entonces paso a paso, con ejemplos de código, cómo escribir un fichero simple xlsx con Python. Los primeros pasos en nuestro código serán importar la librería, crear un nuevo libro de trabajo y crear una nueva hoja. Lo haríamos así:

import xlsxwriter

libro = xlsxwriter.Workbook('Presupuesto1.xlsx')
hoja = libro.add_worksheet()

El constructor Workbook() nos permite crear un nuevo objeto que representaría un libro de Excel. Es importante destacar que XlsxWriter no nos permite modificar ni leer ficheros de Excel, solo podemos crearlos.

La función add_worksheet() del objeto Workbook nos permite crear nuevas hojas en nuestro libro. Si invocamos esta función sin parámetros creará las hojas con un nombre numerado de forma consecutiva (Sheet1, Sheet2, Sheet3…) pero si le pasamos una cadena esta será el nombre de la hoja.

Ahora, para continuar con el ejemplo, vamos a escribir los datos que queremos mostrar en nuestra hoja de cálculo.

# El presupuesto que pintaremos en la hoja de cálculo
presupuesto = (
    ['Equipos',     4000],
    ['Cable',        100],
    ['Armario',      200],
    ['Switch',        99],
    ['AP',            50],
    ['Router',       150],
    ['Mano de Obra', 350],
)

Ok, tenemos los datos a pintar. Tenemos la librería importada y los objetos creados. ¿Qué nos queda? Unos simples pasos: primero nos posicionamos al inicio del documento, después iteramos sobre la colección de datos pintando cada columna con el método write(), que recibirá la fila, la columna y el valor. Finalmente añadiremos una fila con los totales, calculados ya con una fórmula de sumatorio, y cerraremos el objeto Workbook().

# Nos posicionamos en la primera columna de la primera fila
row = 0
col = 0

# Iteramos los datos para ir pintando fila a fila
for concepto, precio in (presupuesto):
    hoja.write(row, col,     concepto)
    hoja.write(row, col + 1, precio)
    row += 1

#Pintamos la fila de totales
hoja.write(row, 0, 'Total:')
hoja.write(row, 1, '=SUM(B1:B7)')

#Cerramos el libro
libro.close()


Operador ternario en Python

Hace un tiempo hablamos del operador ternario en Java, una forma de hacer operaciones condicionales en una sola línea con tres parámetros. Pero ¿existe algo similar en Python? Pues sí, existe:

No se trata de un operador, como el ? de Java, sino de una condición if-else un poco distinta a la clásica. La sintaxis sería algo así:

opción1 if condición else opción2

Veamos un ejemplo práctico:

#Declaramos una variable, le llamamos var
#Para el ejemplo le damos valor 1
var = 1
#Aplicamos la operación
resultado="Mayor que cero" if var>0 else "Menor o igual que cero"
#La variable resutado en este caso almacenaría "Mayor que cero"

Orden de operaciones aritméticas (PEMDAS) y su aplicación en lenguajes de programación.

Todo un clásico en las redes sociales es que alguien comparta la operación 5+4/3-1*2 y que se monte un gallinero tremendo en los comentarios con distintas soluciones. Esto se debe a que mucha gente no tiene claro cómo va la jerarquía de las operaciones y el orden de evaluación de las mismas.

Si hablamos de operaciones básicas, y de la mayoría de lenguajes de programación (Javascript, PHP, Python, Ruby, C,Visual Basic, Java…), nos regiremos por el orden de operaciones conocido por el acrónimo inglés PEMDAS, que en castellano podríamos traducir como PAPOMUDAS (PAréntesis, POtencias, MUltiplicación, División, Adición, Sustracción). En base a esto el orden de operaciones en lenguajes de programación como Python, PHP, Ruby o Javascript sería:

  1. Paréntesis
  2. Potencias y radicales
  3. Multiplicación, división, división entera y módulo.
  4. Suma y resta.

En este enlace puedes comprobar los resultados de distintas operaciones realizados en distintos lenguajes de programación. Puedes copiar los siguientes ejemplos para comprobar que el resultado es el mismo.

Aquí el código en Javascript:

var resultado = 5+4/3-1*2;
console.log(resultado);

Aquí el código en Python:

resultado = 5+4/3-1*2
print(resultado)

Aquí en Java:

public class Test {
  public static void main(String[] args){
    System.out.println(5.0+4.0/3.0-1.0*2.0);
  }
}

Y aquí en C:

void main(void) {
   double resultado;
   resultado = 5.0+4.0/3.0-1.0*2.0;
   printf("%f",resultado);
}

Como puedes comprobar, en todos el resultado es 4.333333 ya que todos usan el mismo orden para las operaciones.

Cómo saber si el valor de una variable es numérico en Python

A la hora de trabajar con datos numéricos en Python nos encontramos con un clásico ¿Cómo se que el valor que estoy recibiendo es un número? Casi todos los lenguages de programación tienen una función que nos permite evaluar si el valor almacenado en una variable es numérico, para el caso de Python vamos a ver dos opciones.

Python por defecto incluye una librería llamada math en todas sus versiones, pensada para realizar operaciones sobre datos escalares y para operaciones de trigonometría. Por otra parte existe una librería externa muy popular llamada numpy, pensada para el trabajo algebraico con matrices. Según el tipo de operaciones que vayas a realizar en tu código deberás importar una u otra.

En cualquier caso, ambas liberías tienen una función para chequear si una variable es numérica: la función isnan(), que devolverá true si el valor que está evaluando es nan (Not a Number). En el caso de usar la importada desde la librería math recibirá una sola variable y devolverá un valor booleano, en caso de usar la de numpy podrá recibir un array y evaluará todos los valores almacenados dentro del mismo, devolviendo según corresponda un valor booleano o un array de valores booleanos. Basta con importarla al principio de vuestro código y comprobarlo:

Con math en este caso devolvería true:

import math
x=float('cadena')
math.isnan(x)

Con numpy podemos trabajar con arrays:

import numpy as np
np.isnan([np.log(-1.),1.,np.log(0)])

Esto devolvería un array con un true para el primer valor evaluado y un false para los dos siguientes.

Calcula una edad dada la fecha de nacimiento con Python

Mucha gente parece tener interés en esta explicación en concreto, que ya hemos visto con Javascript y con varios sistemas de bases de datos SQL. Vamos ahora con Python ¿Cómo calculamos la edad desde una fecha?

from datetime import date #importamos date
#obtenemos la fecha del sistema
hoy = date.today()
#supongamos que tenemos la fecha de
#nacimiento guardada en la variable
#fnac (no es publicidad xDD)
edad = hoy.year - fnac.year - ((hoy.month, hoy.day) < (fnac.month, fnac.day))

Al igual que hacíamos en el caso de SQLite primero restamos los años y luego restamos la comparación entre mes y día actual y mes y día de nacimiento. Si la combianción mes/día de hoy es anterior a la combinación mes/día de nacimiento la comparación devuelve 1, si no devuelve 0.

Cómo hacer un Hello World! en distintos lenguajes de programación.

El Hello World es un ejercicio básico de programación. Casi en cualquier lenguaje de programación que estudies empezarás en la primera lección programando uno. Aquí te dejo diversos ejemplos en distintos lenguajes
, lo que además te permitirá ver algunas de las pequeñas diferencias que hay entre ellos.

ASP:

Response.Write "Hello World!" 

Script de Bash:

#!/bin/bash
echo "Hello, World!" 

C:

#include 
main(){
  printf ("Hello World!\n");
}

C++:

#include 
using namespace std;
void main(){
  cout << "Hello World!" << endl;
}

C#:

using System;
namespace HelloWorld
{
    class Hello 
    {
        static void Main() 
        {
            Console.WriteLine("Hello World!");            
        }
    }
}

Java:

class hellWorldJava{
  public static void main(String args[]){
    System.out.println("Hello World!");
  }
}

Javascript:

window.alert( 'Hello, world!' );

Objective C:

#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}

Perl:

#!/usr/bin/perl
print “Hello World.\n”;

PHP:

echo "Hello World!";

Script de Powershell:

$strString = "Hello World"
write-host $strString

Python:

print "Hello, World!"

R:

print("Hello World!", quote = FALSE)

Ruby:

puts 'Hello world'

Dar formato a un float para mostrar sólo dos decimales en Python

A la hora de trabajar con números decimales en cualquier lenguaje nos topamos con la necesidad de darles un formato adecuado en muchas ocasiones (por ejemplo si trabajamos con valores monetarios, con estaturas, etc) para presentar un resultado en pantalla. El más habitual es recortar o redondear los decimales para mostrar sólo dos. ¿Cómo podemos hacer esto en Python? Con la función format() y los operadores de formateo de cadenas es muy simple:

#Formateamos 5.1234554321
print "{0:.2f}".format(5.1234554321)
#El resultado sería
>>5.12
#¿Y si queremos tres?
print "{0:.3f}".format(5.1234554321)
#El resultado sería
>>5.123

Creando un bot que hace FAV automáticamente en Twitter con un script de Python

Ayer aproveché el festivo para repasar un poco de scripting de Python (vicios que tiene uno), y me encontré este tutorial para crear un bot de Twitter, que he supuesto que podría interesarle a alguno de mis lectores por lo que vamos con una traducción no literal del mismo (como otras veces os cuento lo que pone pero no traduzco línea por línea).

El funcionamiento del bot/script es el siguiente: le das al bot una palabra clave, este la busca por Twitter y reparte FAV a diestro y siniestro.

El primer paso es descargar el módulo de herramientas de Twitter para Python (en el artículo original os dirige a la versión 1.10, pero es una entrada de 2013, ya van por la 1.17, yo os dejo apuntando al general para que seleccionéis la versión que os convenga). Luego tendréis que dar de alta el app en Twitter también. Al registrar el app Twitter os dará unas claves de autentificación, que se usarán para realizar la conexión tal que así:

from twitter import Twitter, OAuth, TwitterHTTPError

OAUTH_TOKEN = 'tu oauth token'
OAUTH_SECRET = 'tu oauth secret'
CONSUMER_KEY = 'tu consumer key'
CONSUMER_SECRET = 'tu consumer secret'

t = Twitter(auth=OAuth(OAUTH_TOKEN, OAUTH_SECRET,
            CONSUMER_KEY, CONSUMER_SECRET))

Lo siguiente es definir un método de búsqueda, que recoja los tweets:

def search_tweets(q, count=100):
    return t.search.tweets(q=q, result_type='recent', count=count)

Y definir el método que hará FAV al tweet:

def fav_tweet(tweet):
    try:
        result = t.favorites.create(_id=tweet['id'])
        print "Favorited: %s" % (result['text'])
        return result    
    # En caso de que ya esté marcado con FAV
    # devolverá un error.
    except TwitterHTTPError as e:
        print "Error: ", e
        return None

Y ahora ¿qué nos queda? Pues el código principal del script:

def auto_fav(q, count=100):
    result = search_tweets(q, count)
    a = result['statuses'][0]['user']['screen_name']
    print a
    success = 0
    for tweet in result['statuses']:
        if fav_tweet(tweet) is not None:
            success += 1
    print "Marcamos  %i tweets como favoritos de un total de %i tweets" % (success,
          len(result['statuses']))

Y listo, nuestro bot está preparado. Queda guardarlo en un archivo .py, como por ejemplo twitter_bot.py (respetamos el nombre del artículo original) y ya podemos ejecutarlo desde el terminal tal que así:

$ python

>>> import twitter_bot
>>> twitter_bot.auto_fav('#python','50')

El ejemplo buscará en los 50 últimos tweets el hashtag #python y marcará como favoritos los tweets que lo lleven. Ojo, porque abusar de este script podría llevar a que Twitter te aplique un baneo con todas las de la ley.

En fin, resumiendo aquí os dejo el script del artículo original (con los comentarios y el texto de salida en inglés) completo, por si queréis probar:

from twitter import Twitter, OAuth, TwitterHTTPError

OAUTH_TOKEN = 'your oauth token'
OAUTH_SECRET = 'your oauth secret'
CONSUMER_KEY = 'your consumer key'
CONSUMER_SECRET = 'your consumer secret'

t = Twitter(auth=OAuth(OAUTH_TOKEN, OAUTH_SECRET,
            CONSUMER_KEY, CONSUMER_SECRET))

def search_tweets(q, count=100):
    return t.search.tweets(q=q, result_type='recent', count=count)

def fav_tweet(tweet):
    try:
        result = t.favorites.create(_id=tweet['id'])
        print "Favorited: %s" % (result['text'])
        return result
    # when you have already favourited a tweet
    # this error is thrown
    except TwitterHTTPError as e:
        print "Error: ", e
        return None

def auto_fav(q, count=100):
    result = search_tweets(q, count)
    a = result['statuses'][0]['user']['screen_name']
    print a
    success = 0
    for tweet in result['statuses']:
        if fav_tweet(tweet) is not None:
            success += 1
    print "We Favorited a total of %i out of %i tweets" % (success,
          len(result['statuses']))