Skip to content

Chương 2_Bài tập số 2_Dùng Python xử lý số liệu từ Excel xuất ra CSV và dùng thuật toán được hướng dẫn từ AI LLM để viết hàm, làm sạch, thay đổi và phân tích cấu trúc Khoa học Dữ liệu N1,N2

PhD Le Toan Thang edited this page Mar 31, 2024 · 1 revision

0. Hàm load các thư viện số học, dữ liệu, mảng và biểu đồ

import numpy as np
import pandas as pd
#pd.__version__
import seaborn as sns
from matplotlib import pyplot as plt

from statsmodels.tsa.api import ExponentialSmoothing, SimpleExpSmoothing, Holt
from sklearn.linear_model import LinearRegression

import warnings
warnings.filterwarnings('ignore')

1. Hàm load dữ liệu từ file CSV, định dạng số cột, dòng

df = pd.read_csv(r"C:\Python311\workspaces\P6B55.csv")
pd.set_option("display.max_rows",df.shape[0]+1)
pd.set_option("display.max_columns",60)
df.shape
df
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Date S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 S16 S17 S18 S19 S20 S21 S22 S23 S24 S25 S26 S27 S28 S29 S30 S31 S32 S33 S34 S35 S36 S37 S38 S39 S40 S41 S42 S43 S44 S45 S46 S47 S48 S49 S50 S51 S52 S53 S54 S55 ST Link Type BD
0 28/9/2023 103 94 113 91 107 94 88 108 108 94 113 110 94 93 94 90 94 108 102 99 94 114 116 108 100 94 92 89 110 99 103 115 111 107 102 97 86 92 94 100 114 108 111 113 100 105 108 104 111 97 115 98 109 97 100 102.000000 https://vietlott.vn/vi/choi/power-6-55/thong-k... P7B55 01.08.2017
1 30/9/2023 103 94 114 92 107 94 88 108 108 94 113 110 95 94 94 90 94 108 103 100 94 114 117 109 100 94 93 89 110 100 103 115 111 107 102 98 86 93 94 100 115 108 111 114 101 105 109 104 111 98 115 98 109 97 100 102.310000 NaN NaN NaN
2 3/10/2023 103 94 115 92 107 94 88 108 108 94 113 110 95 94 95 90 94 108 103 100 94 114 117 109 100 94 94 89 111 100 103 115 111 107 102 98 87 93 94 100 115 108 111 115 101 105 109 105 111 98 115 98 109 97 100 102.440000 NaN NaN NaN
3 7/10/2023 104 94 115 92 107 94 88 108 108 94 113 110 95 94 95 90 94 108 103 100 95 114 117 109 100 94 94 89 111 100 103 115 112 107 102 98 87 93 94 100 115 108 111 115 101 106 110 105 111 98 115 98 110 97 100 102.550000 NaN NaN NaN
4 10/10/2023 104 94 115 93 107 95 88 108 108 94 113 110 96 94 95 90 94 108 103 100 95 114 118 109 100 95 94 89 111 100 103 115 112 107 102 99 88 93 94 101 115 108 112 116 101 107 110 105 111 98 115 99 110 97 100 102.760000 NaN NaN NaN
5 12/10/2023 104 94 115 93 108 95 88 109 109 94 113 110 96 94 95 90 94 108 103 101 95 114 118 109 100 95 94 89 111 100 103 115 112 107 102 100 88 93 94 101 115 108 112 116 101 107 110 105 111 99 115 99 110 97 100 102.870000 NaN NaN NaN
6 14/10/2023 104 94 115 93 108 95 88 110 109 94 113 110 96 94 95 90 94 108 103 101 95 114 119 109 100 95 94 89 111 101 103 115 112 108 102 100 88 94 94 101 115 108 112 116 101 107 111 105 111 99 115 99 110 97 100 102.980000 NaN NaN NaN
7 17/10/2023 104 94 115 93 108 95 88 110 109 94 113 110 97 94 95 90 94 108 103 101 95 115 119 109 100 95 94 89 111 101 103 115 113 108 102 100 88 94 94 101 116 108 112 116 101 108 112 105 111 99 115 99 110 97 100 103.090000 NaN NaN NaN
8 19/10/2023 105 94 115 93 108 95 88 110 109 94 113 110 97 94 95 90 94 108 103 101 95 115 120 109 100 95 94 89 112 101 103 115 113 108 102 100 89 94 94 101 116 108 112 116 101 108 112 105 111 99 116 99 110 97 101 103.200000 NaN NaN NaN
9 21/10/2023 105 94 115 93 108 95 88 110 109 94 114 110 97 94 95 91 94 108 103 101 95 115 120 110 100 95 94 89 112 101 103 115 113 109 102 100 89 94 94 101 116 108 112 116 101 108 113 105 111 99 116 100 110 97 101 103.310000 NaN NaN NaN
10 24/10/2023 105 94 115 93 108 95 88 110 109 94 114 111 97 94 95 91 94 108 103 102 95 115 120 110 100 96 94 89 112 101 103 115 114 109 102 100 89 94 94 102 116 108 112 117 101 108 113 105 111 99 116 100 110 97 101 103.420000 NaN NaN NaN
11 26/10/2023 105 94 115 93 108 95 88 110 109 94 114 111 97 95 95 91 94 108 103 102 95 116 120 110 100 96 94 89 112 101 103 116 114 109 102 100 90 94 94 102 116 109 113 117 101 108 113 106 111 99 116 100 110 97 101 103.550000 NaN NaN NaN
12 28/10/2023 105 94 115 93 108 95 88 110 109 95 115 111 97 96 95 91 94 108 103 102 95 116 120 110 101 96 94 89 112 101 103 116 114 109 102 100 90 94 94 102 116 109 113 118 101 109 114 106 111 99 116 100 110 97 101 103.670000 NaN NaN NaN
13 31/10/2023 105 94 115 93 108 95 88 110 109 95 115 111 97 96 95 92 95 108 103 102 95 116 120 110 101 96 94 90 112 101 103 116 114 109 102 100 91 94 94 102 116 109 113 118 101 109 114 106 111 99 116 100 110 97 101 103.750000 NaN NaN NaN
14 2/11/2023 105 94 115 93 108 95 88 110 110 95 115 111 97 96 96 92 96 108 103 102 96 116 120 110 101 97 94 90 112 101 103 116 114 109 102 101 91 94 94 102 116 109 113 118 101 109 114 106 111 99 116 100 110 97 101 103.850000 NaN NaN NaN
15 4/11/2023 105 94 115 93 108 95 88 110 110 95 115 111 97 97 96 92 96 108 103 102 96 116 120 110 101 97 94 90 112 101 103 116 114 109 103 101 92 94 94 102 116 109 113 118 101 109 115 107 111 100 116 100 110 97 101 103.960000 NaN NaN NaN
16 7/11/2023 105 94 115 93 108 95 88 110 110 95 115 112 97 97 96 92 96 109 103 103 96 116 120 110 101 97 94 91 112 101 103 116 114 109 104 101 92 94 94 102 116 109 113 118 101 109 115 107 111 100 116 101 110 97 101 104.070000 NaN NaN NaN
17 9/11/2023 105 94 115 93 108 95 88 111 110 95 115 112 97 97 96 92 97 109 103 103 96 116 120 111 101 97 94 91 112 101 103 116 114 110 104 101 92 94 95 102 116 109 113 118 101 109 115 108 111 100 116 101 110 97 101 104.180000 NaN NaN NaN
18 11/11/2023 105 95 116 94 108 95 88 111 110 95 115 112 97 97 96 92 97 109 104 103 96 116 120 111 101 97 94 91 112 101 103 116 114 110 104 101 92 94 95 102 117 110 113 118 101 109 115 108 111 100 116 101 110 97 101 104.290000 NaN NaN NaN
19 14/11/2023 105 95 116 95 108 95 88 111 111 95 115 113 97 97 97 92 97 109 104 103 96 117 120 111 101 97 94 91 112 101 103 116 114 110 104 101 92 95 95 102 117 110 113 118 101 109 115 108 111 100 116 101 110 97 101 104.400000 NaN NaN NaN
20 16/11/2023 105 95 117 95 109 95 88 111 111 96 115 113 97 97 97 92 97 110 104 103 96 117 120 111 101 97 94 91 112 101 103 116 114 110 104 101 92 95 95 102 117 110 113 119 101 109 115 108 112 100 116 101 110 97 101 104.510000 NaN NaN NaN
21 18/11/2023 106 95 117 95 109 95 89 111 111 97 115 113 97 98 97 92 97 110 104 103 96 117 120 111 101 97 94 92 113 101 103 116 114 110 104 101 92 95 95 102 117 110 113 119 101 109 115 108 112 100 116 101 110 97 101 104.620000 NaN NaN NaN
22 21/11/2023 106 95 118 95 109 95 90 111 111 97 115 113 97 98 97 93 97 110 104 103 96 117 120 111 101 97 94 92 113 101 103 116 114 110 104 101 93 95 96 102 117 110 113 119 101 109 115 108 112 100 117 101 110 97 101 104.730000 NaN NaN NaN
23 23/11/2023 106 95 118 96 109 96 90 111 111 97 115 113 97 98 97 93 97 110 104 103 96 117 120 111 101 98 94 92 113 101 103 116 115 110 104 101 93 95 96 102 117 110 113 119 101 109 115 108 112 100 117 102 110 97 102 104.840000 NaN NaN NaN
24 25/11/2023 106 95 118 96 109 96 91 111 112 98 115 113 97 98 97 93 98 110 104 103 96 117 120 111 102 98 94 92 113 101 103 116 115 110 104 101 93 95 96 102 117 110 113 119 101 109 115 108 112 100 117 102 111 97 102 104.950000 NaN NaN NaN
25 28/11/2023 106 95 118 96 109 96 91 111 112 99 115 113 97 98 97 93 98 110 104 103 96 117 120 112 102 98 94 92 113 101 103 116 115 110 104 101 93 95 96 102 117 110 113 119 101 109 116 109 112 100 117 103 111 97 103 105.050000 NaN NaN NaN
26 30/11/2023 106 95 118 96 109 96 91 111 113 99 115 113 98 98 97 93 98 110 104 103 97 117 120 112 102 98 94 93 113 101 103 116 115 110 104 101 93 95 96 102 117 110 113 119 101 109 116 109 112 101 117 103 111 98 103 105.160000 NaN NaN NaN
27 2/12/2023 107 95 118 96 109 96 91 111 113 100 115 113 98 98 97 93 98 110 104 104 97 117 120 112 102 98 94 93 113 101 103 116 115 110 104 101 94 95 96 102 117 110 113 119 101 109 116 110 112 101 118 103 111 98 103 105.270000 NaN NaN NaN
28 5/12/2023 107 96 118 97 109 96 91 111 113 100 115 113 98 98 97 93 98 110 105 104 97 117 120 112 102 98 94 93 113 101 103 117 115 110 105 101 94 95 97 102 117 110 113 119 101 109 116 110 113 101 118 103 111 98 103 105.400000 NaN NaN NaN
29 7/12/2023 107 96 118 97 109 96 91 111 114 100 115 113 99 98 97 93 98 110 105 104 97 117 120 112 102 98 94 94 113 101 103 117 116 110 105 101 94 95 97 102 117 110 113 119 101 109 117 110 113 102 118 103 112 98 103 105.530000 NaN NaN NaN
30 9/12/2023 107 96 118 97 109 97 91 111 115 100 115 113 99 98 97 93 98 110 105 104 97 117 120 112 102 99 95 94 113 101 103 117 116 111 105 101 94 95 97 102 118 110 113 119 101 109 118 110 113 102 118 103 112 98 103 105.650000 NaN NaN NaN
31 12/12/2023 107 96 118 97 109 98 92 111 115 100 115 113 99 98 97 94 98 110 105 104 98 117 120 112 102 99 95 94 113 101 103 117 116 112 105 101 94 95 97 102 118 110 113 119 101 109 118 110 113 103 118 103 112 98 103 105.763636 NaN NaN NaN
32 14/12/2023 108 96 118 97 109 98 92 111 115 100 115 114 99 98 97 94 98 110 105 104 98 117 121 112 102 99 95 94 113 102 103 117 116 112 105 101 94 95 97 102 118 110 114 119 101 109 118 111 113 103 118 104 112 98 103 105.890909 NaN NaN NaN
33 16/12/2023 108 96 118 97 109 98 92 111 115 100 115 114 100 98 98 94 98 110 105 104 99 117 121 112 102 100 95 94 113 102 103 117 116 113 106 101 94 95 97 102 118 110 114 119 102 109 118 111 113 103 118 104 112 98 103 106.020000 NaN NaN NaN
34 19/12/2023 108 96 118 97 109 98 92 111 115 100 116 114 100 99 99 94 98 111 105 104 99 117 121 113 102 100 95 94 113 102 103 117 116 114 106 101 94 95 97 102 118 110 114 119 102 109 118 111 113 103 118 104 113 98 103 106.145454 NaN NaN NaN
35 21/12/2023 108 96 119 97 109 98 92 111 116 100 116 114 100 99 99 94 98 111 105 104 99 117 121 113 102 100 95 94 113 102 104 117 116 114 106 101 94 95 98 102 119 110 114 119 102 109 119 112 113 103 118 104 113 98 103 106.272727 NaN NaN NaN
36 23/12/2023 108 96 119 97 109 98 92 111 116 100 116 114 100 99 99 94 98 111 105 104 99 118 121 113 102 100 95 94 113 102 104 118 116 114 106 101 94 95 99 102 119 110 115 119 102 110 119 113 114 103 118 104 113 98 103 106.400000 NaN NaN NaN
37 26/12/2023 108 96 119 97 109 98 92 111 116 101 116 114 100 100 99 94 99 111 105 104 99 118 121 113 103 100 96 94 114 102 104 118 116 114 106 101 94 95 99 103 119 110 115 119 102 110 119 113 114 103 118 104 113 98 103 106.527273 NaN NaN NaN
38 28/12/2023 108 96 119 97 109 98 92 111 116 101 116 114 100 100 99 94 99 111 105 105 99 118 121 113 103 100 96 95 114 103 104 119 116 114 106 101 94 95 99 104 119 110 115 119 103 110 119 113 114 103 118 105 113 98 103 106.654545 NaN NaN NaN
39 30/12/2023 108 97 119 97 109 98 92 111 117 101 116 114 100 100 99 94 100 111 105 105 99 118 121 113 103 100 96 95 115 103 104 120 116 114 106 101 94 96 99 104 119 110 115 119 103 110 119 113 114 103 118 106 113 98 103 106.780000 NaN NaN NaN
40 2/1/2024 108 98 119 97 110 98 92 111 117 101 116 114 100 100 99 94 100 112 105 106 99 118 121 113 103 100 96 95 115 103 105 120 116 114 106 101 95 96 99 104 119 110 115 119 104 110 119 113 114 103 118 106 113 98 103 106.909091 NaN NaN NaN
41 4/1/2024 108 98 119 97 110 98 93 111 117 101 116 114 100 100 99 94 100 112 105 106 99 118 121 113 103 100 96 96 115 103 105 120 116 115 106 101 96 96 99 104 119 110 116 119 104 110 119 113 114 103 118 107 113 99 103 107.036364 NaN NaN NaN
42 6/1/2024 108 98 119 97 110 98 93 111 117 101 117 114 100 100 100 94 101 112 105 106 100 118 121 114 103 100 96 96 115 103 105 120 116 116 106 101 96 96 99 104 119 110 116 119 104 111 119 113 114 103 118 107 113 99 103 107.160000 NaN NaN NaN
43 9/1/2024 108 98 119 97 110 98 93 111 117 101 117 114 100 100 100 95 101 112 105 106 100 118 121 114 103 100 96 96 115 103 105 121 116 116 106 101 96 96 99 104 119 110 116 119 105 111 119 113 114 104 118 108 114 100 103 107.290909 NaN NaN NaN
44 11/1/2024 108 99 119 97 110 98 93 111 117 101 117 114 100 100 100 95 101 112 105 106 100 118 122 114 103 100 96 97 115 103 105 122 116 116 106 101 96 96 99 104 119 110 116 120 105 111 119 113 114 104 119 109 114 100 103 107.420000 NaN NaN NaN
45 13/1/2024 109 99 119 97 111 98 94 111 117 101 117 114 100 100 100 95 101 112 105 106 101 118 123 114 103 100 96 97 115 103 105 122 116 116 107 101 96 96 99 104 119 111 116 120 105 111 119 113 114 104 119 109 114 100 103 107.550000 NaN NaN NaN
46 16/1/2024 109 99 119 97 111 98 94 111 118 101 117 114 100 101 100 95 101 113 105 107 101 118 123 114 103 100 97 97 115 103 105 122 116 116 107 101 96 96 99 104 119 112 117 120 105 111 119 113 114 104 119 109 114 100 103 107.670000 NaN NaN NaN
47 18/1/2024 109 99 119 97 111 98 94 111 118 101 117 115 100 101 100 95 101 113 105 108 101 118 123 114 103 100 97 97 115 103 105 122 117 116 108 101 96 97 99 105 119 112 117 120 105 111 119 113 114 104 119 110 114 100 103 107.800000 NaN NaN NaN
48 20/1/2024 109 99 119 97 111 99 94 111 118 101 117 115 100 101 100 95 101 113 105 108 101 118 123 114 104 100 97 97 116 103 105 122 117 117 108 101 96 98 99 105 119 112 117 120 105 111 119 113 115 104 119 110 114 101 103 107.927273 NaN NaN NaN
49 23/1/2024 109 99 119 97 111 99 94 111 118 101 117 115 101 101 100 95 101 113 105 108 101 118 124 114 104 100 98 97 116 103 105 123 117 117 108 101 96 98 99 105 119 112 117 120 105 111 119 114 116 104 120 110 114 101 103 108.054546 NaN NaN NaN
50 25/1/2024 109 99 119 97 111 99 94 111 118 101 117 115 102 101 100 95 102 113 105 108 101 118 124 114 104 100 98 97 116 103 105 123 117 117 109 101 96 99 99 105 119 113 117 120 105 111 119 115 116 104 120 110 114 101 103 108.160000 NaN NaN NaN
51 27/1/2024 109 99 119 97 111 100 94 111 118 101 117 116 103 101 100 95 102 113 105 108 101 118 124 114 104 100 98 97 116 103 105 123 117 117 109 101 96 100 99 105 120 113 117 120 105 112 119 115 116 104 120 110 114 101 104 108.290000 NaN NaN NaN
52 30/1/2024 109 99 120 97 111 100 94 111 119 102 117 116 104 101 100 95 102 113 105 108 101 118 124 114 104 100 98 97 116 103 105 123 117 117 109 101 96 100 99 106 120 113 117 120 105 112 119 115 117 104 120 111 114 101 104 108.420000 NaN NaN NaN
53 1/2/2024 109 100 120 97 111 100 95 111 119 103 117 116 104 101 100 95 102 113 105 108 101 119 124 114 104 100 98 97 116 103 105 124 117 117 109 101 96 100 100 107 120 113 117 120 105 112 119 115 117 104 120 111 114 101 104 108.550000 1.015799708 NaN NaN
54 3/2/2024 109 100 120 98 111 101 96 111 119 103 117 116 105 101 100 95 102 114 105 108 101 119 124 114 104 101 98 97 116 103 105 124 117 117 109 101 96 100 100 107 120 113 117 120 105 112 119 115 118 104 120 111 114 101 104 108.670000 1.037802307 NaN NaN
55 6/2/2024 109 100 120 98 111 101 96 112 119 103 117 116 105 101 100 95 102 114 106 108 101 119 124 115 104 101 99 97 116 103 105 124 117 118 109 101 96 100 100 107 120 113 117 120 105 113 119 115 118 104 121 111 114 101 104 108.800000 0.971428571 NaN NaN
56 8/2/2024 109 100 120 98 111 101 96 112 119 103 118 116 105 101 100 95 102 114 106 108 101 120 124 115 104 101 99 97 116 103 106 124 117 118 110 102 96 101 100 107 120 114 117 120 105 113 119 115 118 104 121 111 114 101 104 108.930000 NaN NaN NaN
57 13/2/2024 109 100 120 98 111 101 96 113 119 103 118 116 105 101 100 95 103 115 106 108 101 121 124 115 104 101 99 97 116 103 107 124 117 119 110 102 96 101 100 107 120 114 117 120 105 113 119 115 119 104 121 111 114 101 104 109.050000 NaN NaN NaN
58 15/2/2024 109 100 121 98 111 101 97 114 119 103 118 116 105 101 100 95 103 116 107 108 102 121 124 115 104 102 99 97 116 103 107 124 117 119 110 102 96 101 100 107 120 114 117 120 105 113 119 115 119 104 121 111 114 101 104 109.180000 NaN NaN NaN
59 17/2/2024 109 100 121 98 111 101 97 115 119 103 118 117 105 101 100 95 104 116 107 108 102 121 124 115 104 102 100 97 116 103 107 124 117 119 110 102 96 102 100 107 120 114 117 120 105 113 120 115 119 104 121 111 114 101 105 109.310000 NaN NaN NaN
60 20/2/2024 109 100 121 98 112 101 97 115 119 103 118 117 105 101 100 95 104 116 107 108 102 121 124 115 104 102 100 97 116 103 107 124 117 120 110 102 96 102 100 107 120 114 117 120 105 114 120 115 119 105 122 112 114 101 106 109.440000 NaN NaN NaN
61 22/2/2024 110 100 121 98 112 101 97 116 119 103 118 117 105 101 100 95 104 116 108 108 102 121 124 116 104 102 100 97 116 103 108 124 117 120 111 102 96 102 100 107 120 114 117 120 105 114 120 115 119 105 122 112 114 101 107 109.560000 NaN NaN NaN
62 24/2/2024 110 100 122 98 112 101 97 116 119 103 118 117 105 101 100 95 104 116 108 108 102 122 124 116 104 103 101 97 116 103 108 124 117 120 111 102 96 103 100 108 120 114 117 120 105 114 120 115 119 105 122 112 114 101 107 109.670000 NaN NaN NaN

