<jupyter_start><jupyter_text>PPROYECTO DISTRIAS  LIBRERÍAS<jupyter_code>import pandas as pd
import seaborn as sns<jupyter_output><empty_output><jupyter_text>LECTURA DEL DATASET<jupyter_code>df = pd.read_excel('datos_distrias.xlsx')
df.head(2)
df.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
RangeIndex: 222272 entries, 0 to 222271
Data columns (total 39 columns):
 #   Column                    Non-Null Count   Dtype         
---  ------                    --------------   -----         
 0   NOMBRE_DOCUMENTO_MAESTRO  222272 non-null  object        
 1   NOMBRE_CONSECUTIVO        222272 non-null  object        
 2   TIPO_DOCUMENTO            222272 non-null  object        
 3   NUMERO_DOCUMENTO          222272 non-null  int64         
 4   FECHA_DOCUMENTO           222272 non-null  datetime64[ns]
 5   FECHA_VENCIMIENTO         222272 non-null  datetime64[ns]
 6   IDENTIFICACION_TERCERO    222272 non-null  object        
 7   NOMBRE_TERCERO            222272 non-null  object        
 8   ID_CENTRO_COSTO           222272 non-null  int64         
 9   NOMBRE_CENTRO_COSTO       222272 non-null  object        
 10  NOMBRE_CLASIFICACION      222272 non-null  object        
 11  ID_PRODUCTO_SERVICIO      222272 non-null  int64         
 12  PR[...]<jupyter_text>LIMPIEZA E IMPUTACIÓN DE DATOS<jupyter_code>#Transformar tipo de variable
df['NUMERO_DOCUMENTO']=df['NUMERO_DOCUMENTO'].astype(str)
df['CEDULA_VENDEDOR']=df['CEDULA_VENDEDOR'].astype(str)
df['ID_CENTRO_COSTO']=df['ID_CENTRO_COSTO'].astype(str)
df['ID_PRODUCTO_SERVICIO']=df['ID_PRODUCTO_SERVICIO'].astype(str)
df['ID_USUARIO_CREA']=df['ID_USUARIO_CREA'].astype(str)
df['ID_TERCERO']=df['ID_TERCERO'].astype(str)
df['ID_VENDEDOR']=df['ID_VENDEDOR'].astype(str)
#Valores nulos
null_values=df.isnull().sum()/len(df) #Valores nulos
null_values[null_values>0]
#Imputación de columnas
df = df.drop(['NOMBRE_ESTABLECIMIENTO','TIPO'], axis=1)
#Hay filas duplicadas?
l=[]
mask=df.duplicated()
for i in mask:
    if i==True:
        l.append(i)
print(len(l))
#Eliminar las filas dupliucadas
df = df.drop_duplicates()
#En la columna 'NOMBRE_DOCUMENTO_MAESTRO' se van a eliminar las filas correspondientes a notas crédito, pues es una devolución que no implica utilidades para la empresa
df = df.set_index('NOMBRE_DOCUMENTO_MAESTRO')
df = df.drop('NOTA CREDITO')
df.reset_index(level=0, inplace=True)<jupyter_output><empty_output><jupyter_text>EDA<jupyter_code>df.describe()<jupyter_output><empty_output><jupyter_text>ANÁLISIS RFM El análisis RFM permite determinar cuáles son los mejores clientes teniendo en cuenta cuándo realizaron su última compra, con qué frecuencia lo hacen y cuánto se gastan. El RFM permite entender mejor cómo funciona la base de clientes, conociendo su comportamiento.Para aplicar la técnica RFM hay que tener en cuenta las tres principales variables: Recency, Frequency, Monetary. - Recencia: ¿Cuándo fue la última vez que el cliente hizo una compra? - Frecuencia: define el número de interacciones del cliente con la marca en un espacio determinado de tiempo. - Valor monetario: refleja la cantidad que se ha gastado el cliente en las compras hechas en ese espacio de tiempo.  RESENCIA<jupyter_code>df['recency'] = pd.to_datetime('2021-11-13 08:26:00') - df['FECHA_VENCIMIENTO']
def recency(recency):
    res = str(recency).split(' ')[0]
    return(int(res))
df['recency'] = df['recency'].apply(recency)
df_recency = df[['NOMBRE_TERCERO','IDENTIFICACION_TERCERO','recency']]
df_recency = df_recency.drop_duplicates()
df_recency<jupyter_output><empty_output><jupyter_text>FRECUENCIA<jupyter_code>freq = df.groupby(['NOMBRE_TERCERO','IDENTIFICACION_TERCERO'])['FECHA_VENCIMIENTO'].count()
df_freq = pd.DataFrame(freq).reset_index()
df_freq<jupyter_output><empty_output><jupyter_text>MONTO<jupyter_code>monto = df.groupby(['NOMBRE_TERCERO','IDENTIFICACION_TERCERO'])['SUBTOTAL'].sum()
df_monto = pd.DataFrame(monto).reset_index()
df_monto<jupyter_output><empty_output><jupyter_text>DATASET RFM<jupyter_code>finaldf = df_freq.merge(df_monto).merge(df_recency)
finaldf
finaldf.columns
df_final = finaldf.rename(columns={'NOMBRE_TERCERO': 'Nombre_cliente', 'IDENTIFICACION_TERCERO': 'id_cliente','FECHA_VENCIMIENTO': 'Frecuencia',
       'SUBTOTAL': 'Monto', 'recency':'Recencia'})
df_final.head()
df_final['r_cuartil'] = pd.qcut(df_final['Recencia'], 4, ['1','2','3','4'])
df_final['f_cuartil'] = pd.qcut(df_final['Frecuencia'], 4, ['4','3','2','1'])
df_final['m_cuartil'] = pd.qcut(df_final['Monto'], 4, ['4','3','2','1'])
df_final.head()
df_final['RFM_Score'] = df_final['r_cuartil'].astype(str)+ df_final['f_cuartil'].astype(str) + df_final['m_cuartil'].astype(str)
df_final.head()
df_final.to_csv('df_final_rfm.csv', index=False)
# Filter out Top/Best cusotmers
df_final[df_final['RFM_Score']=='111'].sort_values('Monto', ascending=False).head()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12894628946289463, 'fraction_numerical': 0.03075030750307503, 'mean_word_length': 5.152585119798235, 'pattern_counts': {'":': 0, '<': 33, '<?xml version=': 0, '>': 34, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '84476', 'license': 'Apache-2.0', 'n_tokens_mistral': 2035, 'n_tokens_neox': 1901, 'n_words': 342, 'path': 'RFM.ipynb', 'repo_name': 'marisbotero/sapiencia', 'size': '4878'}