<jupyter_start><jupyter_text>Technical Proof Data Scientist<jupyter_code>%matplotlib inline


# Librerías y paquetes necesarios


#Trtamiento de datos

import pandas as pd
import numpy as np
import datetime as dt



#Modelo predictvo series de tiempo

from fbprophet import Prophet
from fbprophet.diagnostics import performance_metrics

#  Biblioteca para aprendizaje automático 

from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error

#Graficas estáticas

import matplotlib
import matplotlib.pyplot as plt

#Graficas interactivas

import plotly
plotly.io.renderers.default = 'notebook_connected'
import plotly.express as px
import plotly.graph_objects as go


# Carga del conjunto de datos

path= './dataset.xlsx'
df = pd.read_excel(path)


df.head(5)
# Exploración completa del conjunto de datos

df.describe()
# Conteo de registros faltantes

df.isnull().sum()
# Conteo del tipo de producto comercializado

df['Descripción.1'].value_counts()
# Primer subconjunto de datos

df_sub1=df[['No.Factura', 'Pagador', 'Resp.Pago', 'Cod.Solic.', 
    'Solicitante','Cód.Vend','Vendedor', 'CondiciónPago', 
    'Pto.exped./depto.entradaMcía', 'Descripción.1', 
    'Descripción.2', 'Material', 'Denominación', 'UMB', 
    'Negocio', 'FechaFactCont', 'Grupo de porte mat.', 'Estado', 'Región',
    'Condado','Cant.Base','NetoDólares']].copy()

df_sub1.head(5)
# Conteo de registros faltantes

df_sub1.isnull().sum()
# Conteo de tipos de unidades manjeadas en los productos que se comercializan

df_sub1['UMB'].value_counts()
# Conteo de registros faltantes, los cuales en este caso tendría una unodad de medida desconocida


df_sub1['UMB'].isnull().sum()
# Asignación de nombre a los registros faltantes


df_sub1['UMB'] = df_sub1['UMB'].replace(np.nan,'Indefinido')

df_sub1['UMB'].value_counts()<jupyter_output><empty_output><jupyter_text>Cemento: análisis exploratorio Como se puede observar, es posible que el cemento esté en varias uniodades de medida, por lo tanto para manejar las cantidades vendidas, es necesario separarlas por su respectiva unidad de medida, que en este caso serían toneladas, metro cúbico e indefinido. Para el análisis de ingresos, que correspondel a el valor neto facturado no es necesario hacer esta operación. A continuación se hará un análisis exploratorio en algunas columnas del Dataframe para observar catergorías relevantes y observar el comportamiento del cemento en cada una de ellas, asícomo su comportamiento en el tiempo<jupyter_code>df_sub1['Descripción.2'].value_counts()
#df_sub1['Descripción.2'].isnull().sum()
df_sub1['Denominación'].value_counts()
#df_sub1['Denominación'].isnull().sum()
df_sub1['Negocio'].value_counts()
#df_sub1['Negocio'].isnull().sum()
df_sub1['Grupo de porte mat.'].value_counts()
#df_sub1['Grupo de porte mat.'].isnull().sum()
df_sub1['Condado'].value_counts()
#df_sub1['Condado'].isnull().sum()<jupyter_output><empty_output><jupyter_text>Cantidad de cemento comercializada  A continuación se separarań los dataframes por unidad de medida<jupyter_code>#-----------------Cantidad de cemento en toneladas-------------------------------

# Filtrado mediante indexación booleana por tipo de unidad de medida y tipo de producto comercializado

# Filtrado por unidad de medida

df_sub1_T=df_sub1['UMB']=='T'

df_T_filtro = df_sub1[df_sub1_T]

df_T1 = df_T_filtro[['No.Factura','Descripción.1','Descripción.2','Denominación','Negocio',
                  'FechaFactCont', 'Grupo de porte mat.','Condado','Cant.Base']]

# Filtrado por tipo de producto comercializado

df_T_fcem = df_T1['Descripción.1']=='CEMENTO'

df_T_fcem1 = df_T1[df_T_fcem]

df_T_cemento1 = df_T_fcem1.drop(['Descripción.1'], axis=1)

#df_T_cemento.head(5)


#-----------------Cantidad de cemento en m3-------------------------------