2. Hàm định dạng lại đúng, kiểm tra kiểu Ngày/Tháng/Năm - dd/mm/yyyy

# Chuyển đổi cột ngày tháng thành định dạng 'yyyy/mm/dd'

df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')

# Hiển thị DataFrame đã chuyển đổi
print(f"Date range of gold from - {df.loc[:,'Date'][0]} to {df.loc[:,'Date'][len(df)-1]}")

# Tạo DatetimeIndex từ '9/28/2023' đến ngày cuối cùng trong DataFrame df
daterange = pd.date_range(start='24/09/2023', end=df.loc[:, 'Date'].iloc[-1], freq='D')
formatted_date = daterange.strftime('%d/%m/%Y')
# Thay thế ngày cuối cùng bằng ngày trong DataFrame df
print(formatted_date)
Date range of gold from - 2023-09-28 00:00:00 to 2024-02-24 00:00:00
Index(['24/09/2023', '25/09/2023', '26/09/2023', '27/09/2023', '28/09/2023',
       '29/09/2023', '30/09/2023', '01/10/2023', '02/10/2023', '03/10/2023',
       ...
       '15/02/2024', '16/02/2024', '17/02/2024', '18/02/2024', '19/02/2024',
       '20/02/2024', '21/02/2024', '22/02/2024', '23/02/2024', '24/02/2024'],
      dtype='object', length=154)

