【发布时间】:2021-04-20 10:02:45
【问题描述】:
我是 Python 世界的新手,所以我的代码还不是“pythonic”。我有一个包含几千行的数据库,其中每一行代表一个酒吧/咖啡馆,并且对于一年中的每个月,我都有一个 0-1(0-100%)的数字,它告诉我平均有多少,那个酒吧已经满了。例如,酒吧“Python Friends”从 1 月到 10 月已经客满,但在一年的最后 2 个月内客满(example photo)。 这个任务的主要目标是计算每个酒吧的平均覆盖率,所以是逐行计算,但是问题是有些酒吧是在某个月份才开始营业的,所以我需要考虑只有那些列(例如,如果它从 6 月开始,我只计算最后 6 列)。同样,有些在某个月份关闭,所以我不考虑这一点。 here is an example of a few rows in which each combination is present
按照我的指示,我需要将每个月的覆盖率乘以该月的天数,然后将所有这些月相加,然后除以总天数。例如,如果一家酒吧只有一年中最后 3 个月的覆盖率,并且每个月的覆盖率是 100%,我将进行以下计算:(31 * 1 + 30 * 1 + 31 * 1)/92
我尝试了以下代码,但我确信它可以改进,因为即使我有一台相当不错的笔记本电脑,我也要等待很长时间才能编译它。此外,我需要对此进行改进并进行其他计算,例如获取季度数据覆盖率,因此我的代码目前还不是很好。有什么可以改进的?
#create dictionary to get months data
months = {'January' : 31,
'February': 29,
'March' : 31,
'April': 30,
'May' : 31,
'June': 30,
'July' : 31,
'August': 31,
'September' : 30,
'October': 31,
'November' : 30,
'December': 31
}
tobeappended = []
for i,j,m in zip(df['Start Month'],df['End Month'],df.index):
if (i!='Not Available') & (j!='Not Available'): #data coverage for those rows in which both 'Active From' and 'Active To' exist
middlemonths = 0
totaldays = 0
calc=0
newdf= df.loc[m:m,i:j] # make a subset of the current dataframe view in the for loop, to be able to acces its columns
for u in range(0,len(newdf.columns)): #get row calculation of days of coverage, then divide by total number of days
middlemonths += newdf.iloc[:,u] * months[newdf.columns[u]]
totaldays = np.array([months[x] for x in newdf.columns]).sum()
calc = middlemonths / totaldays
calc = calc.item()
tobeappended.append(calc) #list of coverages for those rows in which active to/active from are available, from the same year as the data
elif(i!='Not Available') & (j=='Not Available'):
aftermonths = 0
totaldays = 0
calc = 0
newdf = df.loc[m:m,i:'December']
for u in range(0, len(newdf.columns)):
aftermonths += newdf.iloc[:,u] * months[newdf.columns[u]]
totaldays = np.array([months[x] for x in newdf.columns]).sum()
calc = aftermonths / totaldays
calc = calc.item()
tobeappended.append(calc)
elif(i=='Not Available') & (j!='Not Available'):
beforemonths = 0
totaldays = 0
calc = 0
newdf = df.loc[m:m,'January':j]
for u in range(0, len(newdf.columns)):
beforemonths += newdf.iloc[:,u] * months[newdf.columns[u]]
totaldays = np.array([months[x] for x in newdf.columns]).sum()
calc = beforemonths / totaldays
calc = calc.item()
tobeappended.append(calc)
else:
newdf = df.loc[m:m, 'January':'December']
allmonths = 0
for u in range(0, len(newdf.columns)):
allmonths += newdf.iloc[:,u] * months[newdf.columns[u]]
totaldays = np.array([months[x] for x in newdf.columns]).sum()
calc = allmonths / totaldays
calc = calc.item()
tobeappended.append(calc)
tobeappended = np.array(tobeappended)
df['Data Coverage'] = tobeappended
P.S:这不是全部代码,我之前需要做一些清理工作。 正如我所说,我的主要目标是改进此代码并使其更快、更 Python 化,以便轻松添加更多部分。我知道这是一个很长的帖子,如果有任何问题,请告诉我,我会提供。感谢您的帮助和时间!
【问题讨论】: