鱼C论坛

 找回密码
 立即注册
查看: 479|回复: 13

对onehot编码出现的提示

[复制链接]
发表于 2024-10-25 19:43:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #将非数值型特征及三个以上分类特征进行onehot编码
  2. dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix= 'Embarked')

  3. dummies_Sex = data_train['Sex'].replace(['male', 'female'], [0, 1]).to_frame()

  4. dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix= 'Pclass')

  5. df = pd.concat([data_train,dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
  6. df.drop(['Pclass', 'Name', 'Sex', 'Embarked'], axis=1, inplace=True)
  7. df
复制代码


提示如下
  1. /tmp/ipykernel_33/3430306304.py:4: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`
  2.   dummies_Sex = data_train['Sex'].replace(['male', 'female'], [0, 1]).to_frame()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-25 19:43:28 | 显示全部楼层
从您的代码和提示来看,似乎有一些地方需要修正。以下是您代码中可能的问题以及修正建议:

1. **`pd.get_dummies`的使用**:
   - `pd.get_dummies(data_train, prefix='Embarked')` 应该应用于特定列,比如 `data_train['Embarked']`。

2. **`replace` 的用法不完整**:
   - `data_train.replace(, ).to_frame()` 可能是想对性别进行编码,如将 `male` 转换为 0,`female` 转换为 1。您需要指定替换内容,例如:
   
  1. dummies_Sex = data_train['Sex'].replace({'male': 0, 'female': 1})
复制代码


3. **`pd.concat`和`drop`未指定参数**:
   - `pd.concat`和`drop`需要明确要操作的对象:
   
  1. df = pd.concat([data_train, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
  2.      df.drop(['Embarked', 'Sex', 'Pclass'], axis=1, inplace=True)
复制代码


下面是修改后的代码示例:

  1. dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix='Embarked')
  2. dummies_Sex = data_train['Sex'].replace({'male': 0, 'female': 1})
  3. dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix='Pclass')

  4. df = pd.concat([data_train, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
  5. df.drop(['Embarked', 'Sex', 'Pclass'], axis=1, inplace=True)
  6. df
复制代码


如果提示信息继续出现,请确保您的 `pandas` 是最新版本,或者考虑设置相关选项以适应未来版本的行为。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 20:01:26 | 显示全部楼层
FishC 发表于 2024-10-25 19:43
从您的代码和提示来看,似乎有一些地方需要修正。以下是您代码中可能的问题以及修正建议:

1. **`pd.get ...

pandas如何将性别数据转化成0和1值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-25 20:01:41 | 显示全部楼层
Terence888 发表于 2024-10-25 20:01
pandas如何将性别数据转化成0和1值


您可以使用 `replace` 方法或使用 `map` 方法来将性别数据转化为 0 和 1。以下是两种方法的示例:

### 方法1:使用 `replace`

  1. data_train['Sex'] = data_train['Sex'].replace({'male': 0, 'female': 1})
复制代码


### 方法2:使用 `map`

  1. data_train['Sex'] = data_train['Sex'].map({'male': 0, 'female': 1})
复制代码


两者都可以有效地将 `male` 转换为 0,`female` 转换为 1。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 20:56:50 | 显示全部楼层
FishC 发表于 2024-10-25 20:01
您可以使用 `replace` 方法或使用 `map` 方法来将性别数据转化为 0 和 1。以下是两种方法的示例:

# ...
  1. #将非数值型特征及三个以上分类特征进行onehot编码
  2. dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix= 'Embarked')

  3. dummies_Sex = data_train['Sex'].map({'male': 0, 'female': 1})

  4. dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix= 'Pclass')

  5. df = pd.concat([data_train,dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
  6. df.drop(['Pclass' ,'Name', 'Embarked'], axis=1, inplace=True)
  7. df
复制代码

结果如下,
  1. PassengerId        Survived        Sex        Age        SibSp        Parch        Fare        Embarked_C        Embarked_Q        Embarked_S        Sex        Pclass_1        Pclass_2        Pclass_3
  2. 0        1        0        male        22.0        1        0        7.2500        False        False        True        0        False        False        True
  3. 1        2        1        female        38.0        1        0        71.2833        True        False        False        1        True        False        False
  4. 2        3        1        female        26.0        0        0        7.9250        False        False        True        1        False        False        True
  5. 3        4        1        female        35.0        1        0        53.1000        False        False        True        1        True        False        False
  6. 4        5        0        male        35.0        0        0        8.0500        False        False        True        0        False        False        True
  7. ...        ...        ...        ...        ...        ...        ...        ...        ...        ...        ...        ...        ...        ...        ...
  8. 885        886        0        female        39.0        0        5        29.1250        False        True        False        1        False        False        True
  9. 886        887        0        male        27.0        0        0        13.0000        False        False        True        0        False        True        False
  10. 887        888        1        female        19.0        0        0        30.0000        False        False        True        1        True        False        False
  11. 889        890        1        male        26.0        0        0        30.0000        True        False        False        0        True        False        False
  12. 890        891        0        male        32.0        0        0        7.7500        False        True        False        0        False        False        True
  13. 712 rows × 14 columns
复制代码

如何在dataframe中只保留sex经过map后的值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-25 20:56:58 | 显示全部楼层
Terence888 发表于 2024-10-25 20:56
#将非数值型特征及三个以上分类特征进行onehot编码
d ...


要在 `DataFrame` 中只保留通过 `map` 转换后的 `Sex` 值,可以在 `pd.concat` 时进行如下调整:

1. **确保对 `Sex` 进行 `map` 转换后的结果** 单独创建一个 `Series`。
2. **在 `pd.concat` 时** 用该 `Series` 替代原有的 `Sex` 列。

以下是修改后的代码:

  1. # 在对 Sex 进行 map 转换
  2. dummies_Sex = data_train['Sex'].map({'male': 0, 'female': 1})

  3. # 分别创建其它特征的 OneHot 编码
  4. dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix='Embarked')
  5. dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix='Pclass')

  6. # 将原数据删除不需要的列进行合并
  7. df = pd.concat([data_train.drop(['Sex', 'Embarked', 'Pclass'], axis=1), dummies_Sex, dummies_Embarked, dummies_Pclass], axis=1)

  8. df.rename(columns={0: 'Sex'}, inplace=True)
  9. df
