问题描述
我想知道在任何给定日期范围内持有的最大股票数量。我在MysqL和python pandas中都有这些数据。
我的数据集:
entry_time exit_time stk
272 2020-06-10 2020-06-23 SHANKara
197 2020-06-11 2020-06-25 PNCINFRA
85 2020-06-11 2020-06-25 DYNAMATECH
171 2020-06-15 2020-06-29 MANINDS
199 2020-06-16 2020-06-24 ASTERDM
241 2020-06-18 2020-06-29 JKPAPER
130 2020-06-18 2020-06-23 SOMANYCERA
159 2020-06-18 2020-06-25 EVERESTIND
212 2020-06-18 2020-07-01 JSLHISAR
295 2020-06-19 2020-06-25 IBVENTURES
133 2020-06-19 2020-07-02 FIEMIND
123 2020-06-19 2020-06-23 SUPRAJIT
118 2020-06-19 2020-07-01 NRBbearing
97 2020-06-19 2020-06-24 SPAL
261 2020-06-19 2020-06-29 DALBHaraT
50 2020-06-22 2020-07-06 SANGINITA
150 2020-06-22 2020-07-06 BBL
55 2020-06-22 2020-07-06 SHARdamOTR
169 2020-06-22 2020-07-06 BALAmineS
12 2020-06-22 2020-06-25 KIRLOSIND
284 2020-06-22 2020-07-06 NATcopHARM
236 2020-06-23 2020-07-06 QUICKHEAL
69 2020-06-23 2020-07-07 HMVL
220 2020-06-24 2020-07-08 ASTRAL
42 2020-06-26 2020-07-10 MENONBE
260 2020-07-06 2020-07-16 BSE
105 2020-07-07 2020-07-20 GARFIBRES
35 2020-07-16 2020-07-30 SATIA
218 2020-07-17 2020-07-31 THYROCARE
8 2020-08-04 2020-08-07 CREATIVE
例如,从以上数据中我们可以看到2020-06-15我们的投资组合中有4只股票。因此,如果最大持有数量为4,则输出应显示4。
解决方法
在SQL中,您可以通过前后检查来进行处理,然后进行累加求和:
with io as (
select entry_time as dt,1 as inc
from t
union all
select exit_time + interval 1 day as dt,-1
from t
)
select dt,sum(inc) as change_on_day,sum(sum(inc)) over (order by dt) as active_on_day
from io
group by dt
order by active_on_day desc
limit 1;
Here是db 小提琴。
,您可以:
- 以
entry_time
为单位,对所有exit_time
的数量进行分组,然后将数据框自身合并,以计算出要减去的值(每种{{1} })。 - 但是,您不能仅从行号中减去该特定行的值(行号为
entry_time
,但是您需要像我在第一行中所做的那样首先执行df.index + 1
码)。然后,您需要使用df = df.reset_index(drop=True)
减去累计和。
.cumsum()
然后,要根据每个df = df.reset_index(drop=True)
s = (pd.merge(df,df[['exit_time']].assign(exit_count=df.groupby('exit_time')['entry_time'].transform('count'))
.rename({'exit_time':'entry_time'},axis= 1)
.drop_duplicates(subset='entry_time'),on='entry_time',how='left'))['exit_count'].fillna(0)
df['COUNT'] = df.index + 1 - s.cumsum()
df
Out[1]:
entry_time exit_time stk COUNT
0 2020-06-10 2020-06-23 SHANKARA 1.0
1 2020-06-11 2020-06-25 PNCINFRA 2.0
2 2020-06-11 2020-06-25 DYNAMATECH 3.0
3 2020-06-15 2020-06-29 MANINDS 4.0
4 2020-06-16 2020-06-24 ASTERDM 5.0
5 2020-06-18 2020-06-29 JKPAPER 6.0
6 2020-06-18 2020-06-23 SOMANYCERA 7.0
7 2020-06-18 2020-06-25 EVERESTIND 8.0
8 2020-06-18 2020-07-01 JSLHISAR 9.0
9 2020-06-19 2020-06-25 IBVENTURES 10.0
10 2020-06-19 2020-07-02 FIEMIND 11.0
11 2020-06-19 2020-06-23 SUPRAJIT 12.0
12 2020-06-19 2020-07-01 NRBBEARING 13.0
13 2020-06-19 2020-06-24 SPAL 14.0
14 2020-06-19 2020-06-29 DALBHARAT 15.0
15 2020-06-22 2020-07-06 SANGINITA 16.0
16 2020-06-22 2020-07-06 BBL 17.0
17 2020-06-22 2020-07-06 SHARDAMOTR 18.0
18 2020-06-22 2020-07-06 BALAMINES 19.0
19 2020-06-22 2020-06-25 KIRLOSIND 20.0
20 2020-06-22 2020-07-06 NATCOPHARM 21.0
21 2020-06-23 2020-07-06 QUICKHEAL 19.0
22 2020-06-23 2020-07-07 HMVL 17.0
23 2020-06-24 2020-07-08 ASTRAL 16.0
24 2020-06-26 2020-07-10 MENONBE 17.0
25 2020-07-06 2020-07-16 BSE 12.0
26 2020-07-07 2020-07-20 GARFIBRES 12.0
27 2020-07-16 2020-07-30 SATIA 12.0
28 2020-07-17 2020-07-31 THYROCARE 13.0
29 2020-08-04 2020-08-07 CREATIVE 14.0
的最大库存进行汇总,可以使用entry_time
:
.groupby()