Wednesday, December 7, 2022

Conditional DataFrame column operations

Sử dụng when và otherwise

Chẳng hạn bạn thêm một cột 'tên_côt_gioi_tinh', các giá trị trong cột này sẽ là N nếu giá trị ở cột gioi_tinh tương ứng là 'Nam', còn lại thì sẽ là G.

df = df.withColumn('ten_cot_gioi_tinh', when(df.gioi_tinh == 'Nam', N)

                                                                .otherwise(G))

Thursday, November 24, 2022

Cleaning Data with PySpark

Pyspark dataframe column opertions: filter, select, withColumn.

Xử lý dữ liệu thô để sử dụng trong data processing pipeline, nếu dữ liệu không được làm sạch, thì sẽ gây ra những vấn đề sau đó liên quan tới hiệu năng và tổ chức luồng dữ liệu.

  • Định dạng kiểu dữ liệu, thay thế văn bản
  • Các chuyển đổi tính toán 
  • Loại bỏ dữ liệu "rác" và dữ liệu chưa hoàn thiện. 
Spark có những ưu điểm - đó là nâng cấp mở rộng được nguồn dữ liệu (scalable) và có bộ khung sườn  xử lý hiệu quả dữ liệu. 

Khi nhập file dữ liệu sử dụng pyspark thì có thêm một đối biến schema, spark schema là gì? 

spark schema là cấu trúc của DataFrame hoặc bộ dữ liệu, chúng ta định nghĩa cấu trúc này bằng cách sử dụng class StructTtype - là tổng hợp các StructField định nghĩa tên cột, kiểu dữ liệu của cột, cột nullable, và MetaData. 

Ví dụ dưới đây:

import pyspark.sql.types

yourSchema = StructType([

  StructField('ten', StringType(), True), 

  StructField('tuoi', IntegerType(), True),

  StructField('thanh pho', StringType(), True)

])

Giờ tiến nhành đọc file sử dụng schema như trên:

dan_cu = spark.read.format('csv').load(name='du_lieu_dan_cu.csv', schema=yourSchema)

Cách lấy - Get the last entry of the splits list

Sau khi tách string thành list thì bạn muốn lấy entry cuối, ở đây mình tạo một cột mới "Họ", còn cột_tách chứa list of strings họ và tên:

df = df.withColumn("Họ", df.splits.getItem(F.size('cột_tách') - 1))

Saturday, September 24, 2022

Phân tích dữ liệu thẻ tín dụng được duyệt

 Analysis of Credit Approval Data

http://rstudio-pubs-static.s3.amazonaws.com/73039_9946de135c0a49daa7a0a9eda4a67a72.html

Friday, September 23, 2022

Các bước để trở thành chuyên viên phân tích dữ liệu

Nguồn: https://www.youtube.com/watch?v=AYWLZ1lES6g

Động lực để học môn này của bạn là gì: Có một dữ liệu bán hàng và bạn muốn dùng một công cụ nào đó để hiểu hơn về công việc kinh doanh, hay bạn quan tâm và thích thú với những biều đồ, đồ thị.. cũng có khi đơn giản là để phát triển tư duy logic từ một ngôn ngữ lập trình mới...., mức lương cao. Tóm lại sẽ có một lý do nào đó. Mình bắt đầu với Python khi muốn phân tích dữ liệu bán hàng, nhập khẩu của công ty mình làm. Mình phụ trách mấy chục đầu sản phẩm, mà công cty không có công cụ hiệu quả và tiện dụng để phân tích ví dụ như so sánh revenue của từng sản phẩm của từng quý, tháng...

Và để bắt đầu thì bạn sẽ làm quan với một công cụ hoặc một ngôn ngữ lập trình Excel, SQL và một số công cụ trực quan hóa như Tableau, Power BI and Qlikview. 

Bắt đầu với Excel, SQL, Power BI và Python. 

Excel: nếu làm việc với những file dữ liệu nhỏ nhưng với những file dữ liệu lớn thì thời gian load sẽ lâu. 

SQL: Ngôn ngữ khá đơn giản, để xử lý. 

Power BI: Trực quan hóa dữ liệu

Python: Dùng cho được cả phân tích dữ liệu và trực quan hóa dữ liệu. 

Trong qua trình học tập các công cụ và ngôn ngữ trên điều quan trong nhất là bạn phải thực hiện với một file dữ liệu. Vì tất cả các khóa học hay những video hướng dẫn chỉ thể hiện một khía cạnh hay để demo các viết hàm hay vẽ đồ thị...

Excel thì bạn thực hành ở https://www.excel-practice-online.com/

SQL thì bạn thực hành ở https://w3schools.com/sql

Power BI: datacamp

Python:thực hành ở learnpython.org hoặc datacamp

Lưu ý: Khi có lỗi thì bạn chỉ việc copy và paste lỗi trên google hầu hết sẽ có giải pháp, https://stackoverflow.com

Việc học một ngôn ngữ lập trình hay công cụ mới sẽ đòi hỏi thời gian, và bạn chắc chắn sẽ có những gián đoạn, không từ bỏ - nếu gián đoạn 1 tháng 2, tháng hay 3 tháng bạn vẫn có thể tiếp tục cho tới khi hoàn thiện các kỹ năng cần thiết. 

Để xây dựng portfolio thì bạn có thể làm những dự án riêng, trên github hoặc share các bài viết trên linkedin hoặc blog, điều này sẽ giúp ích cho việc bạn tìm việc sau này. 




Thursday, September 22, 2022

Công thức tính safety stock áp dụng cho ngành hóa chất

Công thức tính mức safety stock (SS) là lead time (LT) nhân với mức tiêu thụ trung bình average consumption (CA)

SS = LT x CA

Ví dụ, một chất tạo đặc có lead time là 2 tháng, và mức tiêu thụ trung bình hàng tháng là 300kg, thì safety stock tối thiểu là 600kg. 

Tuy nhiên thì LT có thể thay đổi nhà nhà cung cấp thiếu hàng (shortage), thiếu nguyên liệu sản xuất, phân bổ cho thị trường giảm, hoặc việc thông quan hàng hóa chậm. Do vậy bạn có thể nhân SS gấp lên 1.2 hoặc 1.5 lần tùy thuộc vào loại nguyên liệu, và cũng căn cứ vào số lượng tiêu thụ tối đa của nguyên liệu trong năm đó. Thêm một yếu tố nữa là một số sản phẩm mang tính chất mùa vụ, tức là sản phẩm chỉ dùng cho mùa hè giả sử bắt đầu tháng 5, nếu lead làm là 3 tháng thì cần đặt hàng từ tháng 2. 

Sau khi đã có safety stock cho từng tháng, thì bạn chỉ cần thêm một cột cảnh bảo, cột này lấy cột safety stock trừ đi cột stock (tồn kho) 

(safety stock - tồn kho), sản phẩm nào có giá trị âm thì (trong thời điểm hiện tại + LT tháng) tới có thể sẽ thiếu hàng. 

Ví dụ cho chất tạo đặc, tháng 6 chỉ còn có 400kg, như vậy thời điểm tháng 8 có thể sẽ không đủ hàng bán. safety stock - tồn kho dùng để căn cứ cho thời gian đặt hàng, việc này có thể kiểm soát hàng tuần. Như vậy sẽ đặt thêm bao nhiêu thì bạn có thể căn cứ vào lượng tiêu thụ hàng năm, 300kg x 12 = 3,600 kg, trong năm dự kiến sẽ cần thêm khoảng 1,800kg nữa (nếu đầu tháng 7 có thêm 600kg về thêm thì sẽ tính toán thế nào) Từ đó đặt ra câu hỏi, tính safety stock ở thời điểm hiện tại hay tính trước vài tháng. 

Nếu sử dụng Python, thì bạn thêm cột stock của sản phẩm xuất ra từ hệ thống bán hàng, sao đó thêm cột này vào file planning - file này sẽ chứa cột sản phẩm, cột safety stock và cột warning - cột cảnh bảo, cùng cột lượng tiêu thụ dự kiến trong năm của từng sản phẩm. 

import pandas as pd
import numpy as np

# Đọc file planning, tạo df

planning22 = pd.read_csv('planning.csv')

# Đọc file stock_22 là file tồn kho các sản phẩm, tạo df

stock = pd.read_csv('stock_22.csv')

# nhập 2 file này với nhau, có chung cột Products

planning_order = pd.merge(planning22, stock, how='left', left_on='Products')

# Tiếp đến bạn tạo một cột Warning boolean, true tức là một số sản phẩm vẫn đang ok, false thì là cảnh báo cần đặt thêm hàng, hoặc sẽ thiếu hàng.

planning_order['Warning'] = np.where((planning_order['saftety_stock'] - planning_order['availability']) >= 0, True, False)

bạn chỉ quan tâm tới cột Warning - giá trị False

# Các sản phẩm lưu ý đặt hàng 

order_now = planning_order[planning_order['Warning'] == False]

Các yếu tố khác: safety stock sử dụng công thức tiêu chuẩn kết hợp các yếu tố như nhu cầu, chi phí lưu kho, chi phí cho sản phẩm hết hạn và nhiều yếu tố khác, nhu cầu tăng theo mùa.

Các tính Lead time (LT) cho từng sản phẩm, leadtime sẽ được tính bằng ngày bắt đầu đặt hàng cho tới khi hàng về tới nhập kho. Với những sản phẩm nhập khẩu thì có ETA bạn chỉ việc lấy cột ETA - Cột ngày đặt hàng, cộng thêm thời gian thông quan 7 tới 10 ngày là ra được lead time. Giá trị trung bình của LT cho sản phẩm có thể tính trong khoảng thời gian 3 năm gần nhất. Nếu có cột DDP thì bạn tính theo DDP - Date(ngày đặt hàng)

ETA -  Estimated time of arrival - Thời gian dự kiến về cảng

DDP = promised delivery date - Thời gian về kho 

Nguồn: https://msh.org/wp-content/uploads/2013/04/mds3-ch23-inventorymgmt-mar2012.pdf

Cách phân tích số liệu bán hàng sử dụng Python

Khi đánh giá tình hình kinh doanh thì thông thường sẽ dựa vào số liệu tháng (month to date) và số liệu từ đầu năm tới tháng (year to date). Các sản phẩm còn được phân chia vào các segments.

Ví dụ theo số liệu bán hàng tháng 2 (month to date) tổng doanh số tháng 2 và tháng 2 (year to date) tổng doanh số từ đầu năm tới tháng 2. 

Với công cụ matplotlib thì bạn có thể thể hiện doanh số bán hàng của các sản phẩm trên cùng một biểu đồ. Nhìn qua sẽ biết sản phẩm nào đang tăng trưởng, sản phẩm nào bán chậm và thêm những sản phẩm phát triển mới. 


Trước hết mình sử dụng các thư viện dưới đây

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Đọc các csv file, so sánh doanh số bán hàng tháng 4 năm 2020 và tháng 4 năm 2019
apr_2019 = pd.read_csv(r'D:\Sales_Data/Sales_April_2019.csv')
apr_2020 = pd.read_csv(r'D:\Sales_Data/Sales_April_2020.csv')

# Thông thường nếu file xuất từ hệ thống bán hàng, sẽ hiếm khi có số liệu thiếu ở các hàng hay cột, tuy nhiên vẫn có tình huống xảy tới. Khi đó bạn sử dụng

apr_2019 = apr_2019.dropna(how='any')
apr_2020 = apr_2020.dropna(how='any')

# Tiếp theo là chuyển kiểu dữ liệu từ các cột để tính toán, ở đây có 2 cột là Quantity (Số lượng) và Price giá bán. 

apr_2019['Quantity Ordered'] = pd.to_numeric(apr_2019['Quantity'], errors='coerce')
apr_2020['Price Each'] = pd.to_numeric(apr_2020['Price'], errors='coerce')

# Giờ mình tiến hành groupby theo sản phẩm theo số lượng bán được (Quantity).
apr_2019_group = apr_2019_group.groupby('Product')
apr_2019_quatity = apr_2019_group.sum()['Quantity']
# Tính luôn tổng số lượng các sản phẩm.
apr_2019_order = apr_2019['Quantity Ordered'].sum()

# Làm tương tự cho tháng 4/2020
apr_2020_group = apr_2020_group.groupby('Product')
apr_2020_quatity = apr_2020_group.sum()['Quantity']
# Tính luôn tổng số lượng các sản phẩm.
apr_2020_order = apr_2020['Quantity Ordered'].sum()

# Và so sanh peformance cho từng sản phẩm. 

width = 0.8
# trục x là tên sản phẩm
indices = [pair for pair, value in apr_2019_quatity]

plt.bar(indices, apr_2019_quatity, width=width, 
        color='b', label='2019 performance {}'.format(apr_2019_order))

plt.bar([i+0.25*width for i in np.arange(len( apr_2019_quatity))], apr_2020_quatity, 
        width=0.75*width, color='r', alpha=0.5, label='2020 performance {}'.format(apr_2020_order))
# Dùng rotation để chuyển chữ ngang thành dọc.
plt.xticks(np.arange(len(apr_2019_quatity))+width/2., 
           indices, rotation='vertical', size=8)

plt.legend()

plt.show()