我一直在尝试将一些事务数据从 DB2 SQL 表导入到 Python 中,以便使用 mlxtend。我需要使用 TransactionEncoder 将其转换为正确的形式,但我似乎找不到正确的数据格式以使其工作。
我发现的所有示例似乎都使用 csv 或少量手工编码的行来创建数据集,但这对于我将使用的数据来说是不可行的。我有一个以逗号分隔的每个客户的项目列表,但无论我在 Python 中如何格式化它,我似乎都会在 TransactionEncoder 期间收到“TypeError: 'int' object is not iterable”错误。这就是我现在所在的地方;
import pandas as pd
import pyodbc
import getpass
from mlxtend.preprocessing import TransactionEncoder
#Create dataset
odbc_dsn = 'ABCDEF'
db_user = input("Enter database username: ")
# Create connection object
conn = pyodbc.connect(DSN = odbc_dsn,
UID = db_user,
PWD = getpass.getpass("Enter database password: "))
# Run query and store output in variable 'd'
d = pd.read_sql_query(sql = "SELECT * FROM SUP.SJC_PYTHON_CROSSPURCH ORDER BY COMBO_COUNT DESC;",
con = conn)
# Closes the connection
conn.close()
print(d)
df4 = d["COMBO_VARIABLE_AGG"].str.split(", ", n = -1, expand = True)
print (df4)
dataset = df4
#dataset2 = [['Milk', 'Eggs', 'Bread'],
#['Milk', 'Eggs'],
#['Milk', 'Bread'],
#['Eggs', 'Apple']]
#print(dataset2)
#Transpose and 1-Hot
te = TransactionEncoder()
te_array = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_array, columns=te.columns_)
print(df)
#FP_Growth
from mlxtend.frequent_patterns import fpgrowth
frequent_itemsets_fp=fpgrowth(df, min_support=0.01, use_colnames=True)
#print(frequent_itemsets_fp)
#Association Rules
from mlxtend.frequent_patterns import association_rules
rules_fp = association_rules(frequent_itemsets_fp, metric="confidence", min_threshold=0.8)
牛奶/鸡蛋/面包部分来自原始示例,适用于下面的内容。我猜人们必须以这种方式通过 Python 使用 SQL 数据,所以希望有人能够为我指明正确的方向(如果你不知道,我对 Python 还很陌生)。
谢谢
以防万一其他人也有类似的问题,我想我设法解决了这个问题(在花了一些时间实际学习 Python 的基础知识之后)。看来我需要将字符串列(它们是用逗号分隔的项目列表)转换为列表列表。我首先将每一行中的字符串变成一个列表;
df4=d["COMBO_VARIABLE_AGG"].str.split(', ')
(这在“conn.close()”之后) 然后我把这一列列表变成了一个大列表;
df4=(df4.tolist())
我不确定这是否是可接受的方法,但下面的其余代码现在可以工作。
我很高兴您找到了解决此问题的方法。我试图做同样的事情并发现了你的答案。谢谢!!