可转债如何配债

股票李魔佛 发表了文章 • 0 个评论 • 10813 次浏览 • 2019-03-29 16:24 • 来自相关话题

由于还是有很多人不断问我如何配债的问题,这里以歌尔声学为例简单说明下。

1、如果你在登记日也就是12月11日收盘时还持有一定数量歌尔声学正股的话,那么你在配债日也就是12月12日就会看到账户里有相应数量的歌尔配债。注意这里的单位是张,如图,





 
由于我只有800股歌尔声学,因此获得了13张配债,1张对应100元,这时双击它,左侧出现了卖出菜单,价格和配债代码都自动填好了,输入13张或者点击全部,然后点“卖出”。(需要注意的是:有些券商这里是买入。)

2、不管是卖出还是买入,然后检查下委托情况和扣款情况,如下图:










 

可以看到我已经被扣款1300元,这样就算成功完成了这次的13张配债.
 
可转债低佣金开户,沪市转债费率百分之二,全市场最低。
有兴趣的朋友可以扫描开户:



  查看全部
由于还是有很多人不断问我如何配债的问题,这里以歌尔声学为例简单说明下。

1、如果你在登记日也就是12月11日收盘时还持有一定数量歌尔声学正股的话,那么你在配债日也就是12月12日就会看到账户里有相应数量的歌尔配债。注意这里的单位是张,如图,

1.jpg

 
由于我只有800股歌尔声学,因此获得了13张配债,1张对应100元,这时双击它,左侧出现了卖出菜单,价格和配债代码都自动填好了,输入13张或者点击全部,然后点“卖出”。(需要注意的是:有些券商这里是买入。)

2、不管是卖出还是买入,然后检查下委托情况和扣款情况,如下图:

2.jpg


3.jpg

 

可以看到我已经被扣款1300元,这样就算成功完成了这次的13张配债.
 
可转债低佣金开户,沪市转债费率百分之二,全市场最低。
有兴趣的朋友可以扫描开户:



 

【2019-03-16】市场热度预测 - 通过检测某个论坛(集思录)的热度衡量

量化交易-Ptrade-QMT李魔佛 发表了文章 • 4 个评论 • 3234 次浏览 • 2019-03-16 18:03 • 来自相关话题

很早前就有这个想法,只是最终实践最近才完成,其实并不是很大难度,只是把这个事情早早抛诸脑后。
 
首先得有数据,有了数据就可以慢慢分析了。
 
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:





 
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
 
感觉这个是不错逃顶抄底指标呀。
 
文章中的数据每周更新,敬请留意。
 
原创文章
转载请注明出处:
http://30daydo.com/article/428
  查看全部
很早前就有这个想法,只是最终实践最近才完成,其实并不是很大难度,只是把这个事情早早抛诸脑后。
 
首先得有数据,有了数据就可以慢慢分析了。
 
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:

echarts.png

 
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
 
感觉这个是不错逃顶抄底指标呀。
 
文章中的数据每周更新,敬请留意。
 
原创文章
转载请注明出处:
http://30daydo.com/article/428
 

Linux下自制有道词典 - python 解密有道词典JS加密

python爬虫李魔佛 发表了文章 • 0 个评论 • 3657 次浏览 • 2019-02-23 20:17 • 来自相关话题

对于爬虫新手来说,JS解密是一道过不去的坎,需要不断地练习。
平时在linux下开发,鉴于没有什么好用翻译软件,打开网易也占用系统资源,所以写了个在控制台的翻译软件接口。
 
使用python爬虫,查看网页的JS加密方法,一步一步地分析,就能够得到最后的加密方法啦。
 
直接给出代码:
 # -*- coding: utf-8 -*-
# website: http://30daydo.com
# @Time : 2019/2/23 19:34
# @File : youdao.py
# 解密有道词典的JS


import hashlib
import random
import requests
import time


def md5_(word):
s = bytes(word, encoding='utf8')
m = hashlib.md5()
m.update(s)
ret = m.hexdigest()
return ret

def get_sign(word, salt):
ret = md5_('fanyideskweb' + word + salt + 'p09@Bn{h02_BIEe]$P^nG')
return ret


def youdao(word):
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers = {
'Host': 'fanyi.youdao.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Referer': 'http://fanyi.youdao.com/',
'Content-Length': '252',
'Cookie': 'YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID=1672542763@10.169.0.83; JSESSIONID=aaaWzxpjeDu1gbhopLzKw; ___rl__test__cookies=1550913722828; OUTFOX_SEARCH_USER_ID_NCOO=372126049.6326876',
'Connection': 'keep-alive',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
}

ts = str(int(time.time()*1000))
salt=ts+str(random.randint(0,10))
bv = md5_("5.0 (Windows)")
sign= get_sign(word,salt)

post_data = {
'i': word,
'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': salt,
'sign': sign, 'ts': ts, 'bv': bv, 'doctype': 'json', 'version': '2.1',
'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTIME', 'typoResult': 'false'
}

r = requests.post(
url=url,
headers=headers,
data=post_data
)

for item in r.json().get('smartResult',{}).get('entries'):
print(item)

word='student'
youdao(word)
得到结果:





 
Github:
https://github.com/Rockyzsu/CrawlMan/tree/master/youdao_dictionary
原创文章,转载请注明出处
http://30daydo.com/article/416 查看全部
对于爬虫新手来说,JS解密是一道过不去的坎,需要不断地练习。
平时在linux下开发,鉴于没有什么好用翻译软件,打开网易也占用系统资源,所以写了个在控制台的翻译软件接口。
 
使用python爬虫,查看网页的JS加密方法,一步一步地分析,就能够得到最后的加密方法啦。
 
直接给出代码:
 
# -*- coding: utf-8 -*-
# website: http://30daydo.com
# @Time : 2019/2/23 19:34
# @File : youdao.py
# 解密有道词典的JS


import hashlib
import random
import requests
import time


def md5_(word):
s = bytes(word, encoding='utf8')
m = hashlib.md5()
m.update(s)
ret = m.hexdigest()
return ret

def get_sign(word, salt):
ret = md5_('fanyideskweb' + word + salt + 'p09@Bn{h02_BIEe]$P^nG')
return ret


def youdao(word):
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers = {
'Host': 'fanyi.youdao.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Referer': 'http://fanyi.youdao.com/',
'Content-Length': '252',
'Cookie': 'YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID=1672542763@10.169.0.83; JSESSIONID=aaaWzxpjeDu1gbhopLzKw; ___rl__test__cookies=1550913722828; OUTFOX_SEARCH_USER_ID_NCOO=372126049.6326876',
'Connection': 'keep-alive',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
}

ts = str(int(time.time()*1000))
salt=ts+str(random.randint(0,10))
bv = md5_("5.0 (Windows)")
sign= get_sign(word,salt)

post_data = {
'i': word,
'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': salt,
'sign': sign, 'ts': ts, 'bv': bv, 'doctype': 'json', 'version': '2.1',
'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTIME', 'typoResult': 'false'
}

r = requests.post(
url=url,
headers=headers,
data=post_data
)

for item in r.json().get('smartResult',{}).get('entries'):
print(item)

word='student'
youdao(word)

得到结果:

youdao.PNG

 
Github:
https://github.com/Rockyzsu/CrawlMan/tree/master/youdao_dictionary
原创文章,转载请注明出处
http://30daydo.com/article/416

县城赚钱的暴利生意背后,收割穷人的血汗钱

闲聊李魔佛 发表了文章 • 0 个评论 • 2998 次浏览 • 2019-02-14 17:56 • 来自相关话题

文章来源: 网上转载的,大部分都同意,除了最后一点。

年关难过年年过,但2019年的年关,着实有些不一样。
赶上年底办公地点搬迁,失去工位的评论君,被迫早早返乡,代号也从5A写字楼的Jeffrey转换成村头的二狗子。
作为长年在外务工人员,每次回乡过年,都是来去匆匆。
这次难得在家呆的时间长,年前穿梭在家乡的江南小城地级市,县城和乡村之间走亲戚。
见到听到的人和事, 让我意识到,这个世界的折叠程度,远远超过自己的想象。
最震惊我的,是那些县城里赚钱未遂的人。

01
堂哥的灯具店要关门了
回乡见得第一个亲人,是堂哥。堂哥开了三年的灯具店终于撑不住了,考虑关掉,想听听我的意见。
堂哥是大伯家的独子,刚过而立之年。念书不行,高中毕业就跟着大伯做早餐生意,但起早贪黑,对年轻人来说,确实太难。
三年前, 举全家之力,给堂哥在县城开了一家灯具店。
县城的生意逻辑在造势。为此,堂哥在银行贷了15万,把门店装修的很讲究。就这样,毫无灯具经营经验的堂哥一下子当上了老板。
店铺开起来,才知道有那么多活儿。
销售,上门安装,拉业务,催账,堂哥夫妻两根本忙不过来。于是,大伯的早餐店也盘出去,帮忙上门安装灯具,伯母负责做饭。
全家人围着店铺转,可生意还是每况愈下。
三年忙活下来,店铺的灯具品牌,从欧普、美的等知名品牌降级到杂牌产品。店铺租金太高,堂哥重找了个便宜店面。
最要命的是,三年前借的15万一分钱也没还。整个家庭陷入了进退不得的状态,还不如当初开早餐店。
对此,我觉得不可思议。问堂哥:
去年县城的房子不是卖得很不错嘛,怎么装修生意这么难做?
“炒房的太多了,哪有人真的装修。”
堂哥觉得很无力,我感到很震惊。“县城不到30万人,炒啥房!”
堂哥接触到最真实的市场情况,2018年,绝大多数县城的房子,都是被占坑式买房人买走的。
在外打工,听闻房价会涨,赶紧回家占个坑,或者是附近乡村的居民为了孩子念书,提前在县城买房。
这两类购房者,都不买堂哥的灯具。
堂哥的顾客,主要是周边乡镇自建房的农民。但自建房往往上门安装远,账又难收,利润薄如纸。
县城房地产市场火爆,与堂哥的灯具生意不仅毫无关系,还掏空了县城人们的腰包,导致堂哥的品牌灯具滞销,只能卖质差价廉的杂牌灯具。
堂哥盘点了一下,如果8万外账能顺利收回来。加上店里4万的灯具货量。再加上价值3万不到的拉货二手面包车,差不多还掉银行的贷款。
全家四个劳动力,忙活了三年,一分存款也没剩下。
堂哥盘算着:年底把店关了,明年大伯继续做早餐,自己考虑别的营生。
反正不开店不创业了。
如果说堂哥的灯具店的失败,是县城传统行业的缩影。另一件事,让我对县城的未来更担心了。

02
在老家卖水果的小刘
这是一个乡村创业故事,主人翁是我爷爷家隔壁邻居小孩小刘。
爷爷家是一个人口不到20万的乡镇,镇上只有一条街,底下还有七八个自然村,小刘比我小几岁。
我每次暑假回爷爷家,小刘每次就跟着我满田野里跑,他很机灵,但是不会念书。
长大后,我交了更厉害的朋友,便和小刘没了交集。
他成了我躺在好友列表里的微信好友。
通过他的朋友圈,我了解到,小刘初中肄业之后,一直在杭州一家百果园水果店工作。
2018年中,小刘突然微信找我,说自己要回乡创业,想听听我的建议。
我确认他不是借钱之后,松了一口气。正准备以受过高等教育的高级白领身份,好好点拨他。
小刘聊了他的想法,自己的家乡(我爷爷家的小镇)和大多是乡村一样,留守老人孩子多,但不舍得消费水果。
而在杭的老乡群里,很多老乡在外务工,想给家里留守儿童和老人买水果,既买不到,也无法送货上门。
小刘脑袋灵光,这可是一片蓝海。
杭州水果店的工作经验,让他基本摸清了生鲜店的进货渠道,和成本把控的诀窍。
再加上他长年担任门店的熟客微信群群主,对社群营销,更是有独到的见解。
我没想到,小刘的对于to C模式的理解,竟然如此深刻。
在我看来,这是典型的一线城市营销套路,对乡村市场的降维打击,无疑小刘真的是一个奇才。
于是,他决定回小镇开这样一个水果配送店。店很快开起来了。
小刘每天在群里,发当天水果照片和价格。
顾客大多是在外务工的年轻人,他们为尽孝心,也愿意花钱,通过微信转账的方式付款,小刘给客户家里留守老人和孩子配送,并拍视频作为反馈。
全新的营销方式,加上热心肠的小刘的服务态度,水果店的生意非常好。
但没想到,小刘的水果店还是没撑过春节。
自从开店以来,小刘开始每天凌晨进货,早上运营微信群,接单,配送。即使雇了人帮忙,小刘依然累得开车差点睡着。
忙不要紧,但不挣钱的瞎忙,就最致命了。
对生鲜产品来说,乡村的进货成本,远远超过了小刘的预期。为了控制坏果率,小刘每天凌晨,去最近的城市衢州市进货,结果是坏果率没下来,运输成本先上去了。
老家的人口本来就不多,加上很多老人一辈子节约惯了,心疼钱,所以对子女买来的新鲜水果有天然抗性。
人均收入低的乡村,自然客单价也提不上去,两边一挤压,小刘受不了。
这时候,小刘意识到,乡村的生鲜市场,被各大电商抛弃,不是没有原因的。
他在杭州这样的大城市看到的生鲜的刚性需求,到了乡村,一下子就变成伪需求了。
还没撑到车厘子上市的季节,小刘的店就关掉了,小刘重新回到杭州,找了一份月薪4000的工作。

