Python中导入Excel/CSV大型XY数据集为数组的工具包咨询
解决方法:用Pandas导入Excel/CSV数据集
对于处理表格型的大数据集,pandas是Python生态里最适合的工具——它能轻松读取CSV和Excel文件,自动处理表头和数据类型,而且和你代码里用到的numpy、scikit-learn完美兼容,2000条数据完全不在话下。
下面是具体的实现步骤,直接替换你代码里手动定义X、Y的部分就行:
1. 先安装必要的包
如果你还没装pandas,先执行安装命令:
pip install pandas
如果要读取Excel文件(.xlsx格式),还需要额外安装openpyxl来支持文件解析:
pip install openpyxl
2. 读取你的数据集
假设你的CSV/Excel文件里,X列的列名是总体积占比,Y列是总流量占比(如果你的列名是别的,替换成实际名称即可):
读取CSV文件
import pandas as pd # 读取CSV,把文件路径改成你自己的数据集路径 df = pd.read_csv('your_dataset.csv') # 提取X和Y列,直接转换成numpy数组(和你手动定义的格式完全一致) X = df['总体积占比'].values Y = df['总流量占比'].values
读取Excel文件
import pandas as pd # 读取Excel,指定工作表名(如果只有一个工作表可以省略sheet_name参数) df = pd.read_excel('your_dataset.xlsx', sheet_name='Sheet1') # 提取数组 X = df['总体积占比'].values Y = df['总流量占比'].values
3. 替换原代码中的手动数据
把你原代码里手动定义X、Y的两行:
Y = np.array([0.172, 0.33, ...]) X = np.array([0.042, 0.083, ...])
直接替换成上面的X、Y定义即可,剩下的代码完全不需要改动——因为df['列名'].values返回的就是numpy数组,和你原来手动创建的数组格式完全匹配。
额外提示:检查数据质量
导入后可以先简单检查下数据有没有缺失值,避免后续分析报错:
# 查看每列的缺失值数量 print(df.isnull().sum()) # 如果有缺失值,可以选择删除整行或者填充 # df = df.dropna() # 删除含缺失值的行 # df = df.fillna(df.mean()) # 用列均值填充缺失值
修改后的完整代码示例
from matplotlib import pyplot as plt from pylab import * import numpy as np import pandas as pd # 新增导入pandas from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score from sklearn.preprocessing import PolynomialFeatures import scipy.integrate as integrate # 设置坐标轴范围 fig, ax = plt.subplots(figsize=(8, 8)) ax.set_xlim(0, 1) ax.set_ylim(0, 1) # ---------------------- 替换这里的手动数据 ---------------------- # 读取CSV(换成你的文件路径) df = pd.read_csv('your_dataset.csv') # 或者读取Excel:df = pd.read_excel('your_dataset.xlsx', sheet_name='Sheet1') X = df['总体积占比'].values Y = df['总流量占比'].values # ------------------------------------------------------------- plt.plot(X, Y, 'bo') plt.title('Lorenz Plot') plt.ylabel('Flow Capacity, F') plt.xlabel('Storage Capacity, C') plt.grid(True) plt.show() # 平等线 y_eq = x plt.plot(x, y_eq, 'g') # 构建洛伦兹曲线 # 转换数据以增加一个维度 x = X[:, np.newaxis] y = Y[:, np.newaxis] polynomial_features = PolynomialFeatures(degree=4) x_poly = polynomial_features.fit_transform(x) model = LinearRegression() model.fit(x_poly, y) y_poly_pred = model.predict(x_poly) rmse = np.sqrt(mean_squared_error(y, y_poly_pred)) r2 = r2_score(y, y_poly_pred) print("RMSE = ", rmse) print('R^2 = ', r2) plt.scatter(x, y, s=10) plt.plot(x, y_poly_pred, color='m') # 使用coef_方法定义scipy.integrate.quad的传入函数 def f(x): i = len(model.coef_[0]) - 1 eq = 0 while (i > 0): eq += model.coef_[0][i] * x ** i i = i - 1 eq = eq + model.intercept_[0] eq = eq - x return eq # 计算面积ABCA,面积ADCA=0.5 result = integrate.quad(lambda x: f(x), 0, 1) print("积分结果:", result[0]) print("洛伦兹系数 = ", round(result[0] / 0.5, 3))
内容的提问来源于stack exchange,提问作者user13641648




