簡體   English   中英

如何使此代碼更具pythonic功能?

[英]How can I make this code more pythonic?

我正在閱讀一堆日常文件,並使用glob將它們全部連接到單獨的數據框中。最終我將它們連接在一起並基本上創建了一個大文件,用於連接儀表板。 我對Python不太熟悉,但是我經常使用pandas和sklearn。

如您所見,我基本上只是讀取最近60(或更多)天的數據(最近60個文件)並為每個數據創建一個數據框。 這行得通,但我想知道是否還有更多的pythonic /更好的方法? 我觀看了有關pydata的視頻(大約不受PEP 8的限制,並確保您的代碼是pythonic),這很有趣。

(僅供參考,我之所以需要閱讀60天的時間,是因為客戶可以填寫很久以前發生的電話調查。今天,客戶要填寫有關7月份發生的電話調查。我需要知道該呼叫(持續了多長時間,主題是什么,等等)。

os.chdir(r'C:\\Users\Documents\FTP\\')
loc = r'C:\\Users\Documents\\'
rosterloc = r'\\mand\\'
splitsname = r'Splits.csv'
fcrname = r'global_disp_'
npsname = r'survey_'
ahtname = r'callbycall_'
rostername = 'Daily_Roster.csv'
vasname = r'vas_report_'
ext ='.csv'
startdate = dt.date.today() - Timedelta('60 day')
enddate = dt.date.today() 
daterange = Timestamp(enddate) - Timestamp(startdate)
daterange = (daterange / np.timedelta64(1, 'D')).astype(int)

data = []
frames = []
calls = []
bracket = []
try:
    for date_range in (Timestamp(startdate) + dt.timedelta(n) for n in range(daterange)):
        aht = pd.read_csv(ahtname+date_range.strftime('%Y_%m_%d')+ext)
        calls.append(aht)
except IOError:
        print('File does not exist:', ahtname+date_range.strftime('%Y_%m_%d')+ext)
aht = pd.concat(calls)
print('AHT Done')                 
try:
    for date_range in (Timestamp(startdate) + dt.timedelta(n) for n in range(daterange)):
        fcr = pd.read_csv(fcrname+date_range.strftime('%m_%d_%Y')+ext, parse_dates = ['call_time'])
        data.append(fcr)
except IOError:
        print('File does not exist:', fcrname+date_range.strftime('%m_%d_%Y')+ext)
fcr = pd.concat(data)
print('FCR Done')                                                
try:
    for date_range in (Timestamp(enddate) - dt.timedelta(n) for n in range(3)):
        nps = pd.read_csv(npsname+date_range.strftime('%m_%d_%Y')+ext, parse_dates = ['call_date','date_completed'])
        frames.append(nps)
except IOError:
        print('File does not exist:', npsname+date_range.strftime('%m_%d_%Y')+ext)
nps = pd.concat(frames)
print('NPS Done')                
try:
    for date_range in (Timestamp(startdate) + dt.timedelta(n) for n in range(daterange)):
        vas = pd.read_csv(vasname+date_range.strftime('%m_%d_%Y')+ext, parse_dates = ['Call_date'])
        bracket.append(vas)
except IOError:
        print('File does not exist:', vasname+date_range.strftime('%m_%d_%Y')+ext)
vas = pd.concat(bracket)
print('VAS Done')                 
roster = pd.read_csv(loc+rostername)
print('Roster Done')
splits = pd.read_csv(loc+splitsname)
print('Splits Done')      

我沒有更改名稱,但是恕我直言,它們應該更詳細一些。 pd ==熊貓? 不確定。 這是一些更Python的方式來編寫它:

from functools import partial
import logging
from operator import add, sub
import os
import datetime as dt
import contextlib

os.chdir(r'C:\\Users\Documents\FTP\\')
location = r'C:\\Users\Documents\\'
roster_location = r'\\mand\\'
splits_name = r'Splits.csv'
fcr_name = r'global_disp_'
nps_name = r'survey_'
aht_name = r'callbycall_'
roster_name = 'Daily_Roster.csv'
vas_name = r'vas_report_'
ext = '.csv'
start_date = dt.date.today() - Timedelta('60 day')
end_date = dt.date.today()
daterange = Timestamp(end_date) - Timestamp(start_date)
daterange = (daterange / np.timedelta64(1, 'D')).astype(int)
logger = logging.getLogger()    # logger is better than "print" in case, when you have multiple tiers to log. In this case: regular debug and exceptions


def timestamps_in_range(daterange, method=add):    # injected operation method instead of "if" statement in case of subtracting
    for n in xrange(daterange):
        yield method(Timestamp(start_date), dt.timedelta(n))    # use generators for creating series of data in place


def read_csv(name, date_range, **kwargs):    # use functions/methods to shorten (make more readable) long, repetitive method invocation
    return pd.read_csv(name + date_range.strftime('%Y_%m_%d') + ext, kwargs)


def log_done(module):    # use functions/methods to shorten (make more readable) long, repetitive method invocation
    logger.debug("%s Done" % module)


@contextlib.contextmanager    #contextmanager is great to separate business logic from exception handling
def mapper(function, iterable):
    try:
        yield map(function, iterable)    # map instead of executing function in "for" loop
    except IOError, err:
        logger.error('File does not exist: ', err.filename)


# Following code is visualy tight and cleaner. 
# Shows only what's needed, hiding most insignificant details and repetitive code

read_csv_aht = partial(read_csv, aht_name)    # partial pre-fills function (first argument) with arguments of this function (remaining arguments). In this case it is useful for feeding "map" function - it takes one-argument function to execute on each element of a list
with mapper(read_csv_aht, timestamps_in_range(daterange)) as calls:    # contextmanager beautifully hides "dangerous" content, sharing only the "safe" result to be used
    aht = pd.concat(calls)
    log_done('AHT')

read_csv_fcr = partial(read_csv, fcr_name)
with mapper(read_csv_fcr, timestamps_in_range(daterange)) as data:
    fcr = pd.concat(data)
    log_done('FCR')

read_csv_nps = partial(read_csv, nps_name, parse_dates=['call_date', 'date_completed'])
with mapper(read_csv_nps, timestamps_in_range(3, sub)) as frames:
    nps = pd.concat(frames)
    log_done('NPS')

read_csv_vas = partial(read_csv, vas_name, parse_dates=['Call_date'])
with mapper(read_csv_vas, timestamps_in_range(daterange)) as bracket:
    vas = pd.concat(bracket)
    log_done('VAS')

roster = pd.read_csv(location + roster_name)
log_done('Roster')

splits = pd.read_csv(location + splits_name)
log_done('Splits')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM