之前我们发过一期如何利用python制作可以自动聚类的申请人合作关系图(相关链接:
作图详解 | 利用Python绘制自动聚类力导布局图
)。随后有小伙伴提出问题,通常我们从数据库下载下来的数据是一条一条的,并且所有的申请人都在一个单元格中以分号隔开,如下:
而我们制作申请人合作关系的力导布局图需要的数据格式是如下这样的,即横坐标和纵坐标均是所有的申请人,中间的数据表示两两申请人之间的合作申请数量。
前后两种数据格式的转换如何实现?
今天我们这篇文章就是跟大家分享,如何将原始的数据格式变换成制作合作关系
力导布局
图所需要的数据格式。
另外,也有小伙伴问,
由于原始数据中,申请人的名称并不统一,各种中英文或缩写或全称的混搭,以通用公司为例,检索后提取的申请人的名称可能非常多,例如有如下这些:
这种情况下,我们统计起来非常麻烦,怎么来进行申请人名称的统一再进行排名统计?
今天这篇文章就来解答申请人数据处理的问题:
-
第一,统一申请人的名称,并做申请人的排名统计
-
第二,生成申请人的合作关系表格
STEP 1:准备数据
从INCOPAT中检索并下载数据,原始的申请人数据字段格式如下:
STEP 2:准备申请人名称文本
通过数据透视表统计所有的申请人名字,根据实际情况将需统一命名的申请人添加到对应的分组中,每个组之间用8个*号隔开,保存为“
name.txt”文件
。
手工分组结束后,需要给每个分组取个名字。名字位于分组的第一个位置。
最后得到的
“name.txt”文件,举
例如下:
在编辑txt文件时,为兼容所有操作系统,建议使用subline text软件打开编辑
(若采用windows系统自带的文本编辑器,将后文程序里的“\n”替换为“\r\n”即可)
。
STEP 3:统一申请人名称并做排名统计
将下述程序考入spyder中,适应性修改读入的excel文件与txt文件的名字并运行。
import
pandas
as
pd
#
导入
pandas
,用于操作
excel
文件
import
numpy
as
np
df=pd.read_excel(
'2018-05-13.xls'
,sheetname=
'sheet1'
)
#
打开
excel
文件
company_name=[]
#
备用空列表
for
i
in
df[
'
申请人
'
]:
#
对每个申请的申请人进行循环
if
pd.isnull(i):
#
如果是空白的,继续循环,不执行后面的语句
#print(i)
continue
if
';'
in
i:
#
如果是多个申请人合作申请
temp=i.split(
';'
)
#
拆分申请人
company_name.extend([j.upper().strip()
for
j
in
temp])
#
把每个申请人的名字统一到大写字母,去掉开头结尾空格,再加入备用列表
else
:
company_name.append(i.upper().strip())
with
open(
'name.txt'
,
'r'
,encoding=
'utf-8'
)
as
f:
#
修改文本文件的名字以适应实际情况
name_txt=f.read()
name_txt=name_txt.split(
'\n********\n'
)
names_dic={}
for
i
in
name_txt:
temp=i.strip().split(
'\n'
)
for
i
in
temp[
1
:]:
if
i:
names_dic[i]=temp[
0
].strip()
else
:
pass
statistics_dic={}
for
i
in
set(company_name):
if
i
in
names_dic:
statistics_dic[names_dic[i]]=
0
else
:
statistics_dic[i]=
0
for
i
in
company_name:
if
i
in
names_dic:
statistics_dic[names_dic[i]]+=
1
else
:
statistics_dic[i]+=
1
df1=pd.DataFrame(index=[i
for
i
in
statistics_dic],data=[statistics_dic[i]
for
i
in
statistics_dic])
writer = pd.ExcelWriter(
'
申请量统计
.xlsx'
)
df1.to_excel(writer)
writer.save()
company_name1=[]
#
备用空列表
for
i
in
df[
'
申请人
'
]:
#
对每个申请的申请人进行循环
if
pd.isnull(i):
#
如果是空白的,继续循环,不执行后面的语句
#print(i)
continue
if
';'
in
i:
#
如果是多个申请人合作申请
temp=i.split(
';'
)
#
拆分申请人
company_name1.append([j.upper().strip()
for
j
in
temp])
#
把每个申请人的名字统一到大写字母,去掉开头结尾空格,再加入备用列表
else
:
company_name1.append(i.upper().strip())
update_list=[]
for
i
in
company_name1:
if
type(i)==list:
temp=[]
for
j
in
i:
if
j
in
names_dic:
temp.append(names_dic[j])
else
:
temp.append(j)
temp=list(set(temp))
if
len(temp) >
1
:
str_temp=
''
for
k
in
temp:
str_temp+=k+
';'
update_list.append(str_temp)
else
:
update_list.append(temp[
0
])
else
:
if
i
in
names_dic:
update_list.append(names_dic[i])
else
:
update_list.append(i)
df1=pd.DataFrame(index=[i
for
i
in
range(len(update_list))],data=update_list)
writer = pd.ExcelWriter(
'
申请人一列更新
.xlsx'
)
df1.to_excel(writer)
writer.save()
由此得到统计好申请人排名的excel表:
STEP 4:生成申请人合作矩阵
将下述程序考入spyder中,适应性修改读入的excel文件与txt文件的名字(若直接采用上一步生成的excel数据,则不需要修改)并运行。
import
pandas
as
pd
#
导入
pandas
,用于操作
excel
文件
import
numpy
as
np
df3=pd.read_excel(
'
申请人一列更新
.xlsx'
)
name_cooperation={}
name_cooperation_list=[]
for
i
in
df3[
0
]:
if
';'
in
i:
temp=i.split(
';'
)
for
i
in
temp:
if
i:
if
i
notin