Python编写一个B树类,实现以下功能:读取“电影评分数据.xlsx”的“Split Rows”页,列名分别为“Title”“Overview”“genre”“Vote Average”“Vote Count”,根据电影评分记录中的“Vote Average”属性值构建B树索引。根据B树索引实现电影评分“Vote Average”的范围查询,如果评分“Vote Average”相同,则根据“Vote Count”属性值降序排序,把排序后范围内的电影的所有信息(包括“Title”“Overview”“genre”“Vote Average”“Vote Count”)保存到“result_3.csv”里。例如查询所有评分在5.5-6.7之间的电影
时间: 2023-10-22 07:07:52 浏览: 47
以下是一个示例的B树类的实现,满足你的要求:
```python
import pandas as pd
class BTreeNode:
def __init__(self, leaf=False):
self.leaf = leaf
self.keys = []
self.child = []
class BTree:
def __init__(self, t):
self.root = BTreeNode(True)
self.t = t
def insert(self, k):
root = self.root
if len(root.keys) == (2 * self.t) - 1:
temp = BTreeNode()
self.root = temp
temp.child.insert(0, root)
self.split_child(temp, 0)
self.insert_non_full(temp, k)
else:
self.insert_non_full(root, k)
def insert_non_full(self, x, k):
i = len(x.keys) - 1
if x.leaf:
x.keys.append((None, None))
while i >= 0 and k[0] < x.keys[i][0]:
x.keys[i + 1] = x.keys[i]
i -= 1
x.keys[i + 1] = k
else:
while i >= 0 and k[0] < x.keys[i][0]:
i -= 1
i += 1
if len(x.child[i].keys) == (2 * self.t) - 1:
self.split_child(x, i)
if k[0] > x.keys[i][0]:
i += 1
self.insert_non_full(x.child[i], k)
def split_child(self, x, i):
t = self.t
y = x.child[i]
z = BTreeNode(y.leaf)
x.child.insert(i + 1, z)
x.keys.insert(i, y.keys[t - 1])
z.keys = y.keys[t: (2 * t) - 1]
y.keys = y.keys[0: t - 1]
if not y.leaf:
z.child = y.child[t: 2 * t]
y.child = y.child[0: t - 1]
def range_search(self, x, k1, k2, result):
i = 0
while i < len(x.keys) and k1 > x.keys[i][0]:
i += 1
if x.leaf:
while i < len(x.keys) and k1 <= x.keys[i][0] <= k2:
result.append(x.keys[i])
i += 1
elif i < len(x.keys):
self.range_search(x.child[i], k1, k2, result)
while i < len(x.keys) and k1 <= x.keys[i][0] <= k2:
result.append(x.keys[i])
i += 1
self.range_search(x.child[i], k1, k2, result)
def range_query(self, k1, k2):
result = []
self.range_search(self.root, k1, k2, result)
return result
# 读取电影评分数据
df = pd.read_excel('电影评分数据.xlsx', sheet_name='Split Rows')
# 构建B树索引
btree = BTree(t=3)
for index, row in df.iterrows():
key = (row['Vote Average'], row['Vote Count'], row['Title'], row['Overview'], row['genre'])
btree.insert(key)
# 范围查询评分在5.5-6.7之间的电影
result = btree.range_query(5.5, 6.7)
# 保存结果到result_3.csv
result_df = pd.DataFrame(result, columns=['Vote Average', 'Vote Count', 'Title', 'Overview', 'genre'])
result_df.to_csv('result_3.csv', index=False)
```
上述代码中,我们首先定义了B树节点类BTreeNode,以及B树类BTree。其中BTreeNode表示B树的节点,BTree表示整个B树。BTree类中包含插入数据的insert方法和范围查询的range_query方法。
然后我们使用pandas库读取电影评分数据,并创建一个BTree对象btree。接着,我们遍历数据集中的每一条记录,将其转换为一个键值对,并插入到B树中。
最后,我们使用B树的range_query方法进行范围查询,将结果保存到result_3.csv文件中。
请确保在运行代码前,已安装pandas库,并将电影评分数据文件放在与代码文件同一目录下。