улучшить производительность в pandas python - PullRequest
1 голос
/ 22 марта 2019

Вот пример моего набора данных с некоторых видов общественного транспорта: набор данных .

Дата с 2018-06-01 по 2018-06-30,

Время - часы работы, с 5 до 24 (0) утра,

Люди - это количество людей в определенную дату, время и поездку.

from_to - это место, куда эти люди входят и выходят (один тип поездок),

и, наконец, день недели.

Что мне нужно сделать здесь, так это создать расписание для каждой поездки, например, если я хочу создать таблицу для поездки "G1_G2", код, который я сейчас использую:

for i in [0,1,2,3,4,5,6]:
    for j in [0,1,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]:
        df['people'][(df['weekday'] == i)&(df['from_to'] == 'G1_G2') & (df['time'] == j)].mean()

Где "i" - день недели, а j - часы работы. Результатом будет таблица типа: таблица вывода

Но проблема здесь в том, что на создание каждой таблицы уходит около 10 секунд, здесь есть около 11 000 типов поездок, которые займут 30 с лишним часов.

Есть ли другие способы сделать это с большей эффективностью, используя python?

Спасибо заранее!

1 Ответ

0 голосов
/ 22 марта 2019

Вероятно, с помощью группирования и агрегирования вы можете сделать это.

import pandas as pd

Умышленно я привожу здесь небольшой пример данных. Если у вас много таблиц меньшего размера, как я понимаю из вашего описания, вы можете объединить их раньше.

df = pd.DataFrame({'date':['2018-06-01', '2018-06-01', '2018-06-01', '2018-06-02', '2018-06-02', '2018-06-02'], 'time':[0,0,0,1,1,1], 'people':[0,2,2,4,5,7], 'from_to':['BR13_BR13', 'BR13_BR13','BR13_BR13','BR13_BR13','BR13_BR13','BR13_BR13'], 'weekday':[4,4,4,5,5,5]})

Следующий код приводит к длинному формату, а не к широкому формату, который есть в вашей выходной таблице, но его можно сделать широким, если вы хотите:

df.groupby(['from_to', 'time', 'weekday']).aggregate('people').mean()

Что приводит к следующему выводу:

from_to    time  weekday
BR13_BR13  0     4          1.333333
           1     5          5.333333
Name: people, dtype: float64
...