3. Các Hàm thủ tục Kiểm tra Dữ liệu --> Validate and Cleaning Data

3.1. Hàm chống trùng lặp dữ liệu
df = df.drop_duplicates()
df.shape
(63, 60)

3. Các Hàm thủ tục Kiểm tra Dữ liệu --> Validate and Cleaning Data

3.2. Hàm matplotlib.pyplot vẽ biểu đồ kiểm tra tính logic của dữ liệu
import pandas as pd
import matplotlib.pyplot as plt

# Đọc dữ liệu từ file csv
data = pd.read_csv(r"C:\Python311\workspaces\P6B55.csv")
# Thiết lập kích thước biểu đồ
plt.figure(figsize=(10, 6))

# Vẽ các đường line từ S01 đến S55
for column in data.columns[1:56]:
    plt.plot(data['Date'], data[column], label=column)

# Thiết lập tiêu đề và các trục
plt.title('Biểu đồ thống kê số lần')
plt.xlabel('Ngày')
plt.ylabel('Số lần')

# Xoay đứng trục ngày tháng
plt.xticks(rotation='vertical')

# Hiển thị grid
plt.grid(True)

# Hiển thị chú thích
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')

# Hiển thị biểu đồ
plt.show()

png

3. Các Hàm thủ tục Kiểm tra Dữ liệu --> Validate and Cleaning Data

3.3. Hàm describe() tính toán các chỉ số max, min, 25% tối thiểu, 50% trung bình, 75% hiệu suất để kiểm tra tính hợp lệ của dữ liệu
round(df.describe(),0)
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Date S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 S16 S17 S18 S19 S20 S21 S22 S23 S24 S25 S26 S27 S28 S29 S30 S31 S32 S33 S34 S35 S36 S37 S38 S39 S40 S41 S42 S43 S44 S45 S46 S47 S48 S49 S50 S51 S52 S53 S54 S55 ST
count 63 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0 63.0
mean 2023-12-11 18:40:00 107.0 96.0 118.0 96.0 109.0 97.0 91.0 111.0 114.0 99.0 116.0 113.0 99.0 98.0 98.0 93.0 98.0 111.0 104.0 104.0 98.0 117.0 121.0 112.0 102.0 98.0 96.0 93.0 114.0 102.0 104.0 119.0 115.0 113.0 105.0 101.0 93.0 96.0 97.0 103.0 118.0 110.0 114.0 119.0 103.0 110.0 116.0 110.0 114.0 102.0 118.0 104.0 112.0 98.0 102.0 106.0
min 2023-09-28 00:00:00 103.0 94.0 113.0 91.0 107.0 94.0 88.0 108.0 108.0 94.0 113.0 110.0 94.0 93.0 94.0 90.0 94.0 108.0 102.0 99.0 94.0 114.0 116.0 108.0 100.0 94.0 92.0 89.0 110.0 99.0 103.0 115.0 111.0 107.0 102.0 97.0 86.0 92.0 94.0 100.0 114.0 108.0 111.0 113.0 100.0 105.0 108.0 104.0 111.0 97.0 115.0 98.0 109.0 97.0 100.0 102.0
25% 2023-11-05 12:00:00 105.0 94.0 115.0 93.0 108.0 95.0 88.0 110.0 110.0 95.0 115.0 112.0 97.0 97.0 96.0 92.0 96.0 108.0 103.0 102.0 96.0 116.0 120.0 110.0 101.0 97.0 94.0 90.0 112.0 101.0 103.0 116.0 114.0 109.0 104.0 101.0 92.0 94.0 94.0 102.0 116.0 109.0 113.0 118.0 101.0 109.0 115.0 107.0 111.0 100.0 116.0 100.0 110.0 97.0 101.0 104.0
50% 2023-12-12 00:00:00 107.0 96.0 118.0 97.0 109.0 98.0 92.0 111.0 115.0 100.0 115.0 113.0 99.0 98.0 97.0 94.0 98.0 110.0 105.0 104.0 98.0 117.0 120.0 112.0 102.0 99.0 95.0 94.0 113.0 101.0 103.0 117.0 116.0 112.0 105.0 101.0 94.0 95.0 97.0 102.0 118.0 110.0 113.0 119.0 101.0 109.0 118.0 110.0 113.0 103.0 118.0 103.0 112.0 98.0 103.0 106.0
75% 2024-01-17 00:00:00 109.0 99.0 119.0 97.0 111.0 98.0 94.0 111.0 118.0 101.0 117.0 114.0 100.0 101.0 100.0 95.0 101.0 113.0 105.0 108.0 101.0 118.0 123.0 114.0 103.0 100.0 97.0 97.0 115.0 103.0 105.0 122.0 116.0 116.0 108.0 101.0 96.0 96.0 99.0 104.0 119.0 112.0 117.0 120.0 105.0 111.0 119.0 113.0 114.0 104.0 119.0 110.0 114.0 100.0 103.0 108.0
max 2024-02-24 00:00:00 110.0 100.0 122.0 98.0 112.0 101.0 97.0 116.0 119.0 103.0 118.0 117.0 105.0 101.0 100.0 95.0 104.0 116.0 108.0 108.0 102.0 122.0 124.0 116.0 104.0 103.0 101.0 97.0 116.0 103.0 108.0 124.0 117.0 120.0 111.0 102.0 96.0 103.0 100.0 108.0 120.0 114.0 117.0 120.0 105.0 114.0 120.0 115.0 119.0 105.0 122.0 112.0 114.0 101.0 107.0 110.0
std NaN 2.0 2.0 2.0 2.0 1.0 2.0 3.0 2.0 4.0 3.0 2.0 2.0 3.0 3.0 2.0 2.0 3.0 2.0 1.0 3.0 3.0 2.0 2.0 2.0 1.0 2.0 2.0 3.0 2.0 1.0 1.0 3.0 2.0 4.0 3.0 1.0 3.0 3.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 3.0 4.0 3.0 2.0 2.0 5.0 2.0 2.0 2.0 2.0

