# Levanto los datos en 3 diferentes dataframes
# Artículos
conn = sql3.connect('/work/data/articles.db')
sql_query = pd.read_sql_query('SELECT * FROM articles', conn)
df_articles = pd.DataFrame(sql_query, columns=['article_id', 'article_name', 'unit_price'])
# Vendedores
df_sellers = pd.read_excel('/work/data/sellers.xlsx', index_col=0)
# Ordenes
df_orders = pd.read_csv('/work/data/orders.csv')
# Exploración del df de artículos
print('Muestra de datos')
print(df_articles.head()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_articles.shape)
print('\nBúsqueda de valores nulls por columna')
print(df_articles.isnull().sum())
print('\nFormato de los datos por columna')
print(df_articles.dtypes)
Muestra de datos
article_id article_name unit_price
0 20015 Smartphone 525.00
1 20016 Full Pc 2127.81
2 20017 Monitor 230.00
3 20018 Tablet 130.00
4 20019 Desk 130.10
Formato del dataframe
(31, 3)
Búsqueda de valores nulls por columna
article_id 0
article_name 0
unit_price 0
dtype: int64
Formato de los datos por columna
article_id int64
article_name object
unit_price object
dtype: object
# Exploración del df de vendedores
print('Muestra de datos')
print(df_sellers.head()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_sellers.shape)
print('\nBúsqueda de valores nulls por columna')
print(df_sellers.isnull().sum())
print('\nFormato de los datos por columna')
print(df_sellers.dtypes)
Muestra de datos
seller_name
seller_id
1 Aveline Swanwick
2 Jase Doy
3 Oliviero Charkham
4 Cornie Wynrehame
5 Ewell Peres
Formato del dataframe
(15, 1)
Búsqueda de valores nulls por columna
seller_name 0
dtype: int64
Formato de los datos por columna
seller_name object
dtype: object
# Exploración del df de órdenes
print('Muestra de datos')
print(df_orders.head()) # head() 5 Filas por defecto
print('\nFormato del dataframe')
print(df_orders.shape)
print('\nBúsqueda de valores nulls por columna')
print(df_orders.isnull().sum())
print('\nFormato de los datos por columna')
print(df_orders.dtypes)
Muestra de datos
order_id week article_id quantity seller_id country_name
0 15024 1 20039 10 10 Peru
1 15025 1 20029 15 5 Peru
2 15026 1 20024 5 14 Bolivia
3 15027 1 20018 9 14 Brazil
4 15028 1 20035 6 15 Mexico
Formato del dataframe
(1000, 6)
Búsqueda de valores nulls por columna
order_id 0
week 0
article_id 0
quantity 0
seller_id 0
country_name 0
dtype: int64
Formato de los datos por columna
order_id int64
week int64
article_id int64
quantity int64
seller_id int64
country_name object
dtype: object
df_articles['unit_price'] = df_articles['unit_price'].astype(float)
print(df_articles.dtypes)
article_id int64
article_name object
unit_price float64
dtype: object
my_df = df_orders.copy() # shallow copy o copia superficial (otro Objeto alojado en la memoria)
# Cambio el índice del df de artículos
df_articles.set_index('article_id', inplace=True)
my_df = my_df.assign(article_name = my_df['article_id'])
my_df = my_df.assign(total_amount = my_df['article_id'])
my_df = my_df.assign(seller_name = my_df['seller_id'])
# df_articles
# print()
# my_df
for i in range(max(my_df.count())):
# print(i)
# SINTAXIS: df_articles.loc[indice][columna]
# [indice]: va a ser el dato que obtengo de [my_df.loc[i]['article_id']]
# o sea, tomo registro a registro el article_id y lo uso para extraer el nombre del artículo (article_name) de df_articles
# print(df_articles.loc[my_df.loc[i]['article_id']]['article_name'])
article = df_articles.loc[my_df.loc[i]['article_id']]['article_name']
# print(article)
# Asignar a cada valor id de la columna 'article_name' (my_df) el nombre del artículo
my_df.loc[i, 'article_name'] = article
# my_df
# hacemos lo mismo con total_amount
my_df.loc[i, 'total_amount'] = my_df.loc[i, 'quantity']*df_articles.loc[my_df.loc[i]['article_id']]['unit_price']
# Columna de seller name
my_df.loc[i, 'seller_name'] = df_sellers.loc[my_df.loc[i]['seller_id']]['seller_name']
# elimimo las columnas que no necesito del df
my_df.drop(['order_id', 'article_id', 'seller_id'], axis='columns', inplace=True)
print(my_df)
week quantity country_name article_name total_amount seller_name
0 1 10 Peru Water Cooling 675.0 Cirilo Grandham
1 1 15 Peru Mouse 454.5 Ewell Peres
2 1 5 Bolivia Netbook 725.0 Janel O'Curran
3 1 9 Brazil Tablet 1170.0 Janel O'Curran
4 1 6 Mexico Case 227.4 Daisie Slograve
.. ... ... ... ... ... ...
995 4 1 Brazil Modem 67.5 Kati Innot
996 4 15 Brazil Heatsink 150.0 Daisie Slograve
997 4 2 Colombia Heatsink 20.0 Vasily Danilyuk
998 4 14 Brazil Tablet 1820.0 Vasily Danilyuk
999 4 12 Brazil SDD 264.0 Onida Cosely
[1000 rows x 6 columns]
# RESOLUCIÓN ANALÍTICA
print(my_df['article_name'].value_counts()) # cuenta valores únicos
HDD 47
Netbook 45
SDD 45
Tablet 40
Usb Cable 39
Sata Cable 38
Pci Express Port 37
Range Extender 36
Smartphone 35
Headphones 34
Full Pc 34
Mouse 34
Power Supply 34
Heatsink 34
Motherboard 33
Water Cooling 32
Video Card 31
Ram Memory 31
Notebook 30
CPU 29
Modem 29
Desk 28
Mesh Wi-Fi X 2 28
Webcam 28
Monitor 26
Case 26
Fan Cooler 25
Scanner 24
Chair 24
Wi-Fi Card 22
Keyboard 22
Name: article_name, dtype: int64
# RESOLUCIÓN GRÁFICA
sns.displot(my_df, x='article_name')
plt.xticks(rotation=90) # 'vertical'
plt.show()
# RESOLUCIÓN ANALÍTICA
df2=(my_df.groupby(by='article_name').sum()).sort_values('total_amount', ascending=False).head(5)
pd.options.display.float_format= '$ {:,.2f}'.format
print(df2['total_amount'])
# 'article_name' es el index
# print(df2) # agrupa (y suma) sólo datos numéricos
# SINTAXIS ALTERNATIVA
# pd.options.display.float_format= '$ {:,.2f}'.format
# print(my_df[['article_name'] + ['total_amount']].groupby(['article_name']).sum().sort_values('total_amount', ascending=False).head(5))
article_name
Full Pc $ 538,335.93
Notebook $ 251,000.00
Smartphone $ 152,250.00
Chair $ 69,477.48
Tablet $ 48,620.00
Name: total_amount, dtype: float64
# RESOLUCIÓN GRÁFICA
plt.pie(x=df2['total_amount'], labels=df2.index, autopct='%1.2f%%')
plt.show()
# 'article_name' es el index
# RESOLUCIÓN ANALÍTICA
df4 = (my_df.groupby(by='seller_name').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format= '$ {:,.2f}'.format
# print(df4[['quantity'] + ['total_amount']])
print(df4[['quantity'] + ['total_amount']].head(5))
# 'seller_name' es el index
quantity total_amount
seller_name
Janel O'Curran 703 $ 192,832.47
Brockie Patience 441 $ 142,709.88
Oliviero Charkham 555 $ 141,329.76
Vasily Danilyuk 521 $ 129,157.55
Daisie Slograve 554 $ 120,520.11
# RESOLUCIÓN GRÁFICA
plt.bar(df4.index, df4['total_amount'])
plt.xticks(rotation=60)
plt.show()
# 'seller_name' es el index
# RESOLUCIÓN ANALÍTICA
df5 = (my_df.groupby(by='week').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format= '$ {:,.2f}'.format
print(df5[['quantity'] + ['total_amount']])
# 'week' es el index
quantity total_amount
week
1 2449 $ 507,458.81
2 2444 $ 415,364.44
3 2114 $ 329,140.03
4 1058 $ 223,844.56
# RESOLUCIÓN GRÁFICA
plt.bar(df5.index, df5['total_amount'])
plt.show()
# 'week' es el index
# RESOLUCIÓN
# Ventas filtrado por país. Comparar 2 países
# Cuál es el producto que más se vende, en qué cantidad
# Resolución Analítica y Gráfica
5.1.1 Ventas por país - Resolución analítica
# Ventas filtrado por país
# Resolución analítica
print('Ventas por país')
df6=(my_df.groupby(by='country_name').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format= '$ {:,.2f}'.format
print(df6[['quantity'] + ['total_amount']])
Ventas por país
quantity total_amount
country_name
Brazil 2515 $ 441,271.85
Argentina 947 $ 205,832.78
Colombia 881 $ 177,514.29
Peru 1027 $ 161,421.12
Mexico 846 $ 138,619.99
Venezuela 320 $ 77,684.52
El Salvador 111 $ 57,391.26
Guatemala 202 $ 52,579.25
Honduras 303 $ 36,763.56
Costa Rica 145 $ 34,606.50
Chile 231 $ 24,660.98
Bolivia 181 $ 22,682.80
Uruguay 92 $ 17,843.09
Ecuador 129 $ 17,475.30
Paraguay 123 $ 8,195.12
Puerto Rico 12 $ 1,265.43
5.1.2 Ventas por país - Resolución gráfica
# Ventas filtrado por país
# Resolución gráfica
print("Ventas totales por país")
sns.barplot(df6.index, df6['total_amount'],palette='magma')
plt.xticks(rotation=60)
plt.title("Ventas por país")
plt.xlabel("País")
plt.ylabel("Monto")
plt.yticks(np.arange(0,450001,50000))
plt.show()
Ventas totales por país
/shared-libs/python3.9/py/lib/python3.9/site-packages/seaborn/_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
warnings.warn(
5.2.1 Comparación de 2 países - Resolución anlítica
# Cantidades y montos vendidos
# Resolución analítica
print("Cantidades y montos vendidos en los primeros 2 países")
df6_2=(my_df.groupby(by='country_name').sum()).sort_values('total_amount', ascending=False)
pd.options.display.float_format= '$ {:,.2f}'.format
print(df6_2[['quantity'] + ['total_amount']].head(2))
df6_3= df6_2[['quantity'] + ['total_amount']].head(2)
#Artículos mas vendidos en cada país
#Resolución analítica
print("\nTop artículos en Brasil")
df_brasil = my_df.loc[(my_df['country_name'] == 'Brazil')]
print(df_brasil.groupby(['article_name']).agg({'quantity':'sum'}).sort_values('quantity', ascending=False))
df_brasil2=df_brasil.groupby(['article_name']).agg({'quantity':'sum'}).sort_values('quantity', ascending=False)
df_brasil2_head = df_brasil2.head(5)
print()
print("\nTop artículos en Argentina")
df_argentina = my_df.loc[my_df['country_name'] == 'Argentina']
print(df_argentina.groupby(['article_name']).agg({'quantity':'sum'}).sort_values('quantity', ascending=False))
df_argentina2=df_argentina.groupby(['article_name']).agg({'quantity':'sum'}).sort_values('quantity', ascending=False)
df_argentina2_head = df_argentina2.head(5)
df_argentina_total=df_argentina.groupby(['article_name']).agg({'total_amount':'sum'}).sort_values('total_amount', ascending=False)
Cantidades y montos vendidos en los primeros 2 países
quantity total_amount
country_name
Brazil 2515 $ 441,271.85
Argentina 947 $ 205,832.78
Top artículos en Brasil
quantity
article_name
Tablet 156
HDD 119
SDD 117
Chair 112
Pci Express Port 105
Heatsink 103
Power Supply 103
Motherboard 101
Desk 97
Ram Memory 92
Modem 92
Range Extender 90
Notebook 83
CPU 82
Water Cooling 82
Netbook 81
Video Card 80
Smartphone 79
Scanner 78
Headphones 73
Case 71
Mouse 67
Mesh Wi-Fi X 2 65
Usb Cable 64
Full Pc 63
Fan Cooler 58
Sata Cable 57
Webcam 52
Keyboard 37
Wi-Fi Card 37
Monitor 19
Top artículos en Argentina
quantity
article_name
CPU 104
SDD 73
HDD 68
Range Extender 58
Fan Cooler 47
Ram Memory 46
Mesh Wi-Fi X 2 46
Full Pc 45
Notebook 43
Motherboard 39
Netbook 39
Sata Cable 38
Power Supply 32
Usb Cable 32
Keyboard 31
Modem 27
Smartphone 25
Water Cooling 25
Case 20
Headphones 19
Video Card 15
Monitor 13
Wi-Fi Card 12
Scanner 12
Webcam 10
Desk 9
Pci Express Port 7
Mouse 6
Chair 6
5.2.2 Comparación de 2 países - Resolución gráfica
# Cantidades y montos vendidos
# Resolución gráfica
print("Comparación de 2 países")
sns.barplot(df6_3.index, df6_3['quantity'],palette='magma')
plt.xticks(rotation=60)
plt.title("Comparación de 2 países - Cantidades")
plt.xlabel("País")
plt.ylabel("Cantidad")
plt.yticks(np.arange(0,3501,200))
plt.show()
print("Comparación de 2 países")
sns.barplot(df6_3.index, df6_3['total_amount'],palette='magma')
plt.xticks(rotation=60)
plt.title("Comparación de 2 países - Monto total")
plt.xlabel("País")
plt.ylabel("Monto")
plt.yticks(np.arange(0,450001,25000))
plt.show()
#Artículos mas vendidos en cada país
#Resolución gráfica
sns.barplot(df_argentina2_head.index, df_argentina2_head['quantity'],palette='magma')
plt.xticks(rotation=60)
plt.title("Top artículos Argentina - Cantidades")
plt.xlabel("País")
plt.ylabel("Cantidad")
plt.yticks(np.arange(0,201,10))
plt.show()
sns.barplot(df_brasil2_head.index, df_brasil2_head['quantity'],palette='magma')
plt.xticks(rotation=60)
plt.title("Top artículos Brasil - Cantidades")
plt.xlabel("País")
plt.ylabel("Cantidad")
plt.yticks(np.arange(0,201,10))
plt.show()
Comparación de 2 países
/shared-libs/python3.9/py/lib/python3.9/site-packages/seaborn/_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
warnings.warn(
Comparación de 2 países
/shared-libs/python3.9/py/lib/python3.9/site-packages/seaborn/_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
warnings.warn(
/shared-libs/python3.9/py/lib/python3.9/site-packages/seaborn/_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
warnings.warn(
/shared-libs/python3.9/py/lib/python3.9/site-packages/seaborn/_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
warnings.warn(
# RESOLUCIÓN
# Evolución de Ventas por producto.
# Tomar 2 países y 'week' como variable categórica
# Resolución Analítica y Gráfica
6.1.1 Evolución de ventas - Resolución analítica
# Evolución de ventas - Cantidades de productos en cada semana
# Resolución analítica
print("Cantidades por semana en Brasil")
df_brasil = my_df.loc[(my_df['country_name'] == 'Brazil')]
print(df_brasil.groupby(['week']).agg({'quantity':'count'}).sort_values('week', ascending=True))
df_brasil2=df_brasil.groupby(['week']).agg({'quantity':'count'}).sort_values('week', ascending=True)
print()
print("Cantidades por semana en Argentina")
df_argentina = my_df.loc[my_df['country_name'] == 'Argentina']
print(df_argentina.groupby(['week']).agg({'quantity':'count'}).sort_values('week', ascending=True))
df_argentina2=df_argentina.groupby(['week']).agg({'quantity':'count'}).sort_values('week', ascending=True)
Cantidades por semana en Brasil
quantity
week
1 94
2 89
3 83
4 49
Cantidades por semana en Argentina
quantity
week
1 32
2 48
3 19
4 14
6.1.2 Evolución de ventas - Resolución gráfica
# Evolución de ventas - Cantidades de productos en cada semana
# Resolución gráfica
plt.plot(df_argentina2, 'k*--',label = 'Argentina')
plt.plot(df_brasil2, 'ro:',label = 'Brasil')
plt.legend()
plt.xlabel('Semana')
plt.ylabel('Cantidad')
plt.yticks(np.arange(0,101,10))
plt.xticks(np.arange(1,5,1))
plt.grid()
plt.show()
# RESOLUCIÓN
# Mejor vendedor/producto por país
# Resolución Analítica y Gráfica
7.1.1 Vendedores y productos - Resolución analítica
# Mejor vendedores y artículo más vendido por ellos - Argentina
# Resolución analítica
print ("Mejor vendedores y artículo más vendido por ellos en Argentina")
df_vend_art_arg = df_argentina.set_index(['seller_name']).sort_index(ascending=[True])
pd.options.display.float_format= '$ {:,.2f}'.format
df_vend_art_arg.groupby(['seller_name','article_name'])['total_amount'].sum().to_frame().sort_values('total_amount', ascending=False)
print(df_vend_art_arg.groupby(['seller_name','article_name'])['total_amount'].sum().to_frame().sort_values('total_amount', ascending=False).head(10))
df_vend_art_arg_2 = df_vend_art_arg.groupby(['seller_name'])['total_amount'].sum().to_frame().sort_values('total_amount', ascending=False).head(10)
Mejor vendedores y artículo más vendido por ellos en Argentina
total_amount
seller_name article_name
Brockie Patience Full Pc $ 31,917.15
Janel O'Curran Full Pc $ 23,405.91
Oliviero Charkham Full Pc $ 21,278.10
Vasily Danilyuk Notebook $ 11,000.00
Onida Cosely Full Pc $ 10,639.05
Tobin Roselli Notebook $ 10,000.00
Vasily Danilyuk Full Pc $ 8,511.24
Daisie Slograve Notebook $ 8,000.00
Vasily Danilyuk Smartphone $ 6,825.00
Janel O'Curran Smartphone $ 6,300.00
# Mejor vendedores y artículo más vendido por ellos - Brasil
# Resolución analítica
print ("Mejor vendedores y artículo más vendido por ellos en Brasil")
df_vend_art_br = df_brasil.set_index(['seller_name']).sort_index(ascending=[True])
pd.options.display.float_format= '$ {:,.2f}'.format
df_vend_art_br.groupby(['seller_name','article_name'])['total_amount'].sum().to_frame().sort_values('total_amount', ascending=False)
print(df_vend_art_br.groupby(['seller_name','article_name'])['total_amount'].sum().to_frame().sort_values('total_amount', ascending=False).head(10))
df_vend_art_br_2 = df_vend_art_br.groupby(['seller_name'])['total_amount'].sum().to_frame().sort_values('total_amount', ascending=False).head(10)
Mejor vendedores y artículo más vendido por ellos en Brasil
total_amount
seller_name article_name
Aveline Swanwick Full Pc $ 40,428.39
Daisie Slograve Full Pc $ 25,533.72
Notebook $ 23,000.00
Janel O'Curran Full Pc $ 19,150.29
Arnold Kilkenny Full Pc $ 17,022.48
Vasily Danilyuk Full Pc $ 17,022.48
Jase Doy Full Pc $ 14,894.67
Tobin Roselli Notebook $ 14,000.00
Milly Christoffe Smartphone $ 13,125.00
Arnold Kilkenny Notebook $ 13,000.00
7.1.2 Vendedores y productos - Resolución gráfica
# Mejores vendedores en Argentina
# Resolución gráfica
print("Ventas totales por país")
sns.barplot(df_vend_art_arg_2.index, df_vend_art_arg_2['total_amount'],palette='magma')
plt.xticks(rotation=60)
plt.title("Ventas por vendedor - Argentina")
plt.xlabel("Vendedor")
plt.ylabel("Monto")
plt.yticks(np.arange(0,35001,5000))
plt.show()
Ventas totales por país
/shared-libs/python3.9/py/lib/python3.9/site-packages/seaborn/_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
warnings.warn(
# Mejores vendedores en Brasil
# Resolución gráfica
print("Ventas totales por país - Brasil")
sns.barplot(df_vend_art_br_2.index, df_vend_art_br_2['total_amount'],palette='magma')
plt.xticks(rotation=60)
plt.title("Ventas por vendedor - Brasil")
plt.xlabel("Vendedor")
plt.ylabel("Monto")
plt.yticks(np.arange(0,65001,5000))
plt.show()
Ventas totales por país - Brasil
/shared-libs/python3.9/py/lib/python3.9/site-packages/seaborn/_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
warnings.warn(