IIUC, bạn có thể sử dụng Show
Một chút của một ví dụ vô nghĩa, nhưng:
Một cách tiếp cận thay thế không sử dụng chức năng dành riêng cho gấu trúc sẽ là sử dụng các bộ:
4 hữu ích 0 bình luận chia sẻ IIUC, bạn có thể sử dụng Một chút của một ví dụ vô nghĩa, nhưng:
Một cách tiếp cận thay thế không sử dụng chức năng dành riêng cho gấu trúc sẽ là sử dụng các bộ:
4 hữu ích 0 bình luận chia sẻ IIUC, bạn có thể sử dụng Một chút của một ví dụ vô nghĩa, nhưng:
Một cách tiếp cận thay thế không sử dụng chức năng dành riêng cho gấu trúc sẽ là sử dụng các bộ:
4 hữu ích 0 bình luận chia sẻ Đây là cách thường ít được áp dụng vì khi làm việc chúng ta thường đọc dữ liệu từ những file dữ liệu có sẵn được lưu dưới dạng Đưới đây mình sẽ giới thiệu hai cách khởi tạo dataframe chính trực tiếp từ câu lệnh 2.1.1. Khởi tạo thông qua dictionary¶Về định dạng dictionary chúng ta đã được học ở chương phụ lục - dictionary. Nội dung của dictionary sẽ gồm key là tên cột và value là list giá trị của cột tương ứng. import pandas as pd from IPython.display import display pd.set_option('max_colwidth', 40) pd.set_option('precision', 5) pd.set_option('max_rows', 10) pd.set_option('max_columns', 30) dict_columns = { 'contents':['Author', 'Book', 'Target', 'No_Donation'], 'infos':['Pham Dinh Khanh', 'ML algorithms to Practice', 'Vi mot cong dong AI vung manh hon', 'Community'], 'numbers':[1993, 2021, 1, 2] } df = pd.DataFrame(dict_columns) display(df)
Hàm display của
Tiếp theo chúng ta sẽ khởi tạo thông qua list các dòng. 2.1.2. Khởi tạo thông qua list các dòng¶Theo cách này chúng ta sẽ truyền vào data là một list gồm các tupple mà mỗi tupple là một dòng dữ liệu. đối số import pandas as pd records = [('Author', 'Pham Dinh Khanh', 1993), ('Book', 'ML algorithms to Practice', 2021), ('Target', 'Vi mot cong dong AI vung manh hon', 1), ('No_Donation', 'Community', 2)] # Khởi tạo DataFrame df = pd.DataFrame(data = records, columns = ['contents', 'infos', 'numbers']) df
Để lưu trữ một dataframe dưới dạng một file 2.1.3. Đọc dữ liệu từ file¶Chúng
ta cũng có thể khởi tạo bảng bằng cách đọc file
import pandas as pd df = pd.read_csv("https://raw.githubusercontent.com/phamdinhkhanh/datasets/master/BostonHousing.csv", sep=",", header = 0, index_col = None) df.head()
Trong hàm
Hàm Hàm <class 'pandas.core.frame.DataFrame'> RangeIndex: 506 entries, 0 to 505 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 crim 506 non-null float64 1 zn 506 non-null float64 2 indus 506 non-null float64 3 chas 506 non-null int64 4 nox 506 non-null float64 5 rm 506 non-null float64 6 age 506 non-null float64 7 dis 506 non-null float64 8 rad 506 non-null int64 9 tax 506 non-null int64 10 ptratio 506 non-null float64 11 b 506 non-null float64 12 lstat 506 non-null float64 13 medv 506 non-null float64 dtypes: float64(11), int64(3) memory usage: 55.5 KB Hoặc chúng ta có thể dùng hàm # Check for datatype df.dtypes crim float64 zn float64 indus float64 chas int64 nox float64 ... tax int64 ptratio float64 b float64 lstat float64 medv float64 Length: 14, dtype: object Nếu muốn kiểm tra chi tiết hơn những thống kê mô tả của dataframe như trung bình, phương sai, min, max, median của một trường dữ liệu chúng ta dùng hàm # Thống kê mô tả dữ liệu df.describe()
2.1.4. Export to CSV, EXCEL, TXT, JSON¶Đây là câu lệnh được sử dụng khá phổ biến để lưu trữ các file dữ liệu từ dataframe sang những định dạng khác nhau. Những định dạng này sẽ cho phép chúng ta load lại dữ liệu bằng các hàm %%script echo skipping # Lưu dữ liệu sang file csv df.to_csv('BostonHousing.csv', index = False) # Lưu file excel df.to_excel('BostonHousing.xls', index = False) # Lưu dữ file json df.to_json('BostonHousing.json') #do not include index = False, index only use for table orient 2.2. Thao tác với dataframe¶2.2.1. Truy cập dataframe¶Chúng ta có thể truy cập dataframe theo hai cách. Truy cập theo slice index: Theo cách này chúng ta chỉ cần truyền vào index của dòng và cột và sử dụng hàm Note: # Lựa chọn 5 dòng đầu và 5 cột đầu của df df.iloc[:5, :5]
# Lựa chọn 5 dòng từ 5:10 và 2 cột từ 2:4 df.iloc[5:10, 2:4]
# Lựa chọn 5 dòng cuối và các cột 1 và 3 df.iloc[-5:, [1, 3]]
Ngoài ra ta cũng có thể truy cập các dòng theo row index của dataframe thông qua câu lệnh # Truy cập các dòng có index là 10:15 df.loc[10:15]
Truy cập theo column names: Đây là cách được sử dụng phổ biến vì nó tường minh hơn. Theo cách này chúng ta sẽ truy cập các trường của dataframe bằng cách khai báo list column_names của chúng. Ví dụ bên dưới chúng ta cần lấy ra các trường df[['crim', 'tax', 'rad']].head()
Kết hợp cả hai cách: Chúng ta có thể truy cập dataframe bằng cách kết hợp cả hai cách theo hướng sử dụng column names đối với cột và slice index đối với dòng: # Lấy ra các dòng từ 10:15 của các trường 'crim', 'tax', 'rad' df[['crim', 'tax', 'rad']].iloc[10:15]
2.2.2. Lọc dataframe¶Chúng ta có thể lọc dataframe thông qua các điều kiện đối với các trường. Điều kiện của trường được thể hiện như một biểu thức logic và bao trong dấu
Nếu chúng ta muốn kết hợp nhiều điều kiện thì dùng biểu thức logic df[(df['rm']>4) & (df['tax']>250)].head()
Muốn lọc các cột theo định dạng dữ liệu thì như thế nào? Ta dùng hàm df.select_dtypes('float').head()
Lọc các cột theo pattern của tên cột Khi làm việc với dữ liệu lớn sẽ có những tình huống mà bạn bắt gặp các cột thuộc về cùng một nhóm và chúng có chung một pattern. Chẳng hạn như về age sẽ có df2 = pd.DataFrame({ 'name':['a', 'b', 'c', 'd', 'e'], 'age_1':[1, 2, 3, 4, 5], 'age_2':[3, 5, 7, 9 , 10], 'age_3':[2, 5, 2, 5, 6] }) df2.head()
Lựa chọn các cột bắt đầu là df2.filter(regex='^age', axis=1)
Trong pandas thì 2.2.3. Sort dữ liệu¶Trong nhiều trường hợp bạn sẽ cần sort dữ liệu theo chiều từ thấp lên cao hoặc từ cao xuống thấp để biết đâu là những quan sát nhỏ nhất và lớn nhất cũng như việc tạo ra một đồ thị có trend rõ ràng và thể hiện quan hệ tuyến tính giữa các biến theo trend. Để sort dữ liệu chúng ta sử dụng hàm Giả sử bên dưới chúng ta cùng sort giá trị của căn nhà theo chiều giảm dần. #Sort data df.sort_values('medv', ascending = False).head()
chúng ta cũng có thể sort theo một nhóm các trường. Ví dụ để sort đồng thời giá trị của căn nhà và giá trị thuế suất thì ta truyền vào list các trường cần sort là df.sort_values(['medv', 'tax'], ascending = False).head()
2.2.4. Các hàm đối với một trường¶2.2.4.1. Min, max, mean, meadian, sum¶Trên một trường dữ liệu của dataframe đã tích hợp sẵn các hàm tính toán như # min, max, mean, median, sum print(df['tax'].min(), df['tax'].max(), df['tax'].mean(), df['tax'].median(), df['tax'].sum()) 187 711 408.2371541501976 330.0 206568 2.2.4.2. Hàm cut¶Hàm cut giúp ta phân chia giá trị của một trường liên tục vào những khoảng theo ngưỡng cắt. Kết quả trả ra là nhãn của từng khoảng mà chúng ta khai báo. bins = [-999999, 250, 400, 999999] labels = ['low', 'normal', 'high'] # low: -999999 <- 250 # normal: 250 <- 400 # high: 400 <- 999999 df['tax_labels'] = pd.cut(df['tax'], bins=bins, labels=labels) df[df['tax_labels']=='high'].head()
2.2.4.3. Hàm qcut¶Trong trường hợp chúng ta không muốn chia các bin dựa vào ngưỡng mà chỉ muốn khai báo số lượng bins và để cho hàm số tự quyết định ngưỡng để chia đều các quan sát vào các bins thì sử dụng hàm import numpy as np labels = ['low', 'normal', 'high'] tax_labels = pd.qcut(df['tax'], q=3, labels=labels) np.unique(tax_labels, return_counts = True) (array(['high', 'low', 'normal'], dtype=object), array([168, 172, 166])) Trường hợp muốn xác định tỷ lệ phần trăm luỹ kế của các ngưỡng phân chia ta có thể khai báo q là list gồm các ngưỡng luỹ kế. Ví dụ bên dưới ta muốn chia làm ba khoảng giá trị, mỗi khoảng chiếm 33% thì ta khai báo ngưỡng luỹ kế 2.2.4.4. Apply¶Apply sẽ giúp ta biến đổi giá trị của một trường theo một hàm số xác định trước. Hàm số biến đổi được áp dụng trong apply sẽ là một hàm Phân tích kỹ hơn thì chúng ta thấy nó không có return. Điều này là phù hợp với ý nghĩa của hàm lambda vì nó không yêu cầu gía trị trả về ngay. Thực tế nó giống như một lời hứa sẽ thực hiện hàm đó tại thời điểm áp dụng một cách ngầm định bên trong một hàm khác (ở đây là hàm apply). Ví dụ bên dưới ta muốn nhân đôi giá trị của tax thì có thể sử dụng hàm apply với lambda như sau: df['tax'].apply(lambda x: 2*x).head() 0 592 1 484 2 484 3 444 4 444 Name: tax, dtype: int64 Ta cũng có thể áp dụng cho nhiều trường một lúc. Khi đó cần khai báo df[['tax', 'medv']].apply(lambda x: 2*x, axis=1).head()
2.2.4.5. Map¶Map là hàm giúp biến đổi giá trị của một biến sang giá trị mới dựa trên dictionary mà chúng ta áp dụng. Giá trị cũ sẽ là key và giá trị mới sẽ là value. Bên dưới ta sẽ map các giá trị của trường dict_tax = { 'low':'thap', 'normal':'tb', 'high':'cao' } df['tax_labels'].map(dict_tax).head() 0 tb 1 thap 2 thap 3 thap 4 thap Name: tax_labels, dtype: category Categories (3, object): ['thap' < 'tb' < 'cao'] 2.2.5. Biểu đồ matplotlib trên pandas¶Chúng ta có thể nói rằng pandas rất mạnh vì nó đã wrap dường như toàn bộ các đồ thị cơ bản của matplotlib vào bên trong các hàm thành phần của pandas column. Do đó việc visualize trở nên vô cùng ngắn gọn, thậm chí là chỉ trên một dòng. Bên dưới chúng ta sẽ cùng lướt qua nhanh các đồ thị cơ bản khi visualize trên 1. biểu đồ line 2. Biểu đồ line kết hợp với point df['tax'].plot(marker='o') 3. Biểu đồ barchart Biều đồ này được dùng phù hợp khi chúng ta muốn so sánh chênh lệch giữa các nhóm về mặt giá trị tuyệt đối. df_summary = df[['tax_labels', 'tax']].groupby('tax_labels').sum() df_summary.plot.bar() <AxesSubplot:xlabel='tax_labels'> Ở đây
ta sẽ phải dùng thêm hàm groupby để tạo thành bảng thống kê tổng thuế theo df[['tax_labels', 'tax']].groupby('tax_labels').sum().plot.bar() <AxesSubplot:xlabel='tax_labels'> 4. Biểu đồ pie Đây là biểu đồ dùng để thể hiện giá trị phần trăm. Phù hợp khi so sánh giá trị tương đối giữa các nhóm. df_summary['tax'].plot.pie(autopct = '%1.1f%%') <AxesSubplot:ylabel='tax'> 5. Biểu đồ boxplot Biểu đồ boxplot sẽ được sử dụng để quan sát phân phối của biến đối với các giá trị min, max và các ngưỡng phân vị 25%, 50%, 75%. Căn cứ vào boxplot ta có thể biết được khoảng biến thiên của biến rộng hay hẹp, biến phân phối lệch trái hay phải. df[['tax', 'age', 'b']].boxplot() 6. Biểu đồ area Biểu đồ area cho ta biết diện tích nằm dưới đường biểu diễn và trên trục hoành. df_summary['tax'].plot.area() <AxesSubplot:xlabel='tax_labels'> 2.3. Reshape dataframe trên pandas¶2.3.1. Melt¶Hàm melt là hàm được lấy ý tưởng từ ngôn ngữ R. Hàm này sẽ làm cho bảng của chúng ta trở nên bớt cồng kềnh hơn bằng cách rút gọn nhiều measurements thành hai cột variable và value trong đó cột variable qui định loại measurement và value là giá trị của measurement. Bảng của bạn sẽ có ít cột hơn đáng kể nên trông giống như các cột measurement đang bị tan chảy vậy. Do đó nó có tên gọi là melt. Bạn sẽ dễ hình dung hơn những gì mình nói thông qua ví dụ bên dưới. Giả sử bảng của mình gồm Ho, Ten là các dimensions và
df5 = pd.DataFrame({ 'Ho':['Pham','Nguyen'], 'Ten' :['Cong', 'Dong'], 'ChieuCao':[170, 175], 'CanNang':[60, 65], 'Tuoi': [25, 27], 'Diem': [8.5, 9.0], }) df5
Ta nhận thấy
Ta nhận thấy bảng đã trở nên gọn gàng hơn khi các cột được đưa vào trường Cách biến đổi 2.3.2. Biến đổi Dummy¶Cách biến đổi dummy là một cách rất hiệu quả để biến đổi một biến category thành một one-hot véc tơ. Cụ thể cũng với bảng
Ta thấy hàm này sẽ tìm toàn bộ các biến là category (có định dạng trường là Mặc dù có cú pháp cực kì đơn giản nhưng hàm 2.4. Thống kê theo nhóm trên pandas¶Khi làm việc với dữ liệu bảng chúng ta thường xuyên phải thống kê dữ liệu theo các nhóm để bắt dữ liệu tạo ra những thông tin insight hữu ích cho phân tích và ra quyết định. Ngoài ra những feature tốt, có sức mạnh phân loại và dự báo cao có thể được tạo thành từ việc thống kê dữ liệu theo nhóm. Quá trình thống kê và phân tích dữ liệu mặc dù tốn kém về mặt thời gian nhưng lại rất quan trọng đối với mô hình. Vì vậy chúng ta cần thực hiện chúng kỹ lưỡng và cần kết hợp giữa kỹ năng thống kê và kinh nghiệm thực tiễn. Ở mục 5 này chúng ta sẽ làm quen với hai câu lệnh kinh điển trong pandas được sử dụng nhiều trong thống kê theo nhóm trên pandas đó là 2.4.1. df.groupby()¶groupby là câu lệnh cho phép bạn áp dụng những hàm số trên measurements dựa trên việc phân nhóm dữ liệu theo các dimensions. Nếu bạn chưa hiểu về khái niệm measurement và dimension thì mình có thể giải thích đơn giản là: measurement là những biến có thể cộng trừ nhân chia và đo đếm được còn dimension là những biến dùng để phân nhóm dữ liệu. Ví dụ chiều cao là một measurement có thể đo theo dimension là giới tính gồm các nhóm nam/nữ. Cú pháp của hàm df.groupby(by=None, ... ) Chúng ta cần xác định các chiều dimension trong df.groupby('tax_labels')['tax'].sum() tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int64 Theo cách trên thì ta chỉ áp dụng được với những hàm tính toán như df.groupby('tax_labels')['tax'].apply(lambda x: sum(x)) tax_labels low 15221 normal 73540 high 117807 Name: tax, dtype: int64 Nếu muốn áp dụng tính toán cho nhiều measurements một lúc thì truyền vào một list các measurements. Chẳng hạn bên dưới ta truyền vào một list gồm import numpy as np df.groupby('tax_labels')[['tax', 'rm']].apply(lambda x: np.mean(x))
Chúng ta cũng có thể tự định nghĩa các hàm được tuỳ biến theo ý muốn: # Tính quantile 90% của mỗi nhóm tax_labels. def quantile(x): q_90 = np.quantile(x, 0.9) return q_90 df.groupby('tax_labels')['tax'].apply(lambda x: quantile(x)) tax_labels low 244.2 normal 384.0 high 666.0 Name: tax, dtype: float64 Hoặc group theo nhiều chiều dữ liệu. Khi đó phải truyền vào df.groupby(['tax_labels', 'chas'])['tax'].apply(lambda x: quantile(x)) tax_labels chas low 0 244.6 1 223.0 normal 0 384.0 1 307.0 high 0 666.0 1 666.0 Name: tax, dtype: float64 Ưu điểm của 2.4.2. Pivotable¶Pivot table là một công thức có ứng dụng rất quan trọng trong pandas. Nó giúp cho chúng ta thực hiện các thống kê trên các biến measurement theo các chiều dimension. Bạn sẽ hình dung ra cách áp dụng của
import numpy as np pd.pivot_table(df, columns = ['tax_labels', 'chas'], index = ['rad'], values = 'tax', aggfunc = np.sum)
Bạn hình dung ra nội dung của bảng thống kê trên chứ? Bảng thống kê trên sẽ tính tổng số thuế thu được phân theo các cột là Các dòng lại được phân nhóm theo chỉ số mức độ tiếp cận đường cao tốc Như vậy ta có thể hình dung được trong công thức của pivot_table, các đối số của nó có ý nghĩa như sau:
Làm sao để qui định mỗi measurement một công thức? Giả sử chúng ta cần
tính thêm trung bình số phòng trên căn hộ. Tức là thêm trung bình của trường pd.pivot_table(df, columns = ['tax_labels', 'chas'], index = ['rad'], values = ['tax', 'rm'], aggfunc = { 'tax': np.sum, 'rm': np.mean })
Bảng của chúng ta đã tăng gấp đôi số cột. Dòng đầu tiên của bảng là Bạn thấy đó, 2.5. Join, Merge và Concatenate bảng¶Những doanh nghiệp lớn thường tổ chức cơ sở dữ liệu dưới dạng những bảng dữ liệu có quan hệ. Những bảng này được liên kết với nhau bởi key dưới những quan hệ dữ liệu như one-to-one, many-to-one hoặc one-to-many. Những kiến trúc phổ biến trong data warehouse như Ngoài ngôn ngữ SQL là công cụ chính để làm việc với những hệ cơ sở dữ liệu có quan hệ, Data scientist cũng cần nắm vững những kỹ năng liên kết join, merge và concatenate bảng trên pandas mà thông qua chương này mình sẽ giới thiệu tới các bạn. 2.5.1. Các kiểu join¶Chúng ta có 4 kiểu join chính là Chúng ta có hai bảng bên trái và bên phải với những phần thông tin chung (giao nhau giữa hai vòng tròn) và riêng. Phần diện tích màu xanh lá cây là Kết quả của phép join. Chúng ta có thể hình dung kết quả của phép join đó là:
Bên dưới chúng ta cùng thực hành join. import pandas as pd df_sinhvien = pd.DataFrame({ 'ID':['001', '002', '003', '004', '005'], 'Name':['Pham Van Nghia', 'Tong Thuy Linh', 'Le Van Dai', 'Tran Quang Nghia', 'Doan Thu Ha'], 'Age': [25, 26, 25, 23, 22], 'Province':['Nam Dinh', 'Thanh Hoa', 'TP Ho Chi Minh', 'Da Nang', 'Can Tho'] }) df_sinhvien
df_score = pd.DataFrame({ 'ID': ['001', '002', '003', '006', '007'], 'Math': [6.75, 9, 8, 7, 10], 'Physic': [8, 9, 9, 8.5, 9], 'Chemistry': [7, 9.5, 7.5, 9, 10], 'Province': ['Nam Dinh', 'Thanh Hoa', 'TP Ho Chi Minh', 'Quang Nam', 'Nghe An'] }) df_score
2.5.2. Câu lệnh pd.merge()¶Cú pháp chung của câu lện pd.merge( left, right, how="inner", on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=("_x", "_y"), copy=True, indicator=False, validate=None, ) Trong đó một số trường quan trọng:
Tiếp theo áp dụng câu lệnh trên để merge bảng sinh viên với điểm theo key là ID sinh viên. inner join: Theo cách này chỉ ID xuất hiện ở đồng thời hai bảng mới được lựa chọn. pd.merge(df_sinhvien, df_score, left_on='ID', right_on='ID', how='inner', suffixes=['_Sv', '_Score'])
left join: Những ID xuất hiện ở bảng bên trái sẽ được lựa chọn. pd.merge(df_sinhvien, df_score, left_on='ID', right_on='ID', how='left', suffixes=['_Sv', '_Score'])
right join: Những ID xuất hiện ở bảng bên phải sẽ được lựa chọn. pd.merge(df_sinhvien, df_score, left_on='ID', right_on='ID', how='right', suffixes=['_Sv', '_Score'])
outer join: Tất cả ID xuất hiện ở bảng bên trái hoặc bảng bên phải sẽ được lựa chọn. pd.merge(df_sinhvien, df_score, left_on='ID', right_on='ID', how='outer', suffixes=['_Sv', '_Score'])
2.5.3. df.join()¶DataFrame có một hàm là hàm join() có chức năng tương đương với merge, dùng để liên kết bảng theo các keys. df_sinhvien.join(df_score, lsuffix='_Sv', rsuffix='_Score')
Mặc định bảng sẽ join theo index của dòng, các đối số lsuffix Nếu muốn thực hiện hàm # Thiết lập index df_sinhvien.set_index('ID', inplace = True) df_score.set_index('ID', inplace = True) # Join bảng df_sinhvien.join(df_score, lsuffix='_Sv', rsuffix='_Score')
# reset lại index df_sinhvien.reset_index('ID', inplace = True) df_score.reset_index('ID', inplace = True) 2.5.4. Câu lệnh pd.concat()¶Câu lệnh Cú pháp chung của lệnh pd.concat( objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True ) Trong đó:
Nếu muốn nối theo dòng thì làm thế nào? Để nối hai bảng theo dòng thì ta sẽ để Nếu chúng ta muốn nối hai bảng theo dòng và chỉ lấy trường thông tin mà cả hai bảng đều có thì cần thiết lập pd.concat([df_sinhvien, df_score], axis=0, join='inner')
Ta cũng có thể nối hai bảng theo dòng và lấy tất cả các trường thông tin ở cả hai bảng thì sẽ thiết lập pd.concat([df_sinhvien, df_score], axis=0, join='outer')
Làm sao để nối theo cột Để nối theo cột thì khai báo pd.concat([df_sinhvien, df_score], axis=1)
Khi đó các dòng sẽ được liên kết theo row index ở mỗi bảng. Nếu chúng ta muốn các dòng được liên kết theo một trường nào đó như ‘ID’ thì cần pd.concat([df_sinhvien.set_index('ID'), df_score.set_index('ID')], axis=1)
Nếu ta chỉ muốn các dòng mà ID xuất hiện ở cả hai bảng thì thêm pd.concat([df_sinhvien, df_score], axis=1, join='inner')
2.5.5. append()¶Ngoài câu lệnh df_sinhvien.append(df_score)
Câu lệnh này sẽ thường được sử dụng trong tình huống bạn muốn tạo bảng tổng hợp từ nhiều bảng con có cùng cấu trúc. Ví dụ: Bạn muốn tạo ra một bảng về lợi tức chứng khoán của toàn bộ các ngành từ số liệu chứng khoán của từng ngành. import numpy as np import random import string df_chungkhoan = pd.DataFrame(columns = ['Nganh', 'Interest']) for i in range(5): r = np.random.uniform(-0.01, 0.01) nganh = random.choice(string.ascii_lowercase) df_sector = pd.DataFrame({'Nganh': [nganh], 'Interest': [r]}, index=[i]) df_chungkhoan = df_chungkhoan.append(df_sector) df_chungkhoan
2.6. Kết nối SQL¶Đối với những data scientist làm việc trong những doanh nghiệp quản lý dữ liệu trên data warehouse như Ngân Hàng, công ty Chứng Khoán, Bảo Hiểm thì thường xuyên phải kết nối SQL để truy vấn dữ liệu. Python có rất nhiều các packages cung cấp instance connection tới SQL cũng như biến đổi data trên cú pháp của SQL. Mình sẽ không thể giới thiệu hết toàn bộ những packages này mà sẽ giới thiệu tới các bạn hai packages phổ biến nhất đó là: sqlalchemy Đây là một pakage cho phép chúng ta kết nối và truy vấn trên những dữ liệu SQL một cách trực tiếp theo mô hình server-client side. Chúng ta sẽ phải khai báo một số thông tin quan trọng để khởi tạo kết nối như:
Chú ý: Ở phần ví dụ thực hành liên quan tới SQL thì mỗi máy sẽ có một cấu hình khác nhau. Để thực hành được code bên dưới trước tiên máy tính của bạn cần cài SQL Server và có sẵn những database trong server. Bạn sẽ cần khai báo đúng các trường cấu hình truy cập trong Nếu bạn thực hành bị lỗi các ví dụ tại mục 3 này, hãy tạm thời bỏ qua chúng. %%script echo skipping from sqlalchemy import create_engine, MetaData, Table, select, engine # Create parameters TableName = 'WorkOrder' DB = { 'drivername': 'mssql+pyodbc', 'servername': 'LAPTOPTCC-PC', #'port': '1443', #'username': '', #'password': '', 'database': 'TestDB', 'driver': 'SQL Server Native Client 11.0', 'trusted_connection': 'yes', 'legacy_schema_aliasing': False } # Create the connection engine = create_engine(DB['drivername'] + '://' + DB['servername'] + '/' + DB['database'] + '?' + 'driver=' + DB['driver'] + ';' + 'trusted_connection=' + DB['trusted_connection'], legacy_schema_aliasing=DB['legacy_schema_aliasing']) conn = engine.connect() # Required for querying tables metadata = MetaData(conn) #Table to query tbl = Table(TableName, metadata, autoload = True, schema = 'dbo') # tbl.create(checkfirst = True) #select all sql = tbl.select() #run sql code result = conn.execute(sql) df3 = pd.DataFrame(data = list(result), columns = result.keys()) df3.head() Sau khi sử dụng connection thì chúng ta nhớ đóng lại connection để giải phóng memory và port. %%script echo skipping #close connection to free memory conn.close() Chúng ta cũng có thể thực thi các lệnh của SQL thông qua engine SQL mà chúng ta đã khởi tạo. Kết quả sẽ được truy vấn và tính toán trực tiếp từ server trả về như câu lệnh ta yêu cầu. %%script echo skipping #another way, use read_sql_query() function from pandas. This function use directly engine without initialize connection pd.read_sql_query("SELECT TOP 5 * FROM WorkOrder", engine) pyodbc Đây là package được thiết kế riêng để truy vấn trên những hệ cơ sở dữ liệu sử dụng kết nối ODBC của Microsoft. %%script echo skipping import pandas.io.sql import pyodbc server = 'LAPTOPTCC-PC' db = 'AdventureWorks' #create connection conn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + DB['servername'] + ';DATABASE=' + DB['database'] + ';Trusted_Connection=yes') Sau khi khởi tạo kết nối thì ta cũng có thể sử dụng các câu lệnh của SQL như thông thường để truy vấn và tính toán thông tin như bên dưới: %%script echo skipping #query db sql = """SELECT * FROM WorkOrder""" df4 = pandas.io.sql.read_sql(sql, conn) df4.head() Cursor cho SQL Cursor là một con trỏ dẫn tới một vùng nhớ mà lưu trữ dữ liệu. Sử dụng cursor sẽ giúp ta tiết kiệm bộ nhớ vì chúng ta không phải phân bổ bộ nhớ cho dữ liệu ngay mà chỉ sử
dụng địa chỉ để trỏ tới dữ liệu. Cursor được sử dụng phổ biến trong SQL đặc biệt là trong các vòng for. Trong %%script echo skipping import pyodbc con = pyodbc.connect("DRIVER={SQL Server};" "SERVER=LAPTOPTCC-PC;" "DATASET=AdventureWorksDW2012;" "Trusted_Connection=yes;") cursor = con.cursor() cursor.execute("SELECT TOP 10 * FROM AdventureWorksDW2012.dbo.DimCustomer") for row in cursor.fetchall(): print('row = ', row) 2.7. Tổng kết¶Qua bài hướng dẫn này bạn đã được làm quen với những chức năng của pandas trong phân tích, xử lý và biến đổi dữ liệu. Tổng kết lại chúng ta đã đi qua các mục:
Những kiến thức trên không cover hết toàn bộ về pandas nhưng là những kiến thức hay dùng nên bạn đọc cần nắm vững. Tiếp theo là bài tập thực hành cho bài viết này. 2.8. Bài tập¶Sử dụng bộ dữ liệu Churn Customer bạn hãy.
|