3. Các Hàm thủ tục Kiểm tra Dữ liệu --> Validate and Cleaning Data

3.4. Hàm columns kiểm tra xác định tên Trường dữ liệu
df.columns
Index(['Date', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8', 'S9', 'S10',
       'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20',
       'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30',
       'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39', 'S40',
       'S41', 'S42', 'S43', 'S44', 'S45', 'S46', 'S47', 'S48', 'S49', 'S50',
       'S51', 'S52', 'S53', 'S54', 'S55', 'ST', 'Link', 'Type', 'BD'],
      dtype='object')

3. Các Hàm thủ tục Kiểm tra Dữ liệu --> Validate and Cleaning Data

3.5. Hàm info() kiểm tra phân loại Kiểu dữ liệu non-null, dtypes: datetime64[ns](1), float64(1), int64(55), object(3)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 63 entries, 0 to 62
Data columns (total 60 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   Date    63 non-null     datetime64[ns]
 1   S1      63 non-null     int64         
 2   S2      63 non-null     int64         
 3   S3      63 non-null     int64         
 4   S4      63 non-null     int64         
 5   S5      63 non-null     int64         
 6   S6      63 non-null     int64         
 7   S7      63 non-null     int64         
 8   S8      63 non-null     int64         
 9   S9      63 non-null     int64         
 10  S10     63 non-null     int64         
 11  S11     63 non-null     int64         
 12  S12     63 non-null     int64         
 13  S13     63 non-null     int64         
 14  S14     63 non-null     int64         
 15  S15     63 non-null     int64         
 16  S16     63 non-null     int64         
 17  S17     63 non-null     int64         
 18  S18     63 non-null     int64         
 19  S19     63 non-null     int64         
 20  S20     63 non-null     int64         
 21  S21     63 non-null     int64         
 22  S22     63 non-null     int64         
 23  S23     63 non-null     int64         
 24  S24     63 non-null     int64         
 25  S25     63 non-null     int64         
 26  S26     63 non-null     int64         
 27  S27     63 non-null     int64         
 28  S28     63 non-null     int64         
 29  S29     63 non-null     int64         
 30  S30     63 non-null     int64         
 31  S31     63 non-null     int64         
 32  S32     63 non-null     int64         
 33  S33     63 non-null     int64         
 34  S34     63 non-null     int64         
 35  S35     63 non-null     int64         
 36  S36     63 non-null     int64         
 37  S37     63 non-null     int64         
 38  S38     63 non-null     int64         
 39  S39     63 non-null     int64         
 40  S40     63 non-null     int64         
 41  S41     63 non-null     int64         
 42  S42     63 non-null     int64         
 43  S43     63 non-null     int64         
 44  S44     63 non-null     int64         
 45  S45     63 non-null     int64         
 46  S46     63 non-null     int64         
 47  S47     63 non-null     int64         
 48  S48     63 non-null     int64         
 49  S49     63 non-null     int64         
 50  S50     63 non-null     int64         
 51  S51     63 non-null     int64         
 52  S52     63 non-null     int64         
 53  S53     63 non-null     int64         
 54  S54     63 non-null     int64         
 55  S55     63 non-null     int64         
 56  ST      63 non-null     float64       
 57  Link    4 non-null      object        
 58  Type    1 non-null      object        
 59  BD      1 non-null      object        
dtypes: datetime64[ns](1), float64(1), int64(55), object(3)
memory usage: 29.7+ KB

3. Các Hàm thủ tục Kiểm tra Dữ liệu --> Validate and Cleaning Data

3.6. Hàm .isnull().sum() kiểm tra các giá trị supervisor nhập vào thiếu/đủ/thừa giá trị
df.isnull().sum()
Date     0
S1       0
S2       0
S3       0
S4       0
S5       0
S6       0
S7       0
S8       0
S9       0
S10      0
S11      0
S12      0
S13      0
S14      0
S15      0
S16      0
S17      0
S18      0
S19      0
S20      0
S21      0
S22      0
S23      0
S24      0
S25      0
S26      0
S27      0
S28      0
S29      0
S30      0
S31      0
S32      0
S33      0
S34      0
S35      0
S36      0
S37      0
S38      0
S39      0
S40      0
S41      0
S42      0
S43      0
S44      0
S45      0
S46      0
S47      0
S48      0
S49      0
S50      0
S51      0
S52      0
S53      0
S54      0
S55      0
ST       0
Link    59
Type    62
BD      62
dtype: int64

3. Các Hàm thủ tục Kiểm tra Dữ liệu --> Validate and Cleaning Data

3.7. Hàm .isnull() kiểm tra các giá trị supervisor nhập vào sai/đúng kiểu giá trị
df.isnull()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Date S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 S16 S17 S18 S19 S20 S21 S22 S23 S24 S25 S26 S27 S28 S29 S30 S31 S32 S33 S34 S35 S36 S37 S38 S39 S40 S41 S42 S43 S44 S45 S46 S47 S48 S49 S50 S51 S52 S53 S54 S55 ST Link Type BD
0 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False
1 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
2 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
3 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
4 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
5 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
6 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
7 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
8 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
9 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
10 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
11 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
12 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
13 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
14 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
15 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
16 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
17 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
18 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
19 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
20 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
21 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
22 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
23 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
24 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
25 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
26 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
27 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
28 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
29 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
30 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
31 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
32 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
33 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
34 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
35 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
36 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
37 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
38 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
39 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
40 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
41 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
42 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
43 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
44 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
45 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
46 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
47 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
48 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
49 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
50 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
51 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
52 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
53 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True
54 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True
55 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True
56 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
57 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
58 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
59 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
60 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
61 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True
62 False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True True True

3. Các Hàm thủ tục Kiểm tra Dữ liệu --> Validate and Cleaning Data

3.8. Hàm .duplicated().sum() kiểm tra các giá trị, tổng supervisor nhập vào bị trùng lặp giá trị
df.duplicated().sum()
0

3. Các Hàm thủ tục Kiểm tra Dữ liệu --> Validate and Cleaning Data

3.9. Hàm describe().T Bảng mở rộng tính toán các chỉ số: - max, - min, - 25% tối thiểu, - 50% trung bình, - 75% hiệu suất để kiểm tra tính hợp lệ của dữ liệu
#EDA
df.describe().T
# Trong hàm df.describe().T, cột "std" đại diện cho độ lệch chuẩn (standard deviation) của dữ liệu trong các cột tương ứng.
# Độ lệch chuẩn là một số đo mô tả mức độ phân tán của dữ liệu xung quanh giá trị trung bình.
# Công thức tính độ lệch chuẩn là căn bậc hai của phương sai (variance), và được tính bằng cách lấy căn bậc hai của trung bình của 
# bình phương của độ lệch của mỗi giá trị dữ liệu so với giá trị trung bình. Công thức chính xác như sau:
# std = sqrt(mean((x - x.mean())**2))
# Trong trường hợp của bạn, giá trị "std" là 1.8959 cho một cột và 2.03572 cho cột khác. 
# Khi so sánh giá trị độ lệch chuẩn giữa các cột, giá trị lớn hơn có nghĩa là dữ liệu trong cột đó có mức độ phân tán lớn hơn so với cột khác.
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
count mean min 25% 50% 75% max std
Date 63 2023-12-11 18:40:00 2023-09-28 00:00:00 2023-11-05 12:00:00 2023-12-12 00:00:00 2024-01-17 00:00:00 2024-02-24 00:00:00 NaN
S1 63.0 106.873016 103.0 105.0 107.0 109.0 110.0 1.987802
S2 63.0 96.47619 94.0 94.0 96.0 99.0 100.0 2.292042
S3 63.0 117.714286 113.0 115.0 118.0 119.0 122.0 2.135934
S4 63.0 95.666667 91.0 93.0 97.0 97.0 98.0 2.055677
S5 63.0 109.301587 107.0 108.0 109.0 111.0 112.0 1.398558
S6 63.0 97.174603 94.0 95.0 98.0 98.0 101.0 2.261456
S7 63.0 91.460317 88.0 88.0 92.0 94.0 97.0 3.047079
S8 63.0 110.952381 108.0 110.0 111.0 111.0 116.0 1.590583
S9 63.0 113.936508 108.0 110.0 115.0 118.0 119.0 4.007545
S10 63.0 98.698413 94.0 95.0 100.0 101.0 103.0 3.319711
S11 63.0 115.571429 113.0 115.0 115.0 117.0 118.0 1.531542
S12 63.0 113.285714 110.0 111.5 113.0 114.5 117.0 2.120777
S13 63.0 99.349206 94.0 97.0 99.0 100.0 105.0 3.085652
S14 63.0 98.190476 93.0 97.0 98.0 101.0 101.0 2.54544
S15 63.0 97.714286 94.0 96.0 97.0 100.0 100.0 2.051188
S16 63.0 93.126984 90.0 92.0 94.0 95.0 95.0 1.78246
S17 63.0 98.412698 94.0 96.0 98.0 101.0 104.0 3.155307
S18 63.0 110.84127 108.0 108.5 110.0 113.0 116.0 2.470512
S19 63.0 104.492063 102.0 103.0 105.0 105.0 108.0 1.29357
S20 63.0 104.349206 99.0 102.5 104.0 107.5 108.0 2.701008
S21 63.0 98.0 94.0 96.0 98.0 101.0 102.0 2.596524
S22 63.0 117.222222 114.0 116.0 117.0 118.0 122.0 1.912981
S23 63.0 121.0 116.0 120.0 120.0 123.0 124.0 2.071309
S24 63.0 112.126984 108.0 110.0 112.0 114.0 116.0 2.098325
S25 63.0 102.079365 100.0 101.0 102.0 103.0 104.0 1.45138
S26 63.0 98.428571 94.0 97.0 99.0 100.0 103.0 2.353544
S27 63.0 95.587302 92.0 94.0 95.0 97.0 101.0 2.084001
S28 63.0 93.380952 89.0 90.5 94.0 97.0 97.0 3.118253
S29 63.0 113.539683 110.0 112.0 113.0 115.0 116.0 1.838876
S30 63.0 101.777778 99.0 101.0 101.0 103.0 103.0 1.113617
S31 63.0 104.047619 103.0 103.0 103.0 105.0 108.0 1.407681
S32 63.0 118.587302 115.0 116.0 117.0 122.0 124.0 3.406043
S33 63.0 115.111111 111.0 114.0 116.0 116.5 117.0 1.751599
S34 63.0 112.650794 107.0 109.0 112.0 116.0 120.0 4.04873
S35 63.0 105.428571 102.0 103.5 105.0 107.5 111.0 2.780777
S36 63.0 100.730159 97.0 101.0 101.0 101.0 102.0 0.970639
S37 63.0 93.095238 86.0 92.0 94.0 96.0 96.0 3.019903
S38 63.0 96.047619 92.0 94.0 95.0 96.5 103.0 2.732295
S39 63.0 96.968254 94.0 94.0 97.0 99.0 100.0 2.33465
S40 63.0 103.190476 100.0 102.0 102.0 104.5 108.0 2.169117
S41 63.0 117.746032 114.0 116.0 118.0 119.0 120.0 1.731755
S42 63.0 110.412698 108.0 109.0 110.0 112.0 114.0 1.897663
S43 63.0 114.301587 111.0 113.0 113.0 117.0 117.0 2.037035
S44 63.0 118.52381 113.0 118.0 119.0 120.0 120.0 1.644709
S45 63.0 102.539683 100.0 101.0 101.0 105.0 105.0 1.847626
S46 63.0 109.714286 105.0 109.0 109.0 111.0 114.0 2.105512
S47 63.0 116.333333 108.0 115.0 118.0 119.0 120.0 3.287317
S48 63.0 110.253968 104.0 107.0 110.0 113.0 115.0 3.754431
S49 63.0 113.539683 111.0 111.0 113.0 114.0 119.0 2.650778
S50 63.0 101.666667 97.0 100.0 103.0 104.0 105.0 2.293047
S51 63.0 117.793651 115.0 116.0 118.0 119.0 122.0 2.017334
S52 63.0 104.492063 98.0 100.5 103.0 109.5 112.0 4.624176
S53 63.0 111.888889 109.0 110.0 112.0 114.0 114.0 1.814912
S54 63.0 98.492063 97.0 97.0 98.0 100.0 101.0 1.644865
S55 63.0 102.444444 100.0 101.0 103.0 103.0 107.0 1.643931
ST 63.0 105.867662 102.0 104.015 105.763636 107.735 109.67 2.202043

3. Các Hàm thủ tục Kiểm tra Dữ liệu --> Vaidate and Cleaning Data

3.10. Hàm describe(include="object") kiểm tra tính hợp lệ của dữ liệu dạng Object gồm: string, blob, clob, vchar
df.describe(include="object")
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Link Type BD
count 4 1 1
unique 4 1 1
top https://vietlott.vn/vi/choi/power-6-55/thong-k... P7B55 01.08.2017
freq 1 1 1

4. Các Hàm thủ tục Thống kê và Phân tích Dữ liệu --> Analytics/Statistic Data

4.1. Hàm sns.kdeplot Biểu diễn mật độ và độ thay đổi dữ liệu số
import warnings
warnings.filterwarnings('ignore')
for i in df.select_dtypes(include="number").columns:
    plt.figure(figsize=(15,6))
    sns.kdeplot(data=df,x=i)
    plt.show()

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

4. Các Hàm thủ tục Thống kê và Phân tích Dữ liệu --> Analytics/Statistic Data

4.2. Hàm sns.kdeplot mở rộng so sánh với Giá trị thực để xác định độ thay đổi dữ liệu số
#Để vẽ đồ thị mật độ (density plot) kèm theo độ lệch chuẩn (standard deviation),
#bạn có thể sử dụng thư viện seaborn và matplotlib trong Python. Dưới đây là một ví dụ về cách thực hiện điều này:
# Trong đoạn mã trên, chúng ta sử dụng vòng lặp để duyệt qua từng cột là kiểu dữ liệu số trong dataframe (df).
#Sau đó, chúng ta vẽ đồ thị mật độ bằng hàm kdeplot từ thư viện seaborn. 
#Để xác định độ lệch chuẩn, chúng ta sử dụng hàm mean() để tính giá trị trung bình và hàm std() 
#để tính độ lệch chuẩn của cột tương ứng. Cuối cùng, chúng ta sử dụng hàm axvline() từ matplotlib 
#để vẽ các đường dọc đại diện cho giá trị trung bình và độ lệch chuẩn.
# Lưu ý rằng đoạn mã trên giả định rằng dữ liệu trong dataframe của bạn đã được đọc và xử lý đúng cách trước đó.

import seaborn as sns
import matplotlib.pyplot as plt

# Vẽ đồ thị mật độ kèm theo độ lệch chuẩn
for col in df.select_dtypes(include="number").columns:
    plt.figure(figsize=(15, 6))
    sns.kdeplot(data=df, x=col)
    mean = df[col].mean()
    std = df[col].std()
    plt.axvline(x=mean, color='r', linestyle='--', label='Mean')
    plt.axvline(x=mean + std, color='g', linestyle='--', label='Mean + Std')
    plt.axvline(x=mean - std, color='g', linestyle='--', label='Mean - Std')
    plt.legend()
    plt.show()

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

4. Các Hàm thủ tục Thống kê và Phân tích Dữ liệu --> Analytics/Statistic Data

4.3. Hàm sns.boxplot mở rộng so sánh với Giá trị thực để xác định độ thay đổi / tổng từng giá trị của dữ liệu số
  • Chú thích: Hàm sns.boxplot trong thư viện Seaborn được sử dụng để vẽ biểu đồ hộp (box plot). Biểu đồ hộp cho phép chúng ta hiển thị phân phối của một biến dữ liệu và các thông số thống kê liên quan. Thông qua biểu đồ hộp, chúng ta có thể trực quan hóa các thông số như giá trị trung vị (median), phạm vi (range), tứ phân vị (quartiles), và các giá trị ngoại lệ (outliers). Điều này giúp chúng ta có cái nhìn tổng quan về sự phân bố và biến động của dữ liệu

Tuy nhiên, trong phân tích giá trị về diễn biến tổng khối lượng so với giá trị diễn biến thay đổi như nến (volume trong chứng khoán), biểu đồ hộp có thể không phù ợp. Thông thường, biểu đồ hộp được sử dụng để phân tích các biến dữ liệu số (numerical variables) và không có sự phụ thuộc giữa các mẫu dữ li u.

Trong trường hợp giá trị diễn biến tổng khối lượng và giá trị diễn biến thay đổi như nến trong chứng khoán, có thể sử dụng các biểu đồ khác như biểu đồ đường (line plot) hoặc biểu đồ thanh (bar plot) để biểu diễn sự biến đổi của dữ liệu theo thời gian hoặc các nhóm khác nhau.

for i in df.select_dtypes(include="number").columns:
    plt.figure(figsize=(15,6))
    sns.boxplot(data=df,x=i)
    plt.show()

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

4. Các Hàm thủ tục Thống kê và Phân tích Dữ liệu --> Analytics/Statistic Data

4.4. Hàm sns.scatterplot so sánh với Giá trị thực để xác định một độ phân bố và độ thay đổi dữ liệu số Chú thích: hàm sns.scatterplot. Hàm này trong thư viện Seaborn được sử dụng để tạo biểu đồ phân tán (scatter plot), giúp chúng ta quan sát và so sánh mối quan hệ giữa hai biến dữ liệu số.

Biểu đồ phân tán biểu thị các điểm dữ liệu trên một không gian hai chiều, trong đó mỗi điểm dữ liệu được đại diện bởi một điểm trên biểu đồ. Trục x và trục y thường biểu thị hai biến dữ liệu mà chúng ta muốn so sánh. Điểm dữ liệu trên biểu đồ phân tán có thể có các mức độ tương quan khác nhau, từ tương quan dương (các điểm tăng theo cùng một hướng) đến tương quan âm (các điểm giảm theo cùng một hướng) và không có tương quan.

Biểu đồ phân tán giúp chúng ta đánh giá mức độ phân bố và độ thay đổi của dữ liệu số. Nó cho phép chúng ta xem xét các mẫu dữ liệu và tìm hiểu mối quan hệ giữa các biến số. Bằng cách xem xét biểu đồ phân tán, chúng ta có thể nhận ra các mẫu, xu hướng và sự biến đổi trong dữ liệu.

Tóm lại, hàm sns.scatterplot cho phép chúng ta so sánh và phân tích mối quan hệ giữa hai biến số, từ đó xác định được độ phân bố và độ thay đổi của dữ liệu số.

import seaborn as sns
import matplotlib.pyplot as plt

for i in ['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8', 'S9',
       'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19',
       'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29',
       'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39',
       'S40', 'S41', 'S42', 'S43', 'S44', 'S45', 'S46', 'S47', 'S48', 'S49',
       'S50', 'S51', 'S52', 'S53', 'S54', 'S55']:
    plt.figure(figsize=(15,6))
    sns.scatterplot(data=df,y='Date',x=i)
    plt.grid()
    plt.show()

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

4. Các Hàm thủ tục Thống kê và Phân tích Dữ liệu --> Analytics/Statistic Data

4.5. Hàm sns.kdeplot và sns.scatterplot có thể được kết hợp với nhau để cung cấp một cái nhìn toàn diện hơn về phân bố và mối quan hệ giữa hai biến số. Chú thích:

Hàm sns.kdeplot trong thư viện Seaborn được sử dụng để vẽ đồ thị mật độ kernel (kernel density plot), biểu diễn phân bố xác suất của một biến số. Nó tạo ra một đường cong mượt để cho thấy mật độ xác suất của dữ liệu. Điều này giúp chúng ta xác định các đỉnh, đồi, và đáy của phân bố và hiểu rõ hơn về phân phối của biến số.

Khi kết hợp với hàm sns.scatterplot, chúng ta có thể đồng thời hiển thị cả mô hình phân bố và mối quan hệ giữa hai biến số. Bằng cách sử dụng sns.kdeplot để vẽ đường cong mật độ kernel cho mỗi biến số và sử dụng sns.scatterplot để vẽ các điểm dữ liệu tương ứng, chúng ta có thể quan sát cả mô hình phân bố và mối quan hệ tương quan giữa hai biến.

Việc kết hợp hai hàm này cho phép chúng ta nhìn thấy một cách trực quan mối quan hệ giữa các biến số và biết được cách chúng phân bố trong không gian. Điều này có thể giúp chúng ta tìm ra các mẫu, xu hướng, và sự biến đổi trong dữ liệu, cung cấp thông tin quan trọng cho phân tích và hiểu rõ hơn về mối quan hệ giữa các biến số.

Tóm lại, việc kết hợp hàm sns.kdeplot và sns.scatterplot cho phép chúng ta trực quan hóa đồ thị mật độ kernel và biểu đồ phân tán để cung cấp cái nhìn toàn diện hơn về phân bố và mối quan hệ giữa hai biến số.

import seaborn as sns
import matplotlib.pyplot as plt

# Vẽ đồ thị phân bố sắp xếp giá trị số lần theo ngày
for i in ['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8', 'S9',
       'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19',
       'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29',
       'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39',
       'S40', 'S41', 'S42', 'S43', 'S44', 'S45', 'S46', 'S47', 'S48', 'S49',
       'S50', 'S51', 'S52', 'S53', 'S54', 'S55']:
    plt.figure(figsize=(15, 6))
    sns.kdeplot(data=df, y='Date', x=i)
    sns.scatterplot(data=df, y='Date', x=i, color='red')
    std = df[i].std()
    plt.axvline(x=std, color='g', linestyle='--', label='Std')
    plt.xlabel(i + 'std')
    plt.ylabel('Date')
    plt.legend()
    plt.grid()
    plt.show()

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

png

image.png

  • Điều này cho thấy việc tổ chức dữ liệu chi tiết phải được nghiên cứu và sửa lại thành mảng ma trận chữ nhật có cột thể hiện 7 số hãng và dòng phải có tối thiểu 29 - 31 dòng.
  • Vị trí các số hạng phải được bố trí ở các cột và khi thay đổi theo giải quay hàng kỳ sẽ chỉ thay đổi theo dòng và cột (các giá trị cũ chỉ thay đổi xuống theo từng dòng).

4. Các Hàm thủ tục Thống kê và Phân tích Dữ liệu --> Analytics/Statistic Data

4.6. Thư viện networkx và các hàm như nx.Graph(), add_node(), spring_layout(), và draw_networkx() được kết hợp để làm việc với đồ thị (graph) và vẽ đồ thị một cách trực quan. Chú thích: - Thư viện networkx cung cấp các công cụ và chức năng để làm việc với các loại đồ thị, bao gồm đồ thị vô hướng, đồ thị có hướng, đồ thị đa đỉnh và đa cung, và nhiều hơn nữa. Một trong những đối tượng quan trọng trong networkx là lớp Graph() để tạo và quản lý đồ thị. - Hàm add_node() được sử dụng để thêm đỉnh (node) vào đồ thị. Trong ví dụ của bạn, add_node(f"{i+1}.{j+1}", label=number) thêm một đỉnh vào đồ thị với tên là f"{i+1}.{j+1}" và thuộc tính label có giá trị là number. - Hàm spring_layout() được sử dụng để xác định vị trí của các đỉnh trong đồ thị bằng phương pháp spring layout. Nó sắp xếp các đỉnh sao cho các đỉnh có mối quan hệ gần nhau sẽ được đặt gần nhau hơn trên không gian. - Cuối cùng, hàm draw_networkx() được sử dụng để vẽ đồ thị trực quan dựa trên các thông tin về đỉnh và cung đã được thêm vào đồ thị. Nó tạo ra một biểu đồ với đỉnh và cung được hiển thị một cách rõ ràng và trực quan. Vì vậy, bằng cách kết hợp thư viện networkx và các hàm như nx.Graph(), add_node(), spring_layout(), và draw_networkx(), chúng ta có thể tạo và quản lý đồ thị, xác định vị trí của các đỉnh trong đồ thị, và vẽ đồ thị một cách trực quan để hiển thị mối quan hệ giữa các đỉnh.
# Lập bảng ma trận nhiều kỳ quay lote > Chart Cluster Stack P7B55 (17.2.2024)
import networkx as nx
import matplotlib.pyplot as plt

# Tạo đồ thị
G = nx.Graph()

# Thêm các nút vào đồ thị
sequences = [
    [60,61,62,63,64,65,66,67,68,69], #x???
    [8,12,17,27,38,55,47], #1
    [3,7,18,19,21,26], #2
    [22,31,34,49], #3
    [11,35,36,42], #4
    [24,39,46,51], #5
    [4,6,13],  #6
    [32,40],   #7
    [2,9,10,52],  #8
    [41],  #9
    [48],  #10
    [23],  #11
    [25,29,54], #12
    [20,33],  #13
    [14,43],  #14
    [1,5],  #15
    [28,44],  #16
    [16,45,50,53],  #17
    [15],  #18
    [37],  #19
    [],  #20
    [],  #21
    [30],  #22
    [],  #23
    [],  #24
    [],  #25
    [],  #26
    [],  #27
    [],  #28
    [],  #29 
]
#10 chọn liên tiếp tăng sau 10 kỳ gần nhất: 3(10), 26(10), 2(11), 7(14), 8(29), 13(13), 28(17), 30(11), 31(12), 33(14), 35(21), 40(21), 44(13)
for i, sequence in enumerate(sequences):
    for j, number in enumerate(sequence):
        G.add_node(f"{i+1}.{j+1}", label=number)

# Thêm các cạnh cho quan hệ hình cây số học
for i in range(len(sequences)-1):
    for j in range(len(sequences[i])):
        G.add_edge(f"{i+1}.{j+1}", f"{i+2}.{j//2+1}")

# Vẽ đồ thị
pos = nx.spring_layout(G)  # Vị trí các nút
labels = nx.get_node_attributes(G, 'label')  # Nhãn của các nút

plt.figure(figsize=(15, 6))
nx.draw_networkx(G, pos, labels=labels, node_size=100, font_size=9, font_color='red', node_color='none', edge_color='gray')
plt.axis('off')
plt.show()

png

4. Các Hàm thủ tục Thống kê và Phân tích Dữ liệu --> Analytics/Statistic Data

4.7. Một biểu đồ phân tán (scatter plot) với sự sử dụng của thư viện Matplotlib Mục đích chính của đoạn mã này là: - Tạo dữ liệu ngẫu nhiên: Đầu tiên, dữ liệu ngẫu nhiên được tạo ra với 3 chiều (x, y, scale). Biến x và y chứa các giá trị ngẫu nhiên từ danh sách đã cho, còn biến scale chứa các giá trị ngẫu nhiên từ danh sách đã cho nhưng được nhân với 3. - Tạo đồ thị: Một đối tượng hình ảnh (figure) và trục (axes) được tạo ra sử dụng hàm plt.subplots(). Kích thước của hình ảnh được thiết lập theo kích thước cửa sổ màn hình. Điều này đảm bảo rằng biểu đồ sẽ phù hợp với kích thước hiển thị trên màn hình. - Vẽ biểu đồ phân tán: Sử dụng hàm ax.scatter(), biểu đồ phân tán được vẽ với các điểm dữ liệu được xác định bởi các giá trị x, y và scale. Màu sắc của các điểm được xác định bởi scale và kích thước của các điểm được xác định bởi giá trị tuyệt đối của scale nhân với 3. - Thiết lập tiêu đề và nhãn trục: Tiêu đề của biểu đồ được đặt là "Some random data, created with JupyterLab!". Các nhãn trục x và y được thiết lập bằng cách sử dụng các giá trị duy nhất từ dữ liệu x và y. - Đặt tỉ lệ và lưới: Tỉ lệ của trục y được đặt là 'auto', tạo ra một biểu đồ có tỉ lệ tự động. Lưới được thêm vào biểu đồ bằng cách sử dụng hàm plt.grid(). -Hiển thị biểu đồ: Cuối cùng, biểu đồ được hiển thị bằng cách sử dụng hàm plt.show(). -Tóm lại, đoạn mã trên được sử dụng để tạo ra một biểu đồ phân tán với dữ liệu ngẫu nhiên, mô tả các giá trị của x, y và scale. Mục đích của nó là trực quan hóa dữ liệu và hiển thị biểu đồ phân tán trên màn hình.
from matplotlib import pyplot as plt
import numpy as np

# Generate 100 random data points along 3 dimensions, ranging from 1 to 45
x = np.random.choice([5,8,11,19,25,30,31,36,55], size=56)
y = np.random.choice([1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,21,22,24,26,29,30,31,32,33,34,36,37,38,39,41,42,43,44,45,47,48,50,51,52,53,54,55], size=56)
scale = np.random.choice([1,2,3,5,7,9,10,11,12,14,15,16,18,20,21,22,23,25,27,28,29,30,31,32,33,35,37,38,39,40,41,42,43,44,45,48,49,50,51,52,53], size=56)

# Tạo hình ảnh với kích thước cửa sổ màn hình
figure_width, figure_height = plt.rcParams['figure.figsize']
fig, ax = plt.subplots(figsize=(figure_width, figure_height))
#fig, ax = plt.subplots()

# Map each onto a scatterplot we'll create with Matplotlib
ax.scatter(x=x, y=y, c=scale, s=np.abs(scale)*3)
ax.set(title="Some random data, created with JupyterLab!")


# Thêm label tên các số trên trục y
yticks = np.unique(y)
xticks = np.unique(x)
ax.set_xticks(xticks)
ax.set_xticklabels(xticks)
ax.set_yticks(yticks)
ax.set_yticklabels(yticks)

# Đặt tỉ lệ cho trục y
ax.set_aspect('auto')
plt.grid()
plt.show()

png

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt
import numpy as np

# Generate 100 random data points along 3 dimensions, ranging from 1 to 45
x = np.random.choice([1,2,3,5,7,9,10,11,12,14,15,16,18,20,21,22,23,25,27,28,29,30,31,32,33,35,37,38,39,40,41,42,43,44,45,48,49,50,51,52,53], size=45)
y = np.random.choice([1,2,3,5,7,9,10,11,12,14,15,16,18,20,21,22,23,25,27,28,29,30,31,32,33,35,37,38,39,40,41,42,43,44,45,48,49,50,51,52,53], size=45)
scale = np.random.choice([1,2,3,5,7,9,10,11,12,14,15,16,18,20,21,22,23,25,27,28,29,30,31,32,33,35,37,38,39,40,41,42,43,44,45,48,49,50,51,52,53], size=45)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Map each onto a 3D scatterplot
ax.scatter(x, y, scale)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Scale')
ax.set_title('Some random data, created with JupyterLab!')

plt.show()

png

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt
import numpy as np

# Generate random data points along 6 dimensions
x = np.random.choice(range(1, 10), size=100)
y = np.random.choice(range(1, 10), size=100)
z = np.random.choice(range(1, 10), size=100)
a = np.random.choice(range(1, 10), size=100)
b = np.random.choice(range(1, 10), size=100)
c = np.random.choice(range(1, 10), size=100)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Map each onto a 3D scatterplot
ax.scatter(x, y, z, c=a, s=b*10, alpha=c/10)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('6D Data')

plt.show()

png

import numpy as np

# Assuming you have sequences as a list of lists
sequences = [
[33,35,14,1,2],
[9,20,12,5,27],
[52,18,40,38,16],
[28,21,7,42,43],
[11,45,44,32,23],
[37,15,53,50,51],
[31,29,30,10,22],
[25,39,49,41,48],
]

# Step 1: Calculate Correlation
correlation_matrix = np.corrcoef(sequences)

# Step 2: Calculate Density
density_values = [len(seq) / float(max(len(seq) for seq in sequences)) for seq in sequences]

# Step 3: Calculate Rating (using a custom complexity metric)
def calculate_rating(sequence):
    # Implement your complexity metric here and return the rating
    # This can involve calculations based on the values and patterns within the sequence
    rating = ...
    return rating

ratings = [calculate_rating(seq) for seq in sequences]

# Print the correlation, density, and rating for each sequence
for i, sequence in enumerate(sequences):
    print(f"Sequence {i+1}:")
    print(f"Correlation: {correlation_matrix[i]}")
    print(f"Density: {density_values[i]}")
    print(f"Rating: {ratings[i]}")
    print()
Sequence 1:
Correlation: [ 1.         -0.02936609  0.18658581 -0.51864066 -0.00318339 -0.82641389
  0.76148697 -0.66801501]
Density: 1.0
Rating: Ellipsis

Sequence 2:
Correlation: [-0.02936609  1.         -0.85191055  0.12806596  0.08825973 -0.19775868
  0.2628589   0.42467207]
Density: 1.0
Rating: Ellipsis

Sequence 3:
Correlation: [ 0.18658581 -0.85191055  1.         -0.24397437 -0.40341927  0.27814777
  0.11889916 -0.56886749]
Density: 1.0
Rating: Ellipsis

Sequence 4:
Correlation: [-0.51864066  0.12806596 -0.24397437  1.         -0.54861518  0.21385337
 -0.73000925 -0.08323958]
Density: 1.0
Rating: Ellipsis

Sequence 5:
Correlation: [-0.00318339  0.08825973 -0.40341927 -0.54861518  1.         -0.21661886
  0.01973973  0.61254202]
Density: 1.0
Rating: Ellipsis

Sequence 6:
Correlation: [-0.82641389 -0.19775868  0.27814777  0.21385337 -0.21661886  1.
 -0.41447526  0.45999213]
Density: 1.0
Rating: Ellipsis

Sequence 7:
Correlation: [ 0.76148697  0.2628589   0.11889916 -0.73000925  0.01973973 -0.41447526
  1.         -0.25620995]
Density: 1.0
Rating: Ellipsis

Sequence 8:
Correlation: [-0.66801501  0.42467207 -0.56886749 -0.08323958  0.61254202  0.45999213
 -0.25620995  1.        ]
Density: 1.0
Rating: Ellipsis

5. Các Hàm thủ tục nâng cao trong kiểm toán Thống kê và Phân tích Dữ liệu --> Analytics/Statistic Data:

- Rating đánh giá: - Xác định quan hệ giữa các số đã chọn theo chuỗi Thời gian - Mật độ Số đã chọn Desity - Xác định 7 số có khả năng
import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt

df = pd.read_csv(r"C:\Python311\workspaces\P6B55.csv")
latest_date = '2024-02-17'

def analyze_lottery_numbers(df, latest_date):
    pd.set_option("display.max_rows", df.shape[0]+1)
    pd.set_option("display.max_columns", 60)
    
    numbers = ['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8', 'S9',
               'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19',
               'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29',
               'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39',
               'S40', 'S41', 'S42', 'S43', 'S44', 'S45', 'S46', 'S47', 'S48', 'S49',
               'S50', 'S51', 'S52', 'S53', 'S54', 'S55']
    
    # Tạo một mảng màu tùy chỉnh với màu sắc tương phản rõ ràng
    custom_palette = ['#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF', '#00FFFF', '#FF8000', '#8000FF', '#00FF80',
                      '#808080', '#800000', '#008000', '#000080', '#808000', '#800080', '#008080', '#C0C0C0', '#FF8080',
                      '#80FF80', '#8080FF', '#FFFF80', '#FF80FF', '#80FFFF', '#FFBF00', '#BF00FF', '#00FFBF', '#A0A0A0',
                      '#BF0000', '#00BF00', '#0000BF', '#BFBF00', '#BF00BF', '#00BFBF', '#404040', '#400000', '#004000',
                      '#000040', '#404000', '#400040', '#004040', '#606060', '#400000', '#004000', '#000040', '#606000',
                      '#606040', '#004060', '#808080', '#004000', '#000040', '#400040', '#808000', '#808040', '#004080',
                      '#A0A0A0', '#008000', '#000080', '#800080', '#A0A000', '#A000A0', '#0080A0']
    
    plt.figure(figsize=(12, 10))
    for i, number in enumerate(numbers):
        sns.scatterplot(data=df, y='Date', x=number, color=custom_palette[i], label=number)
    plt.grid()
    
    # Tạo biểu đồ màu sắc như thanh màu sắc bên cạnh biểu đồ chính
    color_legend = [plt.Line2D([0], [0], marker='o', color='w', markerfacecolor=custom_palette[i], markersize=10) for i in range(len(numbers))]
    plt.legend(color_legend, numbers, title='Numbers', loc='lower center', bbox_to_anchor=(0.4, -0.3), ncol=9)
    plt.show()


analyze_lottery_numbers(df, latest_date)

png

#Tập hợp 95 <= [] <= 109 scores:
import random
def choose_random_numbers(sequence, k):
    sorted_sequence = sorted(sequence)  # Sắp xếp dãy số theo thứ tự tăng dần
    random_numbers = random.sample(sorted_sequence, k)  # Chọn ngẫu nhiên k số từ dãy số đã sắp xếp
    return random_numbers

sequence = [1,2,4,6,7,10,13,14,15,16,17,19,20,21,25,26,27,28,30,31,35,36,37,38,39,40,45,50,54,55]
k = 3
random_numbers = choose_random_numbers(sequence, k)
print(random_numbers)

#Tập hợp 110 - 121 scores:
import random
def choose_random_numbers(sequence, k):
    sorted_sequence = sorted(sequence)  # Sắp xếp dãy số theo thứ tự tăng dần
    random_numbers = random.sample(sorted_sequence, k)  # Chọn ngẫu nhiên k số từ dãy số đã sắp xếp
    return random_numbers

sequence = [3,5,8,9,11,12,18,22,24,29,33,34,41,42,43,44,46,47,48,49,51,52,53]
k = 3
random_numbers = choose_random_numbers(sequence, k)
print(random_numbers)

#Tập hợp 124 scores:
import random
def choose_random_numbers(sequence, k):
    sorted_sequence = sorted(sequence)  # Sắp xếp dãy số theo thứ tự tăng dần
    random_numbers = random.sample(sorted_sequence, k)  # Chọn ngẫu nhiên k số từ dãy số đã sắp xếp
    return random_numbers

sequence = [23,32]
k = 1
random_numbers = choose_random_numbers(sequence, k)
print(random_numbers)
[27, 39, 20]
[49, 24, 8]
[23]
Mão:54	26 / 47 16
#1: [27, 1, 19][12, 47, 42][32]
#5: [21, 45, 50][3, 11, 42][32]
#7: [14, 50, 27][12, 47, 42][23]
Dậu:
#1: [2, 40, 31][22, 46, 49][32]
#3: [36, 17, 54][49, 12, 46][32]
#5: [6, 10, 39][11, 8, 24][32]
  Cell In[29], line 1
    Mão:54	26 / 47 16
          	^
SyntaxError: invalid syntax
import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt

df = pd.read_csv(r"C:\Python311\workspaces\P6B55.csv")
latest_date = '2024-02-06'


# Xác định độ lệch chuẩn bằng hàm df.describe().T
stats = df.describe().T

print(stats)
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

# Đọc dữ liệu từ tệp CSV
df = pd.read_csv(r"C:\Python311\workspaces\Detail_P7B55.csv")
latest_date = '2024-02-13'

# Chuyển đổi trường Date thành kiểu dữ liệu ngày
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)