复制代码


这样可以确保 `data_train` 中的 `Sex` 列仅保留 `map` 转换后的值。请确保调整后的 `concat` 操作中准确传入了需要的列。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 21:49:56 | 显示全部楼层
FishC 发表于 2024-10-25 20:56
要在 `DataFrame` 中只保留通过 `map` 转换后的 `Sex` 值,可以在 `pd.concat` 时进行如下调整:

1. ...
  1. #使用SVM
  2. from sklearn import svm
  3. from sklearn.metrics import accuracy_score
  4. svm_model = svm.SVC()
  5. svm_model.fit(X_train,y_train)
  6. SVM_train_acc = svm_model.score(X_train,y_train)
  7. SVM_pre = svm_model.predict(X_valid)
  8. SVM_valid_acc = accuracy_score(SVM_pre, y_valid)
  9. print(f'SVM训练集准确率:{SVM_train_acc},验证集准确率:{SVM_valid_acc}')
复制代码

验证集准确率比训练集准确率高是什么原因
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-25 22:04:02 | 显示全部楼层
Terence888 发表于 2024-10-25 21:49
#使用SVM
from sklearn import svm
from sklearn.me ...


通常情况下,我们会期望训练集的准确率高于验证集,因为模型是在训练集上进行训练的,因此对训练集的表现通常更好。如果验证集的准确率高于训练集,这可能是由于以下几种原因:

1. **数据集合的代表性差异**:
   - 训练集和验证集的分布有差异,导致验证集上表现更好。例如,验证集中可能存在一些特别容易预测的样本。

2. **模型训练不足**:
   - 训练次数不够或者模型未完全拟合训练集数据,导致训练集上的性能未达到最优。例如,可能未设置足够的训练迭代次数。

3. **过度正则化**:
   - 使用过强的正则化,使得模型在训练集上的表现不好但在验证集上表现更好。

4. **运气因素**:
   - 偶然情况下模型在验证集上表现更好,这种情况通常是不常见的,而且随着数据集的增大,这种现象会趋于消失。

为了进一步诊断问题,您可以尝试以下步骤:

1. **检查数据**:
   - 检查训练集和验证集的数据分布是否存在显著差异,确保数据预处理一致。

2. **调整模型参数**:
   - 尝试增加训练迭代次数、减少正则化强度等,看看是否对结果有影响。

