эффективность кода, построение стержня и преобразование в матрицу переходов с вероятностями - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь построить сводную таблицу (позже собираюсь превратить в матрицу переходов для цепи Маркова).Ниже приведены поддельные данные, которые более или менее представляют реальные данные.У меня есть данные за 20 лет с не менее чем 200 миллионами строк в год.

import numpy as np
import pandas as pd

создание поддельных данных

  newd = {'year': [2001, 2002, 2005, 2002, 2004, 1999, 1999, 1999, 2012, 2000, 2010, 2005, 2006, 2009, 2009, 
                     2009, 2009, 2010, 2007, 2008, 2009, 2010, 2000, 2001, 2002],
         'tin': [12, 23, 24, 28,30, 12,7, 12, 12, 23, 24, 7, 12, 35, 39,37, 36, 333, 13, 13, 13, 13, 7, 7, 7],
         'ptin': [12, 23, 28, 22, 12, 12,0, 12, 12, 23, 27, 45, 99, 7, 7, 7, 7, 0, 17, 21, 26, 18, 0, 18, 19] }

несколько анализов выборки

newdf = pd.DataFrame (newd)

группа олова по банке плательщика

df=newdf.groupby(['tin', 'year'])['ptin'].groups

#print(list(df))
#print(np.unique(newdf['year'].values))

с использованием функции pivot_table для просмотра распределений по годам олова и ptin.

print(newdf.pivot_table(index=['tin', 'year'], columns='ptin', values=['ptin', 'tin'], aggfunc=len, fill_value=0))

приводит к

ptin      0   7   12  17  18  19  21  22  23  26  27  28  45  99
tin year                                                        
7   1999   1   0   0   0   0   0   0   0   0   0   0   0   0   0
    2000   1   0   0   0   0   0   0   0   0   0   0   0   0   0
    2001   0   0   0   0   1   0   0   0   0   0   0   0   0   0
    2002   0   0   0   0   0   1   0   0   0   0   0   0   0   0
    2005   0   0   0   0   0   0   0   0   0   0   0   0   1   0
12  1999   0   0   2   0   0   0   0   0   0   0   0   0   0   0
    2001   0   0   1   0   0   0   0   0   0   0   0   0   0   0
    2006   0   0   0   0   0   0   0   0   0   0   0   0   0   1
    2012   0   0   1   0   0   0   0   0   0   0   0   0   0   0
13  2007   0   0   0   1   0   0   0   0   0   0   0   0   0   0
    2008   0   0   0   0   0   0   1   0   0   0   0   0   0   0
    2009   0   0   0   0   0   0   0   0   0   1   0   0   0   0
    2010   0   0   0   0   1   0   0   0   0   0   0   0   0   0
23  2000   0   0   0   0   0   0   0   0   1   0   0   0   0   0
    2002   0   0   0   0   0   0   0   0   1   0   0   0   0   0
24  2005   0   0   0   0   0   0   0   0   0   0   0   1   0   0
    2010   0   0   0   0   0   0   0   0   0   0   1   0   0   0
28  2002   0   0   0   0   0   0   0   1   0   0   0   0   0   0
30  2004   0   0   1   0   0   0   0   0   0   0   0   0   0   0
35  2009   0   1   0   0   0   0   0   0   0   0   0   0   0   0
36  2009   0   1   0   0   0   0   0   0   0   0   0   0   0   0
37  2009   0   1   0   0   0   0   0   0   0   0   0   0   0   0
39  2009   0   1   0   0   0   0   0   0   0   0   0   0   0   0
333 2010   1   0   0   0   0   0   0   0   0   0   0   0   0   0

, что соответствует фрейму данныхсверху.

Теперь вопрос в том, эффективен ли этот код, если мне нужно запустить миллиарды строк для трех столбцов?скажем, будет 6,5 миллиона столбцов и последовательно 200 миллионов строк в течение многих лет.Кто-нибудь сталкивался с этим?

Теперь я также пытаюсь построить вероятность перехода, скажем, олова в год x при переходе от ptin y к ptin z?Есть мысли по этому поводу?Я знаю, что это слишком много, чтобы спросить, но, черт возьми, я получаю много ответов в Stackoverflow.Еще одна стратегия, о которой я думал, заключалась в том, чтобы складировать данные, но пока не знаю.

...