0%

场景描述

最近有个需求需要处理下从南京统计局下载的宏观数据pdf,需要将pdf中的表格数据提取出来进一步加工,样例格式如下。

可以看到格式还是比较标准的,我本来以为网上随便一搜python pdf table提取,便能简单的处理大功搞成,然而实际还是踩了不少坑,因此还是记录下。

具体的pdf这里就不展示了,以camelot的样例pdf为例,下载可以点击此链接

技术选型

首先,我确实是在网上搜索python pdf table extract,基本很快就锁定了 pdfplumber,然而在一通操作后,发现pdfplumber的默认识别不太准确,一个很大的原因是pdf的表格很多并不是以标准的线画的,虽然可以使用text方式识别+定制化的一些参数,但是调整太累了,后面本人就放弃了。pdfplumber的官方文档参见pdfplumbergit地址,里面对于一些对象及配置有详尽的描述。另外,知乎的这篇关于python提取pdf不规则表格写得非常不错,里面有讲碰到不规则表格,提取内容错误时,如何利用 debug_tablefinder 画出红线,进而调整进阶参数以优化提取效果。

在pdfplumber碰壁后,继而了解到camelot在无线框表格上效果更好,因此果断尝试,不得不说最终的效果还是不错的。

camelot的git地址参见camelot git 地址,相对来说,camelot的文档就没有那么详尽了,不得不说是一个遗憾。

环境安装

camelot的安装挺坑的。。。,以下只是本人的安装和解决方案。

1. camelot安装

千万不要直接使用pip install camelot进行安装,真正的命令为

1
2
pip install camelot-py
pip install opencv-python

安装完后,本人碰到了

