数据分析

数据分析

【Dataframe warning】Try using .loc[row_indexer,col_indexer] = value instead

python李魔佛 发表了文章 • 0 个评论 • 69 次浏览 • 2019-04-02 22:48 • 来自相关话题

使用dataframe直接赋值操作时
 
df['当前日期'] = datetime.date.today()
 
会出现下面的警告信息
Try using .loc[row_indexer,col_indexer] = value instead 
 
虽然得到的最终结果是正常的,可是为什么会出现上面的警告呢?
 
因为上面的操作如果稍微复杂点,那么就可能导致赋值失败。 因为中间会产生一个切片的临时副本。
 
比如:
df
A B C D E
0 5 0 3 3 7
1 9 3 5 2 4
2 7 6 8 8 1
如果想把A列中大于5的数换成100,如何操作 ?
 
A B C D E
0 5 0 3 3 7
1 1000 3 5 2 4
2 1000 6 8 8 1

df[df.A > 5]['A'] = 1000
 
上面的这个表达式是不会生效的。
 
要生效,需要写成以下:
df.loc[df.A > 5, 'A'] = 1000
 
为什么呢?
因为df[df.A]得到是一个临时切片结果,等于一个中间变量,然后在这个中间变量上的A列上做赋值操作,但是最原始的df却没有被改变。
或者你可以这样写
df=df[df.A>5]
df.A=1000
 
 
  查看全部
使用dataframe直接赋值操作时
 
df['当前日期'] = datetime.date.today()
 
会出现下面的警告信息
Try using .loc[row_indexer,col_indexer] = value instead 
 
虽然得到的最终结果是正常的,可是为什么会出现上面的警告呢?
 
因为上面的操作如果稍微复杂点,那么就可能导致赋值失败。 因为中间会产生一个切片的临时副本。
 
比如:
df
A B C D E
0 5 0 3 3 7
1 9 3 5 2 4
2 7 6 8 8 1

如果想把A列中大于5的数换成100,如何操作 ?
 
      A  B  C  D  E
0 5 0 3 3 7
1 1000 3 5 2 4
2 1000 6 8 8 1


df[df.A > 5]['A'] = 1000
 
上面的这个表达式是不会生效的。
 
要生效,需要写成以下:
df.loc[df.A > 5, 'A'] = 1000
 
为什么呢?
因为df[df.A]得到是一个临时切片结果,等于一个中间变量,然后在这个中间变量上的A列上做赋值操作,但是最原始的df却没有被改变。
或者你可以这样写
df=df[df.A>5]
df.A=1000
 
 
 

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

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

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





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

echarts.png

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

numpy 二维数组按列合并

python李魔佛 发表了文章 • 0 个评论 • 254 次浏览 • 2019-01-19 21:43 • 来自相关话题

numpy的数组默认按行合并,如何按列合并?
 
先生产测试数组# np 的运算
n = np.arange(1,17)
转化形态:
n0 = n.reshape(4,4)变成4x4的矩阵
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
然后运用concatenate函数拼接:
np.concatenate((n0,n0),axis=1)array([[ 1, 2, 3, 4, 1, 2, 3, 4], [ 5, 6, 7, 8, 5, 6, 7, 8], [ 9, 10, 11, 12, 9, 10, 11, 12], [13, 14, 15, 16, 13, 14, 15, 16]])
 这个只需要添加参数axis=1就可以了,axis默认是为0,按照行拼接。
np.concatenate((n0,n0),axis=1)
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16],
[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]) 查看全部
numpy的数组默认按行合并,如何按列合并?
 
先生产测试数组
# np 的运算
n = np.arange(1,17)

