数据分析
优矿的可转债的YTM数据为空 nan
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 2196 次浏览 • 2021-05-31 09:18
注意YTM哪一列全是Nan
脏数据太多了,吐槽一波。 查看全部
pandas 合并两个表,如何保留第一个表的索引?
python • 李魔佛 发表了文章 • 0 个评论 • 2913 次浏览 • 2021-05-29 22:17
tickerBond closePriceBond bondPremRatio secShortNameBond tickerEqu \
secID
110066 110066 199.94 -1.2442 盛屯转债 600711
110067 110067 119.53 25.9204 华安转债 600909
113021 113021 105.81 45.0989 中信转债 601998
113024 113024 101.94 36.6668 核建转债 601611
113025 113025 129.16 0.0409 明泰转债 601677
df2 数据
ROE tickerEqu
0 2.642931 600711
1 4.425438 600909
2 6.259092 601998
3 4.432315 601611
4 6.454054 601677
如果按照 pd.merge(df1,df2,on='tickerEqu') ,按照列 tickerEqu 进行合并,这样会导致最后合成的新的列的索性重构,变成 0,1,2,3 这种的。
有什么办法可以保留 df1 的索引? 用 join 的话会报错,因为 df2 的索引和 df1 匹配不上。
先 df1 = df1.reset_index(),合并之后再把 secID 那一列设为 index 。 查看全部
tickerBond closePriceBond bondPremRatio secShortNameBond tickerEqu \
secID
110066 110066 199.94 -1.2442 盛屯转债 600711
110067 110067 119.53 25.9204 华安转债 600909
113021 113021 105.81 45.0989 中信转债 601998
113024 113024 101.94 36.6668 核建转债 601611
113025 113025 129.16 0.0409 明泰转债 601677
df2 数据
ROE tickerEqu
0 2.642931 600711
1 4.425438 600909
2 6.259092 601998
3 4.432315 601611
4 6.454054 601677
如果按照 pd.merge(df1,df2,on='tickerEqu') ,按照列 tickerEqu 进行合并,这样会导致最后合成的新的列的索性重构,变成 0,1,2,3 这种的。
有什么办法可以保留 df1 的索引? 用 join 的话会报错,因为 df2 的索引和 df1 匹配不上。
先 df1 = df1.reset_index(),合并之后再把 secID 那一列设为 index 。
pandas dataframe 切片与python列表切片的区别
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 3499 次浏览 • 2020-10-29 23:34
有一个Dataframedf = pd.DataFrame(np.arange(16).reshape((8,2)),index=list('abcdefgh'),columns=['COL1','COL2'])COL1 COL2
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9
f 10 11
g 12 13
h 14 15那么如果我用df['a':'e'] 返回的结果是:
COL1 COL2
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9是包含e尾部的,
而python的切片
a = [0,1,2,3,4,5]
a[1:5] 是不包含最后一个元素的。
原文链接:
http://30daydo.com/article/630
查看全部
有一个Dataframe
df = pd.DataFrame(np.arange(16).reshape((8,2)),index=list('abcdefgh'),columns=['COL1','COL2'])
COL1 COL2那么如果我用df['a':'e'] 返回的结果是:
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9
f 10 11
g 12 13
h 14 15
COL1 COL2是包含e尾部的,
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9
而python的切片
a = [0,1,2,3,4,5]
a[1:5] 是不包含最后一个元素的。
原文链接:
http://30daydo.com/article/630
个人的知识星球
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 3868 次浏览 • 2020-02-23 11:10
微信扫一扫加入我的知识星球
星球的第一篇文章
python获取全市场LOF基金折溢价数据并进行套利
市场是总共的LOF基金有301只(上图右下角的圈圈是所有基金的条数),而集思录上只有120只左右,所以有些溢价厉害(大于10%)的LOF基金并没有在集思录的网站上显示,这对于专注于套利的投资者来说,会损失很多潜在的套利机会。
点击查看大图
我回复了该贴后,有大量的人私信我,问我能否提供一份这个数据,或者教对方如何获取这些数据。 因为人数众多,也没有那么多精力来一一回答。毕竟不同人的水平背景不一样,逐个回答起来也很累,所以就回答了几个朋友的问题后就一一婉拒了。
然后在几个投资群里,居然也有人提到这个数据,在咨询如何才能获取到这个完整的数据,并且可以实时更新显示。 因为我的微信群昵称和集思录是一样的,所以不少人@我,我也都简单的回复了下,是使用python抓取的数据,数据保存到Mysql和MongoDB。 代码行数不多,100行都不到。
具体实现在星球会有完整代码。 查看全部
微信扫一扫加入我的知识星球
星球的第一篇文章
python获取全市场LOF基金折溢价数据并进行套利
市场是总共的LOF基金有301只(上图右下角的圈圈是所有基金的条数),而集思录上只有120只左右,所以有些溢价厉害(大于10%)的LOF基金并没有在集思录的网站上显示,这对于专注于套利的投资者来说,会损失很多潜在的套利机会。
点击查看大图
我回复了该贴后,有大量的人私信我,问我能否提供一份这个数据,或者教对方如何获取这些数据。 因为人数众多,也没有那么多精力来一一回答。毕竟不同人的水平背景不一样,逐个回答起来也很累,所以就回答了几个朋友的问题后就一一婉拒了。
然后在几个投资群里,居然也有人提到这个数据,在咨询如何才能获取到这个完整的数据,并且可以实时更新显示。 因为我的微信群昵称和集思录是一样的,所以不少人@我,我也都简单的回复了下,是使用python抓取的数据,数据保存到Mysql和MongoDB。 代码行数不多,100行都不到。
具体实现在星球会有完整代码。
dataframe 根据日期重采样 计算个数
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 3283 次浏览 • 2019-12-19 09:07
python分析目前为止科创板企业省份分布
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 5193 次浏览 • 2019-08-26 00:45
首先获取行情数据,借助tushare这个框架:
在python3环境下,pip install tushare --upgrade ,记得要更新,因为用的旧版本会获取不到科创板的数据。
安装成功后试试import tushare as ts,看看有没有报错。没有就是安装成功了。
接下来抓取全市场的行情.
(点击查看大图)
查看前5条数据
现在行情数据存储在df中,然后分析数据。
因为提取的是全市场的数据,然后获取科创板的企业:
(点击查看大图)
使用的是正则表达式,匹配688开头的代码。
接下来就是分析企业归属地:
(点击查看大图)
使用value_counts函数,统计该列每个值出现的次数。
搞定了! 是不是很简单?
而且企业地区分布和自己的构想也差不多,江浙沪一带占了一半,加上北京地区,占了80%以上的科创板企业了。
每周会定期更新一篇python数据分析股票的文章。
原创文章,欢迎转载
请注明出处:
http://30daydo.com/article/528
查看全部
首先获取行情数据,借助tushare这个框架:
在python3环境下,pip install tushare --upgrade ,记得要更新,因为用的旧版本会获取不到科创板的数据。
安装成功后试试import tushare as ts,看看有没有报错。没有就是安装成功了。
接下来抓取全市场的行情.
(点击查看大图)
查看前5条数据
现在行情数据存储在df中,然后分析数据。
因为提取的是全市场的数据,然后获取科创板的企业:
(点击查看大图)
使用的是正则表达式,匹配688开头的代码。
接下来就是分析企业归属地:
(点击查看大图)
使用value_counts函数,统计该列每个值出现的次数。
搞定了! 是不是很简单?
而且企业地区分布和自己的构想也差不多,江浙沪一带占了一半,加上北京地区,占了80%以上的科创板企业了。
每周会定期更新一篇python数据分析股票的文章。
原创文章,欢迎转载
请注明出处:
http://30daydo.com/article/528
anaconda环境下无法启动jupyter notebook
python • 李魔佛 发表了文章 • 0 个评论 • 7383 次浏览 • 2019-08-19 17:16
报错: from . import (constants, error, message, context,
ImportError: DLL load failed: 找不到指定的模块。
但是可以直接在Anaconda navigator中直接启动,所以判断是环境问题。
切换到anaconda的虚拟环境,(在菜单中进入anaconda prompt command),在当前命令行下执行 jupyter notebook就能够正常运行。
查看全部
报错:
from . import (constants, error, message, context,
ImportError: DLL load failed: 找不到指定的模块。
但是可以直接在Anaconda navigator中直接启动,所以判断是环境问题。
切换到anaconda的虚拟环境,(在菜单中进入anaconda prompt command),在当前命令行下执行 jupyter notebook就能够正常运行。
截止今天(2019-05-14)银行股今年的涨幅排名
股票 • 李魔佛 发表了文章 • 0 个评论 • 5587 次浏览 • 2019-05-14 23:59
31 601288 农业银行 中国农业银行股份有限公司 -0.341178
11 600015 华夏银行 华夏银行股份有限公司 1.856174
45 601988 中国银行 中国银行股份有限公司 2.248533
32 601328 交通银行 交通银行股份有限公司 3.532657
30 601229 上海银行 上海银行股份有限公司 3.725781
35 601398 工商银行 中国工商银行股份有限公司 4.771403
40 601818 光大银行 中国光大银行股份有限公司 5.643119
27 601169 北京银行 北京银行股份有限公司 6.205580
14 600016 民生银行 中国民生银行股份有限公司 7.092815
5 002936 郑州银行 郑州银行股份有限公司 7.551112
49 601998 中信银行 中信银行股份有限公司 8.181956
43 601939 建设银行 中国建设银行股份有限公司 9.402651
41 601838 成都银行 成都银行股份有限公司 9.424554
52 603323 苏农银行 江苏苏州农村商业银行股份有限公司 12.375732
20 600926 杭州银行 杭州银行股份有限公司 12.933645
8 600000 浦发银行 上海浦东发展银行股份有限公司 14.752244
39 601577 长沙银行 长沙银行股份有限公司 14.792683
18 600908 无锡银行 无锡农村商业银行股份有限公司 16.181704
3 002807 江阴银行 江苏江阴农村商业银行股份有限公司 19.274586
48 601997 贵阳银行 贵阳银行股份有限公司 20.489563
4 002839 张家港行 江苏张家港农村商业银行股份有限公司 20.599511
25 601166 兴业银行 兴业银行股份有限公司 21.206503
24 601128 常熟银行 江苏常熟农村商业银行股份有限公司 21.571187
19 600919 江苏银行 江苏银行股份有限公司 23.218299
22 601009 南京银行 南京银行股份有限公司 26.297500
16 600036 招商银行 招商银行股份有限公司 27.518708
0 000001 平安银行 平安银行股份有限公司 31.624747
2 002142 宁波银行 宁波银行股份有限公司 31.729062
6 002948 青岛银行 青岛银行股份有限公司 48.602573
7 002958 青农商行 青岛农村商业银行股份有限公司 108.983776
42 601860 紫金银行 江苏紫金农村商业银行股份有限公司 115.147347
21 600928 西安银行 西安银行股份有限公司 128.496683 查看全部
ticker secShortName secFullName y_chgPct
31 601288 农业银行 中国农业银行股份有限公司 -0.341178
11 600015 华夏银行 华夏银行股份有限公司 1.856174
45 601988 中国银行 中国银行股份有限公司 2.248533
32 601328 交通银行 交通银行股份有限公司 3.532657
30 601229 上海银行 上海银行股份有限公司 3.725781
35 601398 工商银行 中国工商银行股份有限公司 4.771403
40 601818 光大银行 中国光大银行股份有限公司 5.643119
27 601169 北京银行 北京银行股份有限公司 6.205580
14 600016 民生银行 中国民生银行股份有限公司 7.092815
5 002936 郑州银行 郑州银行股份有限公司 7.551112
49 601998 中信银行 中信银行股份有限公司 8.181956
43 601939 建设银行 中国建设银行股份有限公司 9.402651
41 601838 成都银行 成都银行股份有限公司 9.424554
52 603323 苏农银行 江苏苏州农村商业银行股份有限公司 12.375732
20 600926 杭州银行 杭州银行股份有限公司 12.933645
8 600000 浦发银行 上海浦东发展银行股份有限公司 14.752244
39 601577 长沙银行 长沙银行股份有限公司 14.792683
18 600908 无锡银行 无锡农村商业银行股份有限公司 16.181704
3 002807 江阴银行 江苏江阴农村商业银行股份有限公司 19.274586
48 601997 贵阳银行 贵阳银行股份有限公司 20.489563
4 002839 张家港行 江苏张家港农村商业银行股份有限公司 20.599511
25 601166 兴业银行 兴业银行股份有限公司 21.206503
24 601128 常熟银行 江苏常熟农村商业银行股份有限公司 21.571187
19 600919 江苏银行 江苏银行股份有限公司 23.218299
22 601009 南京银行 南京银行股份有限公司 26.297500
16 600036 招商银行 招商银行股份有限公司 27.518708
0 000001 平安银行 平安银行股份有限公司 31.624747
2 002142 宁波银行 宁波银行股份有限公司 31.729062
6 002948 青岛银行 青岛银行股份有限公司 48.602573
7 002958 青农商行 青岛农村商业银行股份有限公司 108.983776
42 601860 紫金银行 江苏紫金农村商业银行股份有限公司 115.147347
21 600928 西安银行 西安银行股份有限公司 128.496683
神经网络中数值梯度的计算 python代码
深度学习 • 李魔佛 发表了文章 • 0 个评论 • 4613 次浏览 • 2019-05-07 19:12
import matplotlib.pyplot as plt
import numpy as np
import time
from collections import OrderedDict
def softmax(a):
a = a - np.max(a)
exp_a = np.exp(a)
exp_a_sum = np.sum(exp_a)
return exp_a / exp_a_sum
def cross_entropy_error(t, y):
delta = 1e-7
s = -1 * np.sum(t * np.log(y + delta))
# print('cross entropy ',s)
return s
class simpleNet:
def __init__(self):
self.W = np.random.randn(2, 3)
def predict(self, x):
print('current w',self.W)
return np.dot(x, self.W)
def loss(self, x, t):
z = self.predict(x)
# print(z)
# print(z.ndim)
y = softmax(z)
# print('y',y)
loss = cross_entropy_error(y, t) # y为预测的值
return loss
def numerical_gradient_(f, x): # 针对2维的情况 甚至是多维
h = 1e-4 # 0.0001
grad = np.zeros_like(x)
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
idx = it.multi_index
print('idx', idx)
tmp_val = x[idx]
x[idx] = float(tmp_val) + h
fxh1 = f(x) # f(x+h)
print('fxh1 ', fxh1)
# print('current W', net.W)
x[idx] = tmp_val - h
fxh2 = f(x) # f(x-h)
print('fxh2 ', fxh2)
# print('next currnet W ', net.W)
grad[idx] = (fxh1 - fxh2) / (2 * h)
x[idx] = tmp_val # 还原值
it.iternext()
return grad
net = simpleNet()
x=np.array([0.6,0.9])
t = np.array([0.0,0.0,1.0])
def f(W):
return net.loss(x,t)
grads =numerical_gradient_(f,net.W)
print(grads) 查看全部
import matplotlib.pyplot as plt
import numpy as np
import time
from collections import OrderedDict
def softmax(a):
a = a - np.max(a)
exp_a = np.exp(a)
exp_a_sum = np.sum(exp_a)
return exp_a / exp_a_sum
def cross_entropy_error(t, y):
delta = 1e-7
s = -1 * np.sum(t * np.log(y + delta))
# print('cross entropy ',s)
return s
class simpleNet:
def __init__(self):
self.W = np.random.randn(2, 3)
def predict(self, x):
print('current w',self.W)
return np.dot(x, self.W)
def loss(self, x, t):
z = self.predict(x)
# print(z)
# print(z.ndim)
y = softmax(z)
# print('y',y)
loss = cross_entropy_error(y, t) # y为预测的值
return loss
def numerical_gradient_(f, x): # 针对2维的情况 甚至是多维
h = 1e-4 # 0.0001
grad = np.zeros_like(x)
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
idx = it.multi_index
print('idx', idx)
tmp_val = x[idx]
x[idx] = float(tmp_val) + h
fxh1 = f(x) # f(x+h)
print('fxh1 ', fxh1)
# print('current W', net.W)
x[idx] = tmp_val - h
fxh2 = f(x) # f(x-h)
print('fxh2 ', fxh2)
# print('next currnet W ', net.W)
grad[idx] = (fxh1 - fxh2) / (2 * h)
x[idx] = tmp_val # 还原值
it.iternext()
return grad
net = simpleNet()
x=np.array([0.6,0.9])
t = np.array([0.0,0.0,1.0])
def f(W):
return net.loss(x,t)
grads =numerical_gradient_(f,net.W)
print(grads)
【可转债剩余转股比例数据排序】【2019-05-06】
股票 • 李魔佛 发表了文章 • 0 个评论 • 6208 次浏览 • 2019-05-06 15:28
剩余的比例越少,上市公司下调转股价的欲望就越少。 也就是会任由可转债在那里晾着,不会积极拉正股。
数据定期更新。
原创文章,
转载请注明出处:
http://30daydo.com/article/472
查看全部
剩余的比例越少,上市公司下调转股价的欲望就越少。 也就是会任由可转债在那里晾着,不会积极拉正股。
数据定期更新。
原创文章,
转载请注明出处:
http://30daydo.com/article/472
numpy flatten函数的用法
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 5314 次浏览 • 2019-04-30 10:01
例子:
x=np.array([[1,2,3,4],[5,6,7,8]])x
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
然后对x进行flatten操作
x.flatten()
得到的数据:
array([1, 2, 3, 4, 5, 6, 7, 8])
你也可以指定展平的轴,设定axis就可以了. 查看全部
把数据展平,无论多少维的数据,变为1维
例子:
x=np.array([[1,2,3,4],[5,6,7,8]])x
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
然后对x进行flatten操作
x.flatten()
得到的数据:
array([1, 2, 3, 4, 5, 6, 7, 8])
你也可以指定展平的轴,设定axis就可以了.
发现numpy一个很坑的问题,要一定级别的高手才能发现问题
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 4668 次浏览 • 2019-04-30 00:04
y=X0**2+X1**2 # **2 是平方def function_2(x):
return x[0]**2+x[1]**2
下面是计算y的偏导数,分布计算X0和X1的偏导def numerical_gradient(f,x):
grad = np.zeros_like(x)
h=1e-4
for idx in range(x.size):
temp_v = x[idx]
x[idx]=temp_v+h
f1=f(x)
print(x,f1)
x[idx]=temp_v-h
f2=f(x)
print(x,f2)
ret = (f1-f2)/(2*h)
print(ret)
x[idx]=temp_v
grad[idx]=ret
return grad
然后调用numerical_gradient(function_2,np.array([3,4]))
计算的是二元一次方程 y=X0**2+X1**2 在点(3,4)的偏导的值
得到的是什么结果?
为什么会得到这样的结果?
小白一般要花点时间才能找到原因。
查看全部
y=X0**2+X1**2 # **2 是平方
def function_2(x):
return x[0]**2+x[1]**2
下面是计算y的偏导数,分布计算X0和X1的偏导
def numerical_gradient(f,x):
grad = np.zeros_like(x)
h=1e-4
for idx in range(x.size):
temp_v = x[idx]
x[idx]=temp_v+h
f1=f(x)
print(x,f1)
x[idx]=temp_v-h
f2=f(x)
print(x,f2)
ret = (f1-f2)/(2*h)
print(ret)
x[idx]=temp_v
grad[idx]=ret
return grad
然后调用
numerical_gradient(function_2,np.array([3,4]))
计算的是二元一次方程 y=X0**2+X1**2 在点(3,4)的偏导的值
得到的是什么结果?
为什么会得到这样的结果?
小白一般要花点时间才能找到原因。
numpy和dataframe轴的含义,axis为负数的含义
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 5592 次浏览 • 2019-04-28 14:22
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a
array([[[ 1, 2],
[ 3, 4]],
[[11, 12],
[13, 14]]])
a有3个中括号,那么就有3条轴,从0开始到2,分别是axis=0,1,2
那么我要对a进行求和,分别用axis=0,1,2进行运行。
a.sum(axis=0)得到:
array([[12, 14],
[16, 18]])意思是去掉一个中括号,然后运行。
同理:
a.sum(axis=1)对a去掉2个中括号,然后运行。
得到:
array([[ 4, 6],
[24, 26]])那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
a.sum(axis=-3)
array([[12, 14],
[16, 18]])
查看全部
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a
array([[[ 1, 2],
[ 3, 4]],
[[11, 12],
[13, 14]]])
a有3个中括号,那么就有3条轴,从0开始到2,分别是axis=0,1,2
那么我要对a进行求和,分别用axis=0,1,2进行运行。
a.sum(axis=0)得到:
array([[12, 14],意思是去掉一个中括号,然后运行。
[16, 18]])
同理:
a.sum(axis=1)对a去掉2个中括号,然后运行。
得到:
array([[ 4, 6],那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
[24, 26]])
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
a.sum(axis=-3)
array([[12, 14],
[16, 18]])
np.nonzero()的用法【numpy小白】
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 5947 次浏览 • 2019-04-28 10:16
返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值。
比如:
n1=np.array([0,1,0,0,0,0,1,0,0,0,0,0,0,1])
n1.nonzero()
返回的是:
(array([ 1, 6, 13], dtype=int64),)注意上面是一个yu元组
要获取里面的值,需要用 n1.nonzero()[0] 来获取。
原创文章
转载请注明出处:
http://30daydo.com/article/466
查看全部
返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值。
比如:
n1=np.array([0,1,0,0,0,0,1,0,0,0,0,0,0,1])
n1.nonzero()
返回的是:
(array([ 1, 6, 13], dtype=int64),)
注意上面是一个yu元组要获取里面的值,需要用 n1.nonzero()[0] 来获取。
原创文章
转载请注明出处:
http://30daydo.com/article/466
ndarray和array的区别【numpy小白】
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 12718 次浏览 • 2019-04-28 10:11
原创文章
转载请注明出处:
http://30daydo.com/article/465
查看全部
np.array([1,2,3,4])
上面代码创建了一个对象,这个对象就是ndarray。 所以ndarray是一个类对象象,而array是一个方法。原创文章
转载请注明出处:
http://30daydo.com/article/465
【Dataframe warning】Try using .loc[row_indexer,col_indexer] = value instead
python • 李魔佛 发表了文章 • 0 个评论 • 11257 次浏览 • 2019-04-02 22:48
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
查看全部
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】市场热度预测 - 通过检测某个论坛(集思录)的热度衡量
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 4 个评论 • 4217 次浏览 • 2019-03-16 18:03
首先得有数据,有了数据就可以慢慢分析了。
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
感觉这个是不错逃顶抄底指标呀。
文章中的数据每周更新,敬请留意。
原创文章
转载请注明出处:
http://30daydo.com/article/428
查看全部
首先得有数据,有了数据就可以慢慢分析了。
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
感觉这个是不错逃顶抄底指标呀。
文章中的数据每周更新,敬请留意。
原创文章
转载请注明出处:
http://30daydo.com/article/428
numpy 二维数组按列合并
python • 李魔佛 发表了文章 • 0 个评论 • 6911 次浏览 • 2019-01-19 21:43
先生产测试数组# 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]]) 查看全部
先生产测试数组
# 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股上市公司按地区分布与可视化 地图显示
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 9137 次浏览 • 2018-12-19 14:07
地区 数目
浙江 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股上市公司分布:engine为from sqlalchemy import create_engine 中的连接引擎。
df = pd.read_sql('tb_basic_info',con=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
np.empty() 函数的用法 (有坑)
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 45317 次浏览 • 2018-11-20 11:36
但是实际结果返回: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()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。
原创文章
转载请注明出处:
http://www.30daydo.com/article/376
查看全部
但是实际结果返回:
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()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。
原创文章
转载请注明出处:
http://www.30daydo.com/article/376
python数据分析入门 --分析雪球元卫南每个月打赏收入
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 2 个评论 • 9211 次浏览 • 2018-10-24 14:34
最近居然被元神拉黑了。因为帖子不知道被哪位挖坟,估计被元神看到了。
重新跑了下原来的代码,还能跑通,看来雪球并没有改动什么代码。但是雪球经历了一波app下架风波,2019年前的帖子全部无法见到了。
重新获取数据:
点击查看大图
统计数据:
点击查看大图
2019年1月到现在(8月),元神收到的赏金为31851.6,数额比他2019年前所有的金额都要多,虽然总额不高,但是说明了元神这一年影响力大增了。
************************* 写于 2018-11 *******************************
在上一篇 雪球的元卫南靠打赏收割了多少钱 ? 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
个人公众号: 查看全部
最近居然被元神拉黑了。因为帖子不知道被哪位挖坟,估计被元神看到了。
重新跑了下原来的代码,还能跑通,看来雪球并没有改动什么代码。但是雪球经历了一波app下架风波,2019年前的帖子全部无法见到了。
重新获取数据:
点击查看大图
统计数据:
点击查看大图
2019年1月到现在(8月),元神收到的赏金为31851.6,数额比他2019年前所有的金额都要多,虽然总额不高,但是说明了元神这一年影响力大增了。
************************* 写于 2018-11 *******************************
在上一篇 雪球的元卫南靠打赏收割了多少钱 ? 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
个人公众号:
jupyter notebook 数据分析的利器
每日总结 • 李魔佛 发表了文章 • 0 个评论 • 3362 次浏览 • 2018-04-22 15:33
而且很重要的一点,jupyter使用web 服务器的方式运行,可以在树莓派上开一个jupyter服务,然后配置一下,就可以在其他的电脑上通过浏览器运行jupyter。 其他电脑不必要安装任何python和配置虚拟环境。 查看全部
而且很重要的一点,jupyter使用web 服务器的方式运行,可以在树莓派上开一个jupyter服务,然后配置一下,就可以在其他的电脑上通过浏览器运行jupyter。 其他电脑不必要安装任何python和配置虚拟环境。
python预测下一期双色球号码【机器学习】
python • 李魔佛 发表了文章 • 2 个评论 • 16152 次浏览 • 2018-02-19 10:16
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
查看全部
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文件,保存为一下的格式:
第一步完成。
Part2 机器学习进行预测
2018-02-19
待续,后面继续更新
原文链接:
http://30daydo.com/article/277
TypeError: the dtype datetime64 is not supported for parsing
回复python • 李魔佛 回复了问题 • 1 人关注 • 1 个回复 • 10641 次浏览 • 2018-02-05 02:44
【量化分析】到底谁在买乐视网?2018年1月26日
股票 • 李魔佛 发表了文章 • 2 个评论 • 4116 次浏览 • 2018-01-26 17:02
本来没有持有这一只股票,不过雪球上不时地出现一些文章,根据龙虎榜推测到底谁在接盘。 于是今天收盘,打开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
查看全部
本来没有持有这一只股票,不过雪球上不时地出现一些文章,根据龙虎榜推测到底谁在接盘。 于是今天收盘,打开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
dataframe reindex和reset_index区别
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 84378 次浏览 • 2017-12-30 15:58
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
欢迎转载,注明出处
查看全部
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
欢迎转载,注明出处
Dataframe中的plot函数绘图会把日期index自动补全
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 6258 次浏览 • 2017-12-26 14:49
df=pd.read_excel('600050.xls',dtype={'datetime':np.datetime64})
df=df.set_index('datetime')
df['close'].plot(use_index=True,grid=True)
plt.show()
df为中国联通的日线数据,跨度为2016年到2017年底,中间有过一段时间的停牌。 用上面的代码绘制出来的曲线图,回发现,横坐标是日期,可是图中居然会把停牌的日子也插进去,这样导致了图形中间出现了一条长长的折线。
因为停牌后,股价是是不会变化的。
查看全部
df=pd.read_excel('600050.xls',dtype={'datetime':np.datetime64})
df=df.set_index('datetime')
df['close'].plot(use_index=True,grid=True)
plt.show()
df为中国联通的日线数据,跨度为2016年到2017年底,中间有过一段时间的停牌。 用上面的代码绘制出来的曲线图,回发现,横坐标是日期,可是图中居然会把停牌的日子也插进去,这样导致了图形中间出现了一条长长的折线。
因为停牌后,股价是是不会变化的。
菜鸟侦探挑战数据分析R源代码
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 3227 次浏览 • 2017-12-11 17:45
百度网盘下载链接:
https://pan.baidu.com/s/1miiScDM
发现numpy一个很坑的问题,要一定级别的高手才能发现问题
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 4668 次浏览 • 2019-04-30 00:04
y=X0**2+X1**2 # **2 是平方def function_2(x):
return x[0]**2+x[1]**2
下面是计算y的偏导数,分布计算X0和X1的偏导def numerical_gradient(f,x):
grad = np.zeros_like(x)
h=1e-4
for idx in range(x.size):
temp_v = x[idx]
x[idx]=temp_v+h
f1=f(x)
print(x,f1)
x[idx]=temp_v-h
f2=f(x)
print(x,f2)
ret = (f1-f2)/(2*h)
print(ret)
x[idx]=temp_v
grad[idx]=ret
return grad
然后调用numerical_gradient(function_2,np.array([3,4]))
计算的是二元一次方程 y=X0**2+X1**2 在点(3,4)的偏导的值
得到的是什么结果?
为什么会得到这样的结果?
小白一般要花点时间才能找到原因。
查看全部
y=X0**2+X1**2 # **2 是平方
def function_2(x):
return x[0]**2+x[1]**2
下面是计算y的偏导数,分布计算X0和X1的偏导
def numerical_gradient(f,x):
grad = np.zeros_like(x)
h=1e-4
for idx in range(x.size):
temp_v = x[idx]
x[idx]=temp_v+h
f1=f(x)
print(x,f1)
x[idx]=temp_v-h
f2=f(x)
print(x,f2)
ret = (f1-f2)/(2*h)
print(ret)
x[idx]=temp_v
grad[idx]=ret
return grad
然后调用
numerical_gradient(function_2,np.array([3,4]))
计算的是二元一次方程 y=X0**2+X1**2 在点(3,4)的偏导的值
得到的是什么结果?
为什么会得到这样的结果?
小白一般要花点时间才能找到原因。
numpy和dataframe轴的含义,axis为负数的含义
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 5592 次浏览 • 2019-04-28 14:22
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a
array([[[ 1, 2],
[ 3, 4]],
[[11, 12],
[13, 14]]])
a有3个中括号,那么就有3条轴,从0开始到2,分别是axis=0,1,2
那么我要对a进行求和,分别用axis=0,1,2进行运行。
a.sum(axis=0)得到:
array([[12, 14],
[16, 18]])意思是去掉一个中括号,然后运行。
同理:
a.sum(axis=1)对a去掉2个中括号,然后运行。
得到:
array([[ 4, 6],
[24, 26]])那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
a.sum(axis=-3)
array([[12, 14],
[16, 18]])
查看全部
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a
array([[[ 1, 2],
[ 3, 4]],
[[11, 12],
[13, 14]]])
a有3个中括号,那么就有3条轴,从0开始到2,分别是axis=0,1,2
那么我要对a进行求和,分别用axis=0,1,2进行运行。
a.sum(axis=0)得到:
array([[12, 14],意思是去掉一个中括号,然后运行。
[16, 18]])
同理:
a.sum(axis=1)对a去掉2个中括号,然后运行。
得到:
array([[ 4, 6],那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
[24, 26]])
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
a.sum(axis=-3)
array([[12, 14],
[16, 18]])
【2019-03-16】市场热度预测 - 通过检测某个论坛(集思录)的热度衡量
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 4 个评论 • 4217 次浏览 • 2019-03-16 18:03
首先得有数据,有了数据就可以慢慢分析了。
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
感觉这个是不错逃顶抄底指标呀。
文章中的数据每周更新,敬请留意。
原创文章
转载请注明出处:
http://30daydo.com/article/428
查看全部
首先得有数据,有了数据就可以慢慢分析了。
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
感觉这个是不错逃顶抄底指标呀。
文章中的数据每周更新,敬请留意。
原创文章
转载请注明出处:
http://30daydo.com/article/428
dataframe reindex和reset_index区别
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 84378 次浏览 • 2017-12-30 15:58
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
欢迎转载,注明出处
查看全部
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
欢迎转载,注明出处
TypeError: the dtype datetime64 is not supported for parsing
回复python • 李魔佛 回复了问题 • 1 人关注 • 1 个回复 • 10641 次浏览 • 2018-02-05 02:44
优矿的可转债的YTM数据为空 nan
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 2196 次浏览 • 2021-05-31 09:18
注意YTM哪一列全是Nan
脏数据太多了,吐槽一波。 查看全部
pandas 合并两个表,如何保留第一个表的索引?
python • 李魔佛 发表了文章 • 0 个评论 • 2913 次浏览 • 2021-05-29 22:17
tickerBond closePriceBond bondPremRatio secShortNameBond tickerEqu \
secID
110066 110066 199.94 -1.2442 盛屯转债 600711
110067 110067 119.53 25.9204 华安转债 600909
113021 113021 105.81 45.0989 中信转债 601998
113024 113024 101.94 36.6668 核建转债 601611
113025 113025 129.16 0.0409 明泰转债 601677
df2 数据
ROE tickerEqu
0 2.642931 600711
1 4.425438 600909
2 6.259092 601998
3 4.432315 601611
4 6.454054 601677
如果按照 pd.merge(df1,df2,on='tickerEqu') ,按照列 tickerEqu 进行合并,这样会导致最后合成的新的列的索性重构,变成 0,1,2,3 这种的。
有什么办法可以保留 df1 的索引? 用 join 的话会报错,因为 df2 的索引和 df1 匹配不上。
先 df1 = df1.reset_index(),合并之后再把 secID 那一列设为 index 。 查看全部
tickerBond closePriceBond bondPremRatio secShortNameBond tickerEqu \
secID
110066 110066 199.94 -1.2442 盛屯转债 600711
110067 110067 119.53 25.9204 华安转债 600909
113021 113021 105.81 45.0989 中信转债 601998
113024 113024 101.94 36.6668 核建转债 601611
113025 113025 129.16 0.0409 明泰转债 601677
df2 数据
ROE tickerEqu
0 2.642931 600711
1 4.425438 600909
2 6.259092 601998
3 4.432315 601611
4 6.454054 601677
如果按照 pd.merge(df1,df2,on='tickerEqu') ,按照列 tickerEqu 进行合并,这样会导致最后合成的新的列的索性重构,变成 0,1,2,3 这种的。
有什么办法可以保留 df1 的索引? 用 join 的话会报错,因为 df2 的索引和 df1 匹配不上。
先 df1 = df1.reset_index(),合并之后再把 secID 那一列设为 index 。
pandas dataframe 切片与python列表切片的区别
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 3499 次浏览 • 2020-10-29 23:34
有一个Dataframedf = pd.DataFrame(np.arange(16).reshape((8,2)),index=list('abcdefgh'),columns=['COL1','COL2'])COL1 COL2
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9
f 10 11
g 12 13
h 14 15那么如果我用df['a':'e'] 返回的结果是:
COL1 COL2
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9是包含e尾部的,
而python的切片
a = [0,1,2,3,4,5]
a[1:5] 是不包含最后一个元素的。
原文链接:
http://30daydo.com/article/630
查看全部
有一个Dataframe
df = pd.DataFrame(np.arange(16).reshape((8,2)),index=list('abcdefgh'),columns=['COL1','COL2'])
COL1 COL2那么如果我用df['a':'e'] 返回的结果是:
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9
f 10 11
g 12 13
h 14 15
COL1 COL2是包含e尾部的,
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9
而python的切片
a = [0,1,2,3,4,5]
a[1:5] 是不包含最后一个元素的。
原文链接:
http://30daydo.com/article/630
个人的知识星球
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 3868 次浏览 • 2020-02-23 11:10
微信扫一扫加入我的知识星球
星球的第一篇文章
python获取全市场LOF基金折溢价数据并进行套利
市场是总共的LOF基金有301只(上图右下角的圈圈是所有基金的条数),而集思录上只有120只左右,所以有些溢价厉害(大于10%)的LOF基金并没有在集思录的网站上显示,这对于专注于套利的投资者来说,会损失很多潜在的套利机会。
点击查看大图
我回复了该贴后,有大量的人私信我,问我能否提供一份这个数据,或者教对方如何获取这些数据。 因为人数众多,也没有那么多精力来一一回答。毕竟不同人的水平背景不一样,逐个回答起来也很累,所以就回答了几个朋友的问题后就一一婉拒了。
然后在几个投资群里,居然也有人提到这个数据,在咨询如何才能获取到这个完整的数据,并且可以实时更新显示。 因为我的微信群昵称和集思录是一样的,所以不少人@我,我也都简单的回复了下,是使用python抓取的数据,数据保存到Mysql和MongoDB。 代码行数不多,100行都不到。
具体实现在星球会有完整代码。 查看全部
微信扫一扫加入我的知识星球
星球的第一篇文章
python获取全市场LOF基金折溢价数据并进行套利
市场是总共的LOF基金有301只(上图右下角的圈圈是所有基金的条数),而集思录上只有120只左右,所以有些溢价厉害(大于10%)的LOF基金并没有在集思录的网站上显示,这对于专注于套利的投资者来说,会损失很多潜在的套利机会。
点击查看大图
我回复了该贴后,有大量的人私信我,问我能否提供一份这个数据,或者教对方如何获取这些数据。 因为人数众多,也没有那么多精力来一一回答。毕竟不同人的水平背景不一样,逐个回答起来也很累,所以就回答了几个朋友的问题后就一一婉拒了。
然后在几个投资群里,居然也有人提到这个数据,在咨询如何才能获取到这个完整的数据,并且可以实时更新显示。 因为我的微信群昵称和集思录是一样的,所以不少人@我,我也都简单的回复了下,是使用python抓取的数据,数据保存到Mysql和MongoDB。 代码行数不多,100行都不到。
具体实现在星球会有完整代码。
dataframe 根据日期重采样 计算个数
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 3283 次浏览 • 2019-12-19 09:07
python分析目前为止科创板企业省份分布
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 5193 次浏览 • 2019-08-26 00:45
首先获取行情数据,借助tushare这个框架:
在python3环境下,pip install tushare --upgrade ,记得要更新,因为用的旧版本会获取不到科创板的数据。
安装成功后试试import tushare as ts,看看有没有报错。没有就是安装成功了。
接下来抓取全市场的行情.
(点击查看大图)
查看前5条数据
现在行情数据存储在df中,然后分析数据。
因为提取的是全市场的数据,然后获取科创板的企业:
(点击查看大图)
使用的是正则表达式,匹配688开头的代码。
接下来就是分析企业归属地:
(点击查看大图)
使用value_counts函数,统计该列每个值出现的次数。
搞定了! 是不是很简单?
而且企业地区分布和自己的构想也差不多,江浙沪一带占了一半,加上北京地区,占了80%以上的科创板企业了。
每周会定期更新一篇python数据分析股票的文章。
原创文章,欢迎转载
请注明出处:
http://30daydo.com/article/528
查看全部
首先获取行情数据,借助tushare这个框架:
在python3环境下,pip install tushare --upgrade ,记得要更新,因为用的旧版本会获取不到科创板的数据。
安装成功后试试import tushare as ts,看看有没有报错。没有就是安装成功了。
接下来抓取全市场的行情.
(点击查看大图)
查看前5条数据
现在行情数据存储在df中,然后分析数据。
因为提取的是全市场的数据,然后获取科创板的企业:
(点击查看大图)
使用的是正则表达式,匹配688开头的代码。
接下来就是分析企业归属地:
(点击查看大图)
使用value_counts函数,统计该列每个值出现的次数。
搞定了! 是不是很简单?
而且企业地区分布和自己的构想也差不多,江浙沪一带占了一半,加上北京地区,占了80%以上的科创板企业了。
每周会定期更新一篇python数据分析股票的文章。
原创文章,欢迎转载
请注明出处:
http://30daydo.com/article/528
anaconda环境下无法启动jupyter notebook
python • 李魔佛 发表了文章 • 0 个评论 • 7383 次浏览 • 2019-08-19 17:16
报错: from . import (constants, error, message, context,
ImportError: DLL load failed: 找不到指定的模块。
但是可以直接在Anaconda navigator中直接启动,所以判断是环境问题。
切换到anaconda的虚拟环境,(在菜单中进入anaconda prompt command),在当前命令行下执行 jupyter notebook就能够正常运行。
查看全部
报错:
from . import (constants, error, message, context,
ImportError: DLL load failed: 找不到指定的模块。
但是可以直接在Anaconda navigator中直接启动,所以判断是环境问题。
切换到anaconda的虚拟环境,(在菜单中进入anaconda prompt command),在当前命令行下执行 jupyter notebook就能够正常运行。
截止今天(2019-05-14)银行股今年的涨幅排名
股票 • 李魔佛 发表了文章 • 0 个评论 • 5587 次浏览 • 2019-05-14 23:59
31 601288 农业银行 中国农业银行股份有限公司 -0.341178
11 600015 华夏银行 华夏银行股份有限公司 1.856174
45 601988 中国银行 中国银行股份有限公司 2.248533
32 601328 交通银行 交通银行股份有限公司 3.532657
30 601229 上海银行 上海银行股份有限公司 3.725781
35 601398 工商银行 中国工商银行股份有限公司 4.771403
40 601818 光大银行 中国光大银行股份有限公司 5.643119
27 601169 北京银行 北京银行股份有限公司 6.205580
14 600016 民生银行 中国民生银行股份有限公司 7.092815
5 002936 郑州银行 郑州银行股份有限公司 7.551112
49 601998 中信银行 中信银行股份有限公司 8.181956
43 601939 建设银行 中国建设银行股份有限公司 9.402651
41 601838 成都银行 成都银行股份有限公司 9.424554
52 603323 苏农银行 江苏苏州农村商业银行股份有限公司 12.375732
20 600926 杭州银行 杭州银行股份有限公司 12.933645
8 600000 浦发银行 上海浦东发展银行股份有限公司 14.752244
39 601577 长沙银行 长沙银行股份有限公司 14.792683
18 600908 无锡银行 无锡农村商业银行股份有限公司 16.181704
3 002807 江阴银行 江苏江阴农村商业银行股份有限公司 19.274586
48 601997 贵阳银行 贵阳银行股份有限公司 20.489563
4 002839 张家港行 江苏张家港农村商业银行股份有限公司 20.599511
25 601166 兴业银行 兴业银行股份有限公司 21.206503
24 601128 常熟银行 江苏常熟农村商业银行股份有限公司 21.571187
19 600919 江苏银行 江苏银行股份有限公司 23.218299
22 601009 南京银行 南京银行股份有限公司 26.297500
16 600036 招商银行 招商银行股份有限公司 27.518708
0 000001 平安银行 平安银行股份有限公司 31.624747
2 002142 宁波银行 宁波银行股份有限公司 31.729062
6 002948 青岛银行 青岛银行股份有限公司 48.602573
7 002958 青农商行 青岛农村商业银行股份有限公司 108.983776
42 601860 紫金银行 江苏紫金农村商业银行股份有限公司 115.147347
21 600928 西安银行 西安银行股份有限公司 128.496683 查看全部
ticker secShortName secFullName y_chgPct
31 601288 农业银行 中国农业银行股份有限公司 -0.341178
11 600015 华夏银行 华夏银行股份有限公司 1.856174
45 601988 中国银行 中国银行股份有限公司 2.248533
32 601328 交通银行 交通银行股份有限公司 3.532657
30 601229 上海银行 上海银行股份有限公司 3.725781
35 601398 工商银行 中国工商银行股份有限公司 4.771403
40 601818 光大银行 中国光大银行股份有限公司 5.643119
27 601169 北京银行 北京银行股份有限公司 6.205580
14 600016 民生银行 中国民生银行股份有限公司 7.092815
5 002936 郑州银行 郑州银行股份有限公司 7.551112
49 601998 中信银行 中信银行股份有限公司 8.181956
43 601939 建设银行 中国建设银行股份有限公司 9.402651
41 601838 成都银行 成都银行股份有限公司 9.424554
52 603323 苏农银行 江苏苏州农村商业银行股份有限公司 12.375732
20 600926 杭州银行 杭州银行股份有限公司 12.933645
8 600000 浦发银行 上海浦东发展银行股份有限公司 14.752244
39 601577 长沙银行 长沙银行股份有限公司 14.792683
18 600908 无锡银行 无锡农村商业银行股份有限公司 16.181704
3 002807 江阴银行 江苏江阴农村商业银行股份有限公司 19.274586
48 601997 贵阳银行 贵阳银行股份有限公司 20.489563
4 002839 张家港行 江苏张家港农村商业银行股份有限公司 20.599511
25 601166 兴业银行 兴业银行股份有限公司 21.206503
24 601128 常熟银行 江苏常熟农村商业银行股份有限公司 21.571187
19 600919 江苏银行 江苏银行股份有限公司 23.218299
22 601009 南京银行 南京银行股份有限公司 26.297500
16 600036 招商银行 招商银行股份有限公司 27.518708
0 000001 平安银行 平安银行股份有限公司 31.624747
2 002142 宁波银行 宁波银行股份有限公司 31.729062
6 002948 青岛银行 青岛银行股份有限公司 48.602573
7 002958 青农商行 青岛农村商业银行股份有限公司 108.983776
42 601860 紫金银行 江苏紫金农村商业银行股份有限公司 115.147347
21 600928 西安银行 西安银行股份有限公司 128.496683
神经网络中数值梯度的计算 python代码
深度学习 • 李魔佛 发表了文章 • 0 个评论 • 4613 次浏览 • 2019-05-07 19:12
import matplotlib.pyplot as plt
import numpy as np
import time
from collections import OrderedDict
def softmax(a):
a = a - np.max(a)
exp_a = np.exp(a)
exp_a_sum = np.sum(exp_a)
return exp_a / exp_a_sum
def cross_entropy_error(t, y):
delta = 1e-7
s = -1 * np.sum(t * np.log(y + delta))
# print('cross entropy ',s)
return s
class simpleNet:
def __init__(self):
self.W = np.random.randn(2, 3)
def predict(self, x):
print('current w',self.W)
return np.dot(x, self.W)
def loss(self, x, t):
z = self.predict(x)
# print(z)
# print(z.ndim)
y = softmax(z)
# print('y',y)
loss = cross_entropy_error(y, t) # y为预测的值
return loss
def numerical_gradient_(f, x): # 针对2维的情况 甚至是多维
h = 1e-4 # 0.0001
grad = np.zeros_like(x)
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
idx = it.multi_index
print('idx', idx)
tmp_val = x[idx]
x[idx] = float(tmp_val) + h
fxh1 = f(x) # f(x+h)
print('fxh1 ', fxh1)
# print('current W', net.W)
x[idx] = tmp_val - h
fxh2 = f(x) # f(x-h)
print('fxh2 ', fxh2)
# print('next currnet W ', net.W)
grad[idx] = (fxh1 - fxh2) / (2 * h)
x[idx] = tmp_val # 还原值
it.iternext()
return grad
net = simpleNet()
x=np.array([0.6,0.9])
t = np.array([0.0,0.0,1.0])
def f(W):
return net.loss(x,t)
grads =numerical_gradient_(f,net.W)
print(grads) 查看全部
import matplotlib.pyplot as plt
import numpy as np
import time
from collections import OrderedDict
def softmax(a):
a = a - np.max(a)
exp_a = np.exp(a)
exp_a_sum = np.sum(exp_a)
return exp_a / exp_a_sum
def cross_entropy_error(t, y):
delta = 1e-7
s = -1 * np.sum(t * np.log(y + delta))
# print('cross entropy ',s)
return s
class simpleNet:
def __init__(self):
self.W = np.random.randn(2, 3)
def predict(self, x):
print('current w',self.W)
return np.dot(x, self.W)
def loss(self, x, t):
z = self.predict(x)
# print(z)
# print(z.ndim)
y = softmax(z)
# print('y',y)
loss = cross_entropy_error(y, t) # y为预测的值
return loss
def numerical_gradient_(f, x): # 针对2维的情况 甚至是多维
h = 1e-4 # 0.0001
grad = np.zeros_like(x)
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
idx = it.multi_index
print('idx', idx)
tmp_val = x[idx]
x[idx] = float(tmp_val) + h
fxh1 = f(x) # f(x+h)
print('fxh1 ', fxh1)
# print('current W', net.W)
x[idx] = tmp_val - h
fxh2 = f(x) # f(x-h)
print('fxh2 ', fxh2)
# print('next currnet W ', net.W)
grad[idx] = (fxh1 - fxh2) / (2 * h)
x[idx] = tmp_val # 还原值
it.iternext()
return grad
net = simpleNet()
x=np.array([0.6,0.9])
t = np.array([0.0,0.0,1.0])
def f(W):
return net.loss(x,t)
grads =numerical_gradient_(f,net.W)
print(grads)
【可转债剩余转股比例数据排序】【2019-05-06】
股票 • 李魔佛 发表了文章 • 0 个评论 • 6208 次浏览 • 2019-05-06 15:28
剩余的比例越少,上市公司下调转股价的欲望就越少。 也就是会任由可转债在那里晾着,不会积极拉正股。
数据定期更新。
原创文章,
转载请注明出处:
http://30daydo.com/article/472
查看全部
剩余的比例越少,上市公司下调转股价的欲望就越少。 也就是会任由可转债在那里晾着,不会积极拉正股。
数据定期更新。
原创文章,
转载请注明出处:
http://30daydo.com/article/472
numpy flatten函数的用法
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 5314 次浏览 • 2019-04-30 10:01
例子:
x=np.array([[1,2,3,4],[5,6,7,8]])x
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
然后对x进行flatten操作
x.flatten()
得到的数据:
array([1, 2, 3, 4, 5, 6, 7, 8])
你也可以指定展平的轴,设定axis就可以了. 查看全部
把数据展平,无论多少维的数据,变为1维
例子:
x=np.array([[1,2,3,4],[5,6,7,8]])x
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
然后对x进行flatten操作
x.flatten()
得到的数据:
array([1, 2, 3, 4, 5, 6, 7, 8])
你也可以指定展平的轴,设定axis就可以了.
发现numpy一个很坑的问题,要一定级别的高手才能发现问题
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 4668 次浏览 • 2019-04-30 00:04
y=X0**2+X1**2 # **2 是平方def function_2(x):
return x[0]**2+x[1]**2
下面是计算y的偏导数,分布计算X0和X1的偏导def numerical_gradient(f,x):
grad = np.zeros_like(x)
h=1e-4
for idx in range(x.size):
temp_v = x[idx]
x[idx]=temp_v+h
f1=f(x)
print(x,f1)
x[idx]=temp_v-h
f2=f(x)
print(x,f2)
ret = (f1-f2)/(2*h)
print(ret)
x[idx]=temp_v
grad[idx]=ret
return grad
然后调用numerical_gradient(function_2,np.array([3,4]))
计算的是二元一次方程 y=X0**2+X1**2 在点(3,4)的偏导的值
得到的是什么结果?
为什么会得到这样的结果?
小白一般要花点时间才能找到原因。
查看全部
y=X0**2+X1**2 # **2 是平方
def function_2(x):
return x[0]**2+x[1]**2
下面是计算y的偏导数,分布计算X0和X1的偏导
def numerical_gradient(f,x):
grad = np.zeros_like(x)
h=1e-4
for idx in range(x.size):
temp_v = x[idx]
x[idx]=temp_v+h
f1=f(x)
print(x,f1)
x[idx]=temp_v-h
f2=f(x)
print(x,f2)
ret = (f1-f2)/(2*h)
print(ret)
x[idx]=temp_v
grad[idx]=ret
return grad
然后调用
numerical_gradient(function_2,np.array([3,4]))
计算的是二元一次方程 y=X0**2+X1**2 在点(3,4)的偏导的值
得到的是什么结果?
为什么会得到这样的结果?
小白一般要花点时间才能找到原因。
numpy和dataframe轴的含义,axis为负数的含义
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 5592 次浏览 • 2019-04-28 14:22
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a
array([[[ 1, 2],
[ 3, 4]],
[[11, 12],
[13, 14]]])
a有3个中括号,那么就有3条轴,从0开始到2,分别是axis=0,1,2
那么我要对a进行求和,分别用axis=0,1,2进行运行。
a.sum(axis=0)得到:
array([[12, 14],
[16, 18]])意思是去掉一个中括号,然后运行。
同理:
a.sum(axis=1)对a去掉2个中括号,然后运行。
得到:
array([[ 4, 6],
[24, 26]])那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
a.sum(axis=-3)
array([[12, 14],
[16, 18]])
查看全部
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a
array([[[ 1, 2],
[ 3, 4]],
[[11, 12],
[13, 14]]])
a有3个中括号,那么就有3条轴,从0开始到2,分别是axis=0,1,2
那么我要对a进行求和,分别用axis=0,1,2进行运行。
a.sum(axis=0)得到:
array([[12, 14],意思是去掉一个中括号,然后运行。
[16, 18]])
同理:
a.sum(axis=1)对a去掉2个中括号,然后运行。
得到:
array([[ 4, 6],那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
[24, 26]])
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
a.sum(axis=-3)
array([[12, 14],
[16, 18]])
np.nonzero()的用法【numpy小白】
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 5947 次浏览 • 2019-04-28 10:16
返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值。
比如:
n1=np.array([0,1,0,0,0,0,1,0,0,0,0,0,0,1])
n1.nonzero()
返回的是:
(array([ 1, 6, 13], dtype=int64),)注意上面是一个yu元组
要获取里面的值,需要用 n1.nonzero()[0] 来获取。
原创文章
转载请注明出处:
http://30daydo.com/article/466
查看全部
返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值。
比如:
n1=np.array([0,1,0,0,0,0,1,0,0,0,0,0,0,1])
n1.nonzero()
返回的是:
(array([ 1, 6, 13], dtype=int64),)
注意上面是一个yu元组要获取里面的值,需要用 n1.nonzero()[0] 来获取。
原创文章
转载请注明出处:
http://30daydo.com/article/466
ndarray和array的区别【numpy小白】
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 12718 次浏览 • 2019-04-28 10:11
原创文章
转载请注明出处:
http://30daydo.com/article/465
查看全部
np.array([1,2,3,4])
上面代码创建了一个对象,这个对象就是ndarray。 所以ndarray是一个类对象象,而array是一个方法。原创文章
转载请注明出处:
http://30daydo.com/article/465
【Dataframe warning】Try using .loc[row_indexer,col_indexer] = value instead
python • 李魔佛 发表了文章 • 0 个评论 • 11257 次浏览 • 2019-04-02 22:48
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
查看全部
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】市场热度预测 - 通过检测某个论坛(集思录)的热度衡量
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 4 个评论 • 4217 次浏览 • 2019-03-16 18:03
首先得有数据,有了数据就可以慢慢分析了。
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
感觉这个是不错逃顶抄底指标呀。
文章中的数据每周更新,敬请留意。
原创文章
转载请注明出处:
http://30daydo.com/article/428
查看全部
首先得有数据,有了数据就可以慢慢分析了。
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
感觉这个是不错逃顶抄底指标呀。
文章中的数据每周更新,敬请留意。
原创文章
转载请注明出处:
http://30daydo.com/article/428
numpy 二维数组按列合并
python • 李魔佛 发表了文章 • 0 个评论 • 6911 次浏览 • 2019-01-19 21:43
先生产测试数组# 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]]) 查看全部
先生产测试数组
# 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股上市公司按地区分布与可视化 地图显示
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 9137 次浏览 • 2018-12-19 14:07
地区 数目
浙江 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股上市公司分布:engine为from sqlalchemy import create_engine 中的连接引擎。
df = pd.read_sql('tb_basic_info',con=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
np.empty() 函数的用法 (有坑)
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 45317 次浏览 • 2018-11-20 11:36
但是实际结果返回: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()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。
原创文章
转载请注明出处:
http://www.30daydo.com/article/376
查看全部
但是实际结果返回:
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()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。
原创文章
转载请注明出处:
http://www.30daydo.com/article/376
python数据分析入门 --分析雪球元卫南每个月打赏收入
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 2 个评论 • 9211 次浏览 • 2018-10-24 14:34
最近居然被元神拉黑了。因为帖子不知道被哪位挖坟,估计被元神看到了。
重新跑了下原来的代码,还能跑通,看来雪球并没有改动什么代码。但是雪球经历了一波app下架风波,2019年前的帖子全部无法见到了。
重新获取数据:
点击查看大图
统计数据:
点击查看大图
2019年1月到现在(8月),元神收到的赏金为31851.6,数额比他2019年前所有的金额都要多,虽然总额不高,但是说明了元神这一年影响力大增了。
************************* 写于 2018-11 *******************************
在上一篇 雪球的元卫南靠打赏收割了多少钱 ? 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
个人公众号: 查看全部
最近居然被元神拉黑了。因为帖子不知道被哪位挖坟,估计被元神看到了。
重新跑了下原来的代码,还能跑通,看来雪球并没有改动什么代码。但是雪球经历了一波app下架风波,2019年前的帖子全部无法见到了。
重新获取数据:
点击查看大图
统计数据:
点击查看大图
2019年1月到现在(8月),元神收到的赏金为31851.6,数额比他2019年前所有的金额都要多,虽然总额不高,但是说明了元神这一年影响力大增了。
************************* 写于 2018-11 *******************************
在上一篇 雪球的元卫南靠打赏收割了多少钱 ? 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
个人公众号:
jupyter notebook 数据分析的利器
每日总结 • 李魔佛 发表了文章 • 0 个评论 • 3362 次浏览 • 2018-04-22 15:33
而且很重要的一点,jupyter使用web 服务器的方式运行,可以在树莓派上开一个jupyter服务,然后配置一下,就可以在其他的电脑上通过浏览器运行jupyter。 其他电脑不必要安装任何python和配置虚拟环境。 查看全部
而且很重要的一点,jupyter使用web 服务器的方式运行,可以在树莓派上开一个jupyter服务,然后配置一下,就可以在其他的电脑上通过浏览器运行jupyter。 其他电脑不必要安装任何python和配置虚拟环境。
python预测下一期双色球号码【机器学习】
python • 李魔佛 发表了文章 • 2 个评论 • 16152 次浏览 • 2018-02-19 10:16
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
查看全部
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文件,保存为一下的格式:
第一步完成。
Part2 机器学习进行预测
2018-02-19
待续,后面继续更新
原文链接:
http://30daydo.com/article/277
【量化分析】到底谁在买乐视网?2018年1月26日
股票 • 李魔佛 发表了文章 • 2 个评论 • 4116 次浏览 • 2018-01-26 17:02
本来没有持有这一只股票,不过雪球上不时地出现一些文章,根据龙虎榜推测到底谁在接盘。 于是今天收盘,打开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
查看全部
本来没有持有这一只股票,不过雪球上不时地出现一些文章,根据龙虎榜推测到底谁在接盘。 于是今天收盘,打开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
dataframe reindex和reset_index区别
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 84378 次浏览 • 2017-12-30 15:58
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
欢迎转载,注明出处
查看全部
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
欢迎转载,注明出处
Dataframe中的plot函数绘图会把日期index自动补全
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 6258 次浏览 • 2017-12-26 14:49
df=pd.read_excel('600050.xls',dtype={'datetime':np.datetime64})
df=df.set_index('datetime')
df['close'].plot(use_index=True,grid=True)
plt.show()
df为中国联通的日线数据,跨度为2016年到2017年底,中间有过一段时间的停牌。 用上面的代码绘制出来的曲线图,回发现,横坐标是日期,可是图中居然会把停牌的日子也插进去,这样导致了图形中间出现了一条长长的折线。
因为停牌后,股价是是不会变化的。
查看全部
df=pd.read_excel('600050.xls',dtype={'datetime':np.datetime64})
df=df.set_index('datetime')
df['close'].plot(use_index=True,grid=True)
plt.show()
df为中国联通的日线数据,跨度为2016年到2017年底,中间有过一段时间的停牌。 用上面的代码绘制出来的曲线图,回发现,横坐标是日期,可是图中居然会把停牌的日子也插进去,这样导致了图形中间出现了一条长长的折线。
因为停牌后,股价是是不会变化的。
菜鸟侦探挑战数据分析R源代码
量化交易-Ptrade-QMT • 李魔佛 发表了文章 • 0 个评论 • 3227 次浏览 • 2017-12-11 17:45
百度网盘下载链接:
https://pan.baidu.com/s/1miiScDM