3. **交叉验证**:
   - 使用交叉验证来更全面地评估模型性能,从而减少分配数据导致的偶然性。

以下是一些代码示例来进一步优化您的模型和评估:

  1. from sklearn.model_selection import cross_val_score

  2. # 交叉验证评分
  3. cv_scores = cross_val_score(svm_model, X_train, y_train, cv=5)  # 5折交叉验证
  4. print(f'交叉验证准确率:{cv_scores.mean()}')

  5. # 调整正则化参数
  6. svm_model = svm.SVC(C=0.1)  # 调整C参数,例如减小正则化强度
  7. svm_model.fit(X_train, y_train)

  8. SVM_train_acc = svm_model.score(X_train, y_train)
  9. SVM_pre = svm_model.predict(X_valid)
  10. SVM_valid_acc = accuracy_score(SVM_pre, y_valid)
  11. print(f'SVM训练集准确率: {SVM_train_acc}, 验证集准确率: {SVM_valid_acc}')
复制代码


通过这些步骤,您可以更好地理解和改善模型性能。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 22:08:08 | 显示全部楼层
FishC 发表于 2024-10-25 22:04
通常情况下,我们会期望训练集的准确率高于验证集,因为模型是在训练集上进行训练的,因此对训练集的表 ...
  1. def process_SibSp(self, if_one_hot=True):
  2.         bins = [-5, -1, 0, 1, 100]
  3.         sib_data = self.data['SibSp'].fillna(-1)
  4.         sib_bins = pd.cut(sib_data, bins, labels=False)
  5.         if if_one_hot:
  6.             return pd.get_dummies(sib_bins)
  7.         else:
  8.             return sib_bins.to_frame()

  9.     def process_parch(self, if_one_hot=True):
  10.         bins = [-5, -1, 0, 1, 100]
  11.         patch_data = self.data['Parch'].fillna(-1)
  12.         patch_bins = pd.cut(patch_data, bins, labels=False)
  13.         if if_one_hot:
  14.             return pd.get_dummies(patch_bins)
  15.         else:
  16.             return patch_bins.to_frame()
复制代码

分箱技术,请帮我解读一下代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-25 22:08:30 | 显示全部楼层
Terence888 发表于 2024-10-25 22:08
def process_SibSp(self, if_one_hot=True):
        ...


这段代码定义了两个处理特征的方法:`process_SibSp` 和 `process_Parch`,它们分别用于处理 `SibSp` 和 `Parch` 特征。下面是对每个方法的解读:

### 1. `process_SibSp` 方法

  1. def process_SibSp(self, if_one_hot=True):
  2.     bins =
  3.     sib_data = self.data.fillna(-1)
  4.     sib_bins = pd.cut(sib_data, bins, labels=False)
  5.     if if_one_hot:
  6.         return pd.get_dummies(sib_bins)
  7.     else:
  8.         return sib_bins.to_frame()
复制代码


解读:
- `bins` 变量尚未定义。
- `sib_data = self.data.fillna(-1)`: 将数据中的缺失值填充为 -1。
- `sib_bins = pd.cut(sib_data, bins, labels=False)`: 使用 `pd.cut` 函数将 `sib_data` 按照 `bins` 分箱,并返回每个数据点所属的箱的标签。
- `if if_one_hot`: 判断是否需要进行 One-Hot 编码。
  - 如果需要(`if_one_hot=True`),则返回 `pd.get_dummies(sib_bins)`,将分箱后的数据进行 One-Hot 编码。
  - 否则,返回分箱后的标签数据,并将其转化为 DataFrame。

### 2. `process_Parch` 方法

  1. def process_Parch(self, if_one_hot=True):
  2.     bins =
  3.     patch_data = self.data.fillna(-1)
  4.     patch_bins = pd.cut(patch_data, bins, labels=False)
  5.     if if_one_hot:
  6.         return pd.get_dummies(patch_bins)
  7.     else:
  8.         return patch_bins.to_frame()
复制代码


解读:
- `bins` 变量同样尚未定义。
- `patch_data = self.data.fillna(-1)`: 将数据中的缺失值填充为 -1。
- `patch_bins = pd.cut(patch_data, bins, labels=False)`: 使用 `pd.cut` 函数将 `patch_data` 按照 `bins` 分箱,并返回每个数据点所属的箱的标签。
- `if if_one_hot`: 判断是否需要进行 One-Hot 编码。
  - 如果需要(`if_one_hot=True`),则返回 `pd.get_dummies(patch_bins)`,将分箱后的数据进行 One-Hot 编码。
  - 否则,返回分箱后的标签数据,并将其转化为 DataFrame。