03
县城的消费市场逻辑
不仅仅传统行业,在县城乡村的土壤无法生长,连小刘这样新颖的商业模式,也无法生存。
县城乡村的消费市场为什么如此萎靡?
我在思考,应该是是消费人口的缺失,导致购买力低下引起的。
年轻人是消费的主力军,但村里的上大学的年轻人,留在省会城市工作。没上学的年轻人,去沿海城市打工。
县城,好就好在消费水平低,坏就坏在,只有消费水平低。
县城缺乏机会,没有热钱,人情社会严重,缺乏工作岗位。寥寥的年轻人选择不多,不是挤破头考公务员,就是考教师资格证。
只有公务员和教师,才是体面的工作。
而就算是体面的工作,依然不会是高薪。这注定了县城的日常用品消费总需求固定,利润低。
消费升级的产品,根本没有对应消费人群。
当一线城市的杯均30RMB的喜茶/瑞幸咖啡/鹿角巷等遍地开花的时候,县城卖得最好的茶饮还是古茗,杯均10RMB。
罗胖在演讲里提到古茗成功的秘诀,县城和镇上晚上的灯光一般不够亮,你只要做一个很简单的事:就是把奶茶店门头的灯调得更亮,最好是能成为那条街上的路灯。
这样就能引起消费者的注意。
其实不然,客单价贴合县城的消费水准,才是奶茶店存活的不二法则。
否则,40块一杯的精品咖啡店开在县城,就算是用上疝气大灯照亮,依然没有市场。
我以为我找到了县城消费萎靡的元凶:购买力低下。
但后来的认知告诉我,我被重重地打脸了。

04
在县城,很多人都用力活着,但很少人用脑活着
虽然这么形容很刻薄,但看到人们花钱做出各种看似“无脑”的事情,真的很痛心。
在县城,似乎只有坑蒙拐骗,才能赚到钱。
和初中同学的饭桌上,听闻当年隔壁班的小美,做床垫生意,如今成为了县城排得上号的富婆。
联想到堂哥口中说的,县城里灯具生意,稍贵的品牌灯具卖不出去,只好卖便宜的杂牌灯具。
卖床垫能如此挣钱?我有些质疑真实性。
后来我知道,原来小美卖的,是玉石床垫,要价3万元到5万元不等,买的人络绎不绝。
没错,就是你第一时间想到的坑老年人的保健品床垫。
以送鸡蛋或大米的小恩惠,召集老年人开会、听课,宣传洗脑玉石床垫包治百病的功效,免费体验试睡。
每天大清早都有老人排队,等着免费“试睡”。不愿意排队的,或者觉得确实有功效的,就把养老钱掏出来买回家。
县城每一个赚钱的暴利生意背后,都是靠收割穷人的血汗钱而来的。
第二个血汗钱收割机,就是低价旅游。99元西湖两日游,399元香港三日游,699元三亚双飞豪华游。
这样大城市玩剩下的低价旅游骗局,在地方被受欢迎。结果可想而知,各种被套路买高价乳胶枕,玉石,名贵中药材等等案例遍地开花。
第三个血汗钱收割机,是民间借贷。p2p以及各种高息揽储的项目,你盯着别人的利息,别人看重的却是你的本金。
我爸告诉我,小时候带我练球的乒乓球教练,因为禁不住年化40%利息诱惑,民间借贷借出去200万遭遇爆雷,抛妻弃子,已经跑路了。
我很震惊,也很忿恨。
起早贪黑开球馆,抛去场地和雇教练的成本,净利润也不过年化20%,连腾讯这样的互联网独角兽的财报,净利润也达不到年化30%。
凭什么你会相信,你的全部养老钱可以躺赚年化40%的利润。

05
跳出这个财富链底层的四点劝诫
这个社会里,信息和财富的扩散,像是冲泡一杯蜜水,蜜总是从杯口慢慢渗透到杯底。
因为认知和信息的差距,导致县城和乡村,就是社会这杯蜜水的杯底。
在城市被淘汰的保健品骗局,入侵着这里的老年人。在大城市卖不动的假货,摆满了这里的货架。
这里的人们赚的不多,还最容易被骗。能不能跳出杯底,我有一些劝诫:
第一,保证全家人都能有健康的生活方式。
别说刚过温饱线的家庭,在疾病面前,连中产家庭也显得不堪一击。
ICU的床位费是1万一个晚上,特效药的报销比例接近于零。别听信“酒是粮食精,越喝越年轻”的鬼话。酒精和隔夜菜里的亚硝酸盐一样,都是一类致癌物。
第二,不要创业不要开店。
不要投入50万装修,开当地最大的网咖,因为等待着你的,是遥遥无期的回本之路。
不要开加工厂,一次工伤事故可能会吃掉你一年的利润。
不要试图开衣食住行以外的店,你的一己之力,无法违背市场规律。
小刘和堂哥,都是县城乡村创业的缩影。
作为一个没背景没资源的普通人,尽量找一份依靠技术和资源赚钱的工作,如果非要创业,请选择轻资产创业模式,不要梭哈。
第三,不要投资,不要炒股。
股票,是资本操纵下的负和游戏,穷人根本没有资格上牌桌。
徐翔案被曝光出的交易内幕,以及今年1月4号,央行降准消息发布前,券商入场拉升大盘等事件,都在说明一个真相:
我们生活在一个信息极不对等的世界里,那些先知先觉的人的背后,是一把把明晃晃的镰刀,等待收割散户。
而投资,同样是一件高门槛高风险的事情。
如果你遇到了一笔很容易的投资机会,它一定是个陷阱,包括但不限于p2p,民间借贷,分红型保险,原油螺纹钢等期货。
第四,为了孩子和自己的起点,请在能力范围内,在最高级别的城市,买房置业。
能买北上深,就不买杭广蓉,能买省会,就不买县城和地级市。
三四线房产只有居住属性,无金融属性。
如果还来得及,请卖掉三四线城市投资属性的房子。
未来三四线城市,将迎来滞涨时代 查看全部
文章来源: 网上转载的,大部分都同意,除了最后一点。

年关难过年年过,但2019年的年关,着实有些不一样。
赶上年底办公地点搬迁,失去工位的评论君,被迫早早返乡,代号也从5A写字楼的Jeffrey转换成村头的二狗子。
作为长年在外务工人员,每次回乡过年,都是来去匆匆。
这次难得在家呆的时间长,年前穿梭在家乡的江南小城地级市,县城和乡村之间走亲戚。
见到听到的人和事, 让我意识到,这个世界的折叠程度,远远超过自己的想象。
最震惊我的,是那些县城里赚钱未遂的人。

01
堂哥的灯具店要关门了
回乡见得第一个亲人,是堂哥。堂哥开了三年的灯具店终于撑不住了,考虑关掉,想听听我的意见。
堂哥是大伯家的独子,刚过而立之年。念书不行,高中毕业就跟着大伯做早餐生意,但起早贪黑,对年轻人来说,确实太难。
三年前, 举全家之力,给堂哥在县城开了一家灯具店。
县城的生意逻辑在造势。为此,堂哥在银行贷了15万,把门店装修的很讲究。就这样,毫无灯具经营经验的堂哥一下子当上了老板。
店铺开起来,才知道有那么多活儿。
销售,上门安装,拉业务,催账,堂哥夫妻两根本忙不过来。于是,大伯的早餐店也盘出去,帮忙上门安装灯具,伯母负责做饭。
全家人围着店铺转,可生意还是每况愈下。
三年忙活下来,店铺的灯具品牌,从欧普、美的等知名品牌降级到杂牌产品。店铺租金太高,堂哥重找了个便宜店面。
最要命的是,三年前借的15万一分钱也没还。整个家庭陷入了进退不得的状态,还不如当初开早餐店。
对此,我觉得不可思议。问堂哥:
去年县城的房子不是卖得很不错嘛,怎么装修生意这么难做?
“炒房的太多了,哪有人真的装修。”
堂哥觉得很无力,我感到很震惊。“县城不到30万人,炒啥房!”
堂哥接触到最真实的市场情况,2018年,绝大多数县城的房子,都是被占坑式买房人买走的。
在外打工,听闻房价会涨,赶紧回家占个坑,或者是附近乡村的居民为了孩子念书,提前在县城买房。
这两类购房者,都不买堂哥的灯具。
堂哥的顾客,主要是周边乡镇自建房的农民。但自建房往往上门安装远,账又难收,利润薄如纸。
县城房地产市场火爆,与堂哥的灯具生意不仅毫无关系,还掏空了县城人们的腰包,导致堂哥的品牌灯具滞销,只能卖质差价廉的杂牌灯具。
堂哥盘点了一下,如果8万外账能顺利收回来。加上店里4万的灯具货量。再加上价值3万不到的拉货二手面包车,差不多还掉银行的贷款。
全家四个劳动力,忙活了三年,一分存款也没剩下。
堂哥盘算着:年底把店关了,明年大伯继续做早餐,自己考虑别的营生。
反正不开店不创业了。
如果说堂哥的灯具店的失败,是县城传统行业的缩影。另一件事,让我对县城的未来更担心了。

02
在老家卖水果的小刘
这是一个乡村创业故事,主人翁是我爷爷家隔壁邻居小孩小刘。
爷爷家是一个人口不到20万的乡镇,镇上只有一条街,底下还有七八个自然村,小刘比我小几岁。
我每次暑假回爷爷家,小刘每次就跟着我满田野里跑,他很机灵,但是不会念书。
长大后,我交了更厉害的朋友,便和小刘没了交集。
他成了我躺在好友列表里的微信好友。
通过他的朋友圈,我了解到,小刘初中肄业之后,一直在杭州一家百果园水果店工作。
2018年中,小刘突然微信找我,说自己要回乡创业,想听听我的建议。
我确认他不是借钱之后,松了一口气。正准备以受过高等教育的高级白领身份,好好点拨他。
小刘聊了他的想法,自己的家乡(我爷爷家的小镇)和大多是乡村一样,留守老人孩子多,但不舍得消费水果。
而在杭的老乡群里,很多老乡在外务工,想给家里留守儿童和老人买水果,既买不到,也无法送货上门。
小刘脑袋灵光,这可是一片蓝海。
杭州水果店的工作经验,让他基本摸清了生鲜店的进货渠道,和成本把控的诀窍。
再加上他长年担任门店的熟客微信群群主,对社群营销,更是有独到的见解。
我没想到,小刘的对于to C模式的理解,竟然如此深刻。
在我看来,这是典型的一线城市营销套路,对乡村市场的降维打击,无疑小刘真的是一个奇才。
于是,他决定回小镇开这样一个水果配送店。店很快开起来了。
小刘每天在群里,发当天水果照片和价格。
顾客大多是在外务工的年轻人,他们为尽孝心,也愿意花钱,通过微信转账的方式付款,小刘给客户家里留守老人和孩子配送,并拍视频作为反馈。
全新的营销方式,加上热心肠的小刘的服务态度,水果店的生意非常好。
但没想到,小刘的水果店还是没撑过春节。
自从开店以来,小刘开始每天凌晨进货,早上运营微信群,接单,配送。即使雇了人帮忙,小刘依然累得开车差点睡着。
忙不要紧,但不挣钱的瞎忙,就最致命了。
对生鲜产品来说,乡村的进货成本,远远超过了小刘的预期。为了控制坏果率,小刘每天凌晨,去最近的城市衢州市进货,结果是坏果率没下来,运输成本先上去了。
老家的人口本来就不多,加上很多老人一辈子节约惯了,心疼钱,所以对子女买来的新鲜水果有天然抗性。
人均收入低的乡村,自然客单价也提不上去,两边一挤压,小刘受不了。
这时候,小刘意识到,乡村的生鲜市场,被各大电商抛弃,不是没有原因的。
他在杭州这样的大城市看到的生鲜的刚性需求,到了乡村,一下子就变成伪需求了。
还没撑到车厘子上市的季节,小刘的店就关掉了,小刘重新回到杭州,找了一份月薪4000的工作。

03
县城的消费市场逻辑
不仅仅传统行业,在县城乡村的土壤无法生长,连小刘这样新颖的商业模式,也无法生存。
县城乡村的消费市场为什么如此萎靡?
我在思考,应该是是消费人口的缺失,导致购买力低下引起的。
年轻人是消费的主力军,但村里的上大学的年轻人,留在省会城市工作。没上学的年轻人,去沿海城市打工。
县城,好就好在消费水平低,坏就坏在,只有消费水平低。
县城缺乏机会,没有热钱,人情社会严重,缺乏工作岗位。寥寥的年轻人选择不多,不是挤破头考公务员,就是考教师资格证。
只有公务员和教师,才是体面的工作。
而就算是体面的工作,依然不会是高薪。这注定了县城的日常用品消费总需求固定,利润低。
消费升级的产品,根本没有对应消费人群。
当一线城市的杯均30RMB的喜茶/瑞幸咖啡/鹿角巷等遍地开花的时候,县城卖得最好的茶饮还是古茗,杯均10RMB。
罗胖在演讲里提到古茗成功的秘诀,县城和镇上晚上的灯光一般不够亮,你只要做一个很简单的事:就是把奶茶店门头的灯调得更亮,最好是能成为那条街上的路灯。
这样就能引起消费者的注意。
其实不然,客单价贴合县城的消费水准,才是奶茶店存活的不二法则。
否则,40块一杯的精品咖啡店开在县城,就算是用上疝气大灯照亮,依然没有市场。
我以为我找到了县城消费萎靡的元凶:购买力低下。
但后来的认知告诉我,我被重重地打脸了。