转化形态:
n0 = n.reshape(4,4)
变成4x4的矩阵
array([[ 1,  2,  3,  4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])

然后运用concatenate函数拼接:
np.concatenate((n0,n0),axis=1)
array([[ 1, 2, 3, 4, 1, 2, 3, 4], [ 5, 6, 7, 8, 5, 6, 7, 8], [ 9, 10, 11, 12, 9, 10, 11, 12], [13, 14, 15, 16, 13, 14, 15, 16]])

 这个只需要添加参数axis=1就可以了,axis默认是为0,按照行拼接。
np.concatenate((n0,n0),axis=1)

array([[ 1,  2,  3,  4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16],
[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])

python数据分析之 A股上市公司按地区分布与可视化 地图显示

量化交易李魔佛 发表了文章 • 0 个评论 • 700 次浏览 • 2018-12-19 14:07 • 来自相关话题

首先传统方法是使用数据库:SELECT area `地区`,count(*) as `数目` FROM `tb_basic_info` GROUP BY area order by 数目 desc;得到下面的结果: 接着我们使用pandas进行数据可视化。
 地区 数目
浙江 431
江苏 401
北京 316
广东 303
上海 285
深圳 283
山东 196
福建 132
四川 120
湖南 104
安徽 103
湖北 101
河南 79
辽宁 72
河北 56
新疆 54
天津 50
陕西 49
重庆 48
吉林 41
江西 41
山西 38
黑龙江 37
广西 37
云南 33
甘肃 33
海南 31
贵州 29
内蒙 25
西藏 18
宁夏 13
青海 12
看看我们的641主席的功劳,江浙一带的上市公司数量已经超过广东了。
 
接下来我们使用pandas进行数据可视化:
 
首先读入数据:# A股上市公司分布:
df = pd.read_sql('tb_basic_info',con=engine)engine为from sqlalchemy import create_engine 中的连接引擎。
 
然后直接统计:result = df['area'].value_counts()得到的result就是统计结果:





 
看是不是比mysql语句简单多了?
 
得到一样的数据。
 
接下来使用图像来显示我们的数据:





 
什么? 一条命令就可以啦~ 实在太强大了!
从这个柱状图上,可以更加直观地看到A股上市公司的分布情况,东部长三角和珠三角的公司数目最多。而西部只有东部的零头。
 
接着把数据转化为百分比数据:total = result.sum()
ration = result/total*100




可以看到江浙地区占了22%的数量,体量还是很大的。
 
接下来,为了数据更加直观,把数据在地图上显示出来:





            点击查看大图

颜色越红,表明上市公司越多。现在数据够直观了吧。
 
实现代码:# 热力图
def create_heatmap(attr,value,name,maptype):
style = Style(title_color="#fff", title_pos="center",
width=1200, height=600, background_color="#696969")

# 可视化
geo = Geo(name,**style.init_style)
geo.add("", attr, value, visual_range=[min(value), max(value)], symbol_size=8,
visual_text_color="#000",
is_visualmap=True, type='effectScatter',effect_scale=7,is_random=True,is_roam=False,is_piecewise = True,visual_split_number= 10,
)

geo.render('{}.html'.format(name)) create_heatmap(attr,value,'公司分布','china')
 

更多的数据分析,请关注本网站。
不定期更新哦
 
原创文章
转载请注明出处:
http://30daydo.com/article/388
  查看全部
首先传统方法是使用数据库:
SELECT area `地区`,count(*) as `数目` FROM `tb_basic_info` GROUP BY area order by 数目 desc;
得到下面的结果: 接着我们使用pandas进行数据可视化。
 地区 数目
浙江 431
江苏 401
北京 316
广东 303
上海 285
深圳 283
山东 196
福建 132
四川 120
湖南 104
安徽 103
湖北 101
河南 79
辽宁 72
河北 56
新疆 54
天津 50
陕西 49
重庆 48
吉林 41
江西 41
山西 38
黑龙江 37
广西 37
云南 33
甘肃 33
海南 31
贵州 29
内蒙 25
西藏 18
宁夏 13
青海 12
看看我们的641主席的功劳,江浙一带的上市公司数量已经超过广东了。
 
接下来我们使用pandas进行数据可视化:
 
首先读入数据:
# A股上市公司分布:
df = pd.read_sql('tb_basic_info',con=engine)
engine为from sqlalchemy import create_engine 中的连接引擎。
 
然后直接统计:
result = df['area'].value_counts()
得到的result就是统计结果:

地区统计_副本.jpg

 
看是不是比mysql语句简单多了?
 
得到一样的数据。
 
接下来使用图像来显示我们的数据:

地区绘图.JPG

 
什么? 一条命令就可以啦~ 实在太强大了!
从这个柱状图上,可以更加直观地看到A股上市公司的分布情况,东部长三角和珠三角的公司数目最多。而西部只有东部的零头。
 
接着把数据转化为百分比数据:
total = result.sum()
ration = result/total*100

a5.JPG

可以看到江浙地区占了22%的数量,体量还是很大的。
 
接下来,为了数据更加直观,把数据在地图上显示出来:

热力图.JPG

            点击查看大图

颜色越红,表明上市公司越多。现在数据够直观了吧。
 
实现代码:
# 热力图
def create_heatmap(attr,value,name,maptype):
style = Style(title_color="#fff", title_pos="center",
width=1200, height=600, background_color="#696969")

# 可视化
geo = Geo(name,**style.init_style)
geo.add("", attr, value, visual_range=[min(value), max(value)], symbol_size=8,
visual_text_color="#000",
is_visualmap=True, type='effectScatter',effect_scale=7,is_random=True,is_roam=False,is_piecewise = True,visual_split_number= 10,
)

geo.render('{}.html'.format(name))
 
create_heatmap(attr,value,'公司分布','china')

 

更多的数据分析,请关注本网站。
不定期更新哦
 
原创文章
转载请注明出处:
http://30daydo.com/article/388
 

np.empty() 函数的用法 (有坑)

量化交易李魔佛 发表了文章 • 0 个评论 • 5816 次浏览 • 2018-11-20 11:36 • 来自相关话题

看名字np.empty(),以为创建一个空的多维数组,如 np.empty((4,4))
但是实际结果返回:
 array([[4.67296746e-307, 1.69121096e-306, 9.34601642e-307,
1.33511562e-306],
[8.34447260e-308, 6.23043768e-307, 2.22522597e-306,
1.33511969e-306],
[1.37962320e-306, 9.34604358e-307, 9.79101082e-307,
1.78020576e-306],
[1.69119873e-306, 2.22522868e-306, 1.24611809e-306,
8.06632139e-308]])
what ?
 
感觉里面的元素是随机生成的。
查了下官方文档,的确是。np.empty()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。 查看全部
看名字np.empty(),以为创建一个空的多维数组,如 np.empty((4,4))
但是实际结果返回:
 
array([[4.67296746e-307, 1.69121096e-306, 9.34601642e-307,
1.33511562e-306],
[8.34447260e-308, 6.23043768e-307, 2.22522597e-306,
1.33511969e-306],
[1.37962320e-306, 9.34604358e-307, 9.79101082e-307,
1.78020576e-306],
[1.69119873e-306, 2.22522868e-306, 1.24611809e-306,
8.06632139e-308]])

what ?
 
感觉里面的元素是随机生成的。
查了下官方文档,的确是。np.empty()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。

python数据分析入门 --分析雪球元卫南每个月打赏收入

量化交易李魔佛 发表了文章 • 0 个评论 • 929 次浏览 • 2018-10-24 14:34 • 来自相关话题

在上一篇 雪球的元卫南靠打赏收割了多少钱 ? python爬虫实例 中,统计出来元卫南所有打赏收入为 24128.13 ,这个数字出乎不少人的意料。因为不少人看到元卫南最近收到的打赏都很多,不少都是100,200的。 那么接下来我就顺便带大家学一下,如何用python做数据分析。
 
数据来源于上一篇文章中获取到的数据。
首先,从数据库mongodb中读取数据










(点击查看大图)

上面显示数据的前10条,确保数据被正常载入。
 
观察到列 created_at 是打赏的时间, 导入的数据是字符类型,那么对列 created_at 进行换算, 转化为dataframe中的datetime类型。重新定义一列 pub_date 为打赏时间,设为index,因为dataframe可以对时间index做很多丰富的操作。










 (点击查看大图) 

可以看到转换后的时间精确到小时,分,秒,而我们需要统计的是每个月(或者每周,每季度,每年都可以)的数据,那么我们就需要重新采样, pandas提供了很好的resample函数,可以对数据按照时间频次进行重新采样。 





 (点击查看大图)
 
现在可以看到获取到2018年9月的所有打赏金额的数据。
 
那么现在就对所有数据进行重采样,并打赏金额进行求和






 (点击查看大图)
 
现在可以看到,每个月得到的打赏金额的总和都可以看到了。从2016年7月到现在2018年10月,最多的月份是这个月,共1.4万,占了所有金额的60%多,所以才让大家造成一个错觉,元兄靠打赏赚了不少粉丝的打赏钱,其实只是最近才多起来的。
 
还可以绘制条形图。






 (点击查看大图)
 
不过因为月份金额差距过大,导致部分月份的条形显示很短。
 
不过对于赏金的分布也一目了然了吧。
 
原创文章
转载请注明出处:
http://30daydo.com/article/362 
  
个人公众号:

  查看全部
在上一篇 雪球的元卫南靠打赏收割了多少钱 ? python爬虫实例 中,统计出来元卫南所有打赏收入为 24128.13 ,这个数字出乎不少人的意料。因为不少人看到元卫南最近收到的打赏都很多,不少都是100,200的。 那么接下来我就顺便带大家学一下,如何用python做数据分析。
 
数据来源于上一篇文章中获取到的数据。
首先,从数据库mongodb中读取数据

捕获a12.JPG


top10.JPG

(点击查看大图)

上面显示数据的前10条,确保数据被正常载入。
 
观察到列 created_at 是打赏的时间, 导入的数据是字符类型,那么对列 created_at 进行换算, 转化为dataframe中的datetime类型。重新定义一列 pub_date 为打赏时间,设为index,因为dataframe可以对时间index做很多丰富的操作。

捕获a22.JPG


resample1.JPG

 (点击查看大图) 

可以看到转换后的时间精确到小时,分,秒,而我们需要统计的是每个月(或者每周,每季度,每年都可以)的数据,那么我们就需要重新采样, pandas提供了很好的resample函数,可以对数据按照时间频次进行重新采样。 

捕获a24.JPG

 (点击查看大图)
 
现在可以看到获取到2018年9月的所有打赏金额的数据。
 
那么现在就对所有数据进行重采样,并打赏金额进行求和


捕获a25.JPG

 (点击查看大图)
 
现在可以看到,每个月得到的打赏金额的总和都可以看到了。从2016年7月到现在2018年10月,最多的月份是这个月,共1.4万,占了所有金额的60%多,所以才让大家造成一个错觉,元兄靠打赏赚了不少粉丝的打赏钱,其实只是最近才多起来的。
 
还可以绘制条形图。


捕获a26.JPG

 (点击查看大图)
 
不过因为月份金额差距过大,导致部分月份的条形显示很短。
 
不过对于赏金的分布也一目了然了吧。
 
原创文章
转载请注明出处:
http://30daydo.com/article/362 
  
个人公众号:

 

jupyter notebook 数据分析的利器

每日总结李魔佛 发表了文章 • 0 个评论 • 666 次浏览 • 2018-04-22 15:33 • 来自相关话题

python做数据分析,jupyter notebook比其他的IDE要好用的多,每次打开都可以直接看到上次运行的结果。
而且很重要的一点,jupyter使用web 服务器的方式运行,可以在树莓派上开一个jupyter服务,然后配置一下,就可以在其他的电脑上通过浏览器运行jupyter。 其他电脑不必要安装任何python和配置虚拟环境。 查看全部
python做数据分析,jupyter notebook比其他的IDE要好用的多,每次打开都可以直接看到上次运行的结果。
而且很重要的一点,jupyter使用web 服务器的方式运行,可以在树莓派上开一个jupyter服务,然后配置一下,就可以在其他的电脑上通过浏览器运行jupyter。 其他电脑不必要安装任何python和配置虚拟环境。

python预测下一期双色球号码【机器学习】

python李魔佛 发表了文章 • 2 个评论 • 4107 次浏览 • 2018-02-19 10:16 • 来自相关话题

Task:
1. 在福彩官网抓取所有的历史双色球数据。
2. 使用历史数据进行继续学习。
 
Part1 数据抓取
 
main.pyimport re
from bs4 import BeautifulSoup
import urllib2
from mylog import MyLog as mylog
from save2excel import SavaBallDate

class DoubleColorBallItem(object):
date = None
order = None
red1 = None
red2 = None
red3 = None
red4 = None
red5 = None
red6 = None
blue = None
money = None
firstPrize = None
secondPrize = None

class GetDoubleColorBallNumber(object):
'''这个类用于获取双色球中奖号码, 返回一个txt文件
'''
def __init__(self):
self.urls =
self.log = mylog()
self.getUrls()
self.items = self.spider(self.urls)
self.pipelines(self.items)
self.log.info('beging save data to excel \r\n')
SavaBallDate(self.items)
self.log.info('save data to excel end ...\r\n')


def getUrls(self):
'''获取数据来源网页
'''
URL = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html'
htmlContent = self.getResponseContent(URL)
soup = BeautifulSoup(htmlContent, 'lxml')
tag = soup.find_all(re.compile('p'))[-1]
pages = tag.strong.get_text()
for i in xrange(1, int(pages)+1):
url = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_' + str(i) + '.html'
self.urls.append(url)
self.log.info(u'添加URL:%s 到URLS \r\n' %url)

def getResponseContent(self, url):
'''这里单独使用一个函数返回页面返回值,是为了后期方便的加入proxy和headers等
'''
try:
response = urllib2.urlopen(url.encode('utf8'))
except:
self.log.error(u'Python 返回URL:%s 数据失败 \r\n' %url)
else:
self.log.info(u'Python 返回URUL:%s 数据成功 \r\n' %url)
return response.read()


def spider(self,urls):
'''这个函数的作用是从获取的数据中过滤得到中奖信息
'''
items =
for url in urls:
htmlContent = self.getResponseContent(url)
soup = BeautifulSoup(htmlContent, 'lxml')
tags = soup.find_all('tr', attrs={})
for tag in tags:
if tag.find('em'):
item = DoubleColorBallItem()
tagTd = tag.find_all('td')
item.date = tagTd[0].get_text()
item.order = tagTd[1].get_text()
tagEm = tagTd[2].find_all('em')
item.red1 = tagEm[0].get_text()
item.red2 = tagEm[1].get_text()
item.red3 = tagEm[2].get_text()
item.red4 = tagEm[3].get_text()
item.red5 = tagEm[4].get_text()
item.red6 = tagEm[5].get_text()
item.blue = tagEm[6].get_text()
item.money = tagTd[3].find('strong').get_text()
item.firstPrize = tagTd[4].find('strong').get_text()
item.secondPrize = tagTd[5].find('strong').get_text()
items.append(item)
self.log.info(u'获取日期为:%s 的数据成功' %(item.date))
return items

def pipelines(self,items):
fileName = u'双色球.txt'.encode('GBK')
with open(fileName, 'w') as fp:
for item in items:
fp.write('%s %s \t %s %s %s %s %s %s %s \t %s \t %s %s \n'
%(item.date,item.order,item.red1,item.red2,item.red3,item.red4,item.red5,item.red6,item.blue,item.money,item.firstPrize,item.secondPrize))
self.log.info(u'将日期为:%s 的数据存入"%s"...' %(item.date, fileName.decode('GBK')))


if __name__ == '__main__':
GDCBN = GetDoubleColorBallNumber()




from mylog import MyLog as mylog 
from save2excel import SavaBallDate
这两个模块四用来显示log和保存为excel数据。import logging
import getpass
import sys


#### 定义MyLog类
class MyLog(object):
#### 类MyLog的构造函数
def __init__(self):
self.user = getpass.getuser()
self.logger = logging.getLogger(self.user)
self.logger.setLevel(logging.DEBUG)

#### 日志文件名
self.logFile = sys.argv[0][0:-3] + '.log'
self.formatter = logging.Formatter('%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s\r\n')

#### 日志显示到屏幕上并输出到日志文件内
self.logHand = logging.FileHandler(self.logFile, encoding='utf8')
self.logHand.setFormatter(self.formatter)
self.logHand.setLevel(logging.DEBUG)

self.logHandSt = logging.StreamHandler()
self.logHandSt.setFormatter(self.formatter)
self.logHandSt.setLevel(logging.DEBUG)

self.logger.addHandler(self.logHand)
self.logger.addHandler(self.logHandSt)

#### 日志的5个级别对应以下的5个函数
def debug(self,msg):
self.logger.debug(msg)

def info(self,msg):
self.logger.info(msg)

def warn(self,msg):
self.logger.warn(msg)

def error(self,msg):
self.logger.error(msg)

def critical(self,msg):
self.logger.critical(msg)

if __name__ == '__main__':
mylog = MyLog()
mylog.debug(u"I'm debug 测试中文")
mylog.info("I'm info")
mylog.warn("I'm warn")
mylog.error(u"I'm error 测试中文")
mylog.critical("I'm critical")


 import xlwt
class SavaBallDate(object):
def __init__(self, items):
self.items = items
self.run(self.items)

def run(self,items):
fileName = u'双色球.xls'.encode('GBK')
book = xlwt.Workbook(encoding='utf8')
sheet=book.add_sheet('ball', cell_overwrite_ok=True)
sheet.write(0, 0, u'开奖日期'.encode('utf8'))
sheet.write(0, 1, u'期号'.encode('utf8'))
sheet.write(0, 2, u'红1'.encode('utf8'))
sheet.write(0, 3, u'红2'.encode('utf8'))
sheet.write(0, 4, u'红3'.encode('utf8'))
sheet.write(0, 5, u'红4'.encode('utf8'))
sheet.write(0, 6, u'红5'.encode('utf8'))
sheet.write(0, 7, u'红6'.encode('utf8'))
sheet.write(0, 8, u'蓝'.encode('utf8'))
sheet.write(0, 9, u'销售金额'.encode('utf8'))
sheet.write(0, 10, u'一等奖'.encode('utf8'))
sheet.write(0, 11, u'二等奖'.encode('utf8'))
i = 1
while i <= len(items):
item = items[i-1]
sheet.write(i, 0, item.date)
sheet.write(i, 1, item.order)
sheet.write(i, 2, item.red1)
sheet.write(i, 3, item.red2)
sheet.write(i, 4, item.red3)
sheet.write(i, 5, item.red4)
sheet.write(i, 6, item.red5)
sheet.write(i, 7, item.red6)
sheet.write(i, 8, item.blue)
sheet.write(i, 9, item.money)
sheet.write(i, 10, item.firstPrize)
sheet.write(i, 11, item.secondPrize)
i += 1
book.save(fileName)



if __name__ == '__main__':
pass



 
运行脚本后,会在本地生成一个excel文件,保存为一下的格式:





 
第一步完成。
 Part2 机器学习进行预测
2018-02-19
待续,后面继续更新 
原文链接:
http://30daydo.com/article/277
  查看全部
Task:
1. 在福彩官网抓取所有的历史双色球数据。
2. 使用历史数据进行继续学习。
 
Part1 数据抓取
 
main.py
import re
from bs4 import BeautifulSoup
import urllib2
from mylog import MyLog as mylog
from save2excel import SavaBallDate

class DoubleColorBallItem(object):
date = None
order = None
red1 = None
red2 = None
red3 = None
red4 = None
red5 = None
red6 = None
blue = None
money = None
firstPrize = None
secondPrize = None

class GetDoubleColorBallNumber(object):
'''这个类用于获取双色球中奖号码, 返回一个txt文件
'''
def __init__(self):
self.urls =
self.log = mylog()
self.getUrls()
self.items = self.spider(self.urls)
self.pipelines(self.items)
self.log.info('beging save data to excel \r\n')
SavaBallDate(self.items)
self.log.info('save data to excel end ...\r\n')


def getUrls(self):
'''获取数据来源网页
'''
URL = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html'
htmlContent = self.getResponseContent(URL)
soup = BeautifulSoup(htmlContent, 'lxml')
tag = soup.find_all(re.compile('p'))[-1]
pages = tag.strong.get_text()
for i in xrange(1, int(pages)+1):
url = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_' + str(i) + '.html'
self.urls.append(url)
self.log.info(u'添加URL:%s 到URLS \r\n' %url)

def getResponseContent(self, url):
'''这里单独使用一个函数返回页面返回值,是为了后期方便的加入proxy和headers等
'''
try:
response = urllib2.urlopen(url.encode('utf8'))
except:
self.log.error(u'Python 返回URL:%s 数据失败 \r\n' %url)
else:
self.log.info(u'Python 返回URUL:%s 数据成功 \r\n' %url)
return response.read()


def spider(self,urls):
'''这个函数的作用是从获取的数据中过滤得到中奖信息
'''
items =
for url in urls:
htmlContent = self.getResponseContent(url)
soup = BeautifulSoup(htmlContent, 'lxml')
tags = soup.find_all('tr', attrs={})
for tag in tags:
if tag.find('em'):
item = DoubleColorBallItem()
tagTd = tag.find_all('td')
item.date = tagTd[0].get_text()
item.order = tagTd[1].get_text()
tagEm = tagTd[2].find_all('em')
item.red1 = tagEm[0].get_text()
item.red2 = tagEm[1].get_text()
item.red3 = tagEm[2].get_text()
item.red4 = tagEm[3].get_text()
item.red5 = tagEm[4].get_text()
item.red6 = tagEm[5].get_text()
item.blue = tagEm[6].get_text()
item.money = tagTd[3].find('strong').get_text()
item.firstPrize = tagTd[4].find('strong').get_text()
item.secondPrize = tagTd[5].find('strong').get_text()
items.append(item)
self.log.info(u'获取日期为:%s 的数据成功' %(item.date))
return items

def pipelines(self,items):
fileName = u'双色球.txt'.encode('GBK')
with open(fileName, 'w') as fp:
for item in items:
fp.write('%s %s \t %s %s %s %s %s %s %s \t %s \t %s %s \n'
%(item.date,item.order,item.red1,item.red2,item.red3,item.red4,item.red5,item.red6,item.blue,item.money,item.firstPrize,item.secondPrize))
self.log.info(u'将日期为:%s 的数据存入"%s"...' %(item.date, fileName.decode('GBK')))


if __name__ == '__main__':
GDCBN = GetDoubleColorBallNumber()




from mylog import MyLog as mylog 
from save2excel import SavaBallDate
这两个模块四用来显示log和保存为excel数据。
import logging
import getpass
import sys


#### 定义MyLog类
class MyLog(object):
#### 类MyLog的构造函数
def __init__(self):
self.user = getpass.getuser()
self.logger = logging.getLogger(self.user)
self.logger.setLevel(logging.DEBUG)

#### 日志文件名
self.logFile = sys.argv[0][0:-3] + '.log'
self.formatter = logging.Formatter('%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s\r\n')

#### 日志显示到屏幕上并输出到日志文件内
self.logHand = logging.FileHandler(self.logFile, encoding='utf8')
self.logHand.setFormatter(self.formatter)
self.logHand.setLevel(logging.DEBUG)

self.logHandSt = logging.StreamHandler()
self.logHandSt.setFormatter(self.formatter)
self.logHandSt.setLevel(logging.DEBUG)

self.logger.addHandler(self.logHand)
self.logger.addHandler(self.logHandSt)

#### 日志的5个级别对应以下的5个函数
def debug(self,msg):
self.logger.debug(msg)

def info(self,msg):
self.logger.info(msg)

def warn(self,msg):
self.logger.warn(msg)

def error(self,msg):
self.logger.error(msg)

def critical(self,msg):
self.logger.critical(msg)

if __name__ == '__main__':
mylog = MyLog()
mylog.debug(u"I'm debug 测试中文")
mylog.info("I'm info")
mylog.warn("I'm warn")
mylog.error(u"I'm error 测试中文")
mylog.critical("I'm critical")


 
import xlwt
class SavaBallDate(object):
def __init__(self, items):
self.items = items
self.run(self.items)

def run(self,items):
fileName = u'双色球.xls'.encode('GBK')
book = xlwt.Workbook(encoding='utf8')
sheet=book.add_sheet('ball', cell_overwrite_ok=True)
sheet.write(0, 0, u'开奖日期'.encode('utf8'))
sheet.write(0, 1, u'期号'.encode('utf8'))
sheet.write(0, 2, u'红1'.encode('utf8'))
sheet.write(0, 3, u'红2'.encode('utf8'))
sheet.write(0, 4, u'红3'.encode('utf8'))
sheet.write(0, 5, u'红4'.encode('utf8'))
sheet.write(0, 6, u'红5'.encode('utf8'))
sheet.write(0, 7, u'红6'.encode('utf8'))
sheet.write(0, 8, u'蓝'.encode('utf8'))
sheet.write(0, 9, u'销售金额'.encode('utf8'))
sheet.write(0, 10, u'一等奖'.encode('utf8'))
sheet.write(0, 11, u'二等奖'.encode('utf8'))
i = 1
while i <= len(items):
item = items[i-1]
sheet.write(i, 0, item.date)
sheet.write(i, 1, item.order)
sheet.write(i, 2, item.red1)
sheet.write(i, 3, item.red2)
sheet.write(i, 4, item.red3)
sheet.write(i, 5, item.red4)
sheet.write(i, 6, item.red5)
sheet.write(i, 7, item.red6)
sheet.write(i, 8, item.blue)
sheet.write(i, 9, item.money)
sheet.write(i, 10, item.firstPrize)
sheet.write(i, 11, item.secondPrize)
i += 1
book.save(fileName)



if __name__ == '__main__':
pass



 
运行脚本后,会在本地生成一个excel文件,保存为一下的格式:

double.GIF

 
第一步完成。
 Part2 机器学习进行预测
2018-02-19
待续,后面继续更新 
原文链接:
http://30daydo.com/article/277
 

TypeError: the dtype datetime64 is not supported for parsing

回复

python李魔佛 回复了问题 • 1 人关注 • 1 个回复 • 3285 次浏览 • 2018-02-05 02:44 • 来自相关话题

【量化分析】到底谁在买乐视网?2018年1月26日

股票李魔佛 发表了文章 • 2 个评论 • 1352 次浏览 • 2018-01-26 17:02 • 来自相关话题

这是乐视复牌的第三天,连续3个跌停。





 
本来没有持有这一只股票,不过雪球上不时地出现一些文章,根据龙虎榜推测到底谁在接盘。 于是今天收盘,打开jupyter notebook来简单地分析一下。 大家也可以跟着学习一些分析的思路。因为今天的龙虎榜还没出来,等待会龙虎榜出来了可以再比较一下。
 
首先导入今天的分时数据





 
volume列就是我们感兴趣的成交量。单位是手(100股)
 
先计算一下今天的总成交量:






1021800股,额,比不少中小创的小股的成交量还大呢,瘦死的骆驼比马大。
 
去对比一下雪球或者东财的数据,看看数据是否准确。






 
嗯,1.02万手,数据一致。
 
接着我们来看看排序,按照成交量的大小排序,可以看到最大和最小的差别:





 
大单都集中在开盘和收盘阶段(其实开盘和收盘严格来说不算大单,因为同一时刻太多人一起买,所以掺杂在一起,如果把收盘和开盘的数据拿掉,其实真的没多少大单。。。)
 




 
然后剩下的都是些零零散散的1手的成交:

可以统计一下每个单数出现的频率:





 
出现最多的是1手,2手。这个很正常,如果出现较多的是超过100手的大单,那么也说明跌停很快被打开(后续如果有打算冒风险去撸一把乐视翘班的,可以自己写一个检测程序)
 
接着做一些统计:
定义大于100手的为大单。
然后计算100手大单占成交的比例:





 
嗯,有28%的比例呢。
 
然后计算一下小于10手的占成交比例。





有30%的比例。
 
再统计一下中位数和各分位数:





 
中位数是3,说明整个交易中,一半的成交是在等于或小于3手的,而分位数看到,1手的可以排到25%的位置,而8手则排到了75%的位置。
 
结论:
其实在买的都是小散,不知道是乐粉还是赌徒了。
原文地址:
http://30daydo.com/article/267
源码:https://github.com/Rockyzsu/stock/blob/master/levt_notebook.ipynb
  查看全部
这是乐视复牌的第三天,连续3个跌停。

letv.png

 
本来没有持有这一只股票,不过雪球上不时地出现一些文章,根据龙虎榜推测到底谁在接盘。 于是今天收盘,打开jupyter notebook来简单地分析一下。 大家也可以跟着学习一些分析的思路。因为今天的龙虎榜还没出来,等待会龙虎榜出来了可以再比较一下。
 
首先导入今天的分时数据

df.png

 
volume列就是我们感兴趣的成交量。单位是手(100股)
 
先计算一下今天的总成交量:

Snap3.png


1021800股,额,比不少中小创的小股的成交量还大呢,瘦死的骆驼比马大。
 
去对比一下雪球或者东财的数据,看看数据是否准确。


Snap4.png

 
嗯,1.02万手,数据一致。
 
接着我们来看看排序,按照成交量的大小排序,可以看到最大和最小的差别:

Snap5.png

 
大单都集中在开盘和收盘阶段(其实开盘和收盘严格来说不算大单,因为同一时刻太多人一起买,所以掺杂在一起,如果把收盘和开盘的数据拿掉,其实真的没多少大单。。。)
 
Snap6.png

 
然后剩下的都是些零零散散的1手的成交:

可以统计一下每个单数出现的频率:

Snap7.png

 
出现最多的是1手,2手。这个很正常,如果出现较多的是超过100手的大单,那么也说明跌停很快被打开(后续如果有打算冒风险去撸一把乐视翘班的,可以自己写一个检测程序)
 
接着做一些统计:
定义大于100手的为大单。
然后计算100手大单占成交的比例:

Snap8.png

 
嗯,有28%的比例呢。
 
然后计算一下小于10手的占成交比例。

Snap9.png

有30%的比例。
 
再统计一下中位数和各分位数:

Snap11.png

 
中位数是3,说明整个交易中,一半的成交是在等于或小于3手的,而分位数看到,1手的可以排到25%的位置,而8手则排到了75%的位置。
 
结论:
其实在买的都是小散,不知道是乐粉还是赌徒了。
原文地址:
http://30daydo.com/article/267
源码:https://github.com/Rockyzsu/stock/blob/master/levt_notebook.ipynb
 

dataframe reindex和reset_index区别

量化交易李魔佛 发表了文章 • 0 个评论 • 12132 次浏览 • 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\n', df
print 'df2\n', df2

df_x = [df, df2]
result = pd.concat(df_x)
print 'first result\n', 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\n', df
print 'df2\n', df2

df_x = [df, df2]
result = pd.concat(df_x)
print 'first result\n', 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 
欢迎转载,注明出处
 

菜鸟侦探挑战数据分析R源代码

量化交易李魔佛 发表了文章 • 0 个评论 • 676 次浏览 • 2017-12-11 17:45 • 来自相关话题

菜鸟侦探挑战数据分析R源代码:
百度网盘下载链接:
https://pan.baidu.com/s/1miiScDM
 
菜鸟侦探挑战数据分析R源代码:
百度网盘下载链接:
https://pan.baidu.com/s/1miiScDM
 

TypeError: the dtype datetime64 is not supported for parsing

回复

python李魔佛 回复了问题 • 1 人关注 • 1 个回复 • 3285 次浏览 • 2018-02-05 02:44 • 来自相关话题

【Dataframe warning】Try using .loc[row_indexer,col_indexer] = value instead

python李魔佛 发表了文章 • 0 个评论 • 69 次浏览 • 2019-04-02 22:48 • 来自相关话题

使用dataframe直接赋值操作时
 
df['当前日期'] = datetime.date.today()
 
会出现下面的警告信息
Try using .loc[row_indexer,col_indexer] = value instead 
 
虽然得到的最终结果是正常的,可是为什么会出现上面的警告呢?
 
因为上面的操作如果稍微复杂点,那么就可能导致赋值失败。 因为中间会产生一个切片的临时副本。
 
比如:
df
A B C D E
0 5 0 3 3 7
1 9 3 5 2 4
2 7 6 8 8 1
如果想把A列中大于5的数换成100,如何操作 ?
 
A B C D E
0 5 0 3 3 7
1 1000 3 5 2 4
2 1000 6 8 8 1

df[df.A > 5]['A'] = 1000
 
上面的这个表达式是不会生效的。
 
要生效,需要写成以下:
df.loc[df.A > 5, 'A'] = 1000
 
为什么呢?
因为df[df.A]得到是一个临时切片结果,等于一个中间变量,然后在这个中间变量上的A列上做赋值操作,但是最原始的df却没有被改变。
或者你可以这样写
df=df[df.A>5]
df.A=1000
 
 
  查看全部
使用dataframe直接赋值操作时
 
df['当前日期'] = datetime.date.today()
 
会出现下面的警告信息
Try using .loc[row_indexer,col_indexer] = value instead 
 
虽然得到的最终结果是正常的,可是为什么会出现上面的警告呢?
 
因为上面的操作如果稍微复杂点,那么就可能导致赋值失败。 因为中间会产生一个切片的临时副本。
 
比如:
df
A B C D E
0 5 0 3 3 7
1 9 3 5 2 4
2 7 6 8 8 1

如果想把A列中大于5的数换成100,如何操作 ?
 
      A  B  C  D  E
0 5 0 3 3 7
1 1000 3 5 2 4
2 1000 6 8 8 1


df[df.A > 5]['A'] = 1000
 
上面的这个表达式是不会生效的。
 
要生效,需要写成以下:
df.loc[df.A > 5, 'A'] = 1000
 
为什么呢?
因为df[df.A]得到是一个临时切片结果,等于一个中间变量,然后在这个中间变量上的A列上做赋值操作,但是最原始的df却没有被改变。
或者你可以这样写
df=df[df.A>5]
df.A=1000
 
 
 

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

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

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





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

echarts.png

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

numpy 二维数组按列合并

python李魔佛 发表了文章 • 0 个评论 • 254 次浏览 • 2019-01-19 21:43 • 来自相关话题

numpy的数组默认按行合并,如何按列合并?
 
先生产测试数组# np 的运算
n = np.arange(1,17)
转化形态:
n0 = n.reshape(4,4)变成4x4的矩阵
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
然后运用concatenate函数拼接:
np.concatenate((n0,n0),axis=1)array([[ 1, 2, 3, 4, 1, 2, 3, 4], [ 5, 6, 7, 8, 5, 6, 7, 8], [ 9, 10, 11, 12, 9, 10, 11, 12], [13, 14, 15, 16, 13, 14, 15, 16]])
 这个只需要添加参数axis=1就可以了,axis默认是为0,按照行拼接。
np.concatenate((n0,n0),axis=1)
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16],
[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]) 查看全部
numpy的数组默认按行合并,如何按列合并?
 
先生产测试数组
# np 的运算
n = np.arange(1,17)

转化形态:
n0 = n.reshape(4,4)
变成4x4的矩阵
array([[ 1,  2,  3,  4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])

然后运用concatenate函数拼接:
np.concatenate((n0,n0),axis=1)
array([[ 1, 2, 3, 4, 1, 2, 3, 4], [ 5, 6, 7, 8, 5, 6, 7, 8], [ 9, 10, 11, 12, 9, 10, 11, 12], [13, 14, 15, 16, 13, 14, 15, 16]])

 这个只需要添加参数axis=1就可以了,axis默认是为0,按照行拼接。
np.concatenate((n0,n0),axis=1)

array([[ 1,  2,  3,  4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16],
[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])

python数据分析之 A股上市公司按地区分布与可视化 地图显示

量化交易李魔佛 发表了文章 • 0 个评论 • 700 次浏览 • 2018-12-19 14:07 • 来自相关话题

首先传统方法是使用数据库:SELECT area `地区`,count(*) as `数目` FROM `tb_basic_info` GROUP BY area order by 数目 desc;得到下面的结果: 接着我们使用pandas进行数据可视化。
 地区 数目
浙江 431
江苏 401
北京 316
广东 303
上海 285
深圳 283
山东 196
福建 132
四川 120
湖南 104
安徽 103
湖北 101
河南 79
辽宁 72
河北 56
新疆 54
天津 50
陕西 49
重庆 48
吉林 41
江西 41
山西 38
黑龙江 37
广西 37
云南 33
甘肃 33
海南 31
贵州 29
内蒙 25
西藏 18
宁夏 13
青海 12
看看我们的641主席的功劳,江浙一带的上市公司数量已经超过广东了。
 
接下来我们使用pandas进行数据可视化:
 
首先读入数据:# A股上市公司分布:
df = pd.read_sql('tb_basic_info',con=engine)engine为from sqlalchemy import create_engine 中的连接引擎。
 
然后直接统计:result = df['area'].value_counts()得到的result就是统计结果:





 
看是不是比mysql语句简单多了?
 
得到一样的数据。
 
接下来使用图像来显示我们的数据:





 
什么? 一条命令就可以啦~ 实在太强大了!
从这个柱状图上,可以更加直观地看到A股上市公司的分布情况,东部长三角和珠三角的公司数目最多。而西部只有东部的零头。
 
接着把数据转化为百分比数据:total = result.sum()
ration = result/total*100




可以看到江浙地区占了22%的数量,体量还是很大的。
 
接下来,为了数据更加直观,把数据在地图上显示出来:





            点击查看大图

颜色越红,表明上市公司越多。现在数据够直观了吧。
 
实现代码:# 热力图
def create_heatmap(attr,value,name,maptype):
style = Style(title_color="#fff", title_pos="center",
width=1200, height=600, background_color="#696969")

# 可视化
geo = Geo(name,**style.init_style)
geo.add("", attr, value, visual_range=[min(value), max(value)], symbol_size=8,
visual_text_color="#000",
is_visualmap=True, type='effectScatter',effect_scale=7,is_random=True,is_roam=False,is_piecewise = True,visual_split_number= 10,
)

geo.render('{}.html'.format(name)) create_heatmap(attr,value,'公司分布','china')
 

更多的数据分析,请关注本网站。
不定期更新哦
 
原创文章
转载请注明出处:
http://30daydo.com/article/388
  查看全部
首先传统方法是使用数据库:
SELECT area `地区`,count(*) as `数目` FROM `tb_basic_info` GROUP BY area order by 数目 desc;
得到下面的结果: 接着我们使用pandas进行数据可视化。
 地区 数目
浙江 431
江苏 401
北京 316
广东 303
上海 285
深圳 283
山东 196
福建 132
四川 120
湖南 104
安徽 103
湖北 101
河南 79
辽宁 72
河北 56
新疆 54
天津 50
陕西 49
重庆 48
吉林 41
江西 41
山西 38
黑龙江 37
广西 37
云南 33
甘肃 33
海南 31
贵州 29
内蒙 25
西藏 18
宁夏 13
青海 12
看看我们的641主席的功劳,江浙一带的上市公司数量已经超过广东了。
 
接下来我们使用pandas进行数据可视化:
 
首先读入数据:
# A股上市公司分布:
df = pd.read_sql('tb_basic_info',con=engine)
engine为from sqlalchemy import create_engine 中的连接引擎。
 
然后直接统计:
result = df['area'].value_counts()
得到的result就是统计结果:

地区统计_副本.jpg

 
看是不是比mysql语句简单多了?
 
得到一样的数据。
 
接下来使用图像来显示我们的数据:

地区绘图.JPG

 
什么? 一条命令就可以啦~ 实在太强大了!
从这个柱状图上,可以更加直观地看到A股上市公司的分布情况,东部长三角和珠三角的公司数目最多。而西部只有东部的零头。
 
接着把数据转化为百分比数据:
total = result.sum()
ration = result/total*100

a5.JPG

可以看到江浙地区占了22%的数量,体量还是很大的。
 
接下来,为了数据更加直观,把数据在地图上显示出来:

热力图.JPG

            点击查看大图

颜色越红,表明上市公司越多。现在数据够直观了吧。
 
实现代码:
# 热力图
def create_heatmap(attr,value,name,maptype):
style = Style(title_color="#fff", title_pos="center",
width=1200, height=600, background_color="#696969")

# 可视化
geo = Geo(name,**style.init_style)
geo.add("", attr, value, visual_range=[min(value), max(value)], symbol_size=8,
visual_text_color="#000",
is_visualmap=True, type='effectScatter',effect_scale=7,is_random=True,is_roam=False,is_piecewise = True,visual_split_number= 10,
)

geo.render('{}.html'.format(name))
 
create_heatmap(attr,value,'公司分布','china')

 

更多的数据分析,请关注本网站。
不定期更新哦
 
原创文章
转载请注明出处:
http://30daydo.com/article/388
 

np.empty() 函数的用法 (有坑)

量化交易李魔佛 发表了文章 • 0 个评论 • 5816 次浏览 • 2018-11-20 11:36 • 来自相关话题

看名字np.empty(),以为创建一个空的多维数组,如 np.empty((4,4))
但是实际结果返回:
 array([[4.67296746e-307, 1.69121096e-306, 9.34601642e-307,
1.33511562e-306],
[8.34447260e-308, 6.23043768e-307, 2.22522597e-306,
1.33511969e-306],
[1.37962320e-306, 9.34604358e-307, 9.79101082e-307,
1.78020576e-306],
[1.69119873e-306, 2.22522868e-306, 1.24611809e-306,
8.06632139e-308]])
what ?
 
感觉里面的元素是随机生成的。
查了下官方文档,的确是。np.empty()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。 查看全部
看名字np.empty(),以为创建一个空的多维数组,如 np.empty((4,4))
但是实际结果返回:
 
array([[4.67296746e-307, 1.69121096e-306, 9.34601642e-307,
1.33511562e-306],
[8.34447260e-308, 6.23043768e-307, 2.22522597e-306,
1.33511969e-306],
[1.37962320e-306, 9.34604358e-307, 9.79101082e-307,
1.78020576e-306],
[1.69119873e-306, 2.22522868e-306, 1.24611809e-306,
8.06632139e-308]])

what ?
 
感觉里面的元素是随机生成的。
查了下官方文档,的确是。np.empty()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。

python数据分析入门 --分析雪球元卫南每个月打赏收入

量化交易李魔佛 发表了文章 • 0 个评论 • 929 次浏览 • 2018-10-24 14:34 • 来自相关话题

在上一篇 雪球的元卫南靠打赏收割了多少钱 ? python爬虫实例 中,统计出来元卫南所有打赏收入为 24128.13 ,这个数字出乎不少人的意料。因为不少人看到元卫南最近收到的打赏都很多,不少都是100,200的。 那么接下来我就顺便带大家学一下,如何用python做数据分析。
 
数据来源于上一篇文章中获取到的数据。
首先,从数据库mongodb中读取数据










(点击查看大图)

上面显示数据的前10条,确保数据被正常载入。
 
观察到列 created_at 是打赏的时间, 导入的数据是字符类型,那么对列 created_at 进行换算, 转化为dataframe中的datetime类型。重新定义一列 pub_date 为打赏时间,设为index,因为dataframe可以对时间index做很多丰富的操作。










 (点击查看大图) 

可以看到转换后的时间精确到小时,分,秒,而我们需要统计的是每个月(或者每周,每季度,每年都可以)的数据,那么我们就需要重新采样, pandas提供了很好的resample函数,可以对数据按照时间频次进行重新采样。 





 (点击查看大图)
 
现在可以看到获取到2018年9月的所有打赏金额的数据。
 
那么现在就对所有数据进行重采样,并打赏金额进行求和






 (点击查看大图)
 
现在可以看到,每个月得到的打赏金额的总和都可以看到了。从2016年7月到现在2018年10月,最多的月份是这个月,共1.4万,占了所有金额的60%多,所以才让大家造成一个错觉,元兄靠打赏赚了不少粉丝的打赏钱,其实只是最近才多起来的。
 
还可以绘制条形图。






 (点击查看大图)
 
不过因为月份金额差距过大,导致部分月份的条形显示很短。
 
不过对于赏金的分布也一目了然了吧。
 
原创文章
转载请注明出处:
http://30daydo.com/article/362 
  
个人公众号:

  查看全部
在上一篇 雪球的元卫南靠打赏收割了多少钱 ? python爬虫实例 中,统计出来元卫南所有打赏收入为 24128.13 ,这个数字出乎不少人的意料。因为不少人看到元卫南最近收到的打赏都很多,不少都是100,200的。 那么接下来我就顺便带大家学一下,如何用python做数据分析。
 
数据来源于上一篇文章中获取到的数据。
首先,从数据库mongodb中读取数据

捕获a12.JPG


top10.JPG

(点击查看大图)

上面显示数据的前10条,确保数据被正常载入。
 
观察到列 created_at 是打赏的时间, 导入的数据是字符类型,那么对列 created_at 进行换算, 转化为dataframe中的datetime类型。重新定义一列 pub_date 为打赏时间,设为index,因为dataframe可以对时间index做很多丰富的操作。

捕获a22.JPG


resample1.JPG

 (点击查看大图) 

可以看到转换后的时间精确到小时,分,秒,而我们需要统计的是每个月(或者每周,每季度,每年都可以)的数据,那么我们就需要重新采样, pandas提供了很好的resample函数,可以对数据按照时间频次进行重新采样。 

捕获a24.JPG

 (点击查看大图)
 
现在可以看到获取到2018年9月的所有打赏金额的数据。
 
那么现在就对所有数据进行重采样,并打赏金额进行求和


捕获a25.JPG

 (点击查看大图)
 
现在可以看到,每个月得到的打赏金额的总和都可以看到了。从2016年7月到现在2018年10月,最多的月份是这个月,共1.4万,占了所有金额的60%多,所以才让大家造成一个错觉,元兄靠打赏赚了不少粉丝的打赏钱,其实只是最近才多起来的。
 
还可以绘制条形图。


捕获a26.JPG

 (点击查看大图)
 
不过因为月份金额差距过大,导致部分月份的条形显示很短。
 
不过对于赏金的分布也一目了然了吧。
 
原创文章
转载请注明出处:
http://30daydo.com/article/362 
  
个人公众号:

 

jupyter notebook 数据分析的利器

每日总结李魔佛 发表了文章 • 0 个评论 • 666 次浏览 • 2018-04-22 15:33 • 来自相关话题

python做数据分析,jupyter notebook比其他的IDE要好用的多,每次打开都可以直接看到上次运行的结果。
而且很重要的一点,jupyter使用web 服务器的方式运行,可以在树莓派上开一个jupyter服务,然后配置一下,就可以在其他的电脑上通过浏览器运行jupyter。 其他电脑不必要安装任何python和配置虚拟环境。 查看全部
python做数据分析,jupyter notebook比其他的IDE要好用的多,每次打开都可以直接看到上次运行的结果。
而且很重要的一点,jupyter使用web 服务器的方式运行,可以在树莓派上开一个jupyter服务,然后配置一下,就可以在其他的电脑上通过浏览器运行jupyter。 其他电脑不必要安装任何python和配置虚拟环境。

python预测下一期双色球号码【机器学习】

python李魔佛 发表了文章 • 2 个评论 • 4107 次浏览 • 2018-02-19 10:16 • 来自相关话题

Task:
1. 在福彩官网抓取所有的历史双色球数据。
2. 使用历史数据进行继续学习。
 
Part1 数据抓取
 
main.pyimport re
from bs4 import BeautifulSoup
import urllib2
from mylog import MyLog as mylog
from save2excel import SavaBallDate

class DoubleColorBallItem(object):
date = None
order = None
red1 = None
red2 = None
red3 = None
red4 = None
red5 = None
red6 = None
blue = None
money = None
firstPrize = None
secondPrize = None

class GetDoubleColorBallNumber(object):
'''这个类用于获取双色球中奖号码, 返回一个txt文件
'''
def __init__(self):
self.urls =
self.log = mylog()
self.getUrls()
self.items = self.spider(self.urls)
self.pipelines(self.items)
self.log.info('beging save data to excel \r\n')
SavaBallDate(self.items)
self.log.info('save data to excel end ...\r\n')


def getUrls(self):
'''获取数据来源网页
'''
URL = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html'
htmlContent = self.getResponseContent(URL)
soup = BeautifulSoup(htmlContent, 'lxml')
tag = soup.find_all(re.compile('p'))[-1]
pages = tag.strong.get_text()
for i in xrange(1, int(pages)+1):
url = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_' + str(i) + '.html'
self.urls.append(url)
self.log.info(u'添加URL:%s 到URLS \r\n' %url)

def getResponseContent(self, url):
'''这里单独使用一个函数返回页面返回值,是为了后期方便的加入proxy和headers等
'''
try:
response = urllib2.urlopen(url.encode('utf8'))
except:
self.log.error(u'Python 返回URL:%s 数据失败 \r\n' %url)
else:
self.log.info(u'Python 返回URUL:%s 数据成功 \r\n' %url)
return response.read()


def spider(self,urls):
'''这个函数的作用是从获取的数据中过滤得到中奖信息
'''
items =
for url in urls:
htmlContent = self.getResponseContent(url)
soup = BeautifulSoup(htmlContent, 'lxml')
tags = soup.find_all('tr', attrs={})
for tag in tags:
if tag.find('em'):
item = DoubleColorBallItem()
tagTd = tag.find_all('td')
item.date = tagTd[0].get_text()
item.order = tagTd[1].get_text()
tagEm = tagTd[2].find_all('em')
item.red1 = tagEm[0].get_text()
item.red2 = tagEm[1].get_text()
item.red3 = tagEm[2].get_text()
item.red4 = tagEm[3].get_text()
item.red5 = tagEm[4].get_text()
item.red6 = tagEm[5].get_text()
item.blue = tagEm[6].get_text()
item.money = tagTd[3].find('strong').get_text()
item.firstPrize = tagTd[4].find('strong').get_text()
item.secondPrize = tagTd[5].find('strong').get_text()
items.append(item)
self.log.info(u'获取日期为:%s 的数据成功' %(item.date))
return items

def pipelines(self,items):
fileName = u'双色球.txt'.encode('GBK')
with open(fileName, 'w') as fp:
for item in items:
fp.write('%s %s \t %s %s %s %s %s %s %s \t %s \t %s %s \n'
%(item.date,item.order,item.red1,item.red2,item.red3,item.red4,item.red5,item.red6,item.blue,item.money,item.firstPrize,item.secondPrize))
self.log.info(u'将日期为:%s 的数据存入"%s"...' %(item.date, fileName.decode('GBK')))


if __name__ == '__main__':
GDCBN = GetDoubleColorBallNumber()




from mylog import MyLog as mylog 
from save2excel import SavaBallDate
这两个模块四用来显示log和保存为excel数据。import logging
import getpass
import sys


#### 定义MyLog类
class MyLog(object):
#### 类MyLog的构造函数
def __init__(self):
self.user = getpass.getuser()
self.logger = logging.getLogger(self.user)
self.logger.setLevel(logging.DEBUG)

#### 日志文件名
self.logFile = sys.argv[0][0:-3] + '.log'
self.formatter = logging.Formatter('%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s\r\n')

#### 日志显示到屏幕上并输出到日志文件内
self.logHand = logging.FileHandler(self.logFile, encoding='utf8')
self.logHand.setFormatter(self.formatter)
self.logHand.setLevel(logging.DEBUG)

self.logHandSt = logging.StreamHandler()
self.logHandSt.setFormatter(self.formatter)
self.logHandSt.setLevel(logging.DEBUG)

self.logger.addHandler(self.logHand)
self.logger.addHandler(self.logHandSt)

#### 日志的5个级别对应以下的5个函数
def debug(self,msg):
self.logger.debug(msg)

def info(self,msg):
self.logger.info(msg)

def warn(self,msg):
self.logger.warn(msg)

def error(self,msg):
self.logger.error(msg)

def critical(self,msg):
self.logger.critical(msg)

if __name__ == '__main__':
mylog = MyLog()
mylog.debug(u"I'm debug 测试中文")
mylog.info("I'm info")
mylog.warn("I'm warn")
mylog.error(u"I'm error 测试中文")
mylog.critical("I'm critical")


 import xlwt
class SavaBallDate(object):
def __init__(self, items):
self.items = items
self.run(self.items)

def run(self,items):
fileName = u'双色球.xls'.encode('GBK')
book = xlwt.Workbook(encoding='utf8')
sheet=book.add_sheet('ball', cell_overwrite_ok=True)
sheet.write(0, 0, u'开奖日期'.encode('utf8'))
sheet.write(0, 1, u'期号'.encode('utf8'))
sheet.write(0, 2, u'红1'.encode('utf8'))
sheet.write(0, 3, u'红2'.encode('utf8'))
sheet.write(0, 4, u'红3'.encode('utf8'))
sheet.write(0, 5, u'红4'.encode('utf8'))
sheet.write(0, 6, u'红5'.encode('utf8'))
sheet.write(0, 7, u'红6'.encode('utf8'))
sheet.write(0, 8, u'蓝'.encode('utf8'))
sheet.write(0, 9, u'销售金额'.encode('utf8'))
sheet.write(0, 10, u'一等奖'.encode('utf8'))
sheet.write(0, 11, u'二等奖'.encode('utf8'))
i = 1
while i <= len(items):
item = items[i-1]
sheet.write(i, 0, item.date)
sheet.write(i, 1, item.order)
sheet.write(i, 2, item.red1)
sheet.write(i, 3, item.red2)
sheet.write(i, 4, item.red3)
sheet.write(i, 5, item.red4)
sheet.write(i, 6, item.red5)
sheet.write(i, 7, item.red6)
sheet.write(i, 8, item.blue)
sheet.write(i, 9, item.money)
sheet.write(i, 10, item.firstPrize)
sheet.write(i, 11, item.secondPrize)
i += 1
book.save(fileName)



if __name__ == '__main__':
pass



 
运行脚本后,会在本地生成一个excel文件,保存为一下的格式:





 
第一步完成。
 Part2 机器学习进行预测
2018-02-19
待续,后面继续更新 
原文链接:
http://30daydo.com/article/277
  查看全部
Task:
1. 在福彩官网抓取所有的历史双色球数据。
2. 使用历史数据进行继续学习。
 
Part1 数据抓取
 
main.py
import re
from bs4 import BeautifulSoup
import urllib2
from mylog import MyLog as mylog
from save2excel import SavaBallDate

class DoubleColorBallItem(object):
date = None
order = None
red1 = None
red2 = None
red3 = None
red4 = None
red5 = None
red6 = None
blue = None
money = None
firstPrize = None
secondPrize = None

class GetDoubleColorBallNumber(object):
'''这个类用于获取双色球中奖号码, 返回一个txt文件
'''
def __init__(self):
self.urls =
self.log = mylog()
self.getUrls()
self.items = self.spider(self.urls)
self.pipelines(self.items)
self.log.info('beging save data to excel \r\n')
SavaBallDate(self.items)
self.log.info('save data to excel end ...\r\n')


def getUrls(self):
'''获取数据来源网页
'''
URL = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html'
htmlContent = self.getResponseContent(URL)
soup = BeautifulSoup(htmlContent, 'lxml')
tag = soup.find_all(re.compile('p'))[-1]
pages = tag.strong.get_text()
for i in xrange(1, int(pages)+1):
url = r'http://kaijiang.zhcw.com/zhcw/html/ssq/list_' + str(i) + '.html'
self.urls.append(url)
self.log.info(u'添加URL:%s 到URLS \r\n' %url)

def getResponseContent(self, url):
'''这里单独使用一个函数返回页面返回值,是为了后期方便的加入proxy和headers等
'''
try:
response = urllib2.urlopen(url.encode('utf8'))
except:
self.log.error(u'Python 返回URL:%s 数据失败 \r\n' %url)
else:
self.log.info(u'Python 返回URUL:%s 数据成功 \r\n' %url)
return response.read()


def spider(self,urls):
'''这个函数的作用是从获取的数据中过滤得到中奖信息
'''
items =
for url in urls:
htmlContent = self.getResponseContent(url)
soup = BeautifulSoup(htmlContent, 'lxml')
tags = soup.find_all('tr', attrs={})
for tag in tags:
if tag.find('em'):
item = DoubleColorBallItem()
tagTd = tag.find_all('td')
item.date = tagTd[0].get_text()
item.order = tagTd[1].get_text()
tagEm = tagTd[2].find_all('em')
item.red1 = tagEm[0].get_text()
item.red2 = tagEm[1].get_text()
item.red3 = tagEm[2].get_text()
item.red4 = tagEm[3].get_text()
item.red5 = tagEm[4].get_text()
item.red6 = tagEm[5].get_text()
item.blue = tagEm[6].get_text()
item.money = tagTd[3].find('strong').get_text()
item.firstPrize = tagTd[4].find('strong').get_text()
item.secondPrize = tagTd[5].find('strong').get_text()
items.append(item)
self.log.info(u'获取日期为:%s 的数据成功' %(item.date))
return items

def pipelines(self,items):
fileName = u'双色球.txt'.encode('GBK')
with open(fileName, 'w') as fp:
for item in items:
fp.write('%s %s \t %s %s %s %s %s %s %s \t %s \t %s %s \n'
%(item.date,item.order,item.red1,item.red2,item.red3,item.red4,item.red5,item.red6,item.blue,item.money,item.firstPrize,item.secondPrize))
self.log.info(u'将日期为:%s 的数据存入"%s"...' %(item.date, fileName.decode('GBK')))


if __name__ == '__main__':
GDCBN = GetDoubleColorBallNumber()




from mylog import MyLog as mylog 
from save2excel import SavaBallDate
这两个模块四用来显示log和保存为excel数据。
import logging
import getpass
import sys


#### 定义MyLog类
class MyLog(object):
#### 类MyLog的构造函数
def __init__(self):
self.user = getpass.getuser()
self.logger = logging.getLogger(self.user)
self.logger.setLevel(logging.DEBUG)

#### 日志文件名
self.logFile = sys.argv[0][0:-3] + '.log'
self.formatter = logging.Formatter('%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s\r\n')

#### 日志显示到屏幕上并输出到日志文件内
self.logHand = logging.FileHandler(self.logFile, encoding='utf8')
self.logHand.setFormatter(self.formatter)
self.logHand.setLevel(logging.DEBUG)

self.logHandSt = logging.StreamHandler()
self.logHandSt.setFormatter(self.formatter)
self.logHandSt.setLevel(logging.DEBUG)

self.logger.addHandler(self.logHand)
self.logger.addHandler(self.logHandSt)

#### 日志的5个级别对应以下的5个函数
def debug(self,msg):
self.logger.debug(msg)

def info(self,msg):
self.logger.info(msg)

def warn(self,msg):
self.logger.warn(msg)

def error(self,msg):
self.logger.error(msg)

def critical(self,msg):
self.logger.critical(msg)

if __name__ == '__main__':
mylog = MyLog()
mylog.debug(u"I'm debug 测试中文")
mylog.info("I'm info")
mylog.warn("I'm warn")
mylog.error(u"I'm error 测试中文")
mylog.critical("I'm critical")


 
import xlwt
class SavaBallDate(object):
def __init__(self, items):
self.items = items
self.run(self.items)

def run(self,items):
fileName = u'双色球.xls'.encode('GBK')
book = xlwt.Workbook(encoding='utf8')
sheet=book.add_sheet('ball', cell_overwrite_ok=True)
sheet.write(0, 0, u'开奖日期'.encode('utf8'))
sheet.write(0, 1, u'期号'.encode('utf8'))
sheet.write(0, 2, u'红1'.encode('utf8'))
sheet.write(0, 3, u'红2'.encode('utf8'))
sheet.write(0, 4, u'红3'.encode('utf8'))
sheet.write(0, 5, u'红4'.encode('utf8'))
sheet.write(0, 6, u'红5'.encode('utf8'))
sheet.write(0, 7, u'红6'.encode('utf8'))
sheet.write(0, 8, u'蓝'.encode('utf8'))
sheet.write(0, 9, u'销售金额'.encode('utf8'))
sheet.write(0, 10, u'一等奖'.encode('utf8'))
sheet.write(0, 11, u'二等奖'.encode('utf8'))
i = 1
while i <= len(items):
item = items[i-1]
sheet.write(i, 0, item.date)
sheet.write(i, 1, item.order)
sheet.write(i, 2, item.red1)
sheet.write(i, 3, item.red2)
sheet.write(i, 4, item.red3)
sheet.write(i, 5, item.red4)
sheet.write(i, 6, item.red5)
sheet.write(i, 7, item.red6)
sheet.write(i, 8, item.blue)
sheet.write(i, 9, item.money)
sheet.write(i, 10, item.firstPrize)
sheet.write(i, 11, item.secondPrize)
i += 1
book.save(fileName)



if __name__ == '__main__':
pass



 
运行脚本后,会在本地生成一个excel文件,保存为一下的格式:

double.GIF

 
第一步完成。
 Part2 机器学习进行预测
2018-02-19
待续,后面继续更新 
原文链接:
http://30daydo.com/article/277
 

【量化分析】到底谁在买乐视网?2018年1月26日

股票李魔佛 发表了文章 • 2 个评论 • 1352 次浏览 • 2018-01-26 17:02 • 来自相关话题

这是乐视复牌的第三天,连续3个跌停。





 
本来没有持有这一只股票,不过雪球上不时地出现一些文章,根据龙虎榜推测到底谁在接盘。 于是今天收盘,打开jupyter notebook来简单地分析一下。 大家也可以跟着学习一些分析的思路。因为今天的龙虎榜还没出来,等待会龙虎榜出来了可以再比较一下。
 
首先导入今天的分时数据





 
volume列就是我们感兴趣的成交量。单位是手(100股)
 
先计算一下今天的总成交量:






1021800股,额,比不少中小创的小股的成交量还大呢,瘦死的骆驼比马大。
 
去对比一下雪球或者东财的数据,看看数据是否准确。






 
嗯,1.02万手,数据一致。
 
接着我们来看看排序,按照成交量的大小排序,可以看到最大和最小的差别:





 
大单都集中在开盘和收盘阶段(其实开盘和收盘严格来说不算大单,因为同一时刻太多人一起买,所以掺杂在一起,如果把收盘和开盘的数据拿掉,其实真的没多少大单。。。)
 




 
然后剩下的都是些零零散散的1手的成交:

可以统计一下每个单数出现的频率:





 
出现最多的是1手,2手。这个很正常,如果出现较多的是超过100手的大单,那么也说明跌停很快被打开(后续如果有打算冒风险去撸一把乐视翘班的,可以自己写一个检测程序)
 
接着做一些统计:
定义大于100手的为大单。
然后计算100手大单占成交的比例:





 
嗯,有28%的比例呢。
 
然后计算一下小于10手的占成交比例。





有30%的比例。
 
再统计一下中位数和各分位数:





 
中位数是3,说明整个交易中,一半的成交是在等于或小于3手的,而分位数看到,1手的可以排到25%的位置,而8手则排到了75%的位置。
 
结论:
其实在买的都是小散,不知道是乐粉还是赌徒了。
原文地址:
http://30daydo.com/article/267
源码:https://github.com/Rockyzsu/stock/blob/master/levt_notebook.ipynb
  查看全部
这是乐视复牌的第三天,连续3个跌停。

letv.png

 
本来没有持有这一只股票,不过雪球上不时地出现一些文章,根据龙虎榜推测到底谁在接盘。 于是今天收盘,打开jupyter notebook来简单地分析一下。 大家也可以跟着学习一些分析的思路。因为今天的龙虎榜还没出来,等待会龙虎榜出来了可以再比较一下。
 
首先导入今天的分时数据

df.png

 
volume列就是我们感兴趣的成交量。单位是手(100股)
 
先计算一下今天的总成交量:

Snap3.png


1021800股,额,比不少中小创的小股的成交量还大呢,瘦死的骆驼比马大。
 
去对比一下雪球或者东财的数据,看看数据是否准确。


Snap4.png

 
嗯,1.02万手,数据一致。
 
接着我们来看看排序,按照成交量的大小排序,可以看到最大和最小的差别:

Snap5.png

 
大单都集中在开盘和收盘阶段(其实开盘和收盘严格来说不算大单,因为同一时刻太多人一起买,所以掺杂在一起,如果把收盘和开盘的数据拿掉,其实真的没多少大单。。。)
 
Snap6.png

 
然后剩下的都是些零零散散的1手的成交:

可以统计一下每个单数出现的频率:

Snap7.png

 
出现最多的是1手,2手。这个很正常,如果出现较多的是超过100手的大单,那么也说明跌停很快被打开(后续如果有打算冒风险去撸一把乐视翘班的,可以自己写一个检测程序)
 
接着做一些统计:
定义大于100手的为大单。
然后计算100手大单占成交的比例:

Snap8.png

 
嗯,有28%的比例呢。
 
然后计算一下小于10手的占成交比例。

Snap9.png

有30%的比例。
 
再统计一下中位数和各分位数:

Snap11.png

 
中位数是3,说明整个交易中,一半的成交是在等于或小于3手的,而分位数看到,1手的可以排到25%的位置,而8手则排到了75%的位置。
 
结论:
其实在买的都是小散,不知道是乐粉还是赌徒了。
原文地址:
http://30daydo.com/article/267
源码:https://github.com/Rockyzsu/stock/blob/master/levt_notebook.ipynb
 

dataframe reindex和reset_index区别

量化交易李魔佛 发表了文章 • 0 个评论 • 12132 次浏览 • 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\n', df
print 'df2\n', df2

df_x = [df, df2]
result = pd.concat(df_x)
print 'first result\n', 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\n', df
print 'df2\n', df2

df_x = [df, df2]
result = pd.concat(df_x)
print 'first result\n', 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 
欢迎转载,注明出处
 

菜鸟侦探挑战数据分析R源代码

量化交易李魔佛 发表了文章 • 0 个评论 • 676 次浏览 • 2017-12-11 17:45 • 来自相关话题

菜鸟侦探挑战数据分析R源代码:
百度网盘下载链接:
https://pan.baidu.com/s/1miiScDM
 
菜鸟侦探挑战数据分析R源代码:
百度网盘下载链接:
https://pan.baidu.com/s/1miiScDM