создание таблицы векторов вычитания панд - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть серия с DatetimeIndex и целочисленным значением.Я хочу сделать таблицу, которая показывает изменение стоимости от каждого времени ко всем другим последующим разам.

Ниже приведено визуальное представление того, что я хочу.Серые и оранжевые ячейки не имеют отношения к данным.

enter image description here Я не могу найти способ создать это в векторизованном стиле внутри панд.

z = pd.DatetimeIndex(periods=10, freq='H', start='2018-12-1')
import random
df = pd.DataFrame(random.sample(range(1, 100), 10), index=z, columns=['foo'])

Я пробовал что-то вроде:

df['foo'].sub(df['foo'].transpose())

Но это не работает.

Выходной DataFrame может иметь мультииндекс (beforeTime, AfterTime) или может иметь отдельный индекс beforeTime, а затем иметь столбец для каждого возможного «aftertime».Я думаю, что они эквивалентны, так как я могу использовать unstack () и связанные функции, чтобы получить желаемую форму?

1 Ответ

0 голосов
/ 13 декабря 2018

Я думаю, что вы можете использовать np.substract с np.outer для вычисления всех значений и создания фрейма данных, например:

df_output = pd.DataFrame(np.subtract.outer(df.foo, df.foo), 
                         columns= df.index.time, index=df.index.time)
print (df_output.head())
          00:00:00  01:00:00  02:00:00  03:00:00  04:00:00  05:00:00  \
00:00:00         0         6        -7       -57       -33         3   
01:00:00        -6         0       -13       -63       -39        -3   
02:00:00         7        13         0       -50       -26        10   
03:00:00        57        63        50         0        24        60   
04:00:00        33        39        26       -24         0        36   

          06:00:00  07:00:00  08:00:00  09:00:00  
00:00:00       -53       -28         5        17  
01:00:00       -59       -34        -1        11  
02:00:00       -46       -21        12        24  
03:00:00         4        29        62        74  
04:00:00       -20         5        38        50  

Вы можете использовать np.triu, чтобы установить 0 все значенияв вашем примере серым цветом, таким как:

pd.DataFrame(np.triu(np.subtract.outer(df.foo, df.foo)), columns = ...)

Обратите внимание, что .time не требуется при создании columns= и index=, это было для копирования и вставки читаемого кадра данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...