gpt4 book ai didi

python - 从 MySQL 到 Python 创建计数向量的有效方法

转载 作者:行者123 更新时间:2023-11-29 13:41:19 25 4
gpt4 key购买 nike

我在 MySQL 中有这些类型的数据(样本):

表1:

ID     ITEM    CNT
--------------------
0001 AAB 5
0001 BBA 3
0001 BBB 8
0001 AAC 10
0002 BBA 2
0002 BBC 7
0003 FFG 2
0003 JPO 4
0003 PUI 22
..........

我想找到一种方法以计数向量的形式在Python中导入这些数据,例如:

0001 = [5,10,3,8,0,0,0,0]
0002 = [0,0,2,0,7,0,0,0]
0003 = [0,0,0,0,0,0,4,22]

其中元素表示以下形式中每个 id 的所有项目的计数:[AAB,AAC,BBA,BBB,BBC,FFG,JPO,PUI]

所以我想问一下,最好、最有效的实现方法是什么?从 python 或 mysql 中执行它更好吗?如何执行?

谢谢

最佳答案

在可能的情况下,使用 SQL 操作数据通常比使用 Python 更有效。

使用此设置:

import config
import MySQLdb
conn = MySQLdb.connect(
host=config.HOST, user=config.USER,
passwd=config.PASS, db='test')
cursor = conn.cursor()

sql = '''\
DROP TABLE IF EXISTS foo
'''
cursor.execute(sql)

sql = '''\
CREATE TABLE foo (
ID varchar(4),
ITEM varchar(3),
CNT int)
'''

cursor.execute(sql)

sql = '''\
INSERT INTO foo VALUES (%s,%s,%s)
'''

cursor.executemany(sql, [['0001', 'AAB', 5],
['0001', 'BBA', 3],
['0001', 'BBB', 8],
['0002', 'BBA', 2]])

您可以使用以下命令形成所需的 SQL:

items = 'AAB AAC BBA BBB BBC FFG JPO PUI'.split()
fields = ', '.join('COALESCE({}.CNT, 0)'.format(item) for item in items)
joins = '\n'.join('''\
LEFT JOIN (SELECT ID, CNT FROM foo WHERE ITEM = '{i}') as {i}
ON T.ID = {i}.ID'''.format(i=item) for item in items)
sql = '''\
SELECT T.ID, {f}
FROM (SELECT DISTINCT ID from foo) as T
{j}
'''.format(f=fields, j=joins)

print(sql)

并像这样使用它:

result = dict()
cursor.execute(sql)
for row in cursor:
result[row[0]] = row[1:]
print(result)

使用的 SQL 查询是:

SELECT T.ID, COALESCE(AAB.CNT, 0), COALESCE(AAC.CNT, 0), COALESCE(BBA.CNT, 0), COALESCE(BBB.CNT, 0), COALESCE(BBC.CNT, 0), COALESCE(FFG.CNT, 0), COALESCE(JPO.CNT, 0), COALESCE(PUI.CNT, 0)
FROM (SELECT DISTINCT ID from foo) as T
LEFT JOIN (SELECT ID, CNT FROM foo WHERE ITEM = 'AAB') as AAB
ON T.ID = AAB.ID
LEFT JOIN (SELECT ID, CNT FROM foo WHERE ITEM = 'AAC') as AAC
ON T.ID = AAC.ID
LEFT JOIN (SELECT ID, CNT FROM foo WHERE ITEM = 'BBA') as BBA
ON T.ID = BBA.ID
LEFT JOIN (SELECT ID, CNT FROM foo WHERE ITEM = 'BBB') as BBB
ON T.ID = BBB.ID
LEFT JOIN (SELECT ID, CNT FROM foo WHERE ITEM = 'BBC') as BBC
ON T.ID = BBC.ID
LEFT JOIN (SELECT ID, CNT FROM foo WHERE ITEM = 'FFG') as FFG
ON T.ID = FFG.ID
LEFT JOIN (SELECT ID, CNT FROM foo WHERE ITEM = 'JPO') as JPO
ON T.ID = JPO.ID
LEFT JOIN (SELECT ID, CNT FROM foo WHERE ITEM = 'PUI') as PUI
ON T.ID = PUI.ID

生成的字典如下所示:

{'0001': (5L, 0L, 3L, 8L, 0L, 0L, 0L, 0L), '0002': (0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L)}

我知道你要求

0001 = [5,10,3,8,0,0,0,0]
0002 = [0,0,2,0,7,0,0,0]
0003 = [0,0,0,0,0,0,4,22]

但这至少存在两个问题。首先,0001 不是有效的 Python 变量名称。变量名不能以数字开头。其次,您不需要动态定义的变量名称,因为很难使用裸变量名称进行编程,而只有在运行时才知道变量名称。

相反,使用可能的变量名称作为字典中的键,结果。然后您可以使用 result['0001'] 引用“变量”0001

关于python - 从 MySQL 到 Python 创建计数向量的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18042518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com