# Filtrado mediante indexación booleana por tipo de unidad de medida y tipo de producto comercializado

# Filtrado por unidad de medida

df_sub1_M3=df_sub1['UMB']=='M3'

df_M3_filtro = df_sub1[df_sub1_M3]

df_M3 = df_M3_filtro[['No.Factura','Descripción.1','Descripción.2','Denominación','Negocio',
                  'FechaFactCont', 'Grupo de porte mat.','Condado','Cant.Base']]

# Filtrado por tipo de producto comercializado

df_M3_fcem=df_M3['Descripción.1']=='CEMENTO'

df_M3_fcem1 = df_M3[df_M3_fcem]

df_M3_cemento = df_M3_fcem1.drop(['Descripción.1'], axis=1)


#df_M3_cemento.head(5)

#-----------------Cantidad de cemento unidades indefinidas-------------------------------



# Filtrado mediante indexación booleana por tipo de unidad de medida y tipo de producto comercializado

# Filtrado por unidad de medida

df_sub1_Indefinido=df_sub1['UMB']=='Indefinido'

df_Indefinido_filtro = df_sub1[df_sub1_Indefinido]

df_Indefinido = df_Indefinido_filtro[['No.Factura','Descripción.1','Descripción.2','Denominación','Negocio',
                  'FechaFactCont', 'Grupo de porte mat.','Condado','Cant.Base']]

# Filtrado por tipo de producto comercializado

df_Indefinido_fcem = df_Indefinido['Descripción.1']=='CEMENTO'

df_Indefinido_fcem1 = df_Indefinido[df_Indefinido_fcem]

df_Indefinido_cemento = df_Indefinido_fcem1.drop(['Descripción.1'], axis=1)


#df_Indefinido_cemento.head(5)
# Al parecer estas unidades corresponden a metro cúbicos.

df_Indefinido_cemento.head(5)

#Inspección de datos para limpieza

df_T_cemento1.describe()

df_M3_cemento.describe()

df_Indefinido_cemento.describe()
# Eliminación de datos negativos y ceros

df_T_cemento1 = df_T_cemento1.drop(df_T_cemento1[df_T_cemento1['Cant.Base']<0].index)
df_T_cemento1 = df_T_cemento1.drop(df_T_cemento1[df_T_cemento1['Cant.Base']==0].index)

df_T_cemento1.describe()

df_M3_cemento = df_M3_cemento.drop(df_M3_cemento[df_M3_cemento['Cant.Base']<0].index)
df_M3_cemento = df_M3_cemento.drop(df_M3_cemento[df_M3_cemento['Cant.Base']==0].index)

df_M3_cemento.describe()


df_Indefinido_cemento = df_Indefinido_cemento.drop(df_Indefinido_cemento[df_Indefinido_cemento['Cant.Base']<0].index)
df_Indefinido_cemento = df_Indefinido_cemento.drop(df_Indefinido_cemento[df_Indefinido_cemento['Cant.Base']==0].index)

df_Indefinido_cemento.describe()

# Conversión de metros cúbicos a toneladas

# Se considera una densidad del cemento de 3000 kg/m3

# El factor de conversión será (3000 kg/m3)*(dato m3)/1000 kg = dato Toneladas

df_M3_cemento['Cant.Base']=df_M3_cemento['Cant.Base']*(3000)/1000
df_Indefinido_cemento['Cant.Base']=df_Indefinido_cemento['Cant.Base']*(3000)/1000


df_T_cemento = pd.concat([df_T_cemento1, df_M3_cemento, df_Indefinido_cemento], axis=0)

#df_T_cemento.head(5)
df_T_cemento.shape
#df_T_cemento.describe()<jupyter_output><empty_output><jupyter_text>Cantidad de cemento en Toneladas<jupyter_code>#-------------Agrupación por Segmento de producto-----------------------------