04
在县城,很多人都用力活着,但很少人用脑活着
虽然这么形容很刻薄,但看到人们花钱做出各种看似“无脑”的事情,真的很痛心。
在县城,似乎只有坑蒙拐骗,才能赚到钱。
和初中同学的饭桌上,听闻当年隔壁班的小美,做床垫生意,如今成为了县城排得上号的富婆。
联想到堂哥口中说的,县城里灯具生意,稍贵的品牌灯具卖不出去,只好卖便宜的杂牌灯具。
卖床垫能如此挣钱?我有些质疑真实性。
后来我知道,原来小美卖的,是玉石床垫,要价3万元到5万元不等,买的人络绎不绝。
没错,就是你第一时间想到的坑老年人的保健品床垫。
以送鸡蛋或大米的小恩惠,召集老年人开会、听课,宣传洗脑玉石床垫包治百病的功效,免费体验试睡。
每天大清早都有老人排队,等着免费“试睡”。不愿意排队的,或者觉得确实有功效的,就把养老钱掏出来买回家。
县城每一个赚钱的暴利生意背后,都是靠收割穷人的血汗钱而来的。
第二个血汗钱收割机,就是低价旅游。99元西湖两日游,399元香港三日游,699元三亚双飞豪华游。
这样大城市玩剩下的低价旅游骗局,在地方被受欢迎。结果可想而知,各种被套路买高价乳胶枕,玉石,名贵中药材等等案例遍地开花。
第三个血汗钱收割机,是民间借贷。p2p以及各种高息揽储的项目,你盯着别人的利息,别人看重的却是你的本金。
我爸告诉我,小时候带我练球的乒乓球教练,因为禁不住年化40%利息诱惑,民间借贷借出去200万遭遇爆雷,抛妻弃子,已经跑路了。
我很震惊,也很忿恨。
起早贪黑开球馆,抛去场地和雇教练的成本,净利润也不过年化20%,连腾讯这样的互联网独角兽的财报,净利润也达不到年化30%。
凭什么你会相信,你的全部养老钱可以躺赚年化40%的利润。

05
跳出这个财富链底层的四点劝诫
这个社会里,信息和财富的扩散,像是冲泡一杯蜜水,蜜总是从杯口慢慢渗透到杯底。
因为认知和信息的差距,导致县城和乡村,就是社会这杯蜜水的杯底。
在城市被淘汰的保健品骗局,入侵着这里的老年人。在大城市卖不动的假货,摆满了这里的货架。
这里的人们赚的不多,还最容易被骗。能不能跳出杯底,我有一些劝诫:
第一,保证全家人都能有健康的生活方式。
别说刚过温饱线的家庭,在疾病面前,连中产家庭也显得不堪一击。
ICU的床位费是1万一个晚上,特效药的报销比例接近于零。别听信“酒是粮食精,越喝越年轻”的鬼话。酒精和隔夜菜里的亚硝酸盐一样,都是一类致癌物。
第二,不要创业不要开店。
不要投入50万装修,开当地最大的网咖,因为等待着你的,是遥遥无期的回本之路。
不要开加工厂,一次工伤事故可能会吃掉你一年的利润。
不要试图开衣食住行以外的店,你的一己之力,无法违背市场规律。
小刘和堂哥,都是县城乡村创业的缩影。
作为一个没背景没资源的普通人,尽量找一份依靠技术和资源赚钱的工作,如果非要创业,请选择轻资产创业模式,不要梭哈。
第三,不要投资,不要炒股。
股票,是资本操纵下的负和游戏,穷人根本没有资格上牌桌。
徐翔案被曝光出的交易内幕,以及今年1月4号,央行降准消息发布前,券商入场拉升大盘等事件,都在说明一个真相:
我们生活在一个信息极不对等的世界里,那些先知先觉的人的背后,是一把把明晃晃的镰刀,等待收割散户。
而投资,同样是一件高门槛高风险的事情。
如果你遇到了一笔很容易的投资机会,它一定是个陷阱,包括但不限于p2p,民间借贷,分红型保险,原油螺纹钢等期货。
第四,为了孩子和自己的起点,请在能力范围内,在最高级别的城市,买房置业。
能买北上深,就不买杭广蓉,能买省会,就不买县城和地级市。
三四线房产只有居住属性,无金融属性。
如果还来得及,请卖掉三四线城市投资属性的房子。
未来三四线城市,将迎来滞涨时代

python 中文图片文字识别

python李魔佛 发表了文章 • 0 个评论 • 5173 次浏览 • 2019-02-01 10:47 • 来自相关话题

pytesseract这个库识别率偏低,也就菜鸟才会用。
使用方法很简单,安装好pytesseract(里面很多坑,小白的话不可避免要折腾一番),然后下载一个中文的字库,百度网盘:https://pan.baidu.com/s/1_jom2d95IeR40gsvkhUuvQ
 
然后把文件放到tesseract的文件夹中 C:\Program Files (x86)\Tesseract-OCR\tessdata 
然后就可以拿来识别了:
from PIL import Image
im = Image.open('chinese.jpg')
plt.figure(figsize=(20,20))
plt.imshow(im)

pytesseract.image_to_string(im,lang='chi_sim')
图片的内容是这样的:





 
然后识别效果如下:
 
'可L又使用以下的语句i上图片显示大 此'
还是不咋地。
 
那么可以换成大厂的API。试试百度的:
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()

image = get_file_content('example.jpg')

""" 调用通用文字识别, 图片参数为本地图片 """
client.basicGeneral(image);

""" 如果有可选参数 """
options = {}
options["language_type"] = "CHN_ENG"
options["detect_direction"] = "true"
options["detect_language"] = "true"
options["probability"] = "true"

from aip import AipOcr

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)


""" 带参数调用通用文字识别, 图片参数为本地图片 """
client.basicGeneral(image, options)

url = "https//www.x.com/sample.jpg"

""" 调用通用文字识别, 图片参数为远程url图片 """
client.basicGeneralUrl(url);

""" 如果有可选参数 """
options = {}
options["language_type"] = "CHN_ENG"
options["detect_direction"] = "true"
options["detect_language"] = "true"
options["probability"] = "true"

""" 带参数调用通用文字识别, 图片参数为远程url图片 """
client.basicGeneralUrl(url, options)
先去百度云申请一个API,免费的。
https://cloud.baidu.com/doc/OCR/OCR-Python-SDK.html#.E9.85.8D.E7.BD.AEAipOcr
然后把key复制到上面的代码中就可以了。
 
然后再调用看看结果:
可以使用以下的语句让图片显示大些正确率明显高很多了。
 
 
 
  查看全部
pytesseract这个库识别率偏低,也就菜鸟才会用。
使用方法很简单,安装好pytesseract(里面很多坑,小白的话不可避免要折腾一番),然后下载一个中文的字库,百度网盘:https://pan.baidu.com/s/1_jom2d95IeR40gsvkhUuvQ
 
然后把文件放到tesseract的文件夹中 C:\Program Files (x86)\Tesseract-OCR\tessdata 
然后就可以拿来识别了:
from PIL import Image
im = Image.open('chinese.jpg')
plt.figure(figsize=(20,20))
plt.imshow(im)

pytesseract.image_to_string(im,lang='chi_sim')

图片的内容是这样的:

中文1.JPG

 
然后识别效果如下:
 
'可L又使用以下的语句i上图片显示大 此'

还是不咋地。
 
那么可以换成大厂的API。试试百度的:
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()

image = get_file_content('example.jpg')

""" 调用通用文字识别, 图片参数为本地图片 """
client.basicGeneral(image);

""" 如果有可选参数 """
options = {}
options["language_type"] = "CHN_ENG"
options["detect_direction"] = "true"
options["detect_language"] = "true"
options["probability"] = "true"

from aip import AipOcr

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)


""" 带参数调用通用文字识别, 图片参数为本地图片 """
client.basicGeneral(image, options)

url = "https//www.x.com/sample.jpg"

""" 调用通用文字识别, 图片参数为远程url图片 """
client.basicGeneralUrl(url);

""" 如果有可选参数 """
options = {}
options["language_type"] = "CHN_ENG"
options["detect_direction"] = "true"
options["detect_language"] = "true"
options["probability"] = "true"

""" 带参数调用通用文字识别, 图片参数为远程url图片 """
client.basicGeneralUrl(url, options)

先去百度云申请一个API,免费的。
https://cloud.baidu.com/doc/OCR/OCR-Python-SDK.html#.E9.85.8D.E7.BD.AEAipOcr
然后把key复制到上面的代码中就可以了。
 
然后再调用看看结果:
可以使用以下的语句让图片显示大些
正确率明显高很多了。
 
 
 
 

可转债价格分布堆叠图 绘制 可视化 python+pyecharts

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 5571 次浏览 • 2019-01-30 10:59 • 来自相关话题

这一节课带大家学习如何利用可视化,更好的呈现数据。
即使你有很多数据,可是,你无法直观地看到数据的总体趋势。使用可视化的绘图,可以帮助我们看到数据背后看不到的数据。 比如我已经有每一个可转债的价格,评级。数据如下:





 点击查看大图

如果我用下面的图形就可以看出规律:




 点击查看大图

横坐标是价格,纵坐标是落在该价格的可转债数量,不同颜色代表不同评级的可转债。
 
可以看到大部分AA-评级(浅橙色)的可转债价格都在100元以下,而AA(浅蓝色)的可转债价格分布较为平均,从90到110都有。而AA+和AAA的一般都在100以上。
 
那么如何使用代码实现呢?from setting import get_mysql_conn,get_engine
import pandas as pd
import pymongo
from pyecharts import Geo,Style,Map
engine = get_engine('db_stock',local='local')
# 堆叠图
from pyecharts import Bar
df = pd.read_sql('tb_bond_jisilu',con=engine)

result ={}
for name,grades in df.groupby('评级'):
# print(name,grades[['可转债名称','可转债价格']])
for each in grades['可转债价格']:
result.setdefault(name,)
result[name].append(each)


# 确定价格的范围

value = [str(i) for i in range(85,140)]
ret = [0]*len(value)
ret1 = dict(zip(value,ret))

