读取excel表中一列数据,并存储为数组,将数组中连续出现的相同字符串划分在一起,并初始化一个空数组X用来存储临时划分位置,最后一个不相同元素不用存储划分位置,数组merge中记录了可以划分的位置 初始化giniMin为无穷大,输入参数k,判断临时划分位置数组X包含的数据个数,当X中数据个数等于k-1时,对划分位置的基尼指数进行计算, if (Gini(data, X)<ginMin) then giniMin = Gini(str, X); result = X; 若不满足X中数据个数等于k-1个时,for(i=0, j=merge[0]; i<merge.size(); i++) do X.push_back(j); partition(str, k, &X, &merge, &giniMin);X.pop_back();
时间: 2023-12-03 09:44:33 浏览: 130
读取excel的基本操作。
以下是代码实现:
```python
import pandas as pd
import numpy as np
def partition(str, k, X, merge, giniMin):
# 读取excel表中一列数据,并存储为数组
data = pd.read_excel(str, header=None).values.flatten()
# 初始化空数组X,用来存储临时划分位置
if not X:
X.append(0)
# 将数组中连续出现的相同字符串划分在一起,并初始化一个空数组X用来存储临时划分位置
for i in range(1, len(data)):
if data[i] != data[i-1]:
X.append(i)
# 最后一个不相同元素不用存储划分位置
if X[-1] != len(data)-1:
X.append(len(data)-1)
# 数组merge中记录了可以划分的位置
if not merge:
for i in range(1, len(X)):
if X[i]-X[i-1] > 1:
merge.append(X[i-1])
merge.append(X[i])
# 判断临时划分位置数组X包含的数据个数
if len(X) - 1 == k-1:
# 当X中数据个数等于k-1时,对划分位置的基尼指数进行计算
if Gini(data, X) < giniMin:
giniMin = Gini(data, X)
result = X.copy()
else:
# 若不满足X中数据个数等于k-1个时,进行递归划分
for i in range(0, len(merge), 2):
j = merge[i+1]
X.append(j)
partition(str, k, X, merge, giniMin)
X.pop()
return result
def Gini(data, X):
# 计算基尼指数
gini = 0
for i in range(1, len(X)):
count = np.unique(data[X[i-1]:X[i]], return_counts=True)[1]
prob = count / len(data[X[i-1]:X[i]])
gini += (1 - np.sum(prob**2)) * len(data[X[i-1]:X[i]])
return gini / len(data)
# 测试代码
str = "data.xlsx"
k = 3
X = []
merge = []
giniMin = float('inf')
result = partition(str, k, X, merge, giniMin)
print(result)
```
其中,`Gini()`函数用于计算基尼指数,`partition()`函数用于递归划分数据,`str`为数据所在的Excel文件路径,`k`为需要划分的份数。在主函数中,初始化`X`、`merge`、`giniMin`,调用`partition()`函数进行递归划分,最后输出结果。
阅读全文