# Tạo biểu đồ đường cho mỗi mảng và mỗi ngày
for array in range(1, 8):
    array_name = 's' + str(array)
    plt.plot(df['Date'], df[array_name], label=f'Array {array_name}')

# Cấu hình biểu đồ
plt.xlabel('Ngày')
plt.ylabel('Giá trị')
plt.title('Sự thay đổi của các giá trị theo ngày')
plt.legend()
plt.xticks(rotation=90)

# Hiển thị biểu đồ
plt.show()
import pandas as pd
from sklearn.linear_model import LogisticRegression

# Đọc dữ liệu từ file CSV
df = pd.read_csv(r"C:\Python311\workspaces\p7b55_s1.csv")

# Chọn các cột cần sử dụng cho việc dự báo
features = ['S55']
target = ['id']

# Xây dựng mô hình hồi quy logistic
model = LogisticRegression()
model.fit(df[features], df[target])

# Dự báo khả năng S1 tăng lên 106 hoặc 107 cho các ngày tiếp theo
future_dates = ['65', '66','67','68']
X_future = pd.DataFrame({'S55': [108,109,110,111]})

predictions = model.predict(X_future)

# In kết quả dự báo
for date, prediction in zip(future_dates, predictions):
    print(f'Ngày {date}: Khả năng S55 tăng lên {prediction}')

