Промежуточный итог по категориям за каждый день в панде - PullRequest
0 голосов
/ 31 января 2019

У меня есть кадр данных pandas с транзакциями с акциями, которые происходят не каждый день и не для каждой акции:

Цель состоит в том, чтобы получить (ежедневные) веса каждой акции за каждый день.

Стартовая таблица и ожидаемый результат

Это означает - создание полного календаря дат - повторение кумулятивных долей для каждой акции на каждую дату - и, наконец, вычисление веса для этой даты

Сомоне сможет мне помочь в этом?Я уже искал несколько тем, но не смог найти какое-либо рабочее решение.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Отлично!Это вдохновило меня найти способ решить проблему!Проблема в вашем решении состояла в том, что если в исходном наборе данных появляется запас D (добавленный в нижнем наборе), он больше не будет работать.

Я смог решить эту проблему следующим образом:

import pandas as pd
import datetime

# create df // build data // adding date as column
trades = pd.DataFrame()
trades['Date'] = pd.to_datetime(['2011-02-16', '2011-02-16', '2011-02-17', '2014-03-20','2014-03-20', '2018-01-04', '2011-02-18'])
trades['stock'] = ['A', 'B', 'A', 'B', 'C', 'B', 'D']
trades['shares_Tr'] = [5,10,5,10,15,-20,5]

# create a range of dates for the merged dataframe
index_of_dates = pd.date_range('2011-02-10', pd.datetime.today()).to_frame().reset_index(drop=True).rename(columns={0: 'Date'})

# create a merged dataframe with columns date / stock / stock_Tr. 
merged = pd.merge(index_of_dates,trades,how='left', on='Date')

# create a pivottable showing the shares_TR of each stock for each date 
shares_tr = merged.pivot(index='Date', columns='stock', values='shares_Tr').dropna(axis=1, how='all').fillna(0)

# calculate individual pivottables for the cumsum and weights 
cumShares = shares_tr.cumsum()
weights = ((cumShares.T / cumShares.T.sum()).T*100).round(2)

# finally combine all data into one dataframe
all_data = pd.concat([shares_tr, cumShares, weights], axis=1, keys=['Shares','cumShares', 'Weights'])
all_data
0 голосов
/ 31 января 2019

Спасибо за вопрос.Я попробовал этот код, так как собираюсь создавать рамки данных для инвестиций, поэтому это была хорошая практика.Попробуйте, я думаю, что это делает то, что вы просите.

import pandas as pd
import datetime

# create df
trades = pd.DataFrame(index=['2011-02-16', '2011-02-16', '2011-02-17', '2014-03-20','2014-03-20', '2018-01-04'])

# build data
trades['stock'] = ['A', 'B', 'A', 'B', 'C', 'B']
trades['shares_Tr'] = [5,10,5,10,15,-20]

# create a range of dates for the balance dataframe
index_of_dates = pd.date_range(('2011-02-10'), ('2018-01-05')).tolist()

# create a balance dataframe with columns for each stock. 
bal = pd.DataFrame(data = 0, index=index_of_dates, columns=['A', 'A_sum', 'A_weight', 'B', 'B_sum', 'B_weight',  'C', 'C_sum', 'C_weight', 'Total' ])

# populate the trades from trades df to the balance df.
for index, row in trades.iterrows():
    bal.loc[index, row['stock']] = row['shares_Tr']

# track totals
bal['A_sum'] = bal['A'].cumsum()
bal['B_sum'] = bal['B'].cumsum()
bal['C_sum'] = bal['C'].cumsum()
bal['Total'] = bal.iloc[:,[1,4,7]].sum(axis=1)
bal['A_weight'] = bal['A_sum'] / bal['Total']
bal['B_weight'] = bal['B_sum'] / bal['Total']
bal['C_weight'] = bal['C_sum'] / bal['Total']

У вас будет два кадра данных, один из которых называется trades, а другой - bal, который содержит ваши результаты.

...