Python 如何计算随时间变化的几天内变量值的共现率,以生成邻接列表?
我正在分析谷歌云上GDELT新闻文档数据库中的数据。该文件包含日期列、300个主题代码之一的列和频率值 这是我的数据。示例数据文件大约有46000行: 这里列出了284个独特的主题: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
我需要在每一天内,创建成对的主题,根据它们的频率进行加权。然后,我需要输出一个邻接列表: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,等等。