# Levanto los datos en 3 diferentes dataframes
# ARTÍCULOS
conn = sql3.connect('/work/data/articles.db')
query1 = pd.read_sql_query('SELECT * FROM articles', conn)
df_articles = pd.DataFrame(query1, columns = ['article_id', 'article_name', 'unit_price'])
# print(df_articles)
# VENDEDORES
df_sellers = pd.read_excel('/work/data/sellers.xlsx', index_col=0)
#print(df_sellers)
# ÓRDENES
df_orders = pd.read_csv('/work/data/orders.csv')
print(df_orders)
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
.. ... ... ... ... ... ...
995 16019 4 20021 1 7 Brazil
996 16020 4 20040 15 15 Brazil
997 16021 4 20040 2 11 Colombia
998 16022 4 20018 14 11 Brazil
999 16023 4 20026 12 9 Brazil
[1000 rows x 6 columns]
# Exploración del df de artículos
print('Muestra de datos')
print(df_articles.head())
print('\nFormato del dataframe')
print(df_articles.shape)
print('\nBúsqueda de valores nulos por columna')
print(df_articles.isnull().sum())
print('\nFormato de los datos')
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 nulos por columna
article_id 0
article_name 0
unit_price 0
dtype: int64
Formato de los datos
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())
print('\nFormato del dataframe')
print(df_sellers.shape)
print('\nBúsqueda de valores nulos por columna')
print(df_sellers.isnull().sum())
print('\nFormato de los datos')
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 nulos por columna
seller_name 0
dtype: int64
Formato de los datos
seller_name object
dtype: object
# Exploración del df de órdenes
print('Muestra de datos')
print(df_orders.head())
print('\nFormato del dataframe')
print(df_orders.shape)
print('\nBúsqueda de valores nulos por columna')
print(df_orders.isnull().sum())
print('\nFormato de los datos')
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 nulos por columna
order_id 0
week 0
article_id 0
quantity 0
seller_id 0
country_name 0
dtype: int64
Formato de los datos
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
# Creo una copia del df base
my_df = df_orders.copy()
# Cambio el índice del df artículos
df_articles.set_index('article_id', inplace=True)
print(my_df)
#print(df_articles)
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
.. ... ... ... ... ... ...
995 16019 4 20021 1 7 Brazil
996 16020 4 20040 15 15 Brazil
997 16021 4 20040 2 11 Colombia
998 16022 4 20018 14 11 Brazil
999 16023 4 20026 12 9 Brazil
[1000 rows x 6 columns]
# Agrego algunas columnas y pongo el campo que me va a servir de "ancla"
my_df = my_df.assign(article_name = my_df['article_id'])
my_df = my_df.assign(total_amount = my_df['article_id']) # voy a necesitar el unit_price
my_df = my_df.assign(seller_name = my_df['seller_id'])
# reeplazar los valores en el nuevo df
# df_articles[?]['article_name']
#for i in range(len(my_df.index)):
# len... devuelve la cantidad de registros
# article = df_articles.loc[my_df.loc[i]['article_name']]['article_name']
# reemplazo en la columna 'article_name'
# my_df.loc[i,'article_name'] = article
# modificar la columna total_amount
# my_df.loc[i,'total_amount'] = my_df.loc[i,'quantity'] * df_articles.loc[my_df.loc[i]['total_amount']]['unit_price']
# modifical la columna 'seller_name'
# my_df.loc[i,'seller_name'] = df_sellers.loc[my_df.loc[i]['seller_name']]['seller_name']
print(my_df)
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
.. ... ... ... ... ... ...
995 16019 4 20021 1 7 Brazil
996 16020 4 20040 15 15 Brazil
997 16021 4 20040 2 11 Colombia
998 16022 4 20018 14 11 Brazil
999 16023 4 20026 12 9 Brazil
article_name total_amount seller_name
0 20039 20039 10
1 20029 20029 5
2 20024 20024 14
3 20018 20018 14
4 20035 20035 15
.. ... ... ...
995 20021 20021 7
996 20040 20040 15
997 20040 20040 11
998 20018 20018 11
999 20026 20026 9
[1000 rows x 9 columns]
# elimino las columnas que no necesito
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 20039 20039 10
1 1 15 Peru 20029 20029 5
2 1 5 Bolivia 20024 20024 14
3 1 9 Brazil 20018 20018 14
4 1 6 Mexico 20035 20035 15
.. ... ... ... ... ... ...
995 4 1 Brazil 20021 20021 7
996 4 15 Brazil 20040 20040 15
997 4 2 Colombia 20040 20040 11
998 4 14 Brazil 20018 20018 11
999 4 12 Brazil 20026 20026 9
[1000 rows x 6 columns]
# RESOLUCIÓN ANALÍTICA
my_df2 = my_df.groupby('article_name').sum()
por_cant = my_df2.sort_values('quantity',ascending=False)
print(por_cant['quantity'].head(1))
article_name
20025 413
Name: quantity, dtype: int64
# RESOLUCIÓN GRÁFICA
sns.displot(my_df, x='article_name')
plt.xticks(rotation=90)
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df3 =(my_df.groupby('article_name').sum()).sort_values('total_amount', ascending=False).head(5)
print(my_df3['total_amount'])
article_name
20025 941175
20026 901170
20024 901080
20018 800720
20041 781599
Name: total_amount, dtype: int64
# RESOLUCIÓN GRÁFICA
# OJO: No puedo hacer un análisis comparativo ni poner porcentajes porque
# no están todos los artículos en este df. Sólo puse los top 5
plt.pie(x=my_df3['total_amount'], labels=my_df3.index)
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df4 = (my_df.groupby('seller_name').sum()).sort_values('total_amount', ascending=False)
print(my_df4[['quantity']+['total_amount']])
quantity total_amount
seller_name
14 703 1582217
1 629 1502163
2 582 1462219
15 554 1442061
3 555 1422027
4 523 1402162
13 583 1361985
9 535 1342068
5 496 1322061
7 512 1261950
11 521 1261791
10 470 1241921
8 519 1201920
12 441 1141627
6 442 1081607
# RESOLUCIÓN GRÁFICA
plt.bar(my_df4.index, my_df4['total_amount'])
plt.xticks(rotation=60)
plt.show()
# RESOLUCIÓN ANALÍTICA
my_df5 = (my_df.groupby('week').sum()).sort_values('total_amount',ascending=False)
print(my_df5)
quantity article_name total_amount seller_name
week
2 2444 6209398 6209398 2516
1 2449 5968600 5968600 2407
3 2114 5247866 5247866 2052
4 1058 2603915 2603915 984
# RESOLUCIÓN GRÁFICA
plt.bar(my_df5.index,my_df5['total_amount'])
plt.show()
# pie/donut
# RESOLUCIÓN
# RESOLUCIÓN
# RESOLUCIÓN