Expasys BI
Руководство пользователя (версия 2023.2)
×

Трансформация данных

 
Так как большая часть нужных данных хранится в столбце 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(', ')