ret_A_add = ret1.copy()
for item in result['A+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
ret_A_add[k]+=1

retAA_ = ret1.copy()
for item in result['']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_[k]+=1

retAA = ret1.copy()
for item in result['AA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA[k]+=1

retAA_add = ret1.copy()
for item in result['AA+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_add[k]+=1

retAAA = ret1.copy()
for item in result['AAA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAAA[k]+=1

bar = Bar('可转债价格分布')
bar.add('A+',value,list(ret_A_add.values()),is_stack=True,yaxis_max=11)
bar.add('',value,list(retAA_.values()),is_stack=True,yaxis_max=11)
bar.add('AA',value,list(retAA.values()),is_stack=True,yaxis_max=11)
bar.add('AA+',value,list(retAA_add.values()),is_stack=True,yaxis_max=11)
bar.add('AAA',value,list(retAAA.values()),is_stack=True,yaxis_max=11)
如果没有安装pyecharts,需要用pip安装即可。
 

 

原创文章
转载请注明出处:
 http://30daydo.com/article/400 

  查看全部
这一节课带大家学习如何利用可视化,更好的呈现数据。
即使你有很多数据,可是,你无法直观地看到数据的总体趋势。使用可视化的绘图,可以帮助我们看到数据背后看不到的数据。 比如我已经有每一个可转债的价格,评级。数据如下:

可转债数据.JPG

 点击查看大图

如果我用下面的图形就可以看出规律:
可转债价格分布.JPG

 点击查看大图

横坐标是价格,纵坐标是落在该价格的可转债数量,不同颜色代表不同评级的可转债。
 
可以看到大部分AA-评级(浅橙色)的可转债价格都在100元以下,而AA(浅蓝色)的可转债价格分布较为平均,从90到110都有。而AA+和AAA的一般都在100以上。
 
那么如何使用代码实现呢?
from  setting import get_mysql_conn,get_engine
import pandas as pd
import pymongo
from pyecharts import Geo,Style,Map
engine = get_engine('db_stock',local='local')
# 堆叠图
from pyecharts import Bar
df = pd.read_sql('tb_bond_jisilu',con=engine)

result ={}
for name,grades in df.groupby('评级'):
# print(name,grades[['可转债名称','可转债价格']])
for each in grades['可转债价格']:
result.setdefault(name,)
result[name].append(each)


# 确定价格的范围

value = [str(i) for i in range(85,140)]
ret = [0]*len(value)
ret1 = dict(zip(value,ret))

ret_A_add = ret1.copy()
for item in result['A+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
ret_A_add[k]+=1

retAA_ = ret1.copy()
for item in result['']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_[k]+=1

retAA = ret1.copy()
for item in result['AA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA[k]+=1

retAA_add = ret1.copy()
for item in result['AA+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_add[k]+=1

retAAA = ret1.copy()
for item in result['AAA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAAA[k]+=1

bar = Bar('可转债价格分布')
bar.add('A+',value,list(ret_A_add.values()),is_stack=True,yaxis_max=11)
bar.add('',value,list(retAA_.values()),is_stack=True,yaxis_max=11)
bar.add('AA',value,list(retAA.values()),is_stack=True,yaxis_max=11)
bar.add('AA+',value,list(retAA_add.values()),is_stack=True,yaxis_max=11)
bar.add('AAA',value,list(retAAA.values()),is_stack=True,yaxis_max=11)

如果没有安装pyecharts,需要用pip安装即可。
 

 

原创文章
转载请注明出处:
 http://30daydo.com/article/400 

 

可转债套利【一】 python找出折价可转债个股

量化交易-Ptrade-QMT李魔佛 发表了文章 • 9 个评论 • 18132 次浏览 • 2018-03-16 17:17 • 来自相关话题

关于可转债的定义,可以到https://xueqiu.com/6832369826/103042836 这里科普一下。
 
下面的内容默认你对可转债已经有一定的了解。
 
可转债的价值=正股价格/转股价格 + 利息,忽略可转债的利息,直接用公式 可转债的价值=正股价格/转股价格 计算可转债的价值。
 
如果当前可转债的交易价格(在交易软件上显示的价格)如:




所以万信转债的价格是121.5元,然后万信转债的价值呢? 按照上面的公式,万信转债的正股是万达信息,今天万达信息  (2018-03-16)的股价是





以收盘价为例,17.25。
 
而万信转债的股转价格呢? 这个可以到万信转债F10页面的公告中找到,为13.11元。 所以万信转债的价值是
17.25/13.11 = 1.315 , 可转债单位是100, 所以万信转债的内在价值是1.315*100=131.5, 而当前的交易价格为 121.5





 
 
也就是你用121.5元买到一个价值 131.5的商品, 所以相当于打折买到了一个超值的商品,所以当前的万信转债是折价状态。
 
所以本次任务就是要找出可交易的可转债中折价状态的可转债。
 
然后直接上干货。上python代码。#-*-coding=utf-8
'''
可转债监控
'''
import tushare as ts
from setting import get_engine
engine = get_engine('db_bond')
import pandas as pd
import datetime
class ConvertBond():

def __init__(self):
self.conn=ts.get_apis()
self.allBonds=ts.new_cbonds(pause=2)
self.onSellBond=self.allBonds.dropna(subset=['marketprice'])
self.today=datetime.datetime.now().strftime('%Y-%m-%d %H:%M')

def stockPrice(self,code):
stock_df = ts.get_realtime_quotes(code)
price = float(stock_df['price'].values[0])
return price

def dataframe(self):
price_list=
for code in self.onSellBond['scode']:
price_list.append(self.stockPrice(code))
self.onSellBond['stock_price']=price_list
self.onSellBond['ratio'] = (
self.onSellBond['marketprice']
/(self.onSellBond['stock_price'] / self.onSellBond['convprice'])-1)*100
self.onSellBond['Updated']=self.today
self.onSellBond.to_sql('tb_bond',engine,if_exists='replace')

def closed(self):
ts.close_apis(self.conn)

def main():
bond=ConvertBond()
bond.dataframe()
bond.closed()
if __name__=='__main__':
main()








 上面的setting库,把下面的*** 替换成你自己的Mysql用户和密码即可。import os
import MySQLdb
MYSQL_USER = *********
MYSQL_PASSWORD = ********
MYSQL_HOST = *********
MYSQL_PORT = *****

def get_engine(db):
engine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, db))
return engine 
上面的少于100行的代码就能够满足你的要求。
运行后会把结果保存在MySQL 数据库。如下图所示:







点击放大
  2018-03-16 可转债表格
 
其中折价率是ratio列。按照ratio列进行排列,只有2个是正,也就是当前市场是只有2只可转债是处于折价状态的,其余的都是溢价状态(价格比内在价值要贵,忽略利息的前提下,如果把4~5%的利息也算进去的话,-3~4%的折价率其实也算小折价吧)
 
目前万信转债折价10个点,宝信转债折价5.8个点。 所以适合低风险投资者建仓。 因为可转债有兜底价格,所以出现亏损的概率很低(除非遇到黑天鹅,公司破产了,像遇到乐视这种PPT独角兽公司,欠债不还的。 但是A股上能够有资格发行可转债的,本身对公司的盈利,分红都有硬性要求)。
 
所以可以保存上面的代码,可以每天运行一次,可以很方便地找出折价的个股,当然也可以在盘中一直监测,因为可转债的价格是实时变化的,一旦遇到大跌,跌到折价状态,你也可以择时入手标的。

原文链接:
http://30daydo.com/article/286
转载请注明出处
 
可转债低费率,沪市百万分之二,深圳十万分之四,免五 开户
加微信开通

  查看全部
关于可转债的定义,可以到https://xueqiu.com/6832369826/103042836 这里科普一下。
 
下面的内容默认你对可转债已经有一定的了解。
 
可转债的价值=正股价格/转股价格 + 利息,忽略可转债的利息,直接用公式 可转债的价值=正股价格/转股价格 计算可转债的价值。
 
如果当前可转债的交易价格(在交易软件上显示的价格)如:
wxzz.GIF

所以万信转债的价格是121.5元,然后万信转债的价值呢? 按照上面的公式,万信转债的正股是万达信息,今天万达信息  (2018-03-16)的股价是

万达信息.GIF

以收盘价为例,17.25。
 
而万信转债的股转价格呢? 这个可以到万信转债F10页面的公告中找到,为13.11元。 所以万信转债的价值是
17.25/13.11 = 1.315 , 可转债单位是100, 所以万信转债的内在价值是1.315*100=131.5, 而当前的交易价格为 121.5

wxzz.GIF

 
 
也就是你用121.5元买到一个价值 131.5的商品, 所以相当于打折买到了一个超值的商品,所以当前的万信转债是折价状态。
 
所以本次任务就是要找出可交易的可转债中折价状态的可转债。
 
然后直接上干货。上python代码。
#-*-coding=utf-8
'''
可转债监控
'''
import tushare as ts
from setting import get_engine
engine = get_engine('db_bond')
import pandas as pd
import datetime
class ConvertBond():

def __init__(self):
self.conn=ts.get_apis()
self.allBonds=ts.new_cbonds(pause=2)
self.onSellBond=self.allBonds.dropna(subset=['marketprice'])
self.today=datetime.datetime.now().strftime('%Y-%m-%d %H:%M')

def stockPrice(self,code):
stock_df = ts.get_realtime_quotes(code)
price = float(stock_df['price'].values[0])
return price

def dataframe(self):
price_list=
for code in self.onSellBond['scode']:
price_list.append(self.stockPrice(code))
self.onSellBond['stock_price']=price_list
self.onSellBond['ratio'] = (
self.onSellBond['marketprice']
/(self.onSellBond['stock_price'] / self.onSellBond['convprice'])-1)*100
self.onSellBond['Updated']=self.today
self.onSellBond.to_sql('tb_bond',engine,if_exists='replace')

def closed(self):
ts.close_apis(self.conn)

def main():
bond=ConvertBond()
bond.dataframe()
bond.closed()
if __name__=='__main__':
main()








 上面的setting库,把下面的*** 替换成你自己的Mysql用户和密码即可。
import os
import MySQLdb
MYSQL_USER = *********
MYSQL_PASSWORD = ********
MYSQL_HOST = *********
MYSQL_PORT = *****

def get_engine(db):
engine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, db))
return engine
 
上面的少于100行的代码就能够满足你的要求。
运行后会把结果保存在MySQL 数据库。如下图所示:


Screenshot_from_2018-03-28_09-14-35.png


点击放大
  2018-03-16 可转债表格
 
其中折价率是ratio列。按照ratio列进行排列,只有2个是正,也就是当前市场是只有2只可转债是处于折价状态的,其余的都是溢价状态(价格比内在价值要贵,忽略利息的前提下,如果把4~5%的利息也算进去的话,-3~4%的折价率其实也算小折价吧)
 
目前万信转债折价10个点,宝信转债折价5.8个点。 所以适合低风险投资者建仓。 因为可转债有兜底价格,所以出现亏损的概率很低(除非遇到黑天鹅,公司破产了,像遇到乐视这种PPT独角兽公司,欠债不还的。 但是A股上能够有资格发行可转债的,本身对公司的盈利,分红都有硬性要求)。
 
所以可以保存上面的代码,可以每天运行一次,可以很方便地找出折价的个股,当然也可以在盘中一直监测,因为可转债的价格是实时变化的,一旦遇到大跌,跌到折价状态,你也可以择时入手标的。

原文链接:
http://30daydo.com/article/286
转载请注明出处
 
可转债低费率,沪市百万分之二,深圳十万分之四,免五 开户
加微信开通

 

dataframe reindex和reset_index区别

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 78217 次浏览 • 2017-12-30 15:58 • 来自相关话题

reset_index的作用是重新设置dataframe的index,范围为0~len(df)。 df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
df2 = pd.DataFrame({'A': [6], 'B': [60]})
print('df', df)
print('df2', df2)

df_x = [df, df2]
result = pd.concat(df_x)
print('first result ', result) 
上面代码把df和df2合并为一个result,但是result的index是乱的。





 
那么执行result2= result.reset_index()
得到如下的result2: (默认只是返回一个copy,原来的result没有发生改变,所以需要副本赋值给result2)





可以看到,原来的一列index现在变成了columns之一,新的index为[0,1,2,3,4,5]
如果添加参数 reset_index(drop=True) 那么原index会被丢弃,不会显示为一个新列。result2 = result.reset_index(drop=True)



 
reindex的作用是按照原有的列进行重新生成一个新的df。
 
还是使用上面的代码
result目前是df和df2的合并序列。
如下:




 
可以看到index为[0,1,2,3,4,0]
执行 result3 = result.reindex(columns=['A','C'])




 
可以看到,原index并没有发生改变,而列变成了A和C,因为C是不存在的,所以使用了NaB填充,这个值的内容可以自己填充,可以改为默认填充0或者任意你想要的数据。reindex(columns=..)的作用类似于重新把列的顺序整理一遍, 而使用reindex(index=....) 则按照行重新整理一遍。

原文链接:http://30daydo.com/article/257 
欢迎转载,注明出处
  查看全部
reset_index的作用是重新设置dataframe的index,范围为0~len(df)。
    df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
df2 = pd.DataFrame({'A': [6], 'B': [60]})
print('df', df)
print('df2', df2)

df_x = [df, df2]
result = pd.concat(df_x)
print('first result ', result)
 
上面代码把df和df2合并为一个result,但是result的index是乱的。

df4.PNG

 
那么执行
result2= result.reset_index()

得到如下的result2: (默认只是返回一个copy,原来的result没有发生改变,所以需要副本赋值给result2)

df5.PNG

可以看到,原来的一列index现在变成了columns之一,新的index为[0,1,2,3,4,5]
如果添加参数 reset_index(drop=True) 那么原index会被丢弃,不会显示为一个新列。
result2 = result.reset_index(drop=True)
df6.PNG

 
reindex的作用是按照原有的列进行重新生成一个新的df。
 
还是使用上面的代码
result目前是df和df2的合并序列。
如下:
df7.PNG

 
可以看到index为[0,1,2,3,4,0]
执行 
result3 = result.reindex(columns=['A','C'])

df8.PNG

 
可以看到,原index并没有发生改变,而列变成了A和C,因为C是不存在的,所以使用了NaB填充,这个值的内容可以自己填充,可以改为默认填充0或者任意你想要的数据。reindex(columns=..)的作用类似于重新把列的顺序整理一遍, 而使用reindex(index=....) 则按照行重新整理一遍。

原文链接:http://30daydo.com/article/257 
欢迎转载,注明出处
 

每天一道leetcode题目 30天尝试新事情

30天新尝试李魔佛 发表了文章 • 0 个评论 • 3921 次浏览 • 2017-02-24 12:14 • 来自相关话题

忽然觉得自己基础知识忘了不少。所以打算做做传说中的刷题神器--leetcode。 题目在官网: https://leetcode.com
 
从接受度排序,先挑战接受度高的题目,然后循序渐进。
 
每天更新在这个帖子里面。 (最近发现另外一个在线编程练习网站lintcode,题目都免费,而且适合国内的公司,也开始在做了,这些题目后面会在这个贴子里更新吧)
 
Day 1 2017-2-25
leetcode Day1 Two Sum 两数之和
http://30daydo.com/article/145
 
Day 2 2017-2-26
leetcode Day2 Hamming Distance 海明距离​
http://30daydo.com/article/146

Day3 2017-2-27
leetcode Day3 complement number 【补码】
http://30daydo.com/article/147 

Day4 2017-2-28
leetcode Day4 Keyboard Row 键盘中的行
http://30daydo.com/article/148
 
Day4 2017-3-1
Day5 leetcode Next Greater Element 下一个更大的元素​
http://30daydo.com/article/150
 
Day4 2017-3-7
Day6 leetcode Fizz Buzz 字符转换游戏(实在不知道该怎么翻译这个)​
http://30daydo.com/article/151
 
 
  查看全部
忽然觉得自己基础知识忘了不少。所以打算做做传说中的刷题神器--leetcode。 题目在官网: https://leetcode.com
 
从接受度排序,先挑战接受度高的题目,然后循序渐进。
 
每天更新在这个帖子里面。 (最近发现另外一个在线编程练习网站lintcode,题目都免费,而且适合国内的公司,也开始在做了,这些题目后面会在这个贴子里更新吧)
 
Day 1 2017-2-25
leetcode Day1 Two Sum 两数之和
http://30daydo.com/article/145
 
Day 2 2017-2-26
leetcode Day2 Hamming Distance 海明距离​
http://30daydo.com/article/146

Day3 2017-2-27
leetcode Day3 complement number 【补码】
http://30daydo.com/article/147 

Day4 2017-2-28
leetcode Day4 Keyboard Row 键盘中的行
http://30daydo.com/article/148
 
Day4 2017-3-1
Day5 leetcode Next Greater Element 下一个更大的元素​
http://30daydo.com/article/150
 
Day4 2017-3-7
Day6 leetcode Fizz Buzz 字符转换游戏(实在不知道该怎么翻译这个)​
http://30daydo.com/article/151
 
 
 

撸羊毛系列 定期更新 ****2017-04-20 ******

30天新尝试绫波丽 发表了文章 • 0 个评论 • 4817 次浏览 • 2016-12-07 02:24 • 来自相关话题

开一个系列的帖子,记录一些常有的撸羊毛的方法,蚊子都是肉呀~ 嘻嘻。 (坚决不碰P2P)
更新时间 ***************2017-04-20*******************
 
立马理财(网易和光大银行一起推出的,信得过)
新注册马上送30元,推荐的注册用户送50元。 而且主页有个活动,扫码就可以拿现金奖励。
新人注册会有6.6个点的收益,还有8888的体验金。
 
百度理财:
推荐新人可以拿到推荐金,为0.45%个点。而且是马上到账的。 被推荐的人期间还可以拿9%的双倍年化收益。
以我为例,推荐我亲戚注册并投资了几万块,30天的货币基金。我就拿到360元的奖励(马上到账可以体现)。
而亲戚拿到了200多的9%双倍年化(只送几天), 然后还有正常的6%的年化收益。
 
支付宝提现按照下面的方法可以不花手续费
 
2016年10月支付宝对提现收取千分之一的手续费。 只要你的钱一旦进入支付宝,要出来就要收取手续费。 你把钱投入到余额宝,转出来也只能赚到余额,不能直接转回卡里面。所以到时是谁在乱说通过余额宝可以绕开这个提现的手续费的? 说出来, 我保证不打断你的腿。
 
阿里旗下有一个浙江的网商银行,在支付宝里面,“我的” 菜单下面,然后在底下有一个网商银行,注册并且绑定银行卡,那么就可以直接把钱从支付宝转出到网商银行(马上到账),然后就可以在网商银行里直接体现,关键是马上到账!! 且不收手续费!!
 
 
更新时间 ***************2017-01-19 *******************
 
最近京东理财有送券的,定存一个月,马上送20元现金券(定存1w有20元,定存1k的只有5元),直接发到银行卡。 而定存的一个月是按照正常的利息计算,年化大概4个点。 
 
支付宝的福字: 有一个福字,爱国福,会有18元的现金券,需要你开通阿里的网商银行,这个开通了马上就可以提现。 
 
最近的年底逆回购利率比较高,可以把平时存在货币基金的钱取出来做做逆回购。





今天1天逆回购最高有15个点的年化收益。
 
 
更新时间 *******2016-12-06********
 
最近微信理财通有一个领取红包的活动,第一次可以免费领取3.99的现金。 
首先充1元到理财通,然后就可以获得3.99, 然后总共有4.99元,可以马上就体现到银行卡
 
然后第二次刘涛会发红包给你,需要你投入1000理财金额,就可以获得25元的红包,不过这1025总额要锁定一个月才能取出来,当然1000元每天都有年化2.5%的收益(约等于5分钱)。
 
 
更多的讨论可以加QQ群:613194389 查看全部
开一个系列的帖子,记录一些常有的撸羊毛的方法,蚊子都是肉呀~ 嘻嘻。 (坚决不碰P2P
更新时间 ***************2017-04-20*******************
 
立马理财(网易和光大银行一起推出的,信得过)
新注册马上送30元,推荐的注册用户送50元。 而且主页有个活动,扫码就可以拿现金奖励。
新人注册会有6.6个点的收益,还有8888的体验金。
 
百度理财:
推荐新人可以拿到推荐金,为0.45%个点。而且是马上到账的。 被推荐的人期间还可以拿9%的双倍年化收益。
以我为例,推荐我亲戚注册并投资了几万块,30天的货币基金。我就拿到360元的奖励(马上到账可以体现)。
而亲戚拿到了200多的9%双倍年化(只送几天), 然后还有正常的6%的年化收益。
 
支付宝提现按照下面的方法可以不花手续费
 
2016年10月支付宝对提现收取千分之一的手续费。 只要你的钱一旦进入支付宝,要出来就要收取手续费。 你把钱投入到余额宝,转出来也只能赚到余额,不能直接转回卡里面。所以到时是谁在乱说通过余额宝可以绕开这个提现的手续费的? 说出来, 我保证不打断你的腿。
 
阿里旗下有一个浙江的网商银行,在支付宝里面,“我的” 菜单下面,然后在底下有一个网商银行,注册并且绑定银行卡,那么就可以直接把钱从支付宝转出到网商银行(马上到账),然后就可以在网商银行里直接体现,关键是马上到账!! 且不收手续费!!
 
 
更新时间 ***************2017-01-19 *******************
 

最近京东理财有送券的,定存一个月,马上送20元现金券(定存1w有20元,定存1k的只有5元),直接发到银行卡。 而定存的一个月是按照正常的利息计算,年化大概4个点。 
 
支付宝的福字: 有一个福字,爱国福,会有18元的现金券,需要你开通阿里的网商银行,这个开通了马上就可以提现。 
 
最近的年底逆回购利率比较高,可以把平时存在货币基金的钱取出来做做逆回购。

逆回购.PNG

今天1天逆回购最高有15个点的年化收益。
 
 
更新时间 *******2016-12-06********
 
最近微信理财通有一个领取红包的活动,第一次可以免费领取3.99的现金。 
首先充1元到理财通,然后就可以获得3.99, 然后总共有4.99元,可以马上就体现到银行卡
 
然后第二次刘涛会发红包给你,需要你投入1000理财金额,就可以获得25元的红包,不过这1025总额要锁定一个月才能取出来,当然1000元每天都有年化2.5%的收益(约等于5分钱)。
 
 
更多的讨论可以加QQ群:613194389

自学能力强大的人在任何领域都会无比强大!

30天新尝试低调的哥哥 发表了文章 • 0 个评论 • 7987 次浏览 • 2016-08-06 11:03 • 来自相关话题

每个人身边都会有牛人,似乎这些牛人从来不会为某一件事情而费劲,而某些人却为某些事情费尽九牛二虎之力也无法把事情解决。 大学时期班上总有那么几个家伙,可以经常打游戏,打球,泡妞,而最终期末考试成绩却还是名列前茅,让人羡慕妒忌恨。
 有部叫做《Hero》的美剧是讲正反两派都是一群有超能力的人,彼此为了某个巨大的阴谋互相撕逼。作为两边的头头,他们自己既不会飞,也不会手上冒火,更不会心灵控制等。但他们却有一种当他们盯着一个超能力者使用自己的力量时,马上能把这个能力复制到自己身上的能力,比如他看到一个人在徒手煎鸡蛋,过了一分钟之后他就说卧槽我也会了......他们只要看到了有人使用超能力,就能马上掌握在手,最后变得无所不能。
这种能力,就叫学习能力。一个会学习的人,在任何领域都能变得强大。

一个人最重要的能力,不是学历多牛逼,不是实习经历多光彩,而是拥有一种强大的学习能力。但很可惜,我们有部分人毕业之后就丧失了如何继续学习的“学习能力”。
那么到底怎样才叫会学习呢?

1.通过观察找到事物的共性

小学课本上有加减乘除的四则运算法则。例如:2*3 -(5-2)- 2=?。如果你去翻答案,可能只有一个孤零零的数字1摆在上面,并没有解题过程。这个时候你可以尝试着用答案来反推解题过程:

2*3 -(5-2)- 2=1,这个等式去掉括号如何才能成立?在试过了几种方向之后,最后会发现只有:2*3-5+2-2=1,这个等式才成立。

进而你会发现,当括号前面是 + 号的时候,去掉括号,括号里面的运算符号不变;

当括号前面是-号的时候,去掉括号,括号里面的运算符号要变成相反。

当你拿着这个结论去验算其他类似的题目,发现全部符合这个规律。这是一个最简单的“演绎归纳”的推理过程,而它背后的逻辑是,通过找到个别事物的特性从而反推找到整体的共性。

在日常的工作生活中,这种方法其实屡见不鲜。

谈恋爱的时候,男生为了讨好女生会在追求的过程中说各种甜言蜜语,可是等到追到手以后就变得不那么上心。这是通过几个个别事例总结出来的事实,然后情感热线专家们据此就会得出一个共性规律:

得不到时才是最好的,得到了就不会懂得珍惜。

在给领导做工作汇报的时候,通常时间都不会超过半个小时,因为领导总是有下一场会议要赶。这是你在做了几次汇报之后发现的一个事实,然后职场热线专家据此就会告诉你一个共性规律:

领导的时间都是有限的,所以汇报工作要精简抓住要点。

这个世界上所有的事情背后都有一套简单的运转规律。会学习的人,首先会通过观察找到事物背后的本质,继而发现共性,最终推论到全局。无论是科学研究,还是世故人情,无论是商业经济,还是生物进化,支撑着这些领域不断向前发展的可能是简单的几条规律,或者说,真理。

牛顿三大定律,摩尔定律,广义相对论,波士顿矩阵,达尔文进化论......这些实际上都是一个东西,规则。聪明人从大量事实中发现共性,总结规则;普通人顺应和利用这些规则,仅此而已。

2.活学活用,举一反百

你身边一定有那种各门考试都很好,但是一遇到没见过的问题就不知道该怎么解的“学霸”,这种叫“死学”。

会学习的人,讲究“活学”。“活学”最大的特征就是,善于跨界地去学习不同领域的知识,并善于各种灵活多变的知识组合,对各种事情进行高效的处理。你在A领域学习到的规则,发现在B领域也基本适用,再修改或者变通下也能在C领域、D领域部分适用。

能量守恒定律最初是物理学规则,但是同样适用于商业领域,于是有了“零和博弈”。

“物竞天择,适者生存”最初是生物进化学的理论,但是推演到任何一个高度竞争的领域都同样适用。在工作中,能力强的人会一路高升,能力差的人一定会被淘汰;在商业竞争中,质量好的商品会收到追捧,质量差的商品会被下架。

“市场供求曲线”最初是经济学的一条规则,但是你在谈恋爱的时候同样适用。

“活学”之人,必会“活用”,再复杂的问题到了他手里都会变的清晰和简单。碰到一个新问题,进行逻辑分析,找出相似性和共性。他们就进入到一个熟悉的领域,问题马上迎刃而解。
3.多领域发展

不管关于这一点是否有争议,但这个世界上“通才”似乎比“专才”往往更能适应竞争。只说一点,“通才”和“专才”最大的区别在于面对急剧变化的形势时的应变能力。

凯文凯利在《失控》说过:

要成长为新物种,你就要经历所有你不会去扮演的角色。

当一个环境开始急剧变化的时候,一定是内部和外部同时发生了改变。如果只是单一内部发生改变,以往过去的规则和经验或许足以应对和解决问题,但是一旦这个冲击变化来自于外部陌生的领域,经验主义就再也不适用了。最好的例子就是近几年来几乎中国所有的实体经济都开始朝着互联网+的方向发展。你会发现,线下超市被电商大规模冲击、逐步有自我学习能力的机器人开始工业和民用领域、工业4.0让制造业变得更加无缝对接、互联网反欺诈让隐形的欺诈者越来越难生存,移动支付让我们省去大量去银行门店处理事务的时间.......这些在过去让人们匪夷所思的事情,背后都蕴含着新的规则和逻辑。

点评:

不论你已经是一位很有名的专家或者专才了,我们都应该保持永久学习的好奇心态,因为世界变化太快。
 
来自知乎专栏 查看全部
每个人身边都会有牛人,似乎这些牛人从来不会为某一件事情而费劲,而某些人却为某些事情费尽九牛二虎之力也无法把事情解决。 大学时期班上总有那么几个家伙,可以经常打游戏,打球,泡妞,而最终期末考试成绩却还是名列前茅,让人羡慕妒忌恨。
 有部叫做《Hero》的美剧是讲正反两派都是一群有超能力的人,彼此为了某个巨大的阴谋互相撕逼。作为两边的头头,他们自己既不会飞,也不会手上冒火,更不会心灵控制等。但他们却有一种当他们盯着一个超能力者使用自己的力量时,马上能把这个能力复制到自己身上的能力,比如他看到一个人在徒手煎鸡蛋,过了一分钟之后他就说卧槽我也会了......他们只要看到了有人使用超能力,就能马上掌握在手,最后变得无所不能。
这种能力,就叫学习能力。一个会学习的人,在任何领域都能变得强大。

一个人最重要的能力,不是学历多牛逼,不是实习经历多光彩,而是拥有一种强大的学习能力。但很可惜,我们有部分人毕业之后就丧失了如何继续学习的“学习能力”。
那么到底怎样才叫会学习呢?

1.通过观察找到事物的共性

小学课本上有加减乘除的四则运算法则。例如:2*3 -(5-2)- 2=?。如果你去翻答案,可能只有一个孤零零的数字1摆在上面,并没有解题过程。这个时候你可以尝试着用答案来反推解题过程:

2*3 -(5-2)- 2=1,这个等式去掉括号如何才能成立?在试过了几种方向之后,最后会发现只有:2*3-5+2-2=1,这个等式才成立。

进而你会发现,当括号前面是 + 号的时候,去掉括号,括号里面的运算符号不变;

当括号前面是-号的时候,去掉括号,括号里面的运算符号要变成相反。

当你拿着这个结论去验算其他类似的题目,发现全部符合这个规律。这是一个最简单的“演绎归纳”的推理过程,而它背后的逻辑是,通过找到个别事物的特性从而反推找到整体的共性。

在日常的工作生活中,这种方法其实屡见不鲜。

谈恋爱的时候,男生为了讨好女生会在追求的过程中说各种甜言蜜语,可是等到追到手以后就变得不那么上心。这是通过几个个别事例总结出来的事实,然后情感热线专家们据此就会得出一个共性规律:

得不到时才是最好的,得到了就不会懂得珍惜。

在给领导做工作汇报的时候,通常时间都不会超过半个小时,因为领导总是有下一场会议要赶。这是你在做了几次汇报之后发现的一个事实,然后职场热线专家据此就会告诉你一个共性规律:

领导的时间都是有限的,所以汇报工作要精简抓住要点。

这个世界上所有的事情背后都有一套简单的运转规律。会学习的人,首先会通过观察找到事物背后的本质,继而发现共性,最终推论到全局。无论是科学研究,还是世故人情,无论是商业经济,还是生物进化,支撑着这些领域不断向前发展的可能是简单的几条规律,或者说,真理。

牛顿三大定律,摩尔定律,广义相对论,波士顿矩阵,达尔文进化论......这些实际上都是一个东西,规则。聪明人从大量事实中发现共性,总结规则;普通人顺应和利用这些规则,仅此而已。

2.活学活用,举一反百

你身边一定有那种各门考试都很好,但是一遇到没见过的问题就不知道该怎么解的“学霸”,这种叫“死学”。

会学习的人,讲究“活学”。“活学”最大的特征就是,善于跨界地去学习不同领域的知识,并善于各种灵活多变的知识组合,对各种事情进行高效的处理。你在A领域学习到的规则,发现在B领域也基本适用,再修改或者变通下也能在C领域、D领域部分适用。

能量守恒定律最初是物理学规则,但是同样适用于商业领域,于是有了“零和博弈”。

“物竞天择,适者生存”最初是生物进化学的理论,但是推演到任何一个高度竞争的领域都同样适用。在工作中,能力强的人会一路高升,能力差的人一定会被淘汰;在商业竞争中,质量好的商品会收到追捧,质量差的商品会被下架。

“市场供求曲线”最初是经济学的一条规则,但是你在谈恋爱的时候同样适用。

“活学”之人,必会“活用”,再复杂的问题到了他手里都会变的清晰和简单。碰到一个新问题,进行逻辑分析,找出相似性和共性。他们就进入到一个熟悉的领域,问题马上迎刃而解。
3.多领域发展

不管关于这一点是否有争议,但这个世界上“通才”似乎比“专才”往往更能适应竞争。只说一点,“通才”和“专才”最大的区别在于面对急剧变化的形势时的应变能力。

凯文凯利在《失控》说过:

要成长为新物种,你就要经历所有你不会去扮演的角色。

当一个环境开始急剧变化的时候,一定是内部和外部同时发生了改变。如果只是单一内部发生改变,以往过去的规则和经验或许足以应对和解决问题,但是一旦这个冲击变化来自于外部陌生的领域,经验主义就再也不适用了。最好的例子就是近几年来几乎中国所有的实体经济都开始朝着互联网+的方向发展。你会发现,线下超市被电商大规模冲击、逐步有自我学习能力的机器人开始工业和民用领域、工业4.0让制造业变得更加无缝对接、互联网反欺诈让隐形的欺诈者越来越难生存,移动支付让我们省去大量去银行门店处理事务的时间.......这些在过去让人们匪夷所思的事情,背后都蕴含着新的规则和逻辑。

点评:

不论你已经是一位很有名的专家或者专才了,我们都应该保持永久学习的好奇心态,因为世界变化太快。
 
来自知乎专栏

使用pandas的dataframe数据进行操作的总结

python李魔佛 发表了文章 • 0 个评论 • 5128 次浏览 • 2016-07-17 16:47 • 来自相关话题

t = df.iloc[0]<class 'pandas.core.series.Series'>
 
#使用iloc后,t已经变成了一个子集。 已经不再是一个dataframe数据。 所以你使用 t['high'] 返回的是一个值。此时t已经没有index了,如果这个时候调用 t.index
 
t=df[:1]
class 'pandas.core.frame.DataFrame'>
 
#这是返回的是一个DataFrame的一个子集。 此时 你可以继续用dateFrame的一些方法进行操作。
 
 
 
 
 
删除dataframe中某一行
 
df.drop()
 
df的内容如下:





 
    df.drop(df[df[u'代码']==300141.0].index,inplace=True)
    print df
 
输出如下





 
记得参数inplace=True, 因为默认的值为inplace=False,意思就是你不添加的话就使用Falase这个值。
这样子原来的df不会被修改, 只是会返回新的修改过的df。 这样的话需要用一个新变量来承接它
new_df=df.drop(df[df[u'代码']==300141.0].index)
 

判断DataFrame为None
  if df is None:
print "None len==0"
return False
  查看全部
t = df.iloc[0]<class 'pandas.core.series.Series'>
 
#使用iloc后,t已经变成了一个子集。 已经不再是一个dataframe数据。 所以你使用 t['high'] 返回的是一个值。此时t已经没有index了,如果这个时候调用 t.index
 
t=df[:1]
class 'pandas.core.frame.DataFrame'>
 
#这是返回的是一个DataFrame的一个子集。 此时 你可以继续用dateFrame的一些方法进行操作。
 
 
 
 
 
删除dataframe中某一行
 
df.drop()
 
df的内容如下:

drop.PNG

 
    df.drop(df[df[u'代码']==300141.0].index,inplace=True)
    print df
 
输出如下

after_drop.PNG

 
记得参数inplace=True, 因为默认的值为inplace=False,意思就是你不添加的话就使用Falase这个值。
这样子原来的df不会被修改, 只是会返回新的修改过的df。 这样的话需要用一个新变量来承接它
new_df=df.drop(df[df[u'代码']==300141.0].index)
 

判断DataFrame为None
 
    if df is None:
print "None len==0"
return False

 

python 获取 中国证券网 的公告

python爬虫李魔佛 发表了文章 • 11 个评论 • 19943 次浏览 • 2016-06-30 15:45 • 来自相关话题

中国证券网: http://ggjd.cnstock.com/
这个网站的公告会比同花顺东方财富的早一点,而且还出现过早上中国证券网已经发了公告,而东财却拿去做午间公告,以至于可以提前获取公告提前埋伏。
 
现在程序自动把抓取的公告存入本网站中:http://30daydo.com/news.php 
每天早上8:30更新一次。
 
生成的公告保存在stock/文件夹下,以日期命名。 下面脚本是循坏检测,如果有新的公告就会继续生成。
 
默认保存前3页的公告。(一次过太多页会被网站暂时屏蔽几分钟)。 代码以及使用了切换header来躲避网站的封杀。
 
修改
getInfo(3) 里面的数字就可以抓取前面某页数据
 
 




__author__ = 'rocchen'
# working v1.0
from bs4 import BeautifulSoup
import urllib2, datetime, time, codecs, cookielib, random, threading
import os,sys


def getInfo(max_index_user=5):
stock_news_site =
"http://ggjd.cnstock.com/gglist/search/ggkx/"

my_userAgent = [
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',
'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)']
index = 0
max_index = max_index_user
num = 1
temp_time = time.strftime("[%Y-%m-%d]-[%H-%M]", time.localtime())

store_filename = "StockNews-%s.log" % temp_time
fOpen = codecs.open(store_filename, 'w', 'utf-8')

while index < max_index:
user_agent = random.choice(my_userAgent)
# print user_agent
company_news_site = stock_news_site + str(index)
# content = urllib2.urlopen(company_news_site)
headers = {'User-Agent': user_agent, 'Host': "ggjd.cnstock.com", 'DNT': '1',
'Accept': 'text/html, application/xhtml+xml, */*', }
req = urllib2.Request(url=company_news_site, headers=headers)
resp = None
raw_content = ""
try:
resp = urllib2.urlopen(req, timeout=30)

except urllib2.HTTPError as e:
e.fp.read()
except urllib2.URLError as e:
if hasattr(e, 'code'):
print "error code %d" % e.code
elif hasattr(e, 'reason'):
print "error reason %s " % e.reason

finally:
if resp:
raw_content = resp.read()
time.sleep(2)
resp.close()

soup = BeautifulSoup(raw_content, "html.parser")
all_content = soup.find_all("span", "time")

for i in all_content:
news_time = i.string
node = i.next_sibling
str_temp = "No.%s \n%s\t%s\n---> %s \n\n" % (str(num), news_time, node['title'], node['href'])
#print "inside %d" %num
#print str_temp
fOpen.write(str_temp)
num = num + 1

#print "index %d" %index
index = index + 1

fOpen.close()


def execute_task(n=60):
period = int(n)
while True:
print datetime.datetime.now()
getInfo(3)

time.sleep(60 * period)



if __name__ == "__main__":

sub_folder = os.path.join(os.getcwd(), "stock")
if not os.path.exists(sub_folder):
os.mkdir(sub_folder)
os.chdir(sub_folder)
start_time = time.time() # user can change the max index number getInfo(10), by default is getInfo(5)
if len(sys.argv) <2:
n = raw_input("Input Period : ? mins to download every cycle")
else:
n=int(sys.argv[1])
execute_task(n)
end_time = time.time()
print "Total time: %s s." % str(round((end_time - start_time), 4))


 
github:https://github.com/Rockyzsu/cnstock
  查看全部
中国证券网: http://ggjd.cnstock.com/
这个网站的公告会比同花顺东方财富的早一点,而且还出现过早上中国证券网已经发了公告,而东财却拿去做午间公告,以至于可以提前获取公告提前埋伏。
 
现在程序自动把抓取的公告存入本网站中:http://30daydo.com/news.php 
每天早上8:30更新一次。
 
生成的公告保存在stock/文件夹下,以日期命名。 下面脚本是循坏检测,如果有新的公告就会继续生成。
 
默认保存前3页的公告。(一次过太多页会被网站暂时屏蔽几分钟)。 代码以及使用了切换header来躲避网站的封杀。
 
修改
getInfo(3) 里面的数字就可以抓取前面某页数据
 
 

公告.PNG
__author__ = 'rocchen'
# working v1.0
from bs4 import BeautifulSoup
import urllib2, datetime, time, codecs, cookielib, random, threading
import os,sys


def getInfo(max_index_user=5):
stock_news_site =
"http://ggjd.cnstock.com/gglist/search/ggkx/"

my_userAgent = [
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',
'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)']
index = 0
max_index = max_index_user
num = 1
temp_time = time.strftime("[%Y-%m-%d]-[%H-%M]", time.localtime())

store_filename = "StockNews-%s.log" % temp_time
fOpen = codecs.open(store_filename, 'w', 'utf-8')

while index < max_index:
user_agent = random.choice(my_userAgent)
# print user_agent
company_news_site = stock_news_site + str(index)
# content = urllib2.urlopen(company_news_site)
headers = {'User-Agent': user_agent, 'Host': "ggjd.cnstock.com", 'DNT': '1',
'Accept': 'text/html, application/xhtml+xml, */*', }
req = urllib2.Request(url=company_news_site, headers=headers)
resp = None
raw_content = ""
try:
resp = urllib2.urlopen(req, timeout=30)

except urllib2.HTTPError as e:
e.fp.read()
except urllib2.URLError as e:
if hasattr(e, 'code'):
print "error code %d" % e.code
elif hasattr(e, 'reason'):
print "error reason %s " % e.reason

finally:
if resp:
raw_content = resp.read()
time.sleep(2)
resp.close()

soup = BeautifulSoup(raw_content, "html.parser")
all_content = soup.find_all("span", "time")

for i in all_content:
news_time = i.string
node = i.next_sibling
str_temp = "No.%s \n%s\t%s\n---> %s \n\n" % (str(num), news_time, node['title'], node['href'])
#print "inside %d" %num
#print str_temp
fOpen.write(str_temp)
num = num + 1

#print "index %d" %index
index = index + 1

fOpen.close()


def execute_task(n=60):
period = int(n)
while True:
print datetime.datetime.now()
getInfo(3)

time.sleep(60 * period)



if __name__ == "__main__":

sub_folder = os.path.join(os.getcwd(), "stock")
if not os.path.exists(sub_folder):
os.mkdir(sub_folder)
os.chdir(sub_folder)
start_time = time.time() # user can change the max index number getInfo(10), by default is getInfo(5)
if len(sys.argv) <2:
n = raw_input("Input Period : ? mins to download every cycle")
else:
n=int(sys.argv[1])
execute_task(n)
end_time = time.time()
print "Total time: %s s." % str(round((end_time - start_time), 4))


 
github:https://github.com/Rockyzsu/cnstock
 

python 批量获取色影无忌 获奖图片

python爬虫李魔佛 发表了文章 • 6 个评论 • 15050 次浏览 • 2016-06-29 16:41 • 来自相关话题

色影无忌上的图片很多都可以直接拿来做壁纸的,而且发布面不会太广,基本不会和市面上大部分的壁纸或者图片素材重复。 关键还没有水印。 这么良心的图片服务商哪里找呀~~
 

 





 
不多说,直接来代码:#-*-coding=utf-8-*-
__author__ = 'rocky chen'
from bs4 import BeautifulSoup
import urllib2,sys,StringIO,gzip,time,random,re,urllib,os
reload(sys)
sys.setdefaultencoding('utf-8')
class Xitek():
    def __init__(self):
        self.url="http://photo.xitek.com/"
        user_agent="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
        self.headers={"User-Agent":user_agent}
        self.last_page=self.__get_last_page()


    def __get_last_page(self):
        html=self.__getContentAuto(self.url)
        bs=BeautifulSoup(html,"html.parser")
        page=bs.find_all('a',class_="blast")
        last_page=page[0]['href'].split('/')[-1]
        return int(last_page)


    def __getContentAuto(self,url):
        req=urllib2.Request(url,headers=self.headers)
        resp=urllib2.urlopen(req)
        #time.sleep(2*random.random())
        content=resp.read()
        info=resp.info().get("Content-Encoding")
        if info==None:
            return content
        else:
            t=StringIO.StringIO(content)
            gziper=gzip.GzipFile(fileobj=t)
            html = gziper.read()
            return html

    #def __getFileName(self,stream):


    def __download(self,url):
        p=re.compile(r'href="(/photoid/\d+)"')
        #html=self.__getContentNoZip(url)

        html=self.__getContentAuto(url)

        content = p.findall(html)
        for i in content:
            print i

            photoid=self.__getContentAuto(self.url+i)
            bs=BeautifulSoup(photoid,"html.parser")
            final_link=bs.find('img',class_="mimg")['src']
            print final_link
            #pic_stream=self.__getContentAuto(final_link)
            title=bs.title.string.strip()
            filename = re.sub('[\/:*?"<>|]', '-', title)
            filename=filename+'.jpg'
            urllib.urlretrieve(final_link,filename)
            #f=open(filename,'w')
            #f.write(pic_stream)
            #f.close()
        #print html
        #bs=BeautifulSoup(html,"html.parser")
        #content=bs.find_all(p)
        #for i in content:
        #    print i
        '''
        print bs.title
        element_link=bs.find_all('div',class_="element")
        print len(element_link)
        k=1
        for href in element_link:

            #print type(href)
            #print href.tag
        '''
        '''
            if href.children[0]:
                print href.children[0]
        '''
        '''
            t=0

            for i in href.children:
                #if i.a:
                if t==0:
                    #print k
                    if i['href']
                    print link

                        if p.findall(link):
                            full_path=self.url[0:len(self.url)-1]+link
                            sub_html=self.__getContent(full_path)
                            bs=BeautifulSoup(sub_html,"html.parser")
                            final_link=bs.find('img',class_="mimg")['src']
                            #time.sleep(2*random.random())
                            print final_link
                    #k=k+1
                #print type(i)
                #print i.tag
                #if hasattr(i,"href"):
                    #print i['href']
                #print i.tag
                t=t+1
                #print "*"

        '''

        '''
            if href:
                if href.children:
                    print href.children[0]
        '''
            #print "one element link"



    def getPhoto(self):

        start=0
        #use style/0
        photo_url="http://photo.xitek.com/style/0/p/"
        for i in range(start,self.last_page+1):
            url=photo_url+str(i)
            print url
            #time.sleep(1)
            self.__download(url)

        '''
        url="http://photo.xitek.com/style/0/p/10"
        self.__download(url)
        '''
        #url="http://photo.xitek.com/style/0/p/0"
        #html=self.__getContent(url)
        #url="http://photo.xitek.com/"
        #html=self.__getContentNoZip(url)
        #print html
        #'''
def main():
    sub_folder = os.path.join(os.getcwd(), "content")
    if not os.path.exists(sub_folder):
        os.mkdir(sub_folder)
    os.chdir(sub_folder)
    obj=Xitek()
    obj.getPhoto()


if __name__=="__main__":
    main()








下载后在content文件夹下会自动抓取所有图片。 (色影无忌的服务器没有做任何的屏蔽处理,所以脚本不能跑那么快,可以适当调用sleep函数,不要让服务器压力那么大)
 
已经下载好的图片:





 
 
github: https://github.com/Rockyzsu/fetchXitek   (欢迎前来star) 查看全部
色影无忌上的图片很多都可以直接拿来做壁纸的,而且发布面不会太广,基本不会和市面上大部分的壁纸或者图片素材重复。 关键还没有水印。 这么良心的图片服务商哪里找呀~~
 

 

色影无忌_副本.png

 
不多说,直接来代码:
#-*-coding=utf-8-*-
__author__ = 'rocky chen'
from bs4 import BeautifulSoup
import urllib2,sys,StringIO,gzip,time,random,re,urllib,os
reload(sys)
sys.setdefaultencoding('utf-8')
class Xitek():
    def __init__(self):
        self.url="http://photo.xitek.com/"
        user_agent="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
        self.headers={"User-Agent":user_agent}
        self.last_page=self.__get_last_page()


    def __get_last_page(self):
        html=self.__getContentAuto(self.url)
        bs=BeautifulSoup(html,"html.parser")
        page=bs.find_all('a',class_="blast")
        last_page=page[0]['href'].split('/')[-1]
        return int(last_page)


    def __getContentAuto(self,url):
        req=urllib2.Request(url,headers=self.headers)
        resp=urllib2.urlopen(req)
        #time.sleep(2*random.random())
        content=resp.read()
        info=resp.info().get("Content-Encoding")
        if info==None:
            return content
        else:
            t=StringIO.StringIO(content)
            gziper=gzip.GzipFile(fileobj=t)
            html = gziper.read()
            return html

    #def __getFileName(self,stream):


    def __download(self,url):
        p=re.compile(r'href="(/photoid/\d+)"')
        #html=self.__getContentNoZip(url)

        html=self.__getContentAuto(url)

        content = p.findall(html)
        for i in content:
            print i

            photoid=self.__getContentAuto(self.url+i)
            bs=BeautifulSoup(photoid,"html.parser")
            final_link=bs.find('img',class_="mimg")['src']
            print final_link
            #pic_stream=self.__getContentAuto(final_link)
            title=bs.title.string.strip()
            filename = re.sub('[\/:*?"<>|]', '-', title)
            filename=filename+'.jpg'
            urllib.urlretrieve(final_link,filename)
            #f=open(filename,'w')
            #f.write(pic_stream)
            #f.close()
        #print html
        #bs=BeautifulSoup(html,"html.parser")
        #content=bs.find_all(p)
        #for i in content:
        #    print i
        '''
        print bs.title
        element_link=bs.find_all('div',class_="element")
        print len(element_link)
        k=1
        for href in element_link:

            #print type(href)
            #print href.tag
        '''
        '''
            if href.children[0]:
                print href.children[0]
        '''
        '''
            t=0

            for i in href.children:
                #if i.a:
                if t==0:
                    #print k
                    if i['href']
                    print link

                        if p.findall(link):
                            full_path=self.url[0:len(self.url)-1]+link
                            sub_html=self.__getContent(full_path)
                            bs=BeautifulSoup(sub_html,"html.parser")
                            final_link=bs.find('img',class_="mimg")['src']
                            #time.sleep(2*random.random())
                            print final_link
                    #k=k+1
                #print type(i)
                #print i.tag
                #if hasattr(i,"href"):
                    #print i['href']
                #print i.tag
                t=t+1
                #print "*"

        '''

        '''
            if href:
                if href.children:
                    print href.children[0]
        '''
            #print "one element link"



    def getPhoto(self):

        start=0
        #use style/0
        photo_url="http://photo.xitek.com/style/0/p/"
        for i in range(start,self.last_page+1):
            url=photo_url+str(i)
            print url
            #time.sleep(1)
            self.__download(url)

        '''
        url="http://photo.xitek.com/style/0/p/10"
        self.__download(url)
        '''
        #url="http://photo.xitek.com/style/0/p/0"
        #html=self.__getContent(url)
        #url="http://photo.xitek.com/"
        #html=self.__getContentNoZip(url)
        #print html
        #'''
def main():
    sub_folder = os.path.join(os.getcwd(), "content")
    if not os.path.exists(sub_folder):
        os.mkdir(sub_folder)
    os.chdir(sub_folder)
    obj=Xitek()
    obj.getPhoto()


if __name__=="__main__":
    main()








下载后在content文件夹下会自动抓取所有图片。 (色影无忌的服务器没有做任何的屏蔽处理,所以脚本不能跑那么快,可以适当调用sleep函数,不要让服务器压力那么大)
 
已经下载好的图片:

色影无忌2_副本1.png

 
 
github: https://github.com/Rockyzsu/fetchXitek   (欢迎前来star)

linux目录跳转利器 z.sh

Linux李魔佛 发表了文章 • 0 个评论 • 5638 次浏览 • 2016-06-17 17:32 • 来自相关话题

使用linux的朋友,经常要在命令下面运行命令,并且频繁地在不同的目录切换, 不断的cd ..,cd ../../../../../../bin,或者cd ../../../../../../../../../, 或者cd ~/Download/bin/
 
浪费时间且效率低下。
 
推荐大家使用一个小脚本,可以快速切换目录,不需要经常cd了。
 
拷贝下面的代码,保存为z.sh,放在用户目录下,/home/xxxx, xxx为用户名, 然后 给予 777权限, chmod 777 z.sh
 
然后 修改 .bashrc 文件, vim ~/.bashrc
 
在文件的最后添加一句 source ~/z.sh
 
然后保存.bashrc
 
然后运行 source ~./bashrc , 然后就马上生效了。
 
然后你进入到某一个目录,比如 /home/user/build/data/bin/hello/, 运行 z
 
系统会纪录你的hello目录一次,
 
下一次在其他目录比如在/etc/apt/,如果要跳转到 /home/user/build/data/bin/hello/,
直接运行 z hello 就可以了。# Copyright (c) 2009 rupa deadwyler under the WTFPL license

# maintains a jump-list of the directories you actually use
#
# INSTALL:
# * put something like this in your .bashrc/.zshrc:
# . /path/to/z.sh
# * cd around for a while to build up the db
# * PROFIT!!
# * optionally:
# set $_Z_CMD in .bashrc/.zshrc to change the command (default z).
# set $_Z_DATA in .bashrc/.zshrc to change the datafile (default ~/.z).
# set $_Z_NO_RESOLVE_SYMLINKS to prevent symlink resolution.
# set $_Z_NO_PROMPT_COMMAND if you're handling PROMPT_COMMAND yourself.
# set $_Z_EXCLUDE_DIRS to an array of directories to exclude.
# set $_Z_OWNER to your username if you want use z while sudo with $HOME kept
#
# USE:
# * z foo # cd to most frecent dir matching foo
# * z foo bar # cd to most frecent dir matching foo and bar
# * z -r foo # cd to highest ranked dir matching foo
# * z -t foo # cd to most recently accessed dir matching foo
# * z -l foo # list matches instead of cd
# * z -c foo # restrict matches to subdirs of $PWD

[ -d "${_Z_DATA:-$HOME/.z}" ] && {
echo "ERROR: z.sh's datafile (${_Z_DATA:-$HOME/.z}) is a directory."
}

_z() {

local datafile="${_Z_DATA:-$HOME/.z}"

# bail if we don't own ~/.z and $_Z_OWNER not set
[ -z "$_Z_OWNER" -a -f "$datafile" -a ! -O "$datafile" ] && return

# add entries
if [ "$1" = "--add" ]; then
shift

# $HOME isn't worth matching
[ "$*" = "$HOME" ] && return

# don't track excluded directory trees
local exclude
for exclude in "${_Z_EXCLUDE_DIRS[@]}"; do
case "$*" in "$exclude*") return;; esac
done

# maintain the data file
local tempfile="$datafile.$RANDOM"
while read line; do
# only count directories
[ -d "${line%%\|*}" ] && echo $line
done < "$datafile" | awk -v path="$*" -v now="$(date +%s)" -F"|" '
BEGIN {
rank[path] = 1
time[path] = now
}
$2 >= 1 {
# drop ranks below 1
if( $1 == path ) {
rank[$1] = $2 + 1
time[$1] = now
} else {
rank[$1] = $2
time[$1] = $3
}
count += $2
}
END {
if( count > 9000 ) {
# aging
for( x in rank ) print x "|" 0.99*rank[x] "|" time[x]
} else for( x in rank ) print x "|" rank[x] "|" time[x]
}
' 2>/dev/null >| "$tempfile"
# do our best to avoid clobbering the datafile in a race condition
if [ $? -ne 0 -a -f "$datafile" ]; then
env rm -f "$tempfile"
else
[ "$_Z_OWNER" ] && chown $_Z_OWNER:$(id -ng $_Z_OWNER) "$tempfile"
env mv -f "$tempfile" "$datafile" || env rm -f "$tempfile"
fi

# tab completion
elif [ "$1" = "--complete" -a -s "$datafile" ]; then
while read line; do
[ -d "${line%%\|*}" ] && echo $line
done < "$datafile" | awk -v q="$2" -F"|" '
BEGIN {
if( q == tolower(q) ) imatch = 1
q = substr(q, 3)
gsub(" ", ".*", q)
}
{
if( imatch ) {
if( tolower($1) ~ tolower(q) ) print $1
} else if( $1 ~ q ) print $1
}
' 2>/dev/null

else
# list/go
while [ "$1" ]; do case "$1" in
--) while [ "$1" ]; do shift; local fnd="$fnd${fnd:+ }$1";done;;
-*) local opt=${1:1}; while [ "$opt" ]; do case ${opt:0:1} in
c) local fnd="^$PWD $fnd";;
h) echo "${_Z_CMD:-z} [-chlrtx] args" >&2; return;;
x) sed -i -e "\:^${PWD}|.*:d" "$datafile";;
l) local list=1;;
r) local typ="rank";;
t) local typ="recent";;
esac; opt=${opt:1}; done;;
*) local fnd="$fnd${fnd:+ }$1";;
esac; local last=$1; [ "$#" -gt 0 ] && shift; done
[ "$fnd" -a "$fnd" != "^$PWD " ] || local list=1

