"""
示例数据集模块
==============
提供内置的经典数据集,方便测试和学习。
"""
import pandas as pd
import numpy as np
[文档]
def load_iris() -> pd.DataFrame:
"""
加载鸢尾花数据集。
经典的分类数据集,包含3种鸢尾花的4个特征测量值。
Returns
-------
pd.DataFrame
鸢尾花数据集
Examples
--------
>>> from pycorrana.datasets import load_iris
>>> df = load_iris()
>>> print(df.head())
"""
try:
from sklearn.datasets import load_iris as sklearn_load_iris
iris = sklearn_load_iris()
df = pd.DataFrame(
iris.data,
columns=['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
)
df['species'] = pd.Categorical.from_codes(
iris.target, iris.target_names
)
return df
except ImportError:
# 手动创建数据
np.random.seed(42)
n = 150
df = pd.DataFrame({
'sepal_length': np.concatenate([
np.random.normal(5.0, 0.3, 50),
np.random.normal(5.9, 0.4, 50),
np.random.normal(6.5, 0.6, 50)
]),
'sepal_width': np.concatenate([
np.random.normal(3.4, 0.3, 50),
np.random.normal(2.8, 0.3, 50),
np.random.normal(3.0, 0.3, 50)
]),
'petal_length': np.concatenate([
np.random.normal(1.5, 0.2, 50),
np.random.normal(4.3, 0.4, 50),
np.random.normal(5.5, 0.5, 50)
]),
'petal_width': np.concatenate([
np.random.normal(0.2, 0.05, 50),
np.random.normal(1.3, 0.2, 50),
np.random.normal(2.0, 0.3, 50)
]),
'species': ['setosa'] * 50 + ['versicolor'] * 50 + ['virginica'] * 50
})
return df
[文档]
def load_titanic() -> pd.DataFrame:
"""
加载泰坦尼克号数据集。
包含泰坦尼克号乘客的生存情况和相关信息。
Returns
-------
pd.DataFrame
泰坦尼克号数据集
Examples
--------
>>> from pycorrana.datasets import load_titanic
>>> df = load_titanic()
>>> print(df.head())
"""
try:
import seaborn as sns
return sns.load_dataset('titanic')
except:
# 创建简化版数据
np.random.seed(42)
n = 891
df = pd.DataFrame({
'survived': np.random.choice([0, 1], n, p=[0.6, 0.4]),
'pclass': np.random.choice([1, 2, 3], n, p=[0.2, 0.2, 0.6]),
'sex': np.random.choice(['male', 'female'], n, p=[0.65, 0.35]),
'age': np.random.normal(30, 14, n).clip(0, 80),
'sibsp': np.random.choice([0, 1, 2, 3, 4, 5, 8], n,
p=[0.68, 0.23, 0.03, 0.02, 0.01, 0.01, 0.02]),
'parch': np.random.choice([0, 1, 2, 3, 4, 5, 6], n,
p=[0.76, 0.13, 0.09, 0.01, 0.005, 0.005, 0.01]),
'fare': np.random.exponential(32, n).clip(0, 512),
'embarked': np.random.choice(['S', 'C', 'Q'], n, p=[0.7, 0.2, 0.1]),
'class': np.random.choice(['First', 'Second', 'Third'], n, p=[0.2, 0.2, 0.6]),
'who': np.random.choice(['man', 'woman', 'child'], n, p=[0.6, 0.3, 0.1]),
'adult_male': np.random.choice([True, False], n, p=[0.6, 0.4]),
'deck': np.random.choice(['A', 'B', 'C', 'D', 'E', 'F', 'G', None], n),
'embark_town': np.random.choice(
['Southampton', 'Cherbourg', 'Queenstown'], n, p=[0.7, 0.2, 0.1]
),
'alive': np.random.choice(['no', 'yes'], n, p=[0.6, 0.4]),
'alone': np.random.choice([True, False], n, p=[0.6, 0.4]),
})
# 添加一些相关性
df.loc[df['sex'] == 'female', 'survived'] = np.random.choice(
[0, 1], (df['sex'] == 'female').sum(), p=[0.25, 0.75]
)
df.loc[df['pclass'] == 1, 'fare'] *= 3
df.loc[df['pclass'] == 2, 'fare'] *= 1.5
return df
[文档]
def load_wine() -> pd.DataFrame:
"""
加载葡萄酒数据集。
包含葡萄酒的化学分析数据和类别标签。
Returns
-------
pd.DataFrame
葡萄酒数据集
"""
try:
from sklearn.datasets import load_wine as sklearn_load_wine
wine = sklearn_load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
return df
except ImportError:
np.random.seed(42)
n = 178
df = pd.DataFrame({
'alcohol': np.concatenate([
np.random.normal(13.7, 0.5, 59),
np.random.normal(12.3, 0.4, 71),
np.random.normal(13.1, 0.5, 48)
]),
'malic_acid': np.random.exponential(2.5, n).clip(0.7, 5.8),
'ash': np.random.normal(2.4, 0.3, n).clip(1.3, 3.2),
'alcalinity_of_ash': np.random.normal(19.5, 3, n).clip(10, 30),
'magnesium': np.random.normal(100, 15, n).clip(70, 162),
'total_phenols': np.random.normal(2.3, 0.6, n).clip(0.9, 3.9),
'flavanoids': np.random.normal(2.0, 1.0, n).clip(0.3, 5.1),
'nonflavanoid_phenols': np.random.normal(0.36, 0.12, n).clip(0.1, 0.7),
'proanthocyanins': np.random.normal(1.6, 0.6, n).clip(0.4, 3.6),
'color_intensity': np.random.exponential(5, n).clip(1, 13),
'hue': np.random.normal(0.96, 0.2, n).clip(0.4, 1.7),
'od280/od315_of_diluted_wines': np.random.normal(2.6, 0.7, n).clip(1.2, 4.0),
'proline': np.random.exponential(750, n).clip(270, 1680),
'target': [0] * 59 + [1] * 71 + [2] * 48
})
return df
# 数据集信息
DATASET_INFO = {
'iris': {
'name': '鸢尾花数据集',
'description': '包含3种鸢尾花的4个特征测量值',
'n_samples': 150,
'n_features': 4,
'task': '分类',
'source': 'UCI Machine Learning Repository'
},
'titanic': {
'name': '泰坦尼克号数据集',
'description': '泰坦尼克号乘客的生存情况和相关信息',
'n_samples': 891,
'n_features': 15,
'task': '分类',
'source': 'Kaggle'
},
'wine': {
'name': '葡萄酒数据集',
'description': '葡萄酒的化学分析数据和类别标签',
'n_samples': 178,
'n_features': 13,
'task': '分类',
'source': 'UCI Machine Learning Repository'
}
}
[文档]
def list_datasets():
"""列出所有可用数据集"""
print("可用数据集:")
print("-" * 60)
for key, info in DATASET_INFO.items():
print(f"\n{key}:")
print(f" 名称: {info['name']}")
print(f" 描述: {info['description']}")
print(f" 样本数: {info['n_samples']}")
print(f" 特征数: {info['n_features']}")
print(f" 任务类型: {info['task']}")
print(f" 来源: {info['source']}")