# -*- coding: utf-8 -*-
"""
Created on Thu Nov 18 16:10:44 2021

@author: jcrav
"""

import pandas as pd
import numpy as np


#______________________________________________________________________________
#Importar multiples archivos txt
import glob
path = 'C:/ACTUAL/PYTHON SENAMHI/CURSO PYTHON SENAMHI/MODULO I/EJERCICIO PANDAS/ARCHIVOS TXT/'
files = glob.glob(path+'*.txt')
dfs = pd.DataFrame()

for file in files:
    
    df = pd.read_csv(file,sep=' ',header=None,
                     na_values=[-99.9,-999.0]).rename(columns={0:'AÑO',1:'MES',2:'DIA',3:'PP',4:'TMAX',5:'TMIN'},
                                                      inplace=False)
    df['CODIGO'] = file[len(path):-4]
    dfs=dfs.append(df)
    
#Uniendo todos los archivos txt en uno solo    
dfs=dfs.replace(-888,0.01)

#______________________________________________________________________________
#Leyendo el archivo de excel con los metadatos de las estaciones
xls_metadatos = pd.ExcelFile("C:/ACTUAL/PYTHON SENAMHI/CURSO PYTHON SENAMHI/MODULO I/EJERCICIO PANDAS/METADATOS/371 snt Con Control de Calidad JULIO 2016 SPC-DMA SENAMHI.xlsx")
metadatos =pd.read_excel(xls_metadatos,'Hoja1',dtype={'CODIGO_ANT': str})
metadatos=metadatos.rename(columns={'CODIGO_ANT':'CODIGO'})

#UNIENDO COLUMNAS DE LOS METADATOS DEL EXCEL CON LOS DATOS DE LAS ESTACIONES
dfs = pd.merge(dfs,metadatos[['CODIGO','NOMBRE','DEPARTAMENTO','PROVINCIA','DISTRITO',
                                    'REGION','LONGITUD','LATITUD','ALTITUD']],on='CODIGO', how='left')

#Ordenando las columnas
dfs = dfs.reindex(columns=['CODIGO','NOMBRE','DEPARTAMENTO','PROVINCIA','DISTRITO',
                                    'REGION','LONGITUD','LATITUD','ALTITUD',
                                    'AÑO','MES','DIA','TMAX','TMIN','PP'])

#Seleccionando un período de tiempo
datos_81_2010=dfs[(dfs['AÑO'] >= 1981) & (dfs['AÑO'] < 2011)]
#______________________________________________________________________________
#Detectando datos erroneos
error1=datos_81_2010.loc[datos_81_2010['TMAX'] == 0.0]
error2=datos_81_2010.loc[datos_81_2010['TMIN'] > datos_81_2010['TMAX']]

#Asignando el valor de nan a valores erroneos
#datos_81_2010.loc[datos_81_2010['TMAX'] == 0.0, 'TMAX'] = np.nan
datos_81_2010.loc[datos_81_2010['TMIN'] >= datos_81_2010['TMAX'], 'TMAX'] = np.nan

#CONVIRTIENDO LAS 3 COLUMNAS DE FECHA EN FORMATO DE FECHA EN UNA SOLA COLUMNA
datos_81_2010=datos_81_2010.rename(columns={'AÑO':'year','MES':'month','DIA':'day'})
datos_81_2010['FECHA']=pd.to_datetime(datos_81_2010[['year','month','day']])

#Eliminando las columnas de año, mes y dia. Reordenando las otras columnas.
datos_81_2010=datos_81_2010.drop(['year','month','day'],axis=1)

dfs = dfs.reindex(columns=['CODIGO','NOMBRE','DEPARTAMENTO','PROVINCIA','DISTRITO',
                                    'REGION','LONGITUD','LATITUD','ALTITUD','FECHA',
                                    'TMAX','TMIN','PP'])

datos_81_2010['MES'] = datos_81_2010.FECHA.dt.month
datos_81_2010['AÑO_MES'] = datos_81_2010.FECHA.dt.strftime('%Y-%m')

#______________________________________________________________________________
#Generacion de normales de temperatura máxima, mínima y precipitación

mensualestmax=pd.DataFrame(datos_81_2010.groupby(['CODIGO','AÑO_MES'])['TMAX'].mean().round(1))
mensualestmax=mensualestmax.reset_index(drop=False)
mensualestmax['MES']=mensualestmax['AÑO_MES'].str.strip().str[-2:]
normalestmax=pd.DataFrame(mensualestmax.groupby(['CODIGO','MES'])['TMAX'].mean().round(1))
normalestmax=normalestmax.reset_index(drop=False)

mensualestmin=pd.DataFrame(datos_81_2010.groupby(['CODIGO','AÑO_MES'])['TMIN'].mean().round(1))
mensualestmin=mensualestmin.reset_index(drop=False)
mensualestmin['MES']=mensualestmin['AÑO_MES'].str.strip().str[-2:]
normalestmin=pd.DataFrame(mensualestmin.groupby(['CODIGO','MES'])['TMIN'].mean().round(1))
normalestmin=normalestmin.reset_index(drop=False)

