Path: blob/main/Trabajo_final/grupo4/Grupo 4 - Trabajo Final_py.py
2714 views
## GRUPO 4:12## Integrantes:34# 20191215 - Flavia Lucıa Ore Mora5#20191445 - Marcela Giuliana Quintero Balletta6#20191240 - Luana Lisette Morales Ancajima7#20191622 - Seidy Isabel Ascencios Angeles89###############################################################################10# #11# PREGUNTA 1 #12# #13###############################################################################1415#%% Importamos las librerías necesarias1617import pandas as pd18import numpy as np19import re20from tqdm import tqdm # controlar el tiempo en un loop21import os222324# linear model library2526import statsmodels.api as sm # linear regression utiliza todas las columnas de base de datos27import statsmodels.formula.api as smf # linear regression usa uan formula28from sklearn import datasets, linear_model # models29from sklearn.metrics import mean_squared_error, r2_score30from linearmodels.iv import IV2SLS # for IV regression3132import warnings33warnings.filterwarnings('ignore') # eliminar warning messages343536# Export latex table and plot37pip install pystout38from pystout import pystout3940import matplotlib.pyplot as plt41import seaborn as sns4243user = os.getlogin() # Username44os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab10") # Set directorio454647#%% Pregunta 1.1484950# laod dataset5152repdata = pd.read_stata(r"../data/dataverse_files/mss_repdata.dta",53convert_categoricals=False)5455# convert_categoricals=False: No se lee las etiquetas de valor5657repdata585960# summmary statistics6162repdata.describe()6364# Tipo de variables6566repdata.info()6768repdata.dtypes697071# Extraer year72# con .month se puede extraer el mes73# con .day se puede extraer el día7475repdata['time_year'] = pd.DatetimeIndex(repdata['year']).year - 197876repdata['time_year']7778print (time_year)798081dummys = pd.get_dummies(repdata["ccode"].astype(int), prefix = "ccode", dummy_na=False)82dummys.columns8384# se convierte a entero repdata["ccode"].astype(int)8586# ccode: código por país8788# dummy_na=False8990# capturar varibbles omitidas invariantes de cada país9192dummys9394len(dummys.columns)959697repdata = pd.concat([ repdata , dummys], axis = 1 )9899# concantenar ambas bases de datos de manera horizontal (axis = 1)100101102# Creación del trend_country effects : multiplicación de las dummy por país y la variable temporal103# capturar variables omitidas variantes en el tiempo por cada país.104105i = 0106107while i < 41: # 41 por el tema de indexing pues en python la posición inicial es cero.108var = dummys.columns[i]+"_"+"time" # creamos el nombre de cada variable109repdata[var] = repdata[dummys.columns[i]]*repdata["time_year"]110111112# multiplicacón de variables: dummy país * variable temporal113114i = i + 1115116#Observamos los trend_country effects creados117118print(repdata[var])119120121# Observamos para país y la variable temporaral.122123repdata[['ccode','time_year']].iloc[0:40,:]124125126# Seleccionamos las variables para las estadísticas descriptivas127128table1 = repdata.loc[:,["NDVI_g", "tot_100_g", "trade_pGDP", "pop_den_rur","land_crop", "va_agr", "va_ind_manf"]]129130table1131132133# Seleccionamos los estadísticos de interés: media, error estándar y cantidad de observaciones134135summary_table = table1.describe().loc[["mean","std","count"]]136summary_table137138139summary_table = table1.describe().loc[["mean","std","count"]].T140summary_table141# .t permite tranponer el DataFrame142143144table1.columns145146147table1.columns148149new_names = ["Tasa de variación de índices de vegetación", "Términos de intercambio","Porcentaje de las exportaciones recpecto al PBI","Densidad poblacional rural",150"Porcentaje de tierra cultivable en uso","Valor agregado del sector agrícola respecto PBI","Valor agregado del sector manufacturero respecto PBI"]151152# Unión de listas bajo la estructura diccionario153154dict( zip( table1.columns, new_names) )155156157# Customize summary table158159index_nuevos_nombres = dict( zip( table1.columns, new_names) )160161columns_nuevos_nombres = {162"mean": "Mean",163"std": "Standard Deviation",164"count": "Observations",165}166167# Rename rows (indexes) and columns168summary_table.rename(index=index_nuevos_nombres, columns=columns_nuevos_nombres, inplace=True)169170summary_table171172# Export the DataFrame to LaTeX173# \ permite esccribir código extenso en lineas diferentes174175summary_table.style.format(subset="Mean", precision=2).format(subset="Standard Deviation", precision=2).format(subset="Observations", precision=0).to_latex(176"summary2.tex",177caption="Descriptive Statistics",178column_format = "lccc" # l: left, c:center ,179)180181182#Columns format183184summary_table.style.format(subset="Mean", precision=2).format(subset="Standard Deviation", precision=2).format(subset="Observations", precision=0)185186187188#%% Pregunta 1.2189190# Anteriormente creamos el country_time_trends, ahora crearemos los efectos fijos por país (country fixed effect):191192index_columns = np.where( repdata.columns.str.contains(193'_time$'))[0]194195# Indice con nombre de variables que terminan con _time196197country_trend = repdata.columns[index_columns] # se extrae el nombre de todas las variables que terminan con _time198country_trend199200201#Planteamos el modelo 1 donde la variable "y" es Civil conflict > 25 deaths202formula_model1 = "any_prio ~ GPCP_g + GPCP_g_l + C(ccode)" + ' + ' + ' + '.join( country_trend )203204205ols_model1 = smf.ols(formula_model1, data=repdata).fit(cov_type='cluster', cov_kwds={'groups': repdata['ccode']})206207print(ols_model1.summary())208209210#Planteamos el Modelo 2 donde la variable "y" es Civil conflict > 1000211212formula_model2 = "war_prio ~ GPCP_g + GPCP_g_l + C(ccode)" + ' + ' + ' + '.join( country_trend )213214215ols_model2 = smf.ols(formula_model2, data=repdata).fit(cov_type='cluster', cov_kwds={'groups': repdata['ccode']})216217print(ols_model2.summary())218219220##Cabe resaltar que ambas regresiones están clusterizadas y usan los errores estándar robustos.221222#Calculamos los root mean squared errors para ambas regresiones223224225anyprio= repdata["any_prio"]226warprio= repdata["war_prio"]227228229rmse_ol1 = round(mean_squared_error(anyprio, ols_model1.predict())**0.5,2)230print (rmse_ol1)231232rmse_ol2 = round(mean_squared_error(warprio, ols_model2.predict())**0.5,2)233print (rmse_ol2)234235236##Procedemos a hacer la tabla237238239# Lista de variables explicativas a mostrarse en la tabla240241explicativas = ['GPCP_g','GPCP_g_l']242243# Etiquetas a las variables244245etiquetas = ['Growth in rainfall, t','Growth in rainfall, t-1']246247248labels = dict(zip(explicativas,etiquetas))249labels250251pystout (models = [ols_model1,ols_model2], file='regression_table_3.tex', digits=3,252endog_names=[ "Civil Conflict > 25 deaths ", "Civil Conflict > 1000 deaths"],253exogvars =explicativas , # selecionamos las variables254varlabels = labels, # etiquetas a las variables255mgroups={"Dependent Variable " : [1,2] }, # titulo a las regresiones256modstat={'nobs':'Observations','rsquared':'R\sym{2}'}, # estadísticos257addrows={'Country fixed effects':['yes','yes'], 'Country-specific time trends' :258['yes','yes'],259'Root mean square error': [rmse_ol1,rmse_ol2]}, # añadimos filas260addnotes=['Note.—Huber robust standard errors are in parentheses.',261'Regression disturbance terms are clustered at the country level.',262'A country-specific year time trend is included in all specifications (coefficient estimates not reported).',263'* Significantly different from zero at 90 percent confidence.',264'** Significantly different from zero at 95 percent confidence.',265'*** Significantly different from zero at 99 percent confidence.'],266title='Rainfall and Civil Conflict (Reduced-Form)',267stars={.1:'*',.05:'**',.01:'***'}268)269270271272#%% Pregunta 1.3273274275# Fijamos los coeficientes y errores estándar del modelo 1276277model1 = smf.ols(formula_model1, data=repdata).fit(cov_type='cluster', cov_kwds={'groups': repdata['ccode']}).summary2().tables[1]278model1_coef = model1.iloc[41,0] # fila posición 1 y columna posición 0279model1_coef_se = model1.iloc[41,1] # fila posición 1 y columan posición 1280281# Obtenemos el lower y upper bound del modelo 1282model1_lower = model1.iloc[41,4]283model1_upper = model1.iloc[41,5]284285286# Fijamos los coeficientes y errores estándar del modelo 2287model2 = smf.ols(formula_model2, data=repdata).fit(cov_type='cluster', cov_kwds={'groups': repdata['ccode']}).summary2().tables[1]288model2_coef = model2.iloc[41,0] # fila posición 1 y columna posición 0289model2_coef_se = model2.iloc[41,1] # fila posición 1 y columan posición 1290291# Obtenemos el lower y upper bound del modelo 2292model2_lower = model2.iloc[41,4]293model2_upper = model2.iloc[41,5]294295#Creamos una tabla con los datos ya extraídos296297table = np.zeros( ( 2, 4 ) )298299table[0,0] = model1_coef300table[0,1] = model1_coef_se301table[0,2] = model1_lower302table[0,3] = model1_upper303304table[1,0] = model2_coef305table[1,1] = model2_coef_se306table[1,2] = model2_lower307table[1,3] = model2_upper308309310311table_pandas = pd.DataFrame( table, columns = [ "Estimate","Std. Error","Lower_bound" , "Upper_bound"])312table_pandas.index = [ "Dependent Variable: Civil Conflict ≥25 Deaths","Dependent Variable: Civil Conflict ≥1000 Deaths"]313314table_pandas.reset_index(inplace = True)315table_pandas.rename(columns = {"index" : "Model"}, inplace = True)316317table_pandas.round(8)318319320# Realizamos el coef plot321322fig, ax = plt.subplots(figsize=(7, 6))323324ax.scatter(x=table_pandas['Model'],325marker='o', s=10, # s: modificar tamaño del point326y=table_pandas['Estimate'], color = "black")327328eb1 = plt.errorbar(x=table_pandas['Model'], y=table_pandas['Estimate'],329yerr = 0.5*(table_pandas['Upper_bound']- table_pandas['Lower_bound']),330color = 'black', ls='', capsize = 4)331332333plt.axhline(y=0, color = 'black').set_linestyle('--') # linea horizontal334# Set title & labels335plt.title('GPCP_g Coefficient (95% CI)',fontsize=12)336337338339#%% Pregunta 2340341# !pip install openpyxl342343#import pandas as pd344#import os345346user = os.getlogin() # Username347348os.chdir(f"C:/Users/{user}/Documents/final_py")349350351## Importamos las bases de datos de Excel a Python:352## Como se trabajó con un archivo propio llamado "Detalle", el código no correrá a menos de tenerlo en una carpeta353## llamada "final_py":354355df2014 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2014')356df2015 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2015')357df2016 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2016')358df2017 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2017')359df2018 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2018')360df2019 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2019')361df2020 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2020')362df2021 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2021')363364365## Conservamos a la columna ANUAL:366367df2014 = df2014.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])368df2015 = df2015.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])369df2016 = df2016.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])370df2017 = df2017.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])371df2018 = df2018.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])372df2019 = df2019.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])373df2020 = df2020.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])374df2021 = df2021.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])375376377## Eliminamos las filas de Establecimiento de Salud e Instituciones educativas:378379df2014 = df2014.drop([8,9], axis=0)380df2015 = df2015.drop([8,9], axis=0)381df2016 = df2016.drop([8,9], axis=0)382df2017 = df2017.drop([8,9], axis=0)383df2018 = df2018.drop([8,9], axis=0)384df2019 = df2019.drop([8,9], axis=0)385df2020 = df2020.drop([8,9], axis=0)386df2021 = df2021.drop([8,9], axis=0)387388389## Mergeamos los df:390391df2014 = df2014.rename(columns={'ANUAL':'2014'})392df2015 = df2015.rename(columns={'ANUAL':'2015'})393df2016 = df2016.rename(columns={'ANUAL':'2016'})394df2017 = df2017.rename(columns={'ANUAL':'2017'})395df2018 = df2018.rename(columns={'ANUAL':'2018'})396df2019 = df2019.rename(columns={'ANUAL':'2019'})397df2020 = df2020.rename(columns={'ANUAL':'2020'})398df2021 = df2021.rename(columns={'ANUAL':'2021'})399400## Como solo se puede utilizar el comando merge para 2 dfs, juntamos cada tabla en grupos de 2 en 2:401402merge1 = pd.merge(df2014, df2015)403merge2 = pd.merge(df2016, df2017)404405first_merge = pd.merge(merge1, merge2)406407## El segundo grupo:408409merge3 = pd.merge(df2018, df2019)410merge4 = pd.merge(df2020, df2021)411412second_merge = pd.merge(merge3, merge4)413414## La tabla final:415416dfs_merged = pd.merge(first_merge, second_merge)417418419## Transponiendo la tabla para que quede como la de las indicaciones:420421dfs_merged.set_index(dfs_merged.columns[0])422dfs_merged = dfs_merged.T423424## Cambiamos de nombre al index425426dfs_merged = dfs_merged.rename(index={'Unnamed: 0':'Año'})427428429430431432433