6. Hàm nâng cao Quadratic Comparison Method - QCM với ma trận giá trị chữ nhật

import pandas as pd
import matplotlib.pyplot as plt

def qcm_rectangle(matrix):
    ratings = []
    colors = []
    
    for i in range(2, matrix.shape[1]):
        rating = 0
        for j in range(2, matrix.shape[1]):
            if i == j:
                continue
            
            if matrix.iloc[:, i].sum() > matrix.iloc[:, j].sum():
                rating += 1
            elif matrix.iloc[:, i].sum() < matrix.iloc[:, j].sum():
                rating -= 1
        
        ratings.append(rating)
        
        if rating > 0:
            colors.append('green')
        elif rating < 0:
            colors.append('red')
        else:
            colors.append('gray')
    
    return ratings, colors

# Đọc dữ liệu từ file CSV vào DataFrame
df = pd.read_csv(r"C:\Python311\workspaces\p7b55_s1.csv")

# Gọi hàm QCM và lưu kết quả vào biến ratings và colors
ratings, colors = qcm_rectangle(df)

# Vẽ biểu đồ
plt.figure(figsize=(10, 6))
plt.bar(range(1, 56), ratings, color=colors)
plt.xlabel('Số')
plt.ylabel('Rating')
plt.title('Biểu đồ rating của các số từ S1 đến S55')
plt.show()