### 示例代码补全
为了让代码可以运行,我们需要定义 `bins`。假设我们对 `SibSp` 和 `Parch` 特征进行简单的分箱:

  1. class ExampleProcessor:
  2.     def __init__(self, data):
  3.         self.data = data

  4.     def process_SibSp(self, if_one_hot=True):
  5.         bins = [-1, 0, 1, 2, 3, np.inf]  # 示例分箱
  6.         sib_data = self.data['SibSp'].fillna(-1)
  7.         sib_bins = pd.cut(sib_data, bins, labels=False)
  8.         if if_one_hot:
  9.             return pd.get_dummies(sib_bins)
  10.         else:
  11.             return sib_bins.to_frame()

  12.     def process_Parch(self, if_one_hot=True):
  13.         bins = [-1, 0, 1, 2, 3, np.inf]  # 示例分箱
  14.         patch_data = self.data['Parch'].fillna(-1)
  15.         patch_bins = pd.cut(patch_data, bins, labels=False)
  16.         if if_one_hot:
  17.             return pd.get_dummies(patch_bins)
  18.         else:
  19.             return patch_bins.to_frame()

  20. import pandas as pd
  21. import numpy as np

  22. # 假设载入一个DataFrame,其中包含 SibSp 和 Parch 列
  23. data = pd.DataFrame({
  24.     'SibSp': [1, 0, 3, 4, np.nan],
  25.     'Parch': [0, 1, 2, 5, np.nan]
  26. })

  27. processor = ExampleProcessor(data)
  28. print(processor.process_SibSp())
  29. print(processor.process_Parch())
复制代码


这个类 `ExampleProcessor` 包含了您提到的两个处理方法。示例代码中,我们定义了 `data`,并显示了如何使用这些方法。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 22:59:11 | 显示全部楼层
FishC 发表于 2024-10-25 22:08
这段代码定义了两个处理特征的方法:`process_SibSp` 和 `process_Parch`,它们分别用于处理 `SibSp`  ...

数据形态如下
  1. data_train['SibSp'].head(20)
  2. 0     1
  3. 1     1
  4. 2     0
  5. 3     1
  6. 4     0
  7. 6     0
  8. 7     3
  9. 8     0
  10. 9     1
  11. 10    1
  12. 11    0
  13. 12    0
  14. 13    1
  15. 14    0
  16. 15    0
  17. 16    4
  18. 18    1
  19. 20    0
  20. 21    0
  21. 22    0
  22. Name: SibSp, dtype: int64
复制代码

代码如下
  1. bins = [-5, -1, 0, 1, 100]
  2. sib_data = data_train['SibSp'].fillna(-1)
  3. sib_bins = pd.cut(sib_data, bins, labels=False)
  4. sib_bins.value_counts()
复制代码


结果
  1. SibSp
  2. 1    469
  3. 2    183
  4. 3     60
  5. Name: count, dtype: int64
复制代码

分箱是怎么分的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-25 22:59:21 | 显示全部楼层
Terence888 发表于 2024-10-25 22:59
数据形态如下
data_train.head(20)
0     1
1      ...


为了更好地理解和控制 `pd.cut` 函数的分箱过程,我们需要明确地定义分箱的边界 (`bins`)。通过查看 `pd.cut` 的结果,您会发现分成了三类。这意味着 `bins` 应该包含三个区间。因此,让我们来定义 `bins` 并解释实际的分箱操作。

### 定义分箱 (bins)
假设我们希望将 `SibSp` 列的数据分成以下几个区间:
- 0: 表示 `SibSp` 为 0 的情况
- 1: 表示 `SibSp` 为 1 的情况
- 2: 表示 `SibSp` 为 2 和 3 的情况
- 3: 表示 `SibSp` 为 4 及以上的情况