# if we hit enter on a completion just go there
case "$last" in
# completions will always start with /
/*) [ -z "$list" -a -d "$last" ] && cd "$last" && return;;
esac

# no file yet
[ -f "$datafile" ] || return

local cd
cd="$(while read line; do
[ -d "${line%%\|*}" ] && echo $line
done < "$datafile" | awk -v t="$(date +%s)" -v list="$list" -v typ="$typ" -v q="$fnd" -F"|" '
function frecent(rank, time) {
# relate frequency and time
dx = t - time
if( dx < 3600 ) return rank * 4
if( dx < 86400 ) return rank * 2
if( dx < 604800 ) return rank / 2
return rank / 4
}
function output(files, out, common) {
# list or return the desired directory
if( list ) {
cmd = "sort -n >&2"
for( x in files ) {
if( files[x] ) printf "%-10s %s\n", files[x], x | cmd
}
if( common ) {
printf "%-10s %s\n", "common:", common > "/dev/stderr"
}
} else {
if( common ) out = common
print out
}
}
function common(matches) {
# find the common root of a list of matches, if it exists
for( x in matches ) {
if( matches[x] && (!short || length(x) < length(short)) ) {
short = x
}
}
if( short == "/" ) return
# use a copy to escape special characters, as we want to return
# the original. yeah, this escaping is awful.
clean_short = short
gsub(/\[\(\)\[\]\|\]/, "\\\\&", clean_short)
for( x in matches ) if( matches[x] && x !~ clean_short ) return
return short
}
BEGIN {
gsub(" ", ".*", q)
hi_rank = ihi_rank = -9999999999
}
{
if( typ == "rank" ) {
rank = $2
} else if( typ == "recent" ) {
rank = $3 - t
} else rank = frecent($2, $3)
if( $1 ~ q ) {
matches[$1] = rank
} else if( tolower($1) ~ tolower(q) ) imatches[$1] = rank
if( matches[$1] && matches[$1] > hi_rank ) {
best_match = $1
hi_rank = matches[$1]
} else if( imatches[$1] && imatches[$1] > ihi_rank ) {
ibest_match = $1
ihi_rank = imatches[$1]
}
}
END {
# prefer case sensitive
if( best_match ) {
output(matches, best_match, common(matches))
} else if( ibest_match ) {
output(imatches, ibest_match, common(imatches))
}
}
')"
[ $? -gt 0 ] && return
[ "$cd" ] && cd "$cd"
fi
}

alias ${_Z_CMD:-z}='_z 2>&1'

[ "$_Z_NO_RESOLVE_SYMLINKS" ] || _Z_RESOLVE_SYMLINKS="-P"

if type compctl >/dev/null 2>&1; then
# zsh
[ "$_Z_NO_PROMPT_COMMAND" ] || {
# populate directory list, avoid clobbering any other precmds.
if [ "$_Z_NO_RESOLVE_SYMLINKS" ]; then
_z_precmd() {
_z --add "${PWD:a}"
}
else
_z_precmd() {
_z --add "${PWD:A}"
}
fi
[[ -n "${precmd_functions[(r)_z_precmd]}" ]] || {
precmd_functions[$(($#precmd_functions+1))]=_z_precmd
}
}
_z_zsh_tab_completion() {
# tab completion
local compl
read -l compl
reply=(${(f)"$(_z --complete "$compl")"})
}
compctl -U -K _z_zsh_tab_completion _z
elif type complete >/dev/null 2>&1; then
# bash
# tab completion
complete -o filenames -C '_z --complete "$COMP_LINE"' ${_Z_CMD:-z}
[ "$_Z_NO_PROMPT_COMMAND" ] || {
# populate directory list. avoid clobbering other PROMPT_COMMANDs.
grep "_z --add" <<< "$PROMPT_COMMAND" >/dev/null || {
PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''_z --add "$(command pwd '$_Z_RESOLVE_SYMLINKS' 2>/dev/null)" 2>/dev/null;'
}
}
fi 查看全部
使用linux的朋友,经常要在命令下面运行命令,并且频繁地在不同的目录切换, 不断的cd ..,cd ../../../../../../bin,或者cd ../../../../../../../../../, 或者cd ~/Download/bin/
 
浪费时间且效率低下。
 
推荐大家使用一个小脚本,可以快速切换目录,不需要经常cd了。
 
拷贝下面的代码,保存为z.sh,放在用户目录下,/home/xxxx, xxx为用户名, 然后 给予 777权限, chmod 777 z.sh
 
然后 修改 .bashrc 文件, vim ~/.bashrc
 
在文件的最后添加一句 source ~/z.sh
 
然后保存.bashrc
 
然后运行 source ~./bashrc , 然后就马上生效了。
 
然后你进入到某一个目录,比如 /home/user/build/data/bin/hello/, 运行 z
 
系统会纪录你的hello目录一次,
 
下一次在其他目录比如在/etc/apt/,如果要跳转到 /home/user/build/data/bin/hello/,
直接运行 z hello 就可以了。
# Copyright (c) 2009 rupa deadwyler under the WTFPL license

# maintains a jump-list of the directories you actually use
#
# INSTALL:
# * put something like this in your .bashrc/.zshrc:
# . /path/to/z.sh
# * cd around for a while to build up the db
# * PROFIT!!
# * optionally:
# set $_Z_CMD in .bashrc/.zshrc to change the command (default z).
# set $_Z_DATA in .bashrc/.zshrc to change the datafile (default ~/.z).
# set $_Z_NO_RESOLVE_SYMLINKS to prevent symlink resolution.
# set $_Z_NO_PROMPT_COMMAND if you're handling PROMPT_COMMAND yourself.
# set $_Z_EXCLUDE_DIRS to an array of directories to exclude.
# set $_Z_OWNER to your username if you want use z while sudo with $HOME kept
#
# USE:
# * z foo # cd to most frecent dir matching foo
# * z foo bar # cd to most frecent dir matching foo and bar
# * z -r foo # cd to highest ranked dir matching foo
# * z -t foo # cd to most recently accessed dir matching foo
# * z -l foo # list matches instead of cd
# * z -c foo # restrict matches to subdirs of $PWD

[ -d "${_Z_DATA:-$HOME/.z}" ] && {
echo "ERROR: z.sh's datafile (${_Z_DATA:-$HOME/.z}) is a directory."
}

_z() {

local datafile="${_Z_DATA:-$HOME/.z}"

# bail if we don't own ~/.z and $_Z_OWNER not set
[ -z "$_Z_OWNER" -a -f "$datafile" -a ! -O "$datafile" ] && return

# add entries
if [ "$1" = "--add" ]; then
shift

# $HOME isn't worth matching
[ "$*" = "$HOME" ] && return

# don't track excluded directory trees
local exclude
for exclude in "${_Z_EXCLUDE_DIRS[@]}"; do
case "$*" in "$exclude*") return;; esac
done

# maintain the data file
local tempfile="$datafile.$RANDOM"
while read line; do
# only count directories
[ -d "${line%%\|*}" ] && echo $line
done < "$datafile" | awk -v path="$*" -v now="$(date +%s)" -F"|" '
BEGIN {
rank[path] = 1
time[path] = now
}
$2 >= 1 {
# drop ranks below 1
if( $1 == path ) {
rank[$1] = $2 + 1
time[$1] = now
} else {
rank[$1] = $2
time[$1] = $3
}
count += $2
}
END {
if( count > 9000 ) {
# aging
for( x in rank ) print x "|" 0.99*rank[x] "|" time[x]
} else for( x in rank ) print x "|" rank[x] "|" time[x]
}
' 2>/dev/null >| "$tempfile"
# do our best to avoid clobbering the datafile in a race condition
if [ $? -ne 0 -a -f "$datafile" ]; then
env rm -f "$tempfile"
else
[ "$_Z_OWNER" ] && chown $_Z_OWNER:$(id -ng $_Z_OWNER) "$tempfile"
env mv -f "$tempfile" "$datafile" || env rm -f "$tempfile"
fi

# tab completion
elif [ "$1" = "--complete" -a -s "$datafile" ]; then
while read line; do
[ -d "${line%%\|*}" ] && echo $line
done < "$datafile" | awk -v q="$2" -F"|" '
BEGIN {
if( q == tolower(q) ) imatch = 1
q = substr(q, 3)
gsub(" ", ".*", q)
}
{
if( imatch ) {
if( tolower($1) ~ tolower(q) ) print $1
} else if( $1 ~ q ) print $1
}
' 2>/dev/null

else
# list/go
while [ "$1" ]; do case "$1" in
--) while [ "$1" ]; do shift; local fnd="$fnd${fnd:+ }$1";done;;
-*) local opt=${1:1}; while [ "$opt" ]; do case ${opt:0:1} in
c) local fnd="^$PWD $fnd";;
h) echo "${_Z_CMD:-z} [-chlrtx] args" >&2; return;;
x) sed -i -e "\:^${PWD}|.*:d" "$datafile";;
l) local list=1;;
r) local typ="rank";;
t) local typ="recent";;
esac; opt=${opt:1}; done;;
*) local fnd="$fnd${fnd:+ }$1";;
esac; local last=$1; [ "$#" -gt 0 ] && shift; done
[ "$fnd" -a "$fnd" != "^$PWD " ] || local list=1

# if we hit enter on a completion just go there
case "$last" in
# completions will always start with /
/*) [ -z "$list" -a -d "$last" ] && cd "$last" && return;;
esac

# no file yet
[ -f "$datafile" ] || return

local cd
cd="$(while read line; do
[ -d "${line%%\|*}" ] && echo $line
done < "$datafile" | awk -v t="$(date +%s)" -v list="$list" -v typ="$typ" -v q="$fnd" -F"|" '
function frecent(rank, time) {
# relate frequency and time
dx = t - time
if( dx < 3600 ) return rank * 4
if( dx < 86400 ) return rank * 2
if( dx < 604800 ) return rank / 2
return rank / 4
}
function output(files, out, common) {
# list or return the desired directory
if( list ) {
cmd = "sort -n >&2"
for( x in files ) {
if( files[x] ) printf "%-10s %s\n", files[x], x | cmd
}
if( common ) {
printf "%-10s %s\n", "common:", common > "/dev/stderr"
}
} else {
if( common ) out = common
print out
}
}
function common(matches) {
# find the common root of a list of matches, if it exists
for( x in matches ) {
if( matches[x] && (!short || length(x) < length(short)) ) {
short = x
}
}
if( short == "/" ) return
# use a copy to escape special characters, as we want to return
# the original. yeah, this escaping is awful.
clean_short = short
gsub(/\[\(\)\[\]\|\]/, "\\\\&", clean_short)
for( x in matches ) if( matches[x] && x !~ clean_short ) return
return short
}
BEGIN {
gsub(" ", ".*", q)
hi_rank = ihi_rank = -9999999999
}
{
if( typ == "rank" ) {
rank = $2
} else if( typ == "recent" ) {
rank = $3 - t
} else rank = frecent($2, $3)
if( $1 ~ q ) {
matches[$1] = rank
} else if( tolower($1) ~ tolower(q) ) imatches[$1] = rank
if( matches[$1] && matches[$1] > hi_rank ) {
best_match = $1
hi_rank = matches[$1]
} else if( imatches[$1] && imatches[$1] > ihi_rank ) {
ibest_match = $1
ihi_rank = imatches[$1]
}
}
END {
# prefer case sensitive
if( best_match ) {
output(matches, best_match, common(matches))
} else if( ibest_match ) {
output(imatches, ibest_match, common(imatches))
}
}
')"
[ $? -gt 0 ] && return
[ "$cd" ] && cd "$cd"
fi
}

alias ${_Z_CMD:-z}='_z 2>&1'

[ "$_Z_NO_RESOLVE_SYMLINKS" ] || _Z_RESOLVE_SYMLINKS="-P"

if type compctl >/dev/null 2>&1; then
# zsh
[ "$_Z_NO_PROMPT_COMMAND" ] || {
# populate directory list, avoid clobbering any other precmds.
if [ "$_Z_NO_RESOLVE_SYMLINKS" ]; then
_z_precmd() {
_z --add "${PWD:a}"
}
else
_z_precmd() {
_z --add "${PWD:A}"
}
fi
[[ -n "${precmd_functions[(r)_z_precmd]}" ]] || {
precmd_functions[$(($#precmd_functions+1))]=_z_precmd
}
}
_z_zsh_tab_completion() {
# tab completion
local compl
read -l compl
reply=(${(f)"$(_z --complete "$compl")"})
}
compctl -U -K _z_zsh_tab_completion _z
elif type complete >/dev/null 2>&1; then
# bash
# tab completion
complete -o filenames -C '_z --complete "$COMP_LINE"' ${_Z_CMD:-z}
[ "$_Z_NO_PROMPT_COMMAND" ] || {
# populate directory list. avoid clobbering other PROMPT_COMMANDs.
grep "_z --add" <<< "$PROMPT_COMMAND" >/dev/null || {
PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''_z --add "$(command pwd '$_Z_RESOLVE_SYMLINKS' 2>/dev/null)" 2>/dev/null;'
}
}
fi