Как использовать метод рефакторинга с функциями в коде Python?

#python #pandas #refactoring

#python #pandas #рефакторинг

Вопрос:

Я нахожусь на этапе обучения написанию кода на python. Я создал приведенный ниже код и успешно получил результаты, однако меня попросили провести рефакторинг кода, и я не очень уверен, как поступить. Я ссылался на несколько сообщений, связанных с рефакторингом, но еще больше запутался и не понял, как это делается. Любая помощь будет оценена. Спасибо.

 import pandas as pd
import numpy as np
pd.set_option('display.max_columns',100)
data = pd.read_excel (r'S:folderfile1.xlsx')
df_mail =pd.DataFrame(data,columns= ['CustomerName','CDAAccount','Transit'])
print(df_mail)
df_maillist =df_mail.rename(columns={'CDAAccount':'ACOUNT_NUM','Transit':'BRANCH_NUM'})
print(df_maillist)

## 1) Read SAS files 
pathcifbas = 'S:foldercustbas.sas7bdat'
pathcifadr = 'S:foldercusadr.sas7bdat'
pathcifacc = 'S:foldercusact.sas7bdat'

##custbas.sas7bdat 

columns=['CIFNUM','CUSTOMR_LANGUG_C']
dfcifbas = pd.read_sas(pathcifbas)
print(dfcifbas.head())
df_langprf= dfcifbas[columns]
print(df_langprf.head())
df_lang =df_langprf.rename(columns={'CUSTOMR_LANGUG_C':'Language Preference'})
print(df_lang)

## cusadr.sas7bdat

dfcifadr = pd.read_sas(pathcifadr)
print(dfcifadr.head())
cols=['CIFNUM','ADRES_STREET_NUM','ADRES_STREET_NAME','ADRES_CITY','ADRES_STATE_PROV_C','FULL_POSTAL','ADRES_COUNTRY_C','ADRES_SPECL_ADRES']
df_adr= dfcifadr[cols]
print(df_adr.head)

### Renaming the columns
df_adrress =df_adr.rename(columns={'ADRES_CITY':'City','ADRES_STATE_PROV_C':'Province','FULL_POSTAL':'Postal Code','ADRES_COUNTRY_C':'Country','ADRES_SPECL_ADRES':'Special Address'})
print(df_adrress)

## cusact.sas7bdat

dfcifacc = pd.read_sas(pathcifacc)
print(dfcifacc.head())
colmns=['CIFNUM','ACOUNT_NUM','BRANCH_NUM','APLICTN_ID']
df_acc= dfcifacc[colmns]
print(df_acc)
## Filtering the tables with ['APLICTN_ID']== b'CDA'
df_cda= df_acc['APLICTN_ID']== b'CDA'
print(df_cda.head())
df_acccda = df_acc[df_cda]
print(df_acccda)

## Joining dataframes (df_lang), (df_adrress) and (df_acccda) on CIF_NUM
from functools import reduce
Combine_CIFNUM= [df_acccda,df_lang,df_adrress ]
df_cifnum = reduce(lambda left,right: pd.merge(left,right,on='CIFNUM'), Combine_CIFNUM)
print(df_cifnum)

#convert multiple columns object byte to string

df_cifnumstr= df_cifnum.select_dtypes([np.object])
df_cifnumstr=df_cifnumstr.stack().str.decode('latin1').unstack()
for col in df_cifnumstr:
   df_cifnum[col] = df_cifnumstr[col]
print(df_cifnum) ## Combined Data Frame

# Joining Mail list with df_cifnum(combined dataframe)

Join1_mailcifnum=pd.merge(df_maillist,df_cifnum, on=['ACOUNT_NUM','BRANCH_NUM'],how='left')
print(Join1_mailcifnum)

## dropping unwanted columns

Com_maillist= Join1_mailcifnum.drop(['CIFNUM','APLICTN_ID'], axis =1)
print(Com_maillist)

## concatenating Street Num   Street Name = Street Address

Com_maillist["Street Address"]=(Com_maillist['ADRES_STREET_NUM'].map(str)  ' '   Com_maillist['ADRES_STREET_NAME'].map(str))
print (Com_maillist.head())

## Rearranging columns

Final_maillist= Com_maillist[["CustomerName","ACOUNT_NUM","BRANCH_NUM","Street Address","City","Province","Postal Code","Country","Language Preference","Special Address"]]
print(Final_maillist)

## Export to excel

Final_maillist.to_excel(r'S:Data AnalysisfolderFinal_List.xlsx',index= False, sheet_name='Final_Maillist',header=True)```
 

Комментарии:

1. «Рефакторинг» просто означает изменение кода. Они дали вам какие-либо подсказки о том, что нужно изменить?

2. они просто сказали преобразовать код в функции

Ответ №1:

Хороший рефакторинг кода может состоять из множества различных этапов и в зависимости от того, чего ожидает ваш преподаватель / клиент / менеджер / и т.д., может потребовать совершенно разных затрат усилий и времени. Хорошей идеей будет спросить этого человека, какие у него ожидания от этого конкретного проекта, и начать с этого.

Однако для тех, кто относительно новичок в Python, я бы порекомендовал вам начать с удобства чтения и организации. Убедитесь, что все ваши имена переменных являются явными и удобочитаемыми (при условии, что вы не используете обязательный шаблон, такой как венгерская нотация). В качестве отправной точки соглашения об именовании Python, как правило, используют строчные буквы и символы подчеркивания, с исключениями для определенных объектов или имен классов. На самом деле в Python есть действительно подробное руководство по стилю под названием PEP-8. Вы можете найти его здесь

https://www.python.org/dev/peps/pep-0008/

Мой личный фаворит — комментарии. Комментарии всегда должны содержать «почему» чего-либо, не обязательно «как» (ваш код должен быть достаточно читаемым, чтобы сделать эту часть относительно очевидной). Это немного сложнее для небольших сценариев или заданий, где у вас нет тонны индивидуального выбора, но это полезно иметь в виду.

Если вы изучали объектно-ориентированное программирование, вам обязательно следует разделить задачи на функции и классы. В вашем конкретном случае вы можете создавать отдельные функции для таких вещей, как загрузка файлов, выполнение определенных операций с содержимым файла и экспорт. Если вы заметили кучу функций, которые, как правило, имеют похожие темы, возможно, сейчас самое время подумать о создании класса для этих функций!

Наконец, и снова это личное предпочтение (в любом случае, для базовых сценариев), но мне нравится видеть основное объявление для удобства чтения и организации.

 # imports go here!

# specific functions
def some_function():
    return

if __name__ == "__main__":
    # the start of your program goes here!
 

Все это довольно сильно упрощено для целей только начинающих. Существует множество других ресурсов, которые могут углубить организацию, передовые методы и оптимизацию.

Удачи!