png

Chú thích:

  • Cột màu xanh lớn hơn 0: Điều này biểu thị rằng các số hạng có mức độ biến đổi cao hơn so với các số hạng khác. Nó có thể được coi là một rating biến động khó lường, vì những số hạng này có xu hướng thay đổi nhiều trong thời gian. Khi một số hạng có rating dương lớn, điều này có thể đồng nghĩa với việc rủi ro cũng lớn do tính biến động cao của chúng.
  • Cột biểu đồ âm, nhỏ hơn 0: Điều này chỉ ra rằng các số hạng có mức độ biến đổi thấp hơn so với các số hạng khác. Rating biến động ít, cho thấy sự ổn định và ít biến thiên trong các số hạng này. Khi một số hạng có rating âm, có thể hiểu là rủi ro cũng ít hơn do tính biến động thấp.
  • Cột biểu đồ = 0:Cột biểu đồ = 0: Đây là trường hợp khi các số hạng có mức độ biến đổi trung bình và có sự kiểm soát được. Đây là trường hợp khi các số hạng có mức độ biến đổi trung bình và có sự kiểm soát được. Rating bằng 0 cho thấy tính ổn định với sự cân bằng giữa các số hạng. Tóm lại: biểu đồ QCM ma trận chữ nhật giúp chúng ta đánh giá mức độ biến động của các số hạng trong ma trận. - Các cột màu xanh lớn hơn 0 biểu thị cho biến động cao và rủi ro lớn, trong khi các cột màu đỏ nhỏ hơn 0 biểu thị cho biến động thấp và rủi ro ít. - Cột có rating bằng 0 thể hiện sự ổn định và kiểm soát được của số hạng.
  • Business Analyst (BA) là một nghề tồn tại từ lâu trên toàn cầu, nhưng ở Việt Nam thì vẫn còn khá mới (xuất hiện khoảng hơn 27 năm).
  • Tôi thực sự đánh giá cao nghề này và trong quá trình làm việc, tôi đã gặp phải nhiều thách thức, từ đó tôi đã hiểu rõ những điểm mạnh và điểm yếu của bản thân. Tôi nhận thấy rằng trong lĩnh vực này có nhiều vấn đề phức tạp và khó khăn, nhưng khi chúng được giải quyết, thì cảm giác thật tuyệt vời.
  • BA xuất hiện với mục tiêu giải quyết vấn đề. Đó có thể là biến một điều không tốt thành điều tốt hơn, hoặc cải thiện những điều đã tốt để trở nên tốt hơn. Việc mang lại ý nghĩa cho người khác thực sự là một điều mà tôi khó lòng tranh cãi hay bỏ qua.
Clone this wiki locally