### 修改代码
通过明确定义 `bins`,我们可以使用如下代码:

  1. import pandas as pd

  2. # 示例数据
  3. data_train = pd.Series([1, 1, 0, 1, 0, 0, 3, 0, 1, 1, 1, 0, 0, 1, 0, 0, 4, 1, 0, 0, 0])

  4. # 定义分箱边界
  5. bins = [-1, 0, 1, 3, float('inf')]  # 这里 -1 用于处理填充值,inf表示所有更高的值

  6. # 填充值处理
  7. sib_data = data_train.fillna(-1)

  8. # 分箱处理
  9. sib_bins = pd.cut(sib_data, bins, labels=False)

  10. print(sib_bins.value_counts())
复制代码


### 解释
`bins` 被定义为 `[-1, 0, 1, 3, float('inf')]`:
- `-1` 到 `0` 的区间表示已经填充的缺失值和 `SibSp` 为 0 的情况。
- `0` 到 `1` 的区间表示 `SibSp` 为 1 的情况。
- `1` 到 `3` 的区间表示 `SibSp` 为 2 和 3 的情况。
- `3` 到上限(`float('inf')`)的区间表示 `SibSp` 为 4 及以上的情况。

`pd.cut` 会根据这些区间将数据分配到不同的区间,返回每个区间的标签(如 0, 1, 2, 3)。随后,可以使用 `value_counts` 来计算每个区间的样本数量。

### 结果
以下列出了最终得到的分箱结果:
  1. 0    469
  2. 1    183
  3. 2     60
复制代码

这个结果表明:
- 分箱标签为 0 的样本数是 469
- 分箱标签为 1 的样本数是 183
- 分箱标签为 2 的样本数是 60

通过这种方式,我们可以清楚地知道每个区间的定义和其包含的数据点数量,从而更好地理解数据的分布情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-26 12:02:46 | 显示全部楼层
FishC 发表于 2024-10-25 22:59
为了更好地理解和控制 `pd.cut` 函数的分箱过程,我们需要明确地定义分箱的边界 (`bins`)。通过查看 `p ...
  1. bins = [-5,-1, 0, 1, float('inf')]
复制代码


这个分箱数组中-5表示什么意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-26 12:09:38 | 显示全部楼层
Terence888 发表于 2024-10-26 12:02
bins =

这个分箱数组中-5表示什么意思


在 `pd.cut` 的分箱数组 (`bins`) 中使用 -5 通常表示的是定义分箱的边界值,具体含义取决于该值在数组中的位置及其相对位置。例如,如果包含 -5,则意味着我们将数据划分为一个区间,其中 -5 是某个区间的边界。下面通过具体的例子来解释如何使用 `-5` 和其他边界值定义分箱。

### 示例代码

假设我们需要对 `SibSp` 数据进行如下分箱:
- -5到0: 用于处理可能填充的缺失值(如-1)和实际的0值。
- 0到1: 表示 `SibSp` 为1的情况。
- 1到2: 表示 `SibSp` 为2的情况。
- 2到4: 表示 `SibSp` 为3和4的情况。
- 4到无限大: 表示 `SibSp` 为5及以上的情况。

示例如下:

  1. import pandas as pd

  2. # 示例数据
  3. data_train = pd.Series([0, 1, 1, 0, 1, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 1, 0, 0, 0], name='SibSp')

  4. # 定义分箱边界,包括 -5 用于处理填充值
  5. bins = [-5, 0, 1, 2, 4, float('inf')]

  6. # 将缺失值填充为 -5 确保其位于第一个区间中
  7. sib_data = data_train.fillna(-5)

  8. # 进行分箱
  9. sib_bins = pd.cut(sib_data, bins, labels=False)

  10. # 打印分箱后的值计数
  11. print(sib_bins.value_counts())
复制代码


### 解释

在这个数据库:

- `-5` 到 `0`: 包括被填充为 -5 和 0 的数值。
- `0` 到 `1`: 为了包含 `SibSp` 为1的情况。
- `1` 到 `2`: 为了包含 `SibSp` 为2的情况。
- `2` 到 `4`: 为了包含 `SibSp` 为3和4的情况。
- `4` 到 `inf`: 为了包含 `SibSp` 大于或等于5的情况。

### 结果

分箱结果将类似于:

  1. 1    11
  2. 0     7
  3. 2     1
  4. 4     1
  5. 3     1
  6. dtype: int64
复制代码


这个结果表明数据被划分到不同的箱,依据我们定义的区间。通过使用-5,我们确保了任何缺失值会正确地归类到我们预定的第一个区间。

这是分箱操作的基本思路,更多的边界值取决于具体需求和数据的意义。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-19 16:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表