Aplicación de la teoría de redes a las relaciones comerciales entre países. Este post busca describir un dashboard de redes comerciales que cree y, al mismo tiempo, probar el funcionamiento de python en Rstudio.
Este post indica cómo se generaron los grafos del dashboard 🚢 Redes comerciales. Por otro lado, se busca generar un informe en donde variables de entorno interactuan entre lenguajes (R y Python) desde el IDE Rstudio.
library(dplyr)
library(gt)
library(ggplot2)
library(plotly)
import pandas as pd
from math import log, floor
import numpy as np
from pyvis.network import Network
Los datos fueron obtenidos de tradestatistics1, un paquete que permite acceder a api.tradestatistics.io de forma sencilla. Se realiza la lectura del dataframe con R, para utilizar el paquete gt para visualizar las tablas.
<- read.csv('data/df.csv')
df %>%
df filter(reporter=='Argentina') %>%
head() %>%
gt() %>%
tab_header('Datos de comercio exterior, 2018')
Datos de comercio exterior, 2018 | |||||
---|---|---|---|---|---|
reporter | partner | section | export_value_usd | continent_reporter | continent_partner |
Argentina | Afghanistan | Animal Products | 762411 | Americas | Asia |
Argentina | Afghanistan | Vegetable Products | 48145 | Americas | Asia |
Argentina | Afghanistan | Animal and Vegetable Bi-Products | 148453 | Americas | Asia |
Argentina | Afghanistan | Unspecified | 164137 | Americas | Asia |
Argentina | Angola | Vegetable Products | 10938605 | Americas | Africa |
Argentina | Angola | Animal and Vegetable Bi-Products | 4484919 | Americas | Africa |
Por secciones se puede ver que el mayor valor de exportaciones se da en Machines ⚙️
%>%
(df group_by(section) %>%
summarise(exports = sum(export_value_usd)/1000000) %>%
ggplot(aes(x=reorder(section, exports), y=exports, fill=exports))+
geom_col()+
coord_flip()+
theme_minimal()+
scale_fill_gradient(low='#E36BF4',high='#5F96ED',)+
labs(x='', y='Exportaciones (millones de dólares)',
title='Valor de las exportaciones por sección')+
theme(legend.position='none')
%>%
) ggplotly() %>%
layout(
xaxis = list(fixedrange = TRUE, showgrid = T),
yaxis = list(fixedrange = TRUE, showgrid = F)
%>%
) hide_legend()
Se utilizará una función definida como human_format para darle formato a los números de valores de exportaciones.
def human_format(number):
if number!=0:
= ['', 'K', 'M', 'G', 'T', 'P']
units = 1000.0
k = int(floor(log(number, k)))
magnitude return '%.1f%s' % (number / k**magnitude, units[magnitude])
else:
return 0
Utilizando python se obtiene una lista de las secciones (valores únicos). Notar que el df había sido importado con código R, y para llamarlo se utiliza r.df.
= list(pd.DataFrame({
sections 'section': r.df['section'].unique()}).sort_values('section').section)
Se filtra el df por un sector específico para generar la red de comercio de este sector.
= r.df[r.df.section=='Machines'].copy() dffilt
Se generan los vértices de los grafos:
= (dffilt
vertices'reporter','continent_reporter'], as_index=False)
.groupby([
.export_value_usdsum()
.
.copy()
)= ['pais','continente','export_value_usd'] vertices.columns
Se visualizan estos datos (generados con python) mediante código en R con gt. En este caso, para utilizar el pandas dataframe vertices con R se utiliza py$vertices.
$vertices %>% head() %>% gt() %>%
pytab_header('Vertices')
Vertices | ||
---|---|---|
pais | continente | export_value_usd |
Afghanistan | Asia | 441904 |
Albania | Europe | 1907127 |
Algeria | Africa | 902838 |
American Samoa | Oceania | 1313000 |
Andorra | Europe | 2329914 |
Angola | Africa | 564364 |
Se generan los vértices faltantes (a pesar de no haber exportado es necesario definirlos para que luego tomen el color del continente al que pertenecen).
=dffilt.loc[~dffilt.partner.isin(vertices.pais.unique()),
vertices2'partner','continent_partner']]
['export_value_usd']=0
vertices2[= ['pais','continente','export_value_usd']
vertices2.columns = pd.concat([vertices,vertices2],axis=0) vertices
Se asignan colores por continente:
'color'] = np.select([vertices.continente == 'Asia',
vertices[== 'Africa',
vertices.continente == 'Americas',
vertices.continente == 'Europe',
vertices.continente == 'Oceania'],
vertices.continente '#FB8455','#E36BF4','#62D5F0','#5F96ED','#18AE95'],
[='other') default
Se utiliza la función human_format para mejorar el formato de las exportaciones.
'label']=[human_format(i) for i in vertices.export_value_usd] vertices[
Se filtra por una cantidad menor de datos para que la visualización renderize más rápido:
= (dffilt
dffilt 'export_value_usd',ascending=False)
.sort_values(200)
.head(=True)
.reset_index(drop
.copy() )
Layout de los grafos:
= Network(
network ="white",
bgcolor="black",
font_color=False,
notebook=True,
directed="750px",
height="100%"
width
)"""
network.set_options(var options = {
"nodes": {
"borderWidth": 0,
"borderWidthSelected": 4,
"fixed": {
"x": false,
"y": false
},
"font": {
"size": 13,
"strokeWidth": 3
},
"shape": "dot"
},
"edges": {
"color": {"inherit": true},
"smooth": {"type": "horizontal",
"type": "continuous",
"forceDirection": "none",
"roundness": 0},
"arrows": {"to": {"enabled": true}},
"arrowStrikethrough": false,
"selectionWidth": 7
},
"interaction": {
"dragNodes": true,
"hideEdgesOnDrag": false
},
"physics": {
"enabled": true,
"barnesHut": {"gravitationalConstant": -40000, "springLength": 100,
"springConstant": 0.01},
"minVelocity": 0.75,
"maxVelocity": 50
}
}
""")
En este momento se asignan los datos a la red (network) generada anteriormente.
= zip(dffilt['reporter'], dffilt['partner'], dffilt['export_value_usd'])
edge_data for e in edge_data:
= e[0]
src = e[1]
dst = e[2]
w =src)
network.add_node(src, src, title=dst)
network.add_node(dst, dst, title=w)
network.add_edge(src, dst, valuefor node in network.nodes:
if node['id'] in list(vertices['pais']):
'value']=int(vertices.loc[vertices.pais==node['id'],'export_value_usd'].values[0])
node['title']=node['title']+"<br>Export: "+str(vertices.loc[vertices.pais==node['id'],'label'].values[0])
node['color']=str(vertices.loc[vertices.pais==node['id'],'color'].values[0]) node[
El grafo se almacena como html:
"grafo.html") network.show(
La siguiente visualización es una de las visualizaciones incluidas en Redes comerciales. En este caso, para Machines, la sección con mayor valor de exportaciones en USD en 2018.
::includeHTML("grafo.html") htmltools
For attribution, please cite this work as
Bartolomé (2021, Jan. 20). Karina Bartolome: Redes en el comercio internacional. Retrieved from https://karbartolome-blog.netlify.app/posts/RedesComerciales/
BibTeX citation
@misc{bartolomé2021redes, author = {Bartolomé, Karina}, title = {Karina Bartolome: Redes en el comercio internacional}, url = {https://karbartolome-blog.netlify.app/posts/RedesComerciales/}, year = {2021} }