df_T_cemento_SP = df_T_cemento.groupby('Descripción.2').agg({ 
                                                      'Cant.Base': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_T_cemento_SP = df_T_cemento_SP.reset_index()

# Cambio el nombre de una de las columnas

df_T_cemento_SP.rename(columns={'Descripción.2':'Segmento_producto', 'Cant.Base':'cant_cemento_ton'}, inplace=True)

#df_T_cemento_SP.head(5)

#-------------Agrupación por Denominación-----------------------------


df_T_cemento_D = df_T_cemento.groupby('Denominación').agg({ 
                                                      'Cant.Base': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_T_cemento_D = df_T_cemento_D.reset_index()

# Cambio el nombre de una de las columnas

df_T_cemento_D.rename(columns={'Cant.Base':'cant_cemento_ton'}, inplace=True)


#df_T_cemento_D.head(5)

#-------------Agrupación por tipo de Negocio-----------------------------


df_T_cemento_N = df_T_cemento.groupby('Negocio').agg({ 
                                                      'Cant.Base': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_T_cemento_N = df_T_cemento_N.reset_index()

# Cambio el nombre de una de las columnas

df_T_cemento_N.rename(columns={'Cant.Base':'cant_cemento_ton'}, inplace=True)

#df_T_cemento_N.head(5)


#-------------Agrupación por Grupo de Porte de Material-----------------------------


df_T_cemento_GPM = df_T_cemento.groupby('Grupo de porte mat.').agg({ 
                                                      'Cant.Base': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_T_cemento_GPM = df_T_cemento_GPM.reset_index()

# Cambio el nombre de una de las columnas

df_T_cemento_GPM.rename(columns={'Grupo de porte mat.':'grp_prote', 'Cant.Base':'cant_cemento_ton'}, inplace=True)

#df_T_cemento_GPM.head(5)



#-------------Agrupación por tipo de Condado-----------------------------


df_T_cemento_C = df_T_cemento.groupby('Condado').agg({ 
                                                      'Cant.Base': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_T_cemento_C = df_T_cemento_C.reset_index()


# Cambio el nombre de una de las columnas

df_T_cemento_C.rename(columns={'Cant.Base':'cant_cemento_ton'}, inplace=True)

#df_T_cemento_C.head(5)



#-------------Agrupación por Fecha-----------------------------


df_T_cemento_Fecha = df_T_cemento.groupby('FechaFactCont').agg({ 
                                                      'Cant.Base': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_T_cemento_Fecha = df_T_cemento_Fecha.reset_index()

# Cambio el nombre de una de las columnas

df_T_cemento_Fecha.rename(columns={'FechaFactCont':'Fecha', 'Cant.Base':'cant_cemento_ton'}, inplace=True)

df_T_cemento_Fecha.head(5)
# Análisis exploratorio de cada ítem

#df_T_cemento_SP.describe()
#df_T_cemento_SP.shape
#df_T_cemento_D.describe()
#df_T_cemento_N.describe()
#df_T_cemento_GPM.describe()
df_T_cemento_C.describe()
#df_T_cemento_Fecha.describe()


# Gráfica de Segmento de Producto

df_T_cemento_SP=df_T_cemento_SP.sort_values("cant_cemento_ton")

fig = px.bar(df_T_cemento_SP, x="Segmento_producto", y="cant_cemento_ton", barmode="group", height=400,
            labels={
                     "Segmento_producto": "Product segment",
                     "cant_cemento_ton": "Amount of cement in Tons"
                 })
fig.update_layout(title_text="Amount of cement in Tons per Product Segment", plot_bgcolor='rgb(230, 230, 230)')

fig.show()
# Gráfica de Segmento de Denominación


df_T_cemento_D=df_T_cemento_D.sort_values("cant_cemento_ton")

fig = px.bar(df_T_cemento_D, x="Denominación", y="cant_cemento_ton", barmode="group", height=400,
            labels={
                     "Denominación": "Common name",
                     "cant_cemento_ton": "Amount of cement in Tons"
                 })
fig.update_layout(title_text="Amount of cement in Tons by Common name", plot_bgcolor='rgb(230, 230, 230)')

fig.show()
# Gráfica de Negocio

fig = px.bar(df_T_cemento_N, x="Negocio", y="cant_cemento_ton", barmode="group", height=400,
            labels={
                     "Negocio": "Business segment",
                     "cant_cemento_ton": "Amount of cement in Tons"
                 })
fig.update_layout(title_text="Amount of cement in Tons by Business segment", plot_bgcolor='rgb(230, 230, 230)')

fig.show()
# Gráfica de Grupo de Porte de Material


fig = px.bar(df_T_cemento_GPM, x="grp_prote", y="cant_cemento_ton", barmode="group", height=400,
            labels={
                     "grp_prote": "Product porte",
                     "cant_cemento_ton": "Amount of cement in Tons"
                 })
fig.update_layout(title_text="Amount of cement in Tons by Product porte", plot_bgcolor='rgb(230, 230, 230)')

fig.show()
# Gráfica de Condado


df_T_cemento_C=df_T_cemento_C.sort_values("cant_cemento_ton")

fig = px.bar(df_T_cemento_C, x="Condado", y="cant_cemento_ton", barmode="group", height=400,
            labels={
                     "Condado": "County",
                     "cant_cemento_ton": "Amount of cement in Tons"
                 })
fig.update_layout(title_text="Amount of cement in Tons by County", plot_bgcolor='rgb(230, 230, 230)')

fig.show()
# Serie de tiempo para la cantidad demandada de cemento en Toneladas

fig = px.line(df_T_cemento_Fecha, x='Fecha', y='cant_cemento_ton', title='Time series for quantity of cement',
             labels={
                     "Fecha": "Date",
                     "cant_cemento_ton": "Amount of cement in Tons"
                 })

fig.update_xaxes(rangeslider_visible=True,   rangeselector=dict(
        buttons=list([
            dict(count=1, label="Days", step="month", stepmode="backward"),
            dict(count=6, label="Six month group", step="month", stepmode="backward"),
            dict(count=1, label="Year", step="year", stepmode="backward"),
            dict(step="all")
        ])))
fig.show()
# Gráficas de cantidad de cemento por año

df_meses = pd.DataFrame(columns=['Mes'])

df_meses['Mes'] = ('January', 'February', 'March', 'April', 'May', 'June',
                   'July', 'August', 'September', 'October', 'November', 'December')

df_T_cemento_Fecha['Fecha'] = pd.to_datetime(df_T_cemento_Fecha['Fecha']) 

#df_T_cemento_Fecha['Fecha'].dtypes


df_tcf=df_T_cemento_Fecha.copy()

df_tcf['Año'] = df_tcf['Fecha'].dt.year

df_tcf['Año'] = df_tcf['Año'].apply(str) 

#-----------2017--------------
df_tcf_1=df_tcf['Año']=='2017'

df_tcf_2017= df_tcf[df_tcf_1]


#df_tcf_2017.head(15)

#-----------2018--------------
df_tcf_2=df_tcf['Año']=='2018'

df_tcf_2018= df_tcf[df_tcf_2]

#df_tcf_2018.head(15)

#-----------2019--------------
df_tcf_3=df_tcf['Año']=='2019'

df_tcf_2019= df_tcf[df_tcf_3]

#df_tcf_2019.head(15)

fig = go.Figure()
fig.add_trace(go.Scatter(x=df_meses['Mes'], y=df_tcf_2017['cant_cemento_ton'], mode="lines+markers", 
                         name="2017", line=dict(color='rgb(217,175,107)')))
fig.add_trace(go.Scatter(x=df_meses['Mes'], y=df_tcf_2018['cant_cemento_ton'], mode="lines+markers", 
                         name="2018", line=dict(color='rgb(175,100,88)')))
fig.add_trace(go.Scatter(x=df_meses['Mes'], y=df_tcf_2019['cant_cemento_ton'], mode="lines+markers", 
                         name="2019", line=dict(color='rgb(82,106,131)')))
fig.update_layout(title='Amount of cement in the month per year', xaxis_tickfont_size=14, 
                  xaxis=dict(title='Month'), yaxis=dict(title='Amount of cement in Tons'),   
                    legend=dict(
                    yanchor="top",
                    y=0.99,
                    xanchor="left",
                    x=0.01
                ), plot_bgcolor='rgb(242, 242, 242)')

fig.show()<jupyter_output><empty_output><jupyter_text>Ingresos de cemento<jupyter_code># Filtrado mediante indexación booleana por tipo de producto comercializado


# Filtrado por tipo de producto comercializado

df_sub1_cem = df_sub1['Descripción.1']=='CEMENTO'

df_fcem1 = df_sub1[df_sub1_cem]


df_fcem2 = df_fcem1[['No.Factura','Descripción.1','Descripción.2','Denominación','Negocio',
                  'FechaFactCont', 'Grupo de porte mat.','Condado','NetoDólares']]

df_cemento = df_fcem2.drop(['Descripción.1'], axis=1)



df_cemento.head(5)

#En este caso no eliminaré los datos negativos, porque en este caso podría indicar deudas, por lo tanto
#Dichas deudas harán parte del análisis.

df_cemento.describe()
#df_cemento.shape
#-------------Agrupación por Segmento de producto-----------------------------


df_cemento_SP = df_cemento.groupby('Descripción.2').agg({ 
                                                      'NetoDólares': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_cemento_SP = df_cemento_SP.reset_index()

# Cambio el nombre de una de las columnas

df_cemento_SP.rename(columns={'Descripción.2':'Segmento_producto', 'NetoDólares':'ingresos_net_dolares'}, inplace=True)

#df_cemento_SP.head(5)

#-------------Agrupación por Denominación-----------------------------


df_cemento_D = df_cemento.groupby('Denominación').agg({ 
                                                      'NetoDólares': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_cemento_D = df_cemento_D.reset_index()

# Cambio el nombre de una de las columnas

df_cemento_D.rename(columns={'NetoDólares':'ingresos_net_dolares'}, inplace=True)


#df_cemento_D.head(5)


#-------------Agrupación por tipo de Negocio-----------------------------


df_cemento_N = df_cemento.groupby('Negocio').agg({ 
                                                      'NetoDólares': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_cemento_N = df_cemento_N.reset_index()

# Cambio el nombre de una de las columnas

df_cemento_N.rename(columns={'NetoDólares':'ingresos_net_dolares'}, inplace=True)

#df_cemento_N.head(5)


#-------------Agrupación por Grupo de Porte de Material-----------------------------


df_cemento_GPM = df_cemento.groupby('Grupo de porte mat.').agg({ 
                                                      'NetoDólares': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_cemento_GPM = df_cemento_GPM.reset_index()

# Cambio el nombre de una de las columnas

df_cemento_GPM.rename(columns={'Grupo de porte mat.':'grp_prote', 'NetoDólares':'ingresos_net_dolares'}, inplace=True)

#df_cemento_GPM.head(5)

#-------------Agrupación por tipo de Condado-----------------------------


df_cemento_C = df_cemento.groupby('Condado').agg({ 
                                                      'NetoDólares': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_cemento_C = df_cemento_C.reset_index()


# Cambio el nombre de una de las columnas

df_cemento_C.rename(columns={'NetoDólares':'ingresos_net_dolares'}, inplace=True)

#df_cemento_C.head(5)


#-------------Agrupación por Fecha-----------------------------


df_cemento_Fecha = df_cemento.groupby('FechaFactCont').agg({ 
                                                      'NetoDólares': 'sum' 
                                                    })

# Reajusto el índice hecho por la setencia 'groupby' y renombro las columnas

df_cemento_Fecha = df_cemento_Fecha.reset_index()

# Cambio el nombre de una de las columnas

df_cemento_Fecha.rename(columns={'FechaFactCont':'Fecha', 'NetoDólares':'ingresos_net_dolares'}, inplace=True)

df_cemento_Fecha.head(5)
# Análisis exploratorio de cada ítem

#df_cemento_SP.describe()
#df_cemento_D.describe()
#df_cemento_N.describe()
#df_cemento_GPM.describe()
df_cemento_C.describe()
#df_cemento_Fecha.describe()
# Gráfica de Segmento de Producto


df_cemento_SP=df_cemento_SP.sort_values("ingresos_net_dolares")



fig = px.bar(df_cemento_SP, x="Segmento_producto", y="ingresos_net_dolares", barmode="group", height=400,
           labels={
                     "Segmento_producto": "Product segment",
                     "ingresos_net_dolares": "Net income in dollars"
                 })
fig.update_layout(title_text="Cement Revenues by Product Segment", plot_bgcolor='rgb(230, 230, 230)')

fig.show()
# Gráfica de Segmento de Denominación


df_cemento_D=df_cemento_D.sort_values("ingresos_net_dolares")

fig = px.bar(df_cemento_D, x="Denominación", y="ingresos_net_dolares", barmode="group", height=400,
           labels={
                     "Denominación": "Denominación",
                     "ingresos_net_dolares": "Net income in dollars"
                 })
fig.update_layout(title_text="Cement Revenues by Common name", plot_bgcolor='rgb(230, 230, 230)')

fig.show()
# Gráfica de Negocio


fig = px.bar(df_cemento_N, x="Negocio", y="ingresos_net_dolares", barmode="group", height=400,
           labels={
                     "Negocio": "Business segment",
                     "ingresos_net_dolares": "Net income in dollars"
                 })
fig.update_layout(title_text="Cement Revenues by Business segment", plot_bgcolor='rgb(230, 230, 230)')

fig.show()
# Gráfica de Grupo de Porte de Material



fig = px.bar(df_cemento_GPM, x="grp_prote", y="ingresos_net_dolares", barmode="group", height=400,
           labels={
                     "grp_prote": "Product porte",
                     "ingresos_net_dolares": "Net income in dollars"
                 })
fig.update_layout(title_text="Cement Revenues by Product porte", plot_bgcolor='rgb(230, 230, 230)')

fig.show()
# Gráfica de Condado


df_cemento_C=df_cemento_C.sort_values("ingresos_net_dolares")

fig = px.bar(df_cemento_C, x="Condado", y="ingresos_net_dolares", barmode="group", height=400,
           labels={
                     "Condado": "County",
                     "ingresos_net_dolares": "Net income in dollars"
                 })
fig.update_layout(title_text="Cement Revenues by County", plot_bgcolor='rgb(230, 230, 230)')

fig.show()
# Serie de tiempo para los ingresos por cemento

fig = px.line(df_cemento_Fecha, x='Fecha', y='ingresos_net_dolares', title='Time series for cement revenue',
             labels={
                     "Fecha": "Date",
                     "ingresos_net_dolares": "Net income in dollars"
                 })

fig.update_xaxes(rangeslider_visible=True,   rangeselector=dict(
        buttons=list([
            dict(count=1, label="Days", step="month", stepmode="backward"),
            dict(count=6, label="Six month group", step="month", stepmode="backward"),
            dict(count=1, label="Year", step="year", stepmode="backward"),
            dict(step="all")
        ])))
fig.show()
# Gráficas de cantidad de cemento por año

df_meses2 = pd.DataFrame(columns=['Mes'])

df_meses2['Mes'] = ('January', 'February', 'March', 'April', 'May', 'June',
                   'July', 'August', 'September', 'October', 'November', 'December')

df_cemento_Fecha['Fecha'] = pd.to_datetime(df_cemento_Fecha['Fecha']) 

#df_cemento_Fecha['Fecha'].dtypes


df_cf=df_cemento_Fecha.copy()

df_cf['Año'] = df_cf['Fecha'].dt.year

df_cf['Año'] = df_cf['Año'].apply(str) 

#-----------2017--------------
df_cf_1=df_cf['Año']=='2017'

df_cf_2017= df_cf[df_cf_1]

#df_cf_2017.head(15)

#-----------2018--------------
df_cf_2=df_cf['Año']=='2018'

df_cf_2018= df_cf[df_tcf_2]

#df_cf_2018.head(15)

#-----------2019--------------
df_cf_3=df_cf['Año']=='2019'

df_cf_2019= df_cf[df_cf_3]

#df_cf_2019.head(15)


fig = go.Figure()
fig.add_trace(go.Scatter(x=df_meses2['Mes'], y=df_cf_2017['ingresos_net_dolares'], mode="lines+markers", 
                         name="2017", line=dict(color='rgb(217,175,107)')))
fig.add_trace(go.Scatter(x=df_meses2['Mes'], y=df_cf_2018['ingresos_net_dolares'], mode="lines+markers", 
                         name="2018", line=dict(color='rgb(175,100,88)')))
fig.add_trace(go.Scatter(x=df_meses2['Mes'], y=df_cf_2019['ingresos_net_dolares'], mode="lines+markers", 
                         name="2019", line=dict(color='rgb(82,106,131)')))
fig.update_layout(title='Cement revenue in the month per year', xaxis_tickfont_size=14, 
                  xaxis=dict(title='Month'), yaxis=dict(title='Net income in dollars'),   
                    legend=dict(
                    yanchor="top",
                    y=0.99,
                    xanchor="left",
                    x=0.01
                ), plot_bgcolor='rgb(242, 242, 242)')

fig.show()<jupyter_output><empty_output><jupyter_text>Predicciones<jupyter_code># Se crea una función para realizar las predicciones:

def predictor(df_data, column_n, location, plazo, perds):
  
 

  # Filtrado y cambio de nombre de columnas

  data_d = df_data[['Fecha', column_n]]
  data_d.columns = ["ds", "y"]


  # Instancia de Prohet y ajuste del modelo
  # intervalo de confianza del 95%

  prop = Prophet(interval_width = 0.95)
  prop.fit(data_d)

  # Realización de predicciones
    
  d_pred = prop.make_future_dataframe(periods=perds) 
  d_prediction = prop.predict(d_pred)
    
  #print(d_prediction[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(10))

  # Gráfica de predicciones
    
  d_prediction_plot = prop.plot(d_prediction, xlabel='Fecha', ylabel=column_n.title() )
  ax = d_prediction_plot.gca()
  ax.set_title('Prediction of '+column_n+' '+location+" in "+plazo, size=15)

  # Cálculo de errores
    
  metrics_df = d_prediction.set_index('ds')[['yhat']].join(data_d.set_index('ds').y).reset_index()
  metrics_df.dropna(inplace=True)
  rdos=r2_score(metrics_df.y, metrics_df.yhat)
  mse=mean_squared_error(metrics_df.y, metrics_df.yhat)
  mae=mean_absolute_error(metrics_df.y, metrics_df.yhat)
  

  print('The prediction for {0} in {1} for the next {2} days is:'.format(column_n, location, perds))
  print('El r2 es: ',rdos)
  print('El MSE es: ',mse)
  print('El MAE es: ',mae)

  return(d_prediction[['ds', 'yhat', 'yhat_lower', 'yhat_upper']], 
         d_prediction_plot,
         rdos,
         mse,
         mae)
perds = 365<jupyter_output><empty_output><jupyter_text>Predicciones para cantidad de cemento en Toneladas<jupyter_code>cemT_pred, cemT_plot, cemT_r2, cemT_mse, cemT_mae = predictor(df_T_cemento_Fecha, 'cant_cemento_ton', "Cement quantity", "long term", perds)
cemT_pred.tail(15)<jupyter_output><empty_output><jupyter_text>Predicciones para ingresos por cemento<jupyter_code>cem_pred, cem_plot, cem_r2, cem_mse, cem_mae = predictor(df_cemento_Fecha, 'ingresos_net_dolares', "Net income in dollars", "long term", perds)
cem_pred.tail(15)<jupyter_output><empty_output><jupyter_text>Dependencias<jupyter_code>%load_ext watermark

%watermark -v -m -p wget,pandas,numpy,datetime,plotly,scikit-learn,fbprophet,matplotlib,watermark

#Fecha

print(" ")

%watermark -u -n -t -z<jupyter_output>The watermark extension is already loaded. To reload it, use:
  %reload_ext watermark
Python implementation: CPython
Python version       : 3.8.5
IPython version      : 7.13.0

wget        : not installed
pandas      : 1.2.3
numpy       : 1.18.4
datetime    : unknown
plotly      : 4.14.3
scikit-learn: 0.23.1
fbprophet   : 0.7.1
matplotlib  : 3.2.1
watermark   : 2.2.0

Compiler    : GCC 9.3.0
OS          : Linux
Release     : 5.8.0-44-generic
Machine     : x86_64
Processor   : x86_64
CPU cores   : 8
Architecture: 64bit

 
Last updated: Sun Mar 14 2021 21:18:13-05
{'fraction_non_alphanumeric': 0.14728999813745577, 'fraction_numerical': 0.024026820636990128, 'mean_word_length': 3.102383863080685, 'pattern_counts': {'":': 24, '<': 39, '<?xml version=': 0, '>': 36, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 48, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '649636', 'license': 'MIT', 'n_tokens_mistral': 10496, 'n_tokens_neox': 9981, 'n_words': 1815, 'path': 'Prueba_Parte1.ipynb', 'repo_name': 'LauraMUD/PruebaTecnica_Argos', 'size': '26845'}