Трансформация данных
Так как большая часть нужных данных хранится в столбце Fields таблицы items_df в стиле словаря, необходимо преобразовать эти данные в плоское представление.
Новая таблица будет содержать следующие поля:
-
Идентификатор книги - _id
-
Удаление (bool) - is_deleted
-
Дата загрузки - creation_date
-
Автор книги - author
-
Автор книги (с инициалами) - short_author_name',
-
Заглавие - title
-
Сведения о заглавии - title_info
-
Сведения об ответственности - responsibility_info
-
Расстановочный признак - item_part
-
Место публикации - publication_place
-
Издательство - publisher
-
Количество экземпляров - organisation_unit
-
Гриф (bool) - is_grif
-
Тип публикации - publication_type
-
Типы публикации (если указано несколько типов, они будут перечислены через запятую) - publication_type_sep
-
Гриф - grif
-
Электронный ресурс (bool) - is_electronic
-
Дата публикации - date_of_publication
-
Объем - size
-
UDC - udc_number
-
Номер - local_call_number
-
Инвентарный номер - inventory_number
-
Сведения об издательстве - publisher_info
-
Часть произведения - part_number
-
Прочее - other
-
Заголовок раздела - title_part
data=pd.DataFrame(columns=['_id', 'is_deleted', 'creation_date', 'author', 'short_author_name', 'title', 'title_info',
'responsibility_info', 'item_part', 'publication_place', 'publisher', 'organisation_unit', 'is_grif',
'publication_type', 'publication_type_sep', 'grif', 'is_electronic', 'date_of_publication', 'size', 'udc_number',
'local_call_number', 'inventory_number', 'publisher_info', 'part_number', 'other', 'title_part'])
data[['_id','is_deleted','creation_date']]=items_df[['_id','IsDeleted','CreationDate']]
data[['author', 'short_author_name', 'title', 'title_info', 'responsibility_info', 'item_part', 'publication_place', 'publisher', 'organisation_unit', 'is_grif', 'publication_type', 'publication_type_sep', 'grif', 'is_electronic', 'date_of_publication', 'size', 'udc_number', 'local_call_number', 'inventory_number', 'publisher_info', 'part_number', 'other', 'title_part']]= ['','','','','','','','',0,False,'','','',False,'','','','','','','','','',]
for i in data.index:
i_df=pd.DataFrame(items_df.loc[items_df['_id']==data['_id'][i], 'Fields'][i])
publication_place, publisher=[],[]
#Тег 100
for j in i_df.loc[i_df['Tag']=='100', 'Subfields']:
j_df=pd.DataFrame(j)
#Автор (100a)
try:
for k in j_df.loc[j_df['Code']==ord('a'), 'Data']:
data['author'][i]=k
data['short_author_name'][i]=get_short_name(data['author'][i])
except:
pass
#Тег 245
for j in i_df.loc[i_df['Tag']=='245', 'Subfields']:
j_df=pd.DataFrame(j)
#Заглавие (245a)
try:
for k in j_df.loc[j_df['Code']==ord('a'), 'Data']:
data['title'][i]=k
except:
pass
#Сведения о заглавии (245b)
try:
for k in j_df.loc[j_df['Code']==ord('b'), 'Data']:
data['title_info'][i]=k
except:
pass
#Сведения об ответственности (245c)
try:
for k in j_df.loc[j_df['Code']==ord('c'), 'Data']:
data['responsibility_info'][i]=k
except:
pass
#Часть произведения (245n)
try:
for k in j_df.loc[j_df['Code']==ord('n'), 'Data']:
data['part_number'][i]=k
except:
pass
#Заголовок раздела (245p)
try:
for k in j_df.loc[j_df['Code']==ord('p'), 'Data']:
data['title_part'][i]=k
except:
pass
#Тег 852
for j in i_df.loc[i_df['Tag']=='852', 'Subfields']:
j_df=pd.DataFrame(j)
#Расстановочный признак (852i)
try:
for k in j_df.loc[j_df['Code']==ord('i'), 'Data']:
data['item_part'][i]=k
except:
pass
#Количество экземпляров по тег-кодам 852t | 852p+852q
try:
count=0
for k in j_df.loc[j_df['Code']==ord('t'), 'Data']:
try:
count+=int(k)
break
except:
pass
if count!=0:
data['organisation_unit'][i]+=count
else:
for k in j_df.loc[j_df['Code']==ord('p'), 'Data']:
data['organisation_unit'][i]+=1
for k in j_df.loc[j_df['Code']==ord('q'), 'Data']:
index1, index2 = k.find('('), k.find(')')
if index1!=-1 and index2!=-1:
data['organisation_unit'][i]+=int(k[index1+1:index2])
except:
pass
#Инвентарный номер (852p)
try:
for k in j_df.loc[j_df['Code']==ord('p'), 'Data']:
data['inventory_number'][i]=k
except:
pass
#Тег 260
for j in i_df.loc[i_df['Tag']=='260', 'Subfields']:
j_df=pd.DataFrame(j)
#Место публикации (260a)
try:
for k in j_df.loc[j_df['Code']==ord('a'), 'Data']:
publication_place.append(k)
data['publication_place'][i]=";".join(publication_place)
except:
pass
#Издательство (260b)
try:
for k in j_df.loc[j_df['Code']==ord('b'), 'Data']:
publisher.append(k)
data['publisher'][i]=":".join(publisher)
except:
pass
#Дата (260c)
try:
for k in j_df.loc[j_df['Code']==ord('c'), 'Data']:
data['date_of_publication'][i]=k
except:
pass
#Тег 653
for j in i_df.loc[i_df['Tag']=='653', 'Subfields']:
j_df=pd.DataFrame(j)
#Электронный ресурс и гриф (653a)
try:
for k in j_df.loc[j_df['Code']==ord('a'), 'Data']:
data['is_electronic'][i]=(k.lower().__contains__('электронные ресурсы') or k.lower().__contains__('электронный ресурс'))
data['is_grif'][i]=(k=='*' or k=='**')
except:
pass
#Тег 887
for j in i_df.loc[i_df['Tag']=='887', 'Subfields']:
j_df=pd.DataFrame(j)
#Организационное подразделение (887T)
try:
for k in j_df.loc[j_df['Code']==ord('T'), 'Data']:
data['organisation_unit'][i]+=int(k)
except:
pass
#Тип публикации и гриф (887a)
try:
for k in j_df.loc[j_df['Code']==ord('a'), 'Data']:
if k.__contains__('type_') and k.replace('type_', '')!='':
if data['publication_type'][i]=='':
data['publication_type'][i]=k.replace('type_', '')
else:
data['publication_type_sep'][i]+=k.replace('type_', '')+', '
elif k.__contains__('grif_') and grif=='':
data['grif'][i]=k.replace('grif_', '')
except:
pass
#Тег 300
for j in i_df.loc[i_df['Tag']=='300', 'Subfields']:
j_df=pd.DataFrame(j)
#Объем (300a)
try:
for k in j_df.loc[j_df['Code']==ord('a'), 'Data']:
data['size'][i]=k
except:
pass
#Прочее (300b)
try:
for k in j_df.loc[j_df['Code']==ord('b'), 'Data']:
data['other'][i]=k
except:
pass
#Тег 080
for j in i_df.loc[i_df['Tag']=='080', 'Subfields']:
j_df=pd.DataFrame(j)
#UDC (080a)
try:
for k in j_df.loc[j_df['Code']==ord('a'), 'Data']:
data['udc_number'][i]=k
except:
pass
#Тег 090
for j in i_df.loc[i_df['Tag']=='090', 'Subfields']:
j_df=pd.DataFrame(j)
#? (090c)
try:
for k in j_df.loc[j_df['Code']==ord('c'), 'Data']:
data['local_call_number'][i]=k
except:
pass
#Тег 250
for j in i_df.loc[i_df['Tag']=='250', 'Subfields']:
j_df=pd.DataFrame(j)
#Сведения об издательстве (250a)
try:
for k in j_df.loc[j_df['Code']==ord('a'), 'Data']:
data['publisher_info'][i]=k
except:
pass
if publication_type=='':
data['publication_type'][i]='Учебная'
if publication_type_sep=='':
data['publication_type_sep'][i]='Учебная'
data['publication_type_sep']=data['publication_type_sep'].str.strip(', ')
|