一、说明
FEllow 数据爱好者!如果你真的想把你的数据科学游戏提升到一个新的水平,让我们来谈谈一些改变游戏规则的东西:Python类。它们有可能增强您的工作流程,为您节省所有这些细节数据任务的时间和精力。
那么,上课是怎么回事呢?好吧,将它们视为以超级直观和可重用的方式组织和构建代码的秘密武器。比方说,你对自定义 DataFrame 类有了一个惊人的想法,它不仅震撼了 Pandas 的所有功能,而且还加入了一些很酷的异常值检测魔法。使用类,您可以轻松地创建一次这个强大的工具,然后毫无困难地将其反复应用于各种数据集。
相信我,一旦你开始利用课程的魔力,你可以取得的成就将是无限的!
本文将探讨类和对象的基本概念,以及 Python 中的继承概念。我将讨论继承如何允许类从其他类继承属性和行为。此外,我们将提供示例来说明这些概念的实际应用,帮助您了解如何在 Python 代码中有效地使用它们。
二、实用类和对象
2.1 类定义
在 Python 中,类封装了数据(属性)和行为(方法/函数)。因此,类本质上是数据和函数的组合,称为类成员。
为了访问这些类成员,无论是数据还是函数,我们都使用对象。对象是类的实例,用作对该类的引用。创建对象时,可以使用该对象访问在类中定义的数据和函数。
class Student:
def __init__(self, name,major):
self.name = name
self.major = major
def display_details(self):
print("Name:", self.name)
print("Major:", self.major)
在这里,我们定义了一个名为 Student 的类,它有两个属性:name 和 major。 我们还有一种称为 display_details 的方法来显示学生的信息。
2.2 对象生成
要创建此类的对象,我们执行以下操作:
# Creating an object of Student class
student1 = Student("Alice", "Computer Science")
# Creating another object of Student class
student2 = Student("John", "Social Science")
student1 是 Student 类的一个对象,代表名为“Alice”并就读于“计算机科学”专业的特定学生。
为了访问此对象的属性和方法,我们使用点表示法:
## Accessing attributes
print(student1.name)
# Output: Alice
print(student1.major)
# Output: Computer Science
# Accessing methods
student1.display_details()
# Output:
# Name: Alice
# Major: Computer Science
2.3 功能与方法:
当我们将函数放在一个类中时,我们称它们为方法。这些方法类似于属于类的特殊函数。他们可以使用存储在类中的数据来做一些事情,我们称之为属性。在前面的示例 Class Student 中,在这个类中,我们有一个方法display_details,它显示了学生的详细信息。
我们可以有另一种方法来做其他事情,例如改变专业:
def change_major(self, new_major):
self.major = new_major
print("major changed to:", self.major)
现在,当我们创建一个学生对象时,我们可以使用以下方法:
# Creating a student object
student1 = Student("Alice", "Computer Science")
# Using the show_details method to display the student's information
student1.show_details()
# Output:
# Name: Alice
# major: Computer Science
# Using the change_major method to update the student's major
student1.change_major("Information Technology")
# Output:
# Major changed to: Information Technology
# Showing the updated details
student1.show_details()
# Output:
# Name: Alice
# major: Information Technology
类中的方法类似于类的对象可以执行的操作或行为。它们帮助我们将相关功能放在一起,并使我们的代码井井有条且易于理解。
方法中的“slef”是什么?
在 Python 中,“self”就像一个占位符,指的是类的当前实例。当您在方法中使用“self”时,它允许您访问该特定实例的属性(变量)和方法(函数)。
简单来说,“self”帮助类的每个实例跟踪自己的数据和行为。这就像说“我”或“我自己”来指代你自己,但在对象和类的上下文中。
想象一下,你有一个名为 Student 的班级。当您创建 Student 对象(如 student1)时,“self”表示 student1。因此,当您调用像 student1.change_major() 这样的方法时,change_major 方法中的 ‘self’ 知道应该change_major的是 student1,而不是任何其他学生。()
在前面的示例中,在方法(show_details 和 change_major)中使用了 ‘self’ 来访问 Student 类 (student1) 的特定实例的属性 name 和 major。这样,学生班的每个实例都可以独立跟踪其数据和行为。
__init__方法是什么?
在 Python 中,init 方法是一种特殊方法,用于在从类创建对象时初始化对象。可以将其视为一个构造函数或设置函数,当您创建类的新实例(对象)时,该函数会自动调用。这是一个特殊的配方,告诉 Python 如何从类创建对象。
初始化对象:这就像给一个全新的对象赋予它的第一套衣服。您可以使用__init__来设置对象出生时的外观。
设置初始值:您可以使用__init__为对象提供一些起始值。例如,如果您要创建“学生”班级,则可以在创建学生后立即使用 init 为每个学生指定姓名和年龄。
自动调用:当您从类创建新对象时,Python 会自动为您调用 init。你不需要做任何特别的事情来实现它。
三、什么是类继承的概念?
继承是指从基类(也称为父类)获取属性或特征到派生类(也称为子类)。让我们把它分解成更简单的术语:
基类和派生类:在继承中,涉及两个主要类:
基类:这是包含多个其他类共享的通用属性和行为的类。
派生类:也称为子类或子类,它是从基类继承属性和行为的类。
2. 获取属性:当一个类从另一个类继承时,它会自动获取基类的所有属性和方法。这意味着派生类可以使用和访问这些属性和方法,而无需重新定义它们。
- 使用继承:要创建派生类,请使用关键字 class,后跟类名,然后在括号中指定它从中继承的基类的名称。
在派生类中,除了从基类继承的属性或方法外,还可以添加特定于该类的其他属性或方法。
访问继承的属性(属性)和方法:从派生类创建的对象既可以访问派生类本身中定义的属性和方法,也可以访问从基类继承的属性和方法。
# Base Class
class Person:
def __init__(self, name):
self.name = name
def display_name(self):
print("Name:", self.name)
# Derived Class
class Student(Person): # Student inherits from Person
def __init__(self, name, student_id):
self.name = name # Initialize name directly
self.student_id = student_id
def display_student_info(self):
self.display_name() # Use the display_name method from the base class
print("StudentID:", self.student_id)
# Creating a Student object
student1 = Student("Alice", "S12345")
# Displaying student information
student1.display_student_info()
#output
#Name:Alice
#StudentID:S12345
#The rest of the code remains the same as the previous example.
#The Student class inherits the display_name
#method from the Person base class and uses it within
#the display_student_info method to display the student's name.
示例 1:此示例演示了如何通过创建针对特定数据分析需求定制的自定义方法来扩展 Pandas DataFrame 的功能。在本例中,我们添加了一种方法来计算数值列的平均值,这对于数据浏览和分析非常有用。
import pandas as pd
class CustomDataFrame(pd.DataFrame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def calculate_mean(self):
numeric_cols = self.select_dtypes(include='number')
mean_values = numeric_cols.mean()
print("Mean of numeric columns:")
print(mean_values)
# Creating a CustomDataFrame object
data = {
'A': [1, 2, 3], 'B': [4, 5, 6], 'C': ['x', 'y', 'z']}
df = CustomDataFrame(data)
# Using the calculate_mean method
df.calculate_mean()
# output
Mean of numeric columns:
A 2.0
B 5.0
dtype: float64
我们定义了一个自定义类 CustomDataFram,该类继承自 Pandas DataFrame 类。
init 方法使用基类的初始化逻辑初始化 DataFrame。
super().init(*args, **kwargs) 是子类调用其父类的构造函数的一种方式,允许它继承和利用父类的初始化行为,同时仍然能够添加自己的自定义行为。
我们在 CustomDataframe 类中添加了一个名为 calculate_mean 的自定义方法,该方法计算数值列的平均值并打印结果。
我们创建一个 CustomDataframe 对象 df,其中包含一些示例数据,包括数值列和非数值列。
我们在 df 对象上调用 calculate_mean 方法来计算和打印数值列的平均值。
示例 2:在本例中,我们添加了一种删除异常值的方法,这对于提高用于分析或建模目的的数据传输质量非常有用。
import pandas as pd
class OutlierRemovalDataFrame(pd.DataFrame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def remove_outliers(self, threshold=3):
numeric_cols = self.select_dtypes(include='number')
for col in numeric_cols.columns:
col_mean = numeric_cols[col].mean()
col_std = numeric_cols[col].std()
lower_bound = col_mean - threshold * col_std
upper_bound = col_mean + threshold * col_std
self[col] = self[col].apply(lambda x: x if lower_bound <= x <= upper_bound else None)
# Creating an OutlierRemovalDataFrame object
data = {
'A': [1, 2, 3, 100], 'B': [5, 10, 15, 200]}
df = OutlierRemovalDataFrame(data)
# Before removing outliers
print("Before removing outliers:")
print(df)
# Removing outliers using default threshold
df.remove_outliers(threshold=1)
# After removing outliers
print("\nAfter removing outliers:")
print(df)
#output
Before removing outliers:
A B
0 1 5
1 2 10
2 3 15
3 100 200
After removing outliers:
A B
0 1.0 5.0
1 2.0 10.0
2 3.0 15.0
3 NaN NaN
示例 3 演示如何使用 scikit-learn 和类的功能来管理缩放、逻辑回归建模、预测和准确性。
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score,f1_score, precision_score, recall_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
class CustomClassifier(BaseEstimator, TransformerMixin):
def __init__(self, penalty='l2', C=1.0, max_iter=100):
self.penalty = penalty
self.C = C
self.max_iter = max_iter
self.scaler = StandardScaler()
self.model = LogisticRegression(penalty=self.penalty, C=self.C, max_iter=self.max_iter)
def fit(self, X, y):
X_scaled = self.scaler.fit_transform(X)
self.model.fit(X_scaled, y)
return self
def predict(self, X):
X_scaled = self.scaler.transform(X)
return self.model.predict(X_scaled)
def predict_proba(self, X):
X_scaled = self.scaler.transform(X)
return self.model.predict_proba(X_scaled)
def accuracy_score(self, X, y):
X_scaled = self.scaler.transform(X)
y_pred = self.model.predict(X_scaled)
return accuracy_score(y, y_pred)
def confusion_matrix(self, X, y):
X_scaled = self.scaler.transform(X)
y_pred = self.model.predict(X_scaled)
return confusion_matrix(y, y_pred)
-----------------------------------------------------
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Load the Breast Cancer dataset
cancer = load_breast_cancer()
X = cancer.data
y = cancer.target
print(X.shape)
print(y.shape)
print(cancer.target_names)
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Create an instance of the CustomClassifier
custom_classifier = CustomClassifier(penalty='l2', C=1.0, max_iter=100)
# Train the model
custom_classifier.fit(X_train, y_train)
# Calculate accuracy on the testing set
accuracy = custom_classifier.accuracy_score(X_test, y_test)
print("Accuracy:", accuracy)
matrix = custom_classifier.confusion_matrix(X_test, y_test)
print("confusion matrix:", matrix)
#output
(569, 30)
(569,)
['malignant' 'benign']
Accuracy: 0.9736842105263158
confusion matrix: [[41 2]
[ 1 70]]
四、小结
总之,我希望你喜欢学习如何通过使用类继承来提高你的 Python 技能。通过掌握这些概念,您可以在代码中解锁新的效率和灵活性水平,使您成为更加熟练和有效的 Python 程序员。继续探索、实验和享受乐趣。
文章评论