首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据所生成的列表数据制作熊猫数据

如何根据所生成的列表数据制作熊猫数据
EN

Stack Overflow用户
提问于 2020-08-16 10:25:44
回答 1查看 128关注 0票数 4

我有一份合著者名单:

代码语言:javascript
复制
ten_author_pairs = [('creutzig', 'gao'),
 ('creutzig', 'linshaw'),
 ('gao', 'linshaw'),
 ('jing', 'zhang'),
 ('jing', 'liu'),
 ('zhang', 'liu'),
 ('jing', 'xu'),
 ('briant', 'einav'),
 ('chen', 'gao'),
 ('chen', 'jing')]

在这里,我可以生成一个负面示例的列表,即作者对,它们使用以下代码不连接:

代码语言:javascript
复制
#generating negative examples - 

from itertools import combinations

elements = list(set([e for l in ten_author_pairs for e in l])) # find all unique elements

complete_list = list(combinations(elements, 2)) # generate all possible combinations

#convert to sets to negate the order

set1 = [set(l) for l in ten_author_pairs]
complete_set = [set(l) for l in complete_list]

# find sets in `complete_set` but not in `set1`
ten_unconnnected = [list(l) for l in complete_set if l not in set1]

print(len(ten_author_pairs))
print(len(ten_unconnnected))

接下来,我想实现一个链接预测问题,为此我想获得如下数据:

代码语言:javascript
复制
author-pair          jaccard   Resource_Allocation    Adamic_Adar   Preferential cn_soundarajan_hopcroft      within_inter_cluster     link
creutzig-linshaw      0.25       0.25                  0.25          0.25          0.25                         0.25                     1 

我可以使用networkx文档计算这些数据,并有分数作为输出的列表,但是我不能像上面所示的那样把它作为一个表放在一起。

与正面示例(上面提到的列表)一样,我可以使用以下方法生成一个数据文件:

代码语言:javascript
复制
df = pd.DataFrame(list, columns = ['u1','u2])

然后用以下图形绘制一个图形:

代码语言:javascript
复制
G = nx.from_pandas_edgelist(df, u1, u2, create_using = nx.Graph())

之后,例如对于jaccard索引,我可以应用:

代码语言:javascript
复制
nx.jaccard_coefficient(G)

它返回一个带有jaccard分数的节点对的列表。

“link”列是用逻辑生成的-1表示合著者,0用于负示例中的对。

但是,我需要所有的分数作为一张表,如前所述。

有谁能帮我如何构造上面的数据。

(上面提到的分数只是为了表示我需要的表格类型)。

EN

回答 1

Stack Overflow用户

发布于 2022-09-14 13:17:50

哦--这两年不错,但我偶然发现了this...in的案子,我正确地理解了你,在你的基础上:

代码语言:javascript
复制
from itertools import combinations
import pandas as pd
import networkx as nx

elements = list(set([e for l in ten_author_pairs for e in l]))
complete_list = list(combinations(elements, 2))
set1 = [set(l) for l in ten_author_pairs]

df = pd.DataFrame(set1, columns=["u1", "u2"])
G = nx.from_pandas_edgelist(df, "u1", "u2", create_using=nx.Graph())

然后定义生成器列表

代码语言:javascript
复制
list_generators = [
    nx.jaccard_coefficient,
    nx.resource_allocation_index,
    nx.adamic_adar_index,
    nx.preferential_attachment,
]

构建得分数据:

代码语言:javascript
复制
dfx = pd.DataFrame()
for item_generator in list_generators:
    if dfx.shape[0]:
        dfx = dfx.merge(
            right=get_df_network(generator=item_generator, graph=G),
            left_index=True,
            right_index=True,
        )
    else:
        dfx = get_df_network(generator=item_generator, graph=G)

最后合并到链接dataframe中。

代码语言:javascript
复制
df_link = (
    pd.DataFrame(set1, columns=["node_0", "node_1"])
    .set_index(["node_0", "node_1"])
    .assign(link=[1] * len(set1))
)

dfx.merge(df_link, left_index=True, right_index=True, how="outer").fillna(0)

能做这份工作吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63435728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档