У меня есть дата-карта, имеющая все данные транзакций клиентов. столбцы - mailid, txn_date, city. Теперь у меня есть ситуация, когда мне приходится рассматривать клиент от 01jan2016 и для каждого из mailid в том, что я должен извлекать их данные txn из базового файла и учитывая их последние данные за 12 месяцев (txn date между последней датой Txn и -365days timedelta) затем выяснив их максимальное имя города.Зацикливание над фреймворком данных и получение связанных данных из другого фрейма данных: PANDAS
образца база dataframe
#df
maild txn_date city
satya 2015-07-21 a
satya 2015-08-11 b
satya 2016-05-11 c
xyz 2016-06-01 f
satya 2016-06-01 a
satya 2016-06-01 b
Как мне нужно Касты от 2016-01-01, так что я сделал
d = df[['mailid', 'txn-date']][df['txn_date'] >= '2016-01-01']
теперь для каждого mailid в д я должен принести каждый из их последней сделки 12month данные из базы Dataframe df и рассчитывают их максимальный город. Для этого я использую для цикла как
x = d.groupby(['mailid'])['txn-date'].max().reset_index() #### finding their last transacted date to find out a 12 Month back date
x['max_city'] = 'N' ## giving default value as 'N'
for idx,row in x.iterrows():
g = row[1].date()
h = g-timedelta(days=365) ###getting the last 12 Month date
y = df[(df['mailid']==row[0]) & (df['txn_date'] >= str(h))]
y.sort(['txn_date'],ascending=True,inplace=True) ### sorting it bcoz i want to consider the last txn when count for one or more cities become same
c = y.groupby(['mailid','city']).size().reset_index()
v = c.groupby(['mailid'])[0].max().reset_index()
dca = pd.merge(y,c,on=['mailid','city'],how='left')
dcb = pd.merge(dca,v,on=['mailid',0])
m = dcb.drop_duplicates(['mailid'],take_last=True)
row[2] = m['city'].unique()[0]
о/р:
maild max_city
satya b ### as in last 12 month 2016-06-01 2015-06-01 txn in a=2 b= 2 so last is b so will consider b as max city
xyz f
Хотя мой код работает (я уверен, что это не-организованной и не собственно именования не используется, как я практиковал) для небольшого фрагмента данных, и цикл попадет в основную базовую базу данных df для каждого клиента, присутствующего в кадре данных x.
Так что моя главная проблема заключается в том, что мой df будет состоять из 100Mln строк и x будет из 6 миллионов строк. то цикл for выполнит 6Mln раз и ударит df для извлечения согласованных данных mailid и выполнит операцию по поиску максимального транзакционного города.
, если в течение 1 минут он рассчитает 3 максимум города mailid. то за 6 млн. потребуется 2 млн. минут ... что будет серьезной проблемой ...
Так что вам нужно знать, как оптимизировать сценарий. Потребительская атака на базовую базу меньше времени и применение более удобных PANDAS путь к тому, что (чего я еще не могу сделать) ...
Пожалуйста, предложите !!!! Спасибо в Adv.
Город - это текстовая колонка, и вы хотите объединить * максимальное название города с транзакцией *? Вы имеете в виду макс. Города? Или в алфавитном наивысшем городе? – Parfait
@ Parfait-Ровно !!! Я хочу макс. подсчета городов, или вы можете сказать, что любимый город ... – Satya