Я написал следующий код для предварительной обработки набора данных, как это:Оптимизировать Python код
StartLocation StartTime EndTime
school Mon Jul 25 19:04:30 GMT+01:00 2016 Mon Jul 25 19:04:33 GMT+01:00 2016
... ... ...
Он содержит список мест, посещаемых пользователем с начальным и конечным временем. Каждое местоположение может происходить несколько раз, и нет исчерпывающего списка мест. Из этого я хочу агрегировать данные для каждого местоположения (частота, общее время, среднее время). Для этого я написал следующий код:
def toEpoch(x):
try:
x = datetime.strptime(re.sub(r":(?=[^:]+$)", "", x), '%a %b %d %H:%M:%S %Z%z %Y').strftime('%s')
except:
x = datetime.strptime(x, '%a %b %d %H:%M:%S %Z %Y').strftime('%s')
x = (int(x)/60)
return x
#Preprocess data
df = pd.read_csv('...')
for index, row in df.iterrows():
df['StartTime'][index] = toEpoch(df['StartTime'][index])
df['EndTime'][index] = toEpoch(df['EndTime'][index])
df['TimeTaken'][index] = int(df['EndTime'][index]) - int(df['StartTime'][index])
total = df.groupby(df['StartLocation'].str.lower()).sum()
av = df.groupby(df['StartLocation'].str.lower()).mean()
count = df.groupby(df['StartLocation'].str.lower()).count()
output = pd.DataFrame({"location": total.index, 'total': total['TimeTaken'], 'mean': av['TimeTaken'], 'count': count['TimeTaken']})
print(output)
Этот код функционирует правильно, однако довольно неэффективен. Как я могу оптимизировать код?
EDIT: Основано на @Batman's полезные комментарии Я больше не итерации. Тем не менее, я все еще надеюсь на дальнейшее оптимизацию, если это возможно. Обновленный код:
df = pd.read_csv('...')
df['StartTime'] = df['StartTime'].apply(toEpoch)
df['EndTime'] = df['EndTime'].apply(toEpoch)
df['TimeTaken'] = df['EndTime'] - df['StartTime']
total = df.groupby(df['StartLocation'].str.lower()).sum()
av = df.groupby(df['StartLocation'].str.lower()).mean()
count = df.groupby(df['StartLocation'].str.lower()).count()
output = pd.DataFrame({"location": total.index, 'total': total['TimeTaken'], 'mean': av['TimeTaken'], 'count': count['TimeTaken']})
print(output)
Вам следует сгруппировать только один раз, а затем получить 'sum',' mean' и 'count' – furas
вам действительно нужно' .str.lower() '? вам действительно нужно регулярное выражение? – furas
@furas Места вводятся вручную, поэтому это необходимо, и регулярное выражение должно обрабатывать необычную временную метку. (См. [This] (https://stackoverflow.com/questions/41782874/valueerror-parsing-time-string)) – user7347576