%matplotlib inline 
import numpy as np
import pylab as pl
import scipy.stats as st
import pandas as pd
import datetime as dt 

"""
Explanation: Medidas de Correlación
Correlaciones paramétricas:


Pearson.


Correlaciones no paramétricas:


Mann Kendall.
Spearman.
Información mutua.
End of explanation
"""


data = np.arange(0,1,0.01)
y = np.sin(data)
x = np.sin(data)
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'P-valor:' + str(Pvalue)

y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'P-valor:' + str(Pvalue)

y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.5,0.5,len(data))
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'P-valor:' + str(Pvalue)

y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
pos = np.where(y>0.5)[0]
y[pos] = y[pos]-(pos/150.0)**2 
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'P-valor:' + str(Pvalue)

y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
pos = np.random.choice(100,3)
y[pos] = y[pos]+np.random.uniform(-5,5,len(pos))
x[pos] = x[pos]+np.random.uniform(-5,5,len(pos))
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'P-valor:' + str(Pvalue)

"""
Explanation: Definición de Pearson.
Es una correlacción lineal en donde se compara como varía una serie $X$ con una $Y$ de manera lineal.
$P = \frac{Cov(x,y)}{\sqrt{Var(x)}\sqrt{Var(y)}}$
Características:


Mide únicamente la relación lineal.
Oscila entre -1 y 1.
Se puede ver afectada por valores atípicos fácilmente.
si $p>0.0$ entonces la relación es positiva.
si $p<0.0$ la relación es negativa.
Asume normalidad.
End of explanation
"""


y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
fig = pl.scatter(x,y)
Spearman, PvalueS = st.spearmanr(x,y)
print 'Spearman:' + str(Spearman)
print 'P-valor:' + str(PvalueS)

y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
pos = np.where(y>0.2)[0]
y[pos] = y[pos]-(pos/150.0)**2 
fig = pl.scatter(x,y)
Spearman, Pvalue = st.spearmanr(x,y)
print 'Spearman:' + str(Spearman)
print 'P-valor:' + str(Pvalue)

"""
Explanation: Definición de Spearman.
Se usa como una medida de correlación no paramétrica, en la cual se tiene en cuenta el orden de la serie y no sus datos, por lo que tiende a ser más estable.
$\rho = 1- \frac{6 \sum_{i=1}{N} d_{i}^{2}}{n (n^2-1)}$
Características:


No asume normalidad.
oscila entre -1 y 1, cuando es 0 es que no hay una correlación.
No mide únicamente la relación lineal.
Mide si dos variables $x_i$ y $y_i$ crecen o decresen monoliticamente.


|IQ, $X_i$ | Hours of TV per week, $Y_i$|
|:---:|:---:|
|106|   7|
|86 |0|
|100|   27|
|101|   50|
|99 |28|
|103|   29|
|97 |20|
|113|   12|
|112|   6|
|110|   17|
|IQ, $X_i$| Hours of TV per week, $Y_i$|    rank $x_i$| rank $y_i$| $d_i$|  $d_i^2$|
|:---:|:---:|:---:|:---:|:---:|:---:|
|86|    0|  1|  1   |0| 0|
|97|    20| 2|  6   |−4|    16|
|99 |28 |3  |8| −5  |25|
|100|   27  |4  |7  |−3|    9|
|101|   50  |5  |10|    −5| 25|
|103|   29  |6  |9| −3| 9|
|106|   7   |7  |3| 4|  16|
|110|   17  |8  |5| 3|  9|
|112|   6   |9  |2| 7|  49|
|113|   12| 10  |4| 6|  36|
End of explanation
"""


y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
pos = np.where(y>0.2)[0]
y[pos] = y[pos]-(pos/170.0)**3 
fig = pl.scatter(x,y)
Spearman, Pvalue = st.spearmanr(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
print 'Pearson:' + str(Pearson)
print 'Spearman:' + str(Spearman)

y = np.sin(data)
x = np.sin(data)+np.random.uniform(-0.1,0.1,len(data))
pos = np.random.choice(100,3)
y[pos] = y[pos]+np.random.uniform(-5,5,len(pos))
x[pos] = x[pos]+np.random.uniform(-5,5,len(pos))
fig = pl.scatter(x,y)
Pearson, Pvalue = st.pearsonr(x,y)
Spearman, Pvalue = st.spearmanr(x,y)
print 'Pearson:' + str(Pearson)
print 'Spearman:' + str(Spearman)

"""
Explanation: Pearson Vs Spearman.
End of explanation
"""


def readArchivoText(ruta):
    #Lectura del archivo
    f = open('Montanitas.txt','r')
    L = f.readlines()
    f.close()
    #Procesa informacion
    Dates = []
    Data = []
    for l in L:
        Data.append(float(l.split(',')[1]))
        Dates.append(dt.datetime.strptime(l.split(',')[0],'%Y-%m-%d %H:%M:%S'))
    return pd.Series(Data,index=Dates)        

Serie = readArchivoText('Montanitas.txt')    

"""
Explanation: Histogramas


Simples $f(x)$.
Conjuntos $p(x,y)$.
Independientes: $f(x)g(y)$
Escaldado: $\frac{p(x,y)}{f(x)g(y)}$



Dependen en gran medida de la selección de intervalos o bins
Muestran la forma en que se distribuyen los datos.


Simples


Se construyen unicamente a partir de un conjunto de datos.
Sensibles a la cantidad de datos y a la cantidad de intervalos 
Pueden representar si los datos presentan o no una distribución clara.
No simpre son explicados por una función contínua del tipo $f(x)$
End of explanation
"""


a = pl.hist(Serie,bins = 20)

a = pl.hist(Serie[Serie>1],bins = 15)

"""
Explanation: Histograma con muchos datos iguales
End of explanation
"""


fig = pl.figure(figsize=(16,5))
for cont,i in enumerate(['D','M','3M','6M']):
    ax = fig.add_subplot(1,4,cont+1)
    ax.set_title('Escala '+i,size = 16)
    Serie.resample(i,how='sum').hist(bins = 10)

"""
Explanation: Límite central en la lluvia
End of explanation
"""


fig = pl.figure(figsize=(16,5))
for cont,i in enumerate([2,10,25,40]):
    ax = fig.add_subplot(1,4,cont+1)
    ax.set_title('Para X>'+str(i),size=16)
    Serie[Serie>i].hist(bins = 15)

"""
Explanation: Histogramas dentro de histogramas
End of explanation
"""


x = np.random.uniform(0,1,100)
y = np.random.normal(0,1,100)

def Series2IndepentHist(x,y,bins = 12):
    hx = np.histogram(x,bins = bins)[0]
    hy = np.histogram(y,bins = bins)[0]
    #
    hxy = np.zeros((bins,bins))
    for ic,i in enumerate(hx):
        for jc,j in enumerate(hy):
            hxy[ic,jc] = i*j
    return hxy

hxy = Series2IndepentHist(x,y)
fig = pl.figure(figsize=(9,9))
pl.imshow(hxy,interpolation='None')
pl.colorbar(orientation='horizontal')

fig = pl.figure(figsize=(9,9))
#hxy = Series2IndepentHist(np.random.normal(0,1,100),np.random.normal(0,1,100))
pl.imshow(Series2IndepentHist(np.random.normal(0,1,1000),np.random.normal(0,1,1000),bins=20),
    interpolation='None')

"""
Explanation: Independientes
$h = f(x)g(y)$
En este tipo de histogramas no se tiene en cuenta la ocurrencia de ambos eventos de forma simultánea, es decir independiente de que $y$ ocurra o no su probabilidad de ocurrencia es multiplicada por la probabilidad de $x$.
End of explanation
"""


def Hist2D(x,y,bins = 12):
    RangoX = np.linspace(x.min(),x.max(),bins)
    RangoY = np.linspace(y.min(),y.max(),bins)
    h2d = np.zeros(12,12)
    for ic,i in enumerate(x):
        for jc,j in enumerate(y):
            
    

x = np.random.normal(0,1,1000)
y = np.random.uniform(0,1,1000)
fig = pl.figure()
a = pl.hist2d(x,y,bins=12)
fig = pl.figure()
a = pl.scatter(x,y)

cont = 0
for i in [1,2,4,12,2]:
    print i,cont
    cont-=10

"""
Explanation: Histogramas conjuntos
A diferencia del histograma independiente, en este se presenta la probabilidad de ocurrencia de un suceso sólo en el caso en que el otro suceso ocurre de manera simultánea. Cuando este histograma es igual al histograma independiente se dice que las variables son independientes
End of explanation
"""


