Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_final/grupo4/Grupo 4 - Trabajo Final_py.py
2714 views
1
## GRUPO 4:
2
3
## Integrantes:
4
5
# 20191215 - Flavia Lucıa Ore Mora
6
#20191445 - Marcela Giuliana Quintero Balletta
7
#20191240 - Luana Lisette Morales Ancajima
8
#20191622 - Seidy Isabel Ascencios Angeles
9
10
###############################################################################
11
# #
12
# PREGUNTA 1 #
13
# #
14
###############################################################################
15
16
#%% Importamos las librerías necesarias
17
18
import pandas as pd
19
import numpy as np
20
import re
21
from tqdm import tqdm # controlar el tiempo en un loop
22
import os
23
24
25
# linear model library
26
27
import statsmodels.api as sm # linear regression utiliza todas las columnas de base de datos
28
import statsmodels.formula.api as smf # linear regression usa uan formula
29
from sklearn import datasets, linear_model # models
30
from sklearn.metrics import mean_squared_error, r2_score
31
from linearmodels.iv import IV2SLS # for IV regression
32
33
import warnings
34
warnings.filterwarnings('ignore') # eliminar warning messages
35
36
37
# Export latex table and plot
38
pip install pystout
39
from pystout import pystout
40
41
import matplotlib.pyplot as plt
42
import seaborn as sns
43
44
user = os.getlogin() # Username
45
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab10") # Set directorio
46
47
48
#%% Pregunta 1.1
49
50
51
# laod dataset
52
53
repdata = pd.read_stata(r"../data/dataverse_files/mss_repdata.dta",
54
convert_categoricals=False)
55
56
# convert_categoricals=False: No se lee las etiquetas de valor
57
58
repdata
59
60
61
# summmary statistics
62
63
repdata.describe()
64
65
# Tipo de variables
66
67
repdata.info()
68
69
repdata.dtypes
70
71
72
# Extraer year
73
# con .month se puede extraer el mes
74
# con .day se puede extraer el día
75
76
repdata['time_year'] = pd.DatetimeIndex(repdata['year']).year - 1978
77
repdata['time_year']
78
79
print (time_year)
80
81
82
dummys = pd.get_dummies(repdata["ccode"].astype(int), prefix = "ccode", dummy_na=False)
83
dummys.columns
84
85
# se convierte a entero repdata["ccode"].astype(int)
86
87
# ccode: código por país
88
89
# dummy_na=False
90
91
# capturar varibbles omitidas invariantes de cada país
92
93
dummys
94
95
len(dummys.columns)
96
97
98
repdata = pd.concat([ repdata , dummys], axis = 1 )
99
100
# concantenar ambas bases de datos de manera horizontal (axis = 1)
101
102
103
# Creación del trend_country effects : multiplicación de las dummy por país y la variable temporal
104
# capturar variables omitidas variantes en el tiempo por cada país.
105
106
i = 0
107
108
while i < 41: # 41 por el tema de indexing pues en python la posición inicial es cero.
109
var = dummys.columns[i]+"_"+"time" # creamos el nombre de cada variable
110
repdata[var] = repdata[dummys.columns[i]]*repdata["time_year"]
111
112
113
# multiplicacón de variables: dummy país * variable temporal
114
115
i = i + 1
116
117
#Observamos los trend_country effects creados
118
119
print(repdata[var])
120
121
122
# Observamos para país y la variable temporaral.
123
124
repdata[['ccode','time_year']].iloc[0:40,:]
125
126
127
# Seleccionamos las variables para las estadísticas descriptivas
128
129
table1 = repdata.loc[:,["NDVI_g", "tot_100_g", "trade_pGDP", "pop_den_rur","land_crop", "va_agr", "va_ind_manf"]]
130
131
table1
132
133
134
# Seleccionamos los estadísticos de interés: media, error estándar y cantidad de observaciones
135
136
summary_table = table1.describe().loc[["mean","std","count"]]
137
summary_table
138
139
140
summary_table = table1.describe().loc[["mean","std","count"]].T
141
summary_table
142
# .t permite tranponer el DataFrame
143
144
145
table1.columns
146
147
148
table1.columns
149
150
new_names = ["Tasa de variación de índices de vegetación", "Términos de intercambio","Porcentaje de las exportaciones recpecto al PBI","Densidad poblacional rural",
151
"Porcentaje de tierra cultivable en uso","Valor agregado del sector agrícola respecto PBI","Valor agregado del sector manufacturero respecto PBI"]
152
153
# Unión de listas bajo la estructura diccionario
154
155
dict( zip( table1.columns, new_names) )
156
157
158
# Customize summary table
159
160
index_nuevos_nombres = dict( zip( table1.columns, new_names) )
161
162
columns_nuevos_nombres = {
163
"mean": "Mean",
164
"std": "Standard Deviation",
165
"count": "Observations",
166
}
167
168
# Rename rows (indexes) and columns
169
summary_table.rename(index=index_nuevos_nombres, columns=columns_nuevos_nombres, inplace=True)
170
171
summary_table
172
173
# Export the DataFrame to LaTeX
174
# \ permite esccribir código extenso en lineas diferentes
175
176
summary_table.style.format(subset="Mean", precision=2).format(subset="Standard Deviation", precision=2).format(subset="Observations", precision=0).to_latex(
177
"summary2.tex",
178
caption="Descriptive Statistics",
179
column_format = "lccc" # l: left, c:center ,
180
)
181
182
183
#Columns format
184
185
summary_table.style.format(subset="Mean", precision=2).format(subset="Standard Deviation", precision=2).format(subset="Observations", precision=0)
186
187
188
189
#%% Pregunta 1.2
190
191
# Anteriormente creamos el country_time_trends, ahora crearemos los efectos fijos por país (country fixed effect):
192
193
index_columns = np.where( repdata.columns.str.contains(
194
'_time$'))[0]
195
196
# Indice con nombre de variables que terminan con _time
197
198
country_trend = repdata.columns[index_columns] # se extrae el nombre de todas las variables que terminan con _time
199
country_trend
200
201
202
#Planteamos el modelo 1 donde la variable "y" es Civil conflict > 25 deaths
203
formula_model1 = "any_prio ~ GPCP_g + GPCP_g_l + C(ccode)" + ' + ' + ' + '.join( country_trend )
204
205
206
ols_model1 = smf.ols(formula_model1, data=repdata).fit(cov_type='cluster', cov_kwds={'groups': repdata['ccode']})
207
208
print(ols_model1.summary())
209
210
211
#Planteamos el Modelo 2 donde la variable "y" es Civil conflict > 1000
212
213
formula_model2 = "war_prio ~ GPCP_g + GPCP_g_l + C(ccode)" + ' + ' + ' + '.join( country_trend )
214
215
216
ols_model2 = smf.ols(formula_model2, data=repdata).fit(cov_type='cluster', cov_kwds={'groups': repdata['ccode']})
217
218
print(ols_model2.summary())
219
220
221
##Cabe resaltar que ambas regresiones están clusterizadas y usan los errores estándar robustos.
222
223
#Calculamos los root mean squared errors para ambas regresiones
224
225
226
anyprio= repdata["any_prio"]
227
warprio= repdata["war_prio"]
228
229
230
rmse_ol1 = round(mean_squared_error(anyprio, ols_model1.predict())**0.5,2)
231
print (rmse_ol1)
232
233
rmse_ol2 = round(mean_squared_error(warprio, ols_model2.predict())**0.5,2)
234
print (rmse_ol2)
235
236
237
##Procedemos a hacer la tabla
238
239
240
# Lista de variables explicativas a mostrarse en la tabla
241
242
explicativas = ['GPCP_g','GPCP_g_l']
243
244
# Etiquetas a las variables
245
246
etiquetas = ['Growth in rainfall, t','Growth in rainfall, t-1']
247
248
249
labels = dict(zip(explicativas,etiquetas))
250
labels
251
252
pystout (models = [ols_model1,ols_model2], file='regression_table_3.tex', digits=3,
253
endog_names=[ "Civil Conflict > 25 deaths ", "Civil Conflict > 1000 deaths"],
254
exogvars =explicativas , # selecionamos las variables
255
varlabels = labels, # etiquetas a las variables
256
mgroups={"Dependent Variable " : [1,2] }, # titulo a las regresiones
257
modstat={'nobs':'Observations','rsquared':'R\sym{2}'}, # estadísticos
258
addrows={'Country fixed effects':['yes','yes'], 'Country-specific time trends' :
259
['yes','yes'],
260
'Root mean square error': [rmse_ol1,rmse_ol2]}, # añadimos filas
261
addnotes=['Note.—Huber robust standard errors are in parentheses.',
262
'Regression disturbance terms are clustered at the country level.',
263
'A country-specific year time trend is included in all specifications (coefficient estimates not reported).',
264
'* Significantly different from zero at 90 percent confidence.',
265
'** Significantly different from zero at 95 percent confidence.',
266
'*** Significantly different from zero at 99 percent confidence.'],
267
title='Rainfall and Civil Conflict (Reduced-Form)',
268
stars={.1:'*',.05:'**',.01:'***'}
269
)
270
271
272
273
#%% Pregunta 1.3
274
275
276
# Fijamos los coeficientes y errores estándar del modelo 1
277
278
model1 = smf.ols(formula_model1, data=repdata).fit(cov_type='cluster', cov_kwds={'groups': repdata['ccode']}).summary2().tables[1]
279
model1_coef = model1.iloc[41,0] # fila posición 1 y columna posición 0
280
model1_coef_se = model1.iloc[41,1] # fila posición 1 y columan posición 1
281
282
# Obtenemos el lower y upper bound del modelo 1
283
model1_lower = model1.iloc[41,4]
284
model1_upper = model1.iloc[41,5]
285
286
287
# Fijamos los coeficientes y errores estándar del modelo 2
288
model2 = smf.ols(formula_model2, data=repdata).fit(cov_type='cluster', cov_kwds={'groups': repdata['ccode']}).summary2().tables[1]
289
model2_coef = model2.iloc[41,0] # fila posición 1 y columna posición 0
290
model2_coef_se = model2.iloc[41,1] # fila posición 1 y columan posición 1
291
292
# Obtenemos el lower y upper bound del modelo 2
293
model2_lower = model2.iloc[41,4]
294
model2_upper = model2.iloc[41,5]
295
296
#Creamos una tabla con los datos ya extraídos
297
298
table = np.zeros( ( 2, 4 ) )
299
300
table[0,0] = model1_coef
301
table[0,1] = model1_coef_se
302
table[0,2] = model1_lower
303
table[0,3] = model1_upper
304
305
table[1,0] = model2_coef
306
table[1,1] = model2_coef_se
307
table[1,2] = model2_lower
308
table[1,3] = model2_upper
309
310
311
312
table_pandas = pd.DataFrame( table, columns = [ "Estimate","Std. Error","Lower_bound" , "Upper_bound"])
313
table_pandas.index = [ "Dependent Variable: Civil Conflict ≥25 Deaths","Dependent Variable: Civil Conflict ≥1000 Deaths"]
314
315
table_pandas.reset_index(inplace = True)
316
table_pandas.rename(columns = {"index" : "Model"}, inplace = True)
317
318
table_pandas.round(8)
319
320
321
# Realizamos el coef plot
322
323
fig, ax = plt.subplots(figsize=(7, 6))
324
325
ax.scatter(x=table_pandas['Model'],
326
marker='o', s=10, # s: modificar tamaño del point
327
y=table_pandas['Estimate'], color = "black")
328
329
eb1 = plt.errorbar(x=table_pandas['Model'], y=table_pandas['Estimate'],
330
yerr = 0.5*(table_pandas['Upper_bound']- table_pandas['Lower_bound']),
331
color = 'black', ls='', capsize = 4)
332
333
334
plt.axhline(y=0, color = 'black').set_linestyle('--') # linea horizontal
335
# Set title & labels
336
plt.title('GPCP_g Coefficient (95% CI)',fontsize=12)
337
338
339
340
#%% Pregunta 2
341
342
# !pip install openpyxl
343
344
#import pandas as pd
345
#import os
346
347
user = os.getlogin() # Username
348
349
os.chdir(f"C:/Users/{user}/Documents/final_py")
350
351
352
## Importamos las bases de datos de Excel a Python:
353
## Como se trabajó con un archivo propio llamado "Detalle", el código no correrá a menos de tenerlo en una carpeta
354
## llamada "final_py":
355
356
df2014 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2014')
357
df2015 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2015')
358
df2016 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2016')
359
df2017 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2017')
360
df2018 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2018')
361
df2019 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2019')
362
df2020 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2020')
363
df2021 = pd.read_excel(f"C:/Users/{user}/Documents/final_py/Detalle.xlsx", sheet_name='Detalle2021')
364
365
366
## Conservamos a la columna ANUAL:
367
368
df2014 = df2014.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])
369
df2015 = df2015.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])
370
df2016 = df2016.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])
371
df2017 = df2017.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])
372
df2018 = df2018.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])
373
df2019 = df2019.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])
374
df2020 = df2020.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])
375
df2021 = df2021.drop(columns = ["I BIMESTRE", "II BIMESTRE", "III BIMESTRE", "IV BIMESTRE", "V BIMESTRE", "VI BIMESTRE"])
376
377
378
## Eliminamos las filas de Establecimiento de Salud e Instituciones educativas:
379
380
df2014 = df2014.drop([8,9], axis=0)
381
df2015 = df2015.drop([8,9], axis=0)
382
df2016 = df2016.drop([8,9], axis=0)
383
df2017 = df2017.drop([8,9], axis=0)
384
df2018 = df2018.drop([8,9], axis=0)
385
df2019 = df2019.drop([8,9], axis=0)
386
df2020 = df2020.drop([8,9], axis=0)
387
df2021 = df2021.drop([8,9], axis=0)
388
389
390
## Mergeamos los df:
391
392
df2014 = df2014.rename(columns={'ANUAL':'2014'})
393
df2015 = df2015.rename(columns={'ANUAL':'2015'})
394
df2016 = df2016.rename(columns={'ANUAL':'2016'})
395
df2017 = df2017.rename(columns={'ANUAL':'2017'})
396
df2018 = df2018.rename(columns={'ANUAL':'2018'})
397
df2019 = df2019.rename(columns={'ANUAL':'2019'})
398
df2020 = df2020.rename(columns={'ANUAL':'2020'})
399
df2021 = df2021.rename(columns={'ANUAL':'2021'})
400
401
## Como solo se puede utilizar el comando merge para 2 dfs, juntamos cada tabla en grupos de 2 en 2:
402
403
merge1 = pd.merge(df2014, df2015)
404
merge2 = pd.merge(df2016, df2017)
405
406
first_merge = pd.merge(merge1, merge2)
407
408
## El segundo grupo:
409
410
merge3 = pd.merge(df2018, df2019)
411
merge4 = pd.merge(df2020, df2021)
412
413
second_merge = pd.merge(merge3, merge4)
414
415
## La tabla final:
416
417
dfs_merged = pd.merge(first_merge, second_merge)
418
419
420
## Transponiendo la tabla para que quede como la de las indicaciones:
421
422
dfs_merged.set_index(dfs_merged.columns[0])
423
dfs_merged = dfs_merged.T
424
425
## Cambiamos de nombre al index
426
427
dfs_merged = dfs_merged.rename(index={'Unnamed: 0':'Año'})
428
429
430
431
432
433