Excel有容量限制,几十万行就会很慢,百万行就跑不动了
集合运算、分组后运算都是Excel不擅长的,比如
数据量大点倒是没问题,但环境准备挡住90%的Excel用户。而且,其实SQL难度经常远大于Excel。
这种嵌套代码,专业程序员都很难写出来
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
Excel直观四步搞定
借助数据库解决大数据没问题,但还是有同样的环境准备困难。
BI能做的运算复杂度更不如SQL,Excel熟手很受限。
表格数据运算能力太弱,随便啥事都很麻烦。
并不直接提供大数据支持,啥都要硬写。
表格数据运算能力还行,但还是有点复杂。
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'])
也没有直接的大数据支持,还得硬写
编程语言的交互性也不好,远没有所见即所得的Excel顺手
从此告别烦人的print大法
A | |
1 | =T("stock.xlsx") |
2 | =A1.sort(DT) |
3 | =A2.group(CODE;~.group@i(CL< CL[-1]).max(~.len()):max_increase_days) |
顺便解决Excel难题
A | |
1 | =T("stock.xlsx") |
2 | =A1.sort(CODE,DT) |
3 | =A2.group@i(CODE!=CODE[-1]||CL< CL[-1]) |
4 | =A3.select(~.len()>=5) |
5 | =A4.conj() |
游标技术可以轻松处理超过内存的大数据; 添加选项即可启用并行计算提升性能。
A | |
1 | StockRecords.txt |
2 | =file(A1).cursor@t().sortx(CODE,DT) |
3 | =A2.group(CODE;~.group@i(CL< CL[-1]).max(~.len()):max_increase_days) |
A | |
1 | StockRecords.txt |
2 | =file(A1).cursor@t().sortx(CODE,DT) |
3 | =A2.group(CODE).conj(~.group@i(CL< CL[-1])) |
4 | =A3.select(~.len()>=5).conj() |
=spl("=E(?1).sort(CODE,DT).group@i(CODE!=CODE[-1]||CL< CL[-1]).select(~.len()>=5).conj()",A1:D253)