mensualespp=pd.DataFrame(datos_81_2010.groupby(['CODIGO','AÑO_MES'])['PP'].sum().round(1))
mensualespp=mensualespp.reset_index(drop=False)
mensualespp['MES']=mensualespp['AÑO_MES'].str.strip().str[-2:]
normalespp=pd.DataFrame(mensualespp.groupby(['CODIGO','MES'])['PP'].mean().round(1))
normalespp=normalespp.reset_index(drop=False)
#______________________________________________________________________________

normales=pd.merge(normalestmax,normalestmin[['CODIGO','MES','TMIN']],on=['CODIGO','MES'], how='left')
normales=pd.merge(normales,normalespp[['CODIGO','MES','PP']],on=['CODIGO','MES'], how='right')
normales=pd.merge(normales,metadatos[['CODIGO','NOMBRE','DEPARTAMENTO','LATITUD','LONGITUD',
                                   'ALTITUD']],on='CODIGO', how='left')
#______________________________________________________________________________
meses={'01':'Enero','02':'Febrero','03':'Marzo','04':'Abril','05':'Mayo'
       ,'06':'Junio','07':'Julio','08':'Agosto',
       '09':'Septiembre','10':'Octubre','11':'Noviembre','12':'Diciembre'}
for numero, mes in meses.items():
      normales['MES'] = normales['MES'].replace(numero, mes)
#______________________________________________________________________________
import matplotlib.pyplot as plt                                     
from matplotlib.ticker import MaxNLocator
from matplotlib.font_manager import FontProperties
from calendar import month_name
#______________________________________________________________________________
#GRAFICAS DE NORMALES CLIMATICAS 1981-2010
for code, data in normales.groupby('CODIGO'):

    nombre = data['NOMBRE'].iloc[0]
    departamento = data['DEPARTAMENTO'].iloc[0]
    latitud = data['LATITUD'].iloc[0]
    longitud = data['LONGITUD'].iloc[0]
    altitud = data['ALTITUD'].iloc[0]
    
    fig, (ax1, ax2, ax3, ax4) = plt.subplots(4, sharex=False, sharey=False,figsize=(20, 15))
    data.plot('MES',["TMAX"], alpha=0.5, color='darkred', marker='P', fontsize = 15.0,ax=ax1)

    data.plot('MES',["TMIN"], alpha=0.5,color='navy',marker='D', fontsize = 15.0,ax=ax2)

    data.plot('MES',["PP"],kind='bar',color='turquoise', fontsize = 15.0,ax=ax3)
    
    #ax1.set_ylim([8, 37])
    #ax2.set_ylim([-15, 25])
    ax3.set_ylim([0, 900])
    #add_value_labels(ax3)
    
    tabla=ax4.table(cellText=data[['TMAX','TMIN','PP']].T.values,colLabels=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto",
                         "Septiembre","Octubre","Noviembre","Diciembre"],
              rowLabels=data[['TMAX','TMIN','PP']].columns,rowColours =["darkred","navy","turquoise"],  
        colColours =["black"] * 12,loc="center",bbox = [0.0, -0.5, 1, 1])
    tabla.auto_set_font_size(False)
    tabla.set_fontsize(15)
    tabla.scale(1,2)
    ax4.axis('off')
    
        
    ax1.set_title(f'ESTACION: {nombre}' + f' DEPARTAMENTO: {departamento}'+f'\nLATITUD: {latitud}' + f' LONGITUD: {longitud}' + ' ALTITUD: '+str(altitud)+' m.s.n.m.'+' CODIGO: '+ str(code) +'\n\nNORMALES CLIMATOLÓGICAS PERÍODO 1991 - 2020',fontsize= 20,fontweight="bold")
    ax1.set_ylabel("Temperatura\nMáxima °C/mes", fontsize = 15.0)
    ax1.yaxis.set_major_locator(MaxNLocator(integer=True, min_n_ticks=1))
    ax2.set_ylabel("Temperatura\nMínima °C/mes", fontsize = 15.0)
    ax2.yaxis.set_major_locator(MaxNLocator(integer=True, min_n_ticks=1))
    ax3.set_ylabel("Precipitación mm/mes", fontsize = 15.0)
    ax3.yaxis.set_major_locator(MaxNLocator(integer=True, min_n_ticks=1))
    ax1.set_xlabel("")
    ax2.set_xlabel("")
    ax3.set_xlabel("")
    ax4.set_xlabel("")

    logo_senamhi = plt.imread("C:/ACTUAL/PYTHON SENAMHI/CURSO PYTHON SENAMHI/MODULO I/EJERCICIO PANDAS/LOGO/SENAMHI_logo-AI-ACENTO.jpg")
    ax_logo_senamhi = fig.add_axes([0.02, 0.90, 0.11, 0.09])
    ax_logo_senamhi.imshow(logo_senamhi)
    ax_logo_senamhi.axis('off')
    

    for (row, col), cell in tabla.get_celld().items():
        if (row == 0) or (col == -1):
            cell.set_text_props(color='white',fontsize=14,fontproperties=FontProperties(weight='bold'))

    fig.savefig("C:/ACTUAL/PYTHON SENAMHI/CURSO PYTHON SENAMHI/MODULO I/EJERCICIO PANDAS/GRAFICAS/"+str(nombre)+"."+str(code)+"estacion.png")   # save the figure to file
    plt.close(fig)    # close the figure window
#______________________________________________________________________________


























