Python 如何计算随时间变化的几天内变量值的共现率,以生成邻接列表?

Python 如何计算随时间变化的几天内变量值的共现率,以生成邻接列表?,python,pandas,Python,Pandas,我正在分析谷歌云上GDELT新闻文档数据库中的数据。该文件包含日期列、300个主题代码之一的列和频率值 这是我的数据。示例数据文件大约有46000行: 这里列出了284个独特的主题: 我需要在每一天内,创建成对的主题,根据它们的频率进行加权。然后,我需要输出一个邻接列表:theme_A、theme_B和weight,以便随后对主题进行网络分析。我被困在计算主题协同发生的点上 #Import packages import pandas as pd import numpy as np #Re

我正在分析谷歌云上GDELT新闻文档数据库中的数据。该文件包含日期列、300个主题代码之一的列和频率值

这是我的数据。示例数据文件大约有46000行:

这里列出了284个独特的主题:

我需要在每一天内,创建成对的主题,根据它们的频率进行加权。然后,我需要输出一个邻接列表:theme_A、theme_B和weight,以便随后对主题进行网络分析。我被困在计算主题协同发生的点上

#Import packages
import pandas as pd
import numpy as np

#Read in data file
df = pd.read_csv(r'C:\Users\james\Desktop\Documents\Downloads\Cybersecurity\cybertime.csv')
df.head

#Create bigrams of themes by days, based on cooccurrences weighted by frequencies.
#Iterate rows until new date is found, then compute weighted cooccurrences.
#Weights are products of theme A frequency (freq) and theme B frequency.


#Output the adjacency list.

您可以尝试将自定义函数与groupBy一起使用,并与pandas数据帧一起应用。看

或者:

df.groupby(['date', 'theme'])['frequency'].apply(lambda x : x.astype(int).sum() 

首先,您可以选择从包含GDELT-Global_Knowledge_Graph_CategoryList中未包含主题的初始csv文件中筛选出所有行:

df = pd.read_csv('cybertime.csv')
gdelt = pd.read_csv('GDELT-Global_Knowledge_Graph_CategoryList.csv')
df.drop(df.loc[~df.theme.isin(gdelt.Name)].index, inplace=True)   # optional
接下来,您可以旋转数据帧以获得一个包含30行(每天一行)和194列(每个主题一列)的矩阵。如果不进行筛选,则会得到一个30x1028数据帧

从这一点开始,您可以将转置矩阵与原始矩阵进行矩阵乘积:它将为您提供一个194x194矩阵,其中包含事件对频率的乘积之和(如果未过滤,则与上面的1028x1028相同)

您只需取消激活(
melt
)该矩阵即可获得邻接列表

代码可以是:

df2 = df.pivot(index='date', columns='theme', values='freq').fillna(0)

df3 = pd.DataFrame(np.transpose(df2.values) @ df2.values,
                   index=df2.columns, columns = df2.columns)

df4 = df3.rename_axis('theme_A').reset_index().melt(
    id_vars=['theme_A'], var_name='theme_B', value_name='weight')

我想你要找的是团购谢谢!一旦我在日期上做了groupby,我将如何为每个日期制作所有主题Bigram(按成对元素频率的乘积加权)?您的文件包含1024个主题。如何将它们分组以仅获得300个?共有284个独特的主题。groupBy,然后使用自定义函数应用以按频率计算权重,df.groupBy(['date','theme'])[“frequency”]。应用(lambda x:x.astype(int).sum()谢谢!这可以很好地按日期和主题对数据进行分组。但是,下一步我该如何做——生成协同发生,每个日期的协同发生列表为:主题\u A主题\u B协同发生频率?例如:协同恐怖61E.G:协同恐怖61\n协同情报14\n情报短缺77,等等。