ric*_*hie 5 python sqlite data-structures
我在python sqlite3数据库中有以下信息,该数据库有大约400万条记录.
Term No of articles Article Ids
Obama 300 [411,523,534, …. 846]
Gandhi 3900 [23,32,33…..4578]
Mandela 3900 [21,14,56,145 …4536]
George Bush 450 [230,310 … 700]
Tony Blair 350 [225,320 … 800]
Justin Bieber 25 [401 , 420, 690 …. 904]
Lionel Messi 150 [23, 78, …… 570]
Run Code Online (Sandbox Code Playgroud)
'Article Ids'是一个包含id列表的blob(由API返回)
我的任务是从Id列表中为每个术语查找common-id并将它们保存在'relationships.db'中
我如何建立关系,我发现哪些文章一起谈论甘地和曼德拉(交叉文章ID)?
relationships.db应该是这样的;
Term 1 Term 2 No of Common Article Ids Common Article IDS
Obama Gandhi 17 [34,123,25 ...]
Obama Mandela 43 [145,111,234,456 ....]
Obama George Bush 46
Obama Tony Blair 2
Obama Justin Bieber 36
Obama Lionel Messi 3
Gandhi Mandela 40
Gandhi George Bush 41
Gandhi Tony Blair 32
Gandhi Justin Bieber 31
Gandhi Lionel Messi 20
Mandela George Bush 20
Mandela Tony Blair 11
Mandela Justin Bieber 19
Mandela Lionel Messi 39
George Bush Tony Blair 46
George Bush Justin Bieber 49
George Bush Lionel Messi 2
Tony Blair Justin Bieber 50
Tony Blair Lionel Messi 3
Justin Bieber Lionel Messi 6
Run Code Online (Sandbox Code Playgroud)
使用'for循环'循环遍历每个术语以获得交集是痛苦的.有没有一种有效的方法来做到这一点?"记忆"和"速度"之间会有权衡吗?
您可以找到pandas的一些解决方法。
1)使用pandas.read_sql创建pandas DataFrame
2)然后你可以获得像@logc建议的那样的交叉连接
3) 之后,您可以将列表转换为集合并应用交集。
如果您需要帮助来实施,我会稍后帮助您,现在有点匆忙。
编辑:
好吧,确实很简单,但我不知道它是否具有您需要的性能,也许您需要一步步阅读csv文件:
import pandas, sqlite3
conn = sqlite3.connect(databaseFilePath)
df=pandas.read_sql('SELECT * FROM Terms;',conn)
df['Article Ids'] = df['Article Ids'].apply(eval).apply(set)
df['key'] = False
df2 = pandas.merge(df,df,on='key')
df2 = df2[df2.Term_x!=df2.Term_y]
df2['Common Articles IDS'] = df2.apply(lambda row:set.intersection(row['Article Ids_x'], row['Article Ids_y']), axis=1)
df2['No of Common Articles Ids'] = df2['Common Articles IDS'].apply(len)
df2['Common Articles IDS'] = df2['Common Articles IDS'].apply(list).apply(str)
df2[['Term_x','Term_y', 'No of Common Articles Ids', 'Common Articles IDS']].to_sql(outputTableName, conn)
Run Code Online (Sandbox Code Playgroud)