import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
% matplotlib inline
plt.style.use('ggplot')

# Leer la informacion
data = pd.read_csv('../data/GlobalTemperatures.csv')

# Mostrar los 5 primeros registros
data.head()

"""
Para el primer analisis solo tomaremos como referencia el campo de informacion: LandAverageTemperature
"""
data = data[['dt','LandAverageTemperature']]
data.head()

data.describe()

"""
Explanation: Ejercicio de Data Science y Linear Regression con Pandas
Para el siguiente ejercicio de Data Science y Linear Regression con Pandas utilizaremos la información disponible en kaggle, la cual contiene los siguientes campos:
* GlobalTemperatures.csv
        dt: 
        LandAverageTemperaturUncertainty : 
        LandMaxTemperature : 
        LandMaxTemperatureUncertainty :
        LandMinTemperature :
        LandMinTemperatureUncertainty :
        LandAndOceanAverageTemperature :
        LandAndOceanAverageTemperatureUncertainty :
* GlobalLandTemperaturesByCity.csv
        dt:
        AverageTemperature : 
        AverageTemperatureUncertainty : 
        City : 
        Country : 
        Latitude :
        Longitude : 
Explorar la informacion
End of explanation
"""


"""
Generemos una grafica de puntos, modificando el ancho y largo 
de la grafica para poder tener una mejor visualizacion de la informacion
"""
plt.figure(figsize = (15, 5))
plt.scatter(x = data['LandAverageTemperature'].index, y = data['LandAverageTemperature'])
plt.title("Temperatura promedio de la tierra 1750-2015")
plt.xlabel("Anio")
plt.ylabel("Temperatura promedio de la Tierra")
plt.show()

# Vamos a probar solo graficar los anios
# Verifiquemos el tipo de dato de la columna dt
print(type(data['dt'][0]))

# Vamos a convertir la columna a un objeto tiempo
times = pd.DatetimeIndex(data['dt'])

# Agrupamos la informacion por anios
grouped = data.groupby([times.year]).mean()

# graficamos
plt.figure(figsize = (15, 5))
plt.plot(grouped['LandAverageTemperature'])

# Change features of the graph
plt.title("Temperatura media anual de la tierra 1750-2015")
plt.xlabel("Anio")
plt.ylabel("Temperatura promedio de la tierra")
plt.show()

# Que puede ocurrir en los primeros anios?
grouped.head()

# Vamos a checar que es lo que pasa en 1752
data[times.year == 1752]

# Tenemos demasiada informacion nula
data[np.isnan(data['LandAverageTemperature'])]

# Usaremos el valor previo validado para llenar las observaciones nulas
data['LandAverageTemperature'] = data['LandAverageTemperature'].fillna(method='ffill')

# Reagrupamos la informacion y graficamos
grouped = data.groupby([times.year]).mean()

# La grafica se ve mejor, aunque no es perfecta
plt.figure(figsize = (15, 5))
plt.plot(grouped['LandAverageTemperature'])
plt.show()

"""
Explanation: Podemos visualizar que la temperatura minima es -2.08 y la maxima 19.02
End of explanation
"""


# Para modelar los datos, vamos a necesitar de la libreria sklearn
from sklearn.linear_model import LinearRegression as LinReg

x = grouped.index.values.reshape(-1, 1)
y = grouped['LandAverageTemperature'].values

reg = LinReg()
reg.fit(x, y)
y_preds = reg.predict(x)
print("Certeza: " + str(reg.score(x, y)))

plt.figure(figsize = (15, 5))
plt.title("Linear Regression")
plt.scatter(x = x, y = y_preds)
plt.scatter(x = x, y = y, c = "b")

reg.predict(2050)

"""
Explanation: Modelado de datos
End of explanation
"""


# Leer la informacion
data = pd.read_csv('../data/GlobalLandTemperaturesByCity.csv')
data.head()

# Cuantas ciudades estan disponibles
data['City'].nunique()

# Verificamos que nuestra ciudad de interes este disponible
ciudades = np.array(data['City'])
"Aguascalientes" in ciudades

# Filtramos la informacion para la ciudad de interes
data = data.loc[data['City'] == 'Aguascalientes']

# clasificamos la informacion
data = data[['dt','AverageTemperature','City']]

data.head()

# Vamos a convertir la columna dt a un objeto tiempo
times = pd.DatetimeIndex(data['dt'])

# Agrupamos la informacion por anios
grouped = data.groupby([times.year]).mean().plot.line(figsize=(15,5))

"""
Explanation: Temperatura por ciudad (Aguascalientes)
End of explanation
"""


# Usaremos el valor previo validado para llenar las observaciones nulas
data['AverageTemperature'] = data['AverageTemperature'].fillna(method='ffill')

# Reagrupamos la informacion y graficamos
grouped = data.groupby([times.year]).mean()

# La grafica se ve mejor, aunque no es perfecta
plt.figure(figsize = (15, 5))
plt.plot(grouped['AverageTemperature'])
plt.show()

x = grouped.index.values.reshape(-1, 1)
y = grouped['AverageTemperature'].values

reg = LinReg()
reg.fit(x, y)
y_preds = reg.predict(x)
print("Certeza: " + str(reg.score(x, y)))

plt.figure(figsize = (15, 5))
plt.title("Linear Regression")
plt.scatter(x = x, y = y_preds)
plt.scatter(x = x, y = y, c = "b")

"""
Explanation: Modelado de datos
End of explanation
"""


reg.predict(2018)

"""
Explanation: Vamos a pedecir la temperatura promedio para el 2018
End of explanation
"""


reg.predict(2050)

"""
Explanation: Vamos a pedecir la temperatura promedio para el 2050
End of explanation
"""


