spl
| a |
2 | stockrecords.xlsx |
3 | =t(a1).sort(dt) |
4 | =a2.group(code;~.group@i(cl < cl[-1]).max(~.len()):max_increase_days) |
特别擅长完成次序相关、移动窗口、跨行运算等复杂场景,比sql、python更简单
python
import pandas as pd
stock_file = "stockrecords.txt"
stock_info = pd.read_csv(stock_file,sep="\t")
stock_info.sort_values(by=['code','dt'],inplace=true)
stock_group = stock_info.groupby(by='code')
stock_info['label'] = stock_info.groupby('code')['cl'].diff().fillna(0).le(0).astype(int).cumsum()
max_increase_days = {}
for code, group in stock_info.groupby('code'):
max_increase_days[code] = group.groupby('label').size().max() – 1
max_rise_df = pd.dataframe(list(max_increase_days.items()), columns=['code', 'max_increase_days'])
sql
select code, max(con_rise) as longest_up_days
from (
select code, count(*) as con_rise
from (
select code, dt, sum(updown_flag) over (partition by code order by code, dt) as no_up_days
from (
select code, dt,
case when cl > lag(cl) over (partition by code order by code, dt) then 0
else 1 end as updown_flag
from stock
)
)
group by code, no_up_days
)
group by code