1
Python-camelot (Error: GhostscriptNotFound 

这个问题,参考网上的,到ghostscript官网下载对应的版本。

本人为windows,因此下载了ghostscript-10.01.1.tar.xz,解压完需要添加

1
2
C:\Program Files\gs\gs9.26\bin
C:\Program Files\gs\gs9.26\lib

到path下,不然依然会报错。

最后,你需要安装下ghostscript

1
pip install ghostscript

不然会得到以下错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PS C:/Users/ivan/AppData/Local/Programs/Python/Python311/python tjj_hgsj_py/nj_tjj.py
Traceback (most recent call last):
File "tjj_hgsj_py\nj_tjj.py", line 20, in <module>
tables= camelot.read_pdf(pdfFilePath)####从1开始计数
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ivan\AppData\Local\Programs\Python\Python311\Lib\site-packages\camelot\io.py", line 113, in read_pdf
tables = p.parse(
^^^^^^^^
File "C:\Users\ivan\AppData\Local\Programs\Python\Python311\Lib\site-packages\camelot\handlers.py", line 176, in parse
t = parser.extract_tables(
^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ivan\AppData\Local\Programs\Python\Python311\Lib\site-packages\camelot\parsers\lattice.py", line 421, in extract_tables
self.backend.convert(self.filename, self.imagename)
File "C:\Users\ivan\AppData\Local\Programs\Python\Python311\Lib\site-packages\camelot\backends\ghostscript_backend.py", line 36, in convert
import ghostscript
ModuleNotFoundError: No module named 'ghostscript'

至此,camelot安装完成。

代码实现

具体代码可以查看 camelot_pdf_table_parse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os
import pandas as pd
import camelot


# 读取pdf文件,获取pdf的表格数据,并保存为csv
pdfFilePath="foo.pdf"
csvFilePath="table.csv"
separate_coma=","

# 使用camelot解析table,all为解析所有的pdf page
tables= camelot.read_pdf(pdfFilePath,pages='all')
# 将所有的table 拼接为一个df
table_df=tables[0].df
for i in range(1,len(tables)):
table_df=table_df._append(tables[i].df)
# 加入自定义字段
table_df['report_date']='2023-02-28'
# 调整顺序,放入第一个
table_df.insert(0,'report_date',table_df.pop('report_date'))
print(table_df)
# 保存为csv文件,为后续入库方便,去除index
table_df.to_csv(csvFilePath,index=None)
print("foo table data finished")

整体代码就想对比较简单了,但是也有一些细节需要处理,方能最后使用,比如

  • 读取所有page,camelot默认只读取pdf的第一页,因此需要all参数。
  • 拼接dataframe
  • 新增自定义列
  • 保存csv去除行号

实现效果

pdf原始表格

提取后的dataframe效果

1
2
3
4
5
6
7
8
  report_date             0            1                2                     3                  4                  5                 6
0 2023-02-28 Cycle \nName KI \n(1/km) Distance \n(mi) Percent Fuel Savings
1 2023-02-28 Improved \nSpeed Decreased \nAccel Eliminate \nStops Decreased \nIdle
2 2023-02-28 2012_2 3.30 1.3 5.9% 9.5% 29.2% 17.4%
3 2023-02-28 2145_1 0.68 11.2 2.4% 0.1% 9.5% 2.7%
4 2023-02-28 4234_1 0.59 58.7 8.5% 1.3% 8.5% 3.3%
5 2023-02-28 2032_2 0.17 57.8 21.7% 0.3% 2.7% 1.2%
6 2023-02-28 4171_1 0.07 173.9 58.1% 1.6% 2.1% 0.5%

最终的csv文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
report_date,0,1,2,3,4,5,6
2023-02-28,"Cycle
Name","KI
(1/km)","Distance
(mi)",Percent Fuel Savings,,,
2023-02-28,,,,"Improved
Speed","Decreased
Accel","Eliminate
Stops","Decreased
Idle"
2023-02-28,2012_2,3.30,1.3,5.9%,9.5%,29.2%,17.4%
2023-02-28,2145_1,0.68,11.2,2.4%,0.1%,9.5%,2.7%
2023-02-28,4234_1,0.59,58.7,8.5%,1.3%,8.5%,3.3%
2023-02-28,2032_2,0.17,57.8,21.7%,0.3%,2.7%,1.2%
2023-02-28,4171_1,0.07,173.9,58.1%,1.6%,2.1%,0.5%

踩坑点及解决方法

Python-camelot (Error: GhostscriptNotFound

需要安装ghostscript
ghostscript官网下载对应的版本。

ModuleNotFoundError: No module named ‘ghostscript’

安装完ghostscript程序后,还需安装ghostscript模块

1
pip install ghostscript

camelot只能读取pdf的第一页

参数需要填all

1
2
tables= camelot.read_pdf(pdfFilePath,pages='all')

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

引言

本人为个人常用的一些命令汇总

/var/log/secure

secure为linux服务器的登录日志,公网默认22端口具有极大的风险。

通过以下命令,可以大致分析当前安全现状,为安全加固提供依据。

1
2
3
4
5
6
7
8
1、哪些IP在爆破主机的root帐号:    
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr

2、哪些IP在爆破用户:
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /from(.*?) port/; print "$1\n";}'|sort -nr|uniq -c |sort -nr

3、爆破用户名字典
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|sort -nr|uniq -c |sort -nr

修改ssh端口

linux默认的端口为22
修改端口的配置文件地址为

1
vi /etc/ssh/sshd_config

找到如下位置

1
# Port 22

默认的端口为22,且是注释的,将#号去掉,端口修改为自己想要的端口
重启服务

1
service sshd restart

登录方法为

1
ssh root@xxx -p port

linux 参数解析

参考linux-shell脚本中的参数解析

大数据之路,不得不说是大数据的神书,本次再次阅读,又有了不同的收获。

问题&需求

hexo 博客默认的首页文章排序为博客发布日期的倒序,有些时候期望将一些高质量的博文置顶,方便访客查看。

解决方案选择

上网随便google了下,发现有现成的解决方案
网上的解决方案有两种

  1. 修改generator.js
  2. 使用现成的插件。

修改generator.js

该方案需要修改核心的js代码,原理就是通过在front-matter中设置需要置顶文章的top值,然后在generator时根据top排序。

该方案的出处应该是解决Hexo博客文章置顶问题这篇博文【本人未验证哈】,其他的应该都是从这篇博文中炒出来的。

由于该方案是早期的方案,后面已经有更成熟的插件方案,具体实现这里就不说了。

使用现成插件

首先,插件的github项目名称和地址为hexo-generator-index,目前的最新版本已经到3.0了,是2022-10-16 release的。

网上很多文章的配置其实都已经过时了,比如使用top进行配置的,最新的使用方法还是建议大家直接阅读github项目上的readme说明,上面有现成的方法。

通过简单的了解,本人最后选定hexo-generator-index作为博客的置顶方案。

hexo-generator-index 安装使用和效果

  1. 通过如下命令安装
    1
    npm install hexo-generator-index --save
  2. 通过在文章的front-matter中添加sticky属性进行使用,其中sticky数值越大,优先级越高。
    1
    2
    3
    4
    5
    ---
    title: Hello World
    date: 2013/7/13 20:46:25
    sticky: 100
    ---
    本人的一个效果如下图所示

可以看到,写了stikcy的文章已经置顶了,切有了一个置顶的标签。

参考文章

Hexo nexT主题之文章置顶
解决Hexo博客文章置顶问题
hexo-generator-index

2022 总结

基准

2022年
上证指数下跌 15.13%
沪市300指数下跌 21.63%

个人

2022年度收益率 -2.4%,同期跑赢上证12.73%,沪深300 19.23%。

扣除打新收益。 121187
2022年度收益率 -15.65%,同期跑输上证0.52%,跑赢沪深300指数 5.98%

2022年通过打新股收益率14832.96,打新债收益1228.19 合计16061.15.

累计

年份 个人收益率 上证 上证超额 沪深300 沪深300超额
2021 7.44% 4.8% 2.64% -5.2% 12.64%
2022 -2.4% -15.13% 12.73% -21.63% 19.23%
复合年华 2.4% -5.69% 7.57% -13.81% 15.89%

个人总结

2022年总得来说,陈善可乏,扣除打新收益,基本就是跟随大盘随波逐流,更加证明了我没啥投资天赋。

一个创新是在11月的时候引入了量化投资,个人也打通了东方财富的自动化接口,实现了程序化交易,并将可转债策略放入实盘。

做的好的部分,学会了分散持仓,个人的选股也没啥大问题。

做的不好的地方

  1. 对于看好的股票,还是买贵了,个人守不住空仓,这也是后面引入程序交易的原因,摒弃一切个人因素,按计划执行。
  2. 对于基本面的研究没有更近一步。

2023 目标

2023年,估计仍然是不容乐观的一年,当然,市场应该是见底了的,应该是底部徘徊的一年。

2023年,个人应该是全年采用可转债策略量化交易,期间可能会进行一些策略改正。

收益期望的话,限定个7%吧。

前言

22年12月31日想做的事情,24年6月25日,补上。。。。

策略目标

根据自己分析的股票池做资产组合,根据分析的目标价位,结合当前估值给定仓位,日内做仓位动态调仓,避免长期坐过山车,也避免自己天天看股价导致手贱买卖,免除自己手动操作。

核心思路

估值定仓,即给定一个股票的目标价格,根据价格高低给与仓位。

个股分析的结果如下

股票代码 股票名称 版本日期 当前市值 乐观只是 悲观市值 分析备注
60000 股票A 2024-06-25 80 160 30 xxxx
60000 股票B 2024-06-25 30 100 5 xxx

仓位策略

part1 个股仓位=单股最高仓位*单股计划仓位

其中,单股最高仓位为单股占总资产最高的比例
单股计划仓位为根据当前的市值和目标,计划的仓位比例。

part1 单股最高仓位

确认性高的,20%
确认性较低的,10%
风险博弈的,5%

part2 仓位

整体差值分为两部分,前50%权重为1,后50%权重为2。

仓位=(乐观价格-当前价格)/(乐观价格-悲观价格)

比如一个股票目标价是100,悲观价为50,当前价98,那么当前仓位为:
(100-98)/(100-50)/1.5=0.026,给与2.6的仓位。

比如一个股票目标价是100,悲观价为50,当前价55,那么当前仓位为:
((100-55)/(100-50)-0.5)/0.5*0.666+0.3333=0.8666,给与86.7%的仓位。

part3 买入

根据仓位计算出价格,动态买卖,实现低买高卖。

引言

在国家放开管控之后,我一波浩浩荡荡的小阳人大军中,我在圣诞节有幸加入,虽然网上已经有很多体验了,但记录下个人的感染过程,还是很有必要的。

新冠发病7日典型症状过程


首先放一张来自网上的新冠发病7日典型症状过程和对应的一些药物治疗。

多了解一点,心里有底一点,万一自己患病很严重用的上呢。

个人新冠历程

DAY1 2022-12-25

当天本人都没啥感觉,也不知道自己已经感染了,只是晚上的时候感觉到喉咙发干,很想喝水。

DAY2 2022-12-26

一觉醒来,喉咙干的厉害,起床后就感觉头有点痛,之后就一直头痛,但属于可以忍受的范围。
从中午开始,就开始发烧了。

  • 上午到中午12点,大概38度左右
  • 中午12点到晚上6点,在38度到39度之间反复横跳,平均大概38.5,这个阶段头痛的就比较厉害了,但属于还能硬抗的阶段,还有要带娃,也只能硬抗。身体的酸痛程度的话,膝盖,背部有轻微酸痛的感觉,有些许没有力气的症状
  • 晚上6点到10点,体温进一步升高,大概在38.5到39度之间横跳了,人的反应有那么点小木呆了,熬到老婆下班回来就休息了。
  • 当天晚上睡眠不怎么好,基本1,2个小时就会醒,高烧也退不下来,基本在38.5到39.5之间横跳,但基本处于38.8这一档,如果温度再升高,就需要动用退烧药了

总的来说,和新冠7天中的第二天症状基本符合。

DAY3 2022-12-27

早上醒来8点,测体温直接下到37.4,以为今天不会发烧了。
但9点过后又烧起来,基本全天维持38度的样子。
头痛的话只是轻微头痛了。
然后乏力这一点,大概中度这个样子。
喉咙干的话,基本没有这个症状了,也没有出现网上说的吞刀片这个场景。
咳嗽的话,有很轻微的咳嗽,全天不超过10声,但有痰。

总的来说,感觉处于新冠流程第四天到第五天的样子。

DAY4 2022-12-28

早上醒来,温度37度,已经不发烧了
不咳嗽,不酸痛,整体精神可以,基本已经恢复正常了。
唯一有点异常的就是感觉胸里有点东西,其他啥都没感觉了。

DAY4 2022-12-28

早上醒来,温度37度,已经不发烧了
不咳嗽,不酸痛,整体精神可以,基本已经恢复正常了。
唯一有点异常的就是感觉胸里有点东西,其他啥都没感觉了。

DAY5 2022-12-29

今天体温全天正常
除了一点鼻塞外其他基本无异常了
顺便测了下抗原,还是阳性。

DAY6 2022-12-30

基本正常

DAY7 2022-12-31

全天开始流鼻涕,开始咳嗽

DAY8 2023-01-01

咳嗽开始严重

DAY8 2023-01-01

没啥症状,over

作用差别

指标体系是结果和过程,更多的作用是分析,
标签体系维度集合,更多是用于圈选,
画像是标签的集合

所谓标签系统,就是利用企业自由数据、第三方数据、采购数据等等,对自有的用户进行打标签的处理。标签系统既可以自主生成标签,也可以对标签进行有序管理维护。

所谓画像系统,就是利用标签,进行的可视化分析及各类应用的落地。简单的,可以是一些统计分析;复杂的,可以是人群的各维度的透视。

数据库

MPP 数据库

MPP (Massively Parallel Processing),即大规模并行处理。简单来说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果(与Hadoop相似)。

MPP数据库是一款 Shared Nothing架构的分布式并行结构化数据库集群,具备高性能、高可用、高扩展特性,可以为超大规模数据管理提供高性价比的通用计算平台,并广泛地用于支撑各类数据仓库系统、BI 系统和决策支持系统

常见mpp数据库有

  • GreenPlum
  • Vertica
  • Sybase IQ
  • TD Aster Data
  • HybirdDB 阿里云的,基于greenplum开源改造

数仓应用

DSS 决策支持系统

决策支持系统(Decision Support System)是一个基于计算机用于支持业务或组织决策活动的信息系统。 DSS服务于组织管理、运营和规划管理层(通常是中级和高级管理层),并帮助人们对可能快速变化并且不容易预测结果的问题做出决策。决策支持系统可以全计算机化、人力驱动或二者结合。

ad-hoc query 即席查询

即席查询是用户根据自己的需求,灵活的选择查询条件进行查询。

系统根据用户的选择生成相应的统计报表。普通查应用查询是定制开发的,即席查询是用户自定义查询条件

理解:快速的执行自定义SQL(可能无法提前运算和预测)

业务术语

UJM (User Journey Map)

用户访问路径太朴素,试试英文的UJM