numpy flatten函数的用法

李魔佛 发表了文章 • 0 个评论 • 201 次浏览 • 2019-04-30 10:01 • 来自相关话题

把数据展平,无论多少维的数据,变为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就可以了. 查看全部

把数据展平,无论多少维的数据,变为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一个很坑的问题,要一定级别的高手才能发现问题

李魔佛 发表了文章 • 0 个评论 • 169 次浏览 • 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为负数的含义

李魔佛 发表了文章 • 0 个评论 • 127 次浏览 • 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],
[24, 26]])
那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
 
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
 
a.sum(axis=-3)

array([[12, 14],
[16, 18]])

 

np.nonzero()的用法【numpy小白】

李魔佛 发表了文章 • 0 个评论 • 137 次浏览 • 2019-04-28 10:16 • 来自相关话题

numpy函数返回非零元素的位置。

返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值。
 
比如:
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
  查看全部
numpy函数返回非零元素的位置。

返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值。
 
比如:
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小白】

李魔佛 发表了文章 • 0 个评论 • 117 次浏览 • 2019-04-28 10:11 • 来自相关话题

在numpy中,np.array()是一个函数,用法: np.array([1,2,3,4])上面代码创建了一个对象,这个对象就是ndarray。 所以ndarray是一个类对象象,而array是一个方法。
 
原创文章
转载请注明出处:
http://30daydo.com/article/465
  查看全部
在numpy中,np.array()是一个函数,用法: 
np.array([1,2,3,4])
上面代码创建了一个对象,这个对象就是ndarray。 所以ndarray是一个类对象象,而array是一个方法。
 
原创文章
转载请注明出处:
http://30daydo.com/article/465
 

【手把手教你】量价关系分析与Python实现

Python金融量化 发表了文章 • 3 个评论 • 346 次浏览 • 2019-04-01 17:15 • 来自相关话题

如果操作过量,即使对市场判断正确,仍会一败涂地。——索罗斯

引言

成交量是股票市场的温度计,许多股票的疯狂上涨并非基本面发生了实质性的变化,而是短期筹码和资金供求关系造成的。量价关系分析法是一种将价格走势与成交量变化相结合的研究方法,正所谓,大军未动,粮草先行。成交量一直被看为是股票市场的“粮草”,成交量的变化是股价变化的前兆。因此,成交量是分析判断市场行情,并作出投资决策时的重要依据,也是各种技术分析指标应用时不可或缺的参照。

本文延续“手把手教你使用Python的TA-Lib”系列,着重介绍交易量指标(Volume Indicators)及其运用。【手把手教你】股市技术分析利器之TA-Lib(一)主要探讨了重叠指标的相关原理与Python实现,【手把手教你】股市技术分析利器之TA-Lib(二)则着重介绍了TA-Lib中强大的数学运算、数学变换、统计函数、价格变换、周期指标和波动率指标函数及其应用实例。TA-Lib的安装使用可查看以前推文。

                        


01
A/D Line 累积派发线


Chaikin Accumulation/Distribution Line (AD),是Marc Chaikin提出的用来平衡交易量的指标,以当日收盘价、最高价和最低价来估算一段时间内该股票累积的资金流量, 用来确定潜在的趋势以及预测趋势反转。


函数名:AD

调用格式:ta.AD(high,low,close,volume)

计算方法: AD=前日AD值+(多空对比*成交量)

多空对比=((收盘价-最低价)-(最高价-收盘价))/(最高价-最低价);注意:当最高价等于最低价时,多空对比 = (收盘价 / 昨收盘) - 1

运用要点:

AD测量资金流向,AD向上表明多方占优势,反之表明空方占优势;

AD与价格的背离可视为买卖信号:底背离考虑买入,顶背离考虑卖出;

AD指标无需设置参数,但在应用时,可结合均线、MACD、KDJ等指标进行分析;

AD指标忽略了缺口的影响,有时无法真实反映价格与成交量的关系。


02
A/D Oscillator 震荡指标


震荡指标是计算长短周期的AD差,将资金流动情况与价格行为相对比,用来研判市场中资金流入和流出的情况。


函数名:ADOSC

调用格式:ta. ADOSC(high,low,close,volume,

              fastperiod=3,slowperiod=10)

计算方法:fastperiod AD - slowperiod AD,AD的计算同上。

运用要点:

交易信号是背离:看涨背离做多,看跌背离做空;

股价与90天移动平均结合,与其他指标结合;

由正变负卖出,由负变正买进。

03
OBV - 能量潮


全称为 On Balance Volume, 由 Joe Granville 提出,通过统计成交量变动的趋势推测股价趋势。


函数名:OBV

调用格式:ta.OBV(close, volume)

计算公式:以某日为基期,逐日累计每日股票总成交量,若隔日指数或股票上涨,则基期OBV加上本日成交量为本日OBV。隔日指数或股票下跌, 则基期OBV减去本日成交量为本日OBV。

研判:

以“N”字型为波动单位,一浪高于一浪称“上升潮”,下跌称“跌潮”;

上升潮买进,跌潮卖出;

须配合K线图、股价走势和其他指标。


04
应用实例代码


#先引入后面可能用到的包(package)
import pandas as pd  
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline   

#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False


#引入TA-Lib库
import talib as ta


#获取交易数据函数,这里使用tushare的老接口,比较方便
import tushare as ts
def get_data(code,start='2018-11-01',end='2019-03-26'):
    df=ts.get_k_data(code,start,end)
    df.index=pd.to_datetime(df.date)
    df=df.sort_index()
    return df[['open','close','high','low','volume']]


#获取当前交易是所有股票代码和名字
basics=ts.get_stock_basics()
print(len(basics))
#basics.head()


3602


index={'上证综指': 'sh','深证成指': 'sz','沪深300': 'hs300',
               '创业板指': 'cyb', '上证50': 'sz50','中小板指': 'zxb'}


#将当前交易的股票和常用指数代码和名称写入字典,方便调用
stock=dict(zip(basics.name,basics.index))
stocks=dict(stock,**index)



计算交易量指标并可视化

#使用matplotlib画k线图以及
import matplotlib.patches as patches
def plot_line(name):   
    code=stocks[name]
    data=get_data(code)
    fig = plt.figure(figsize=(12,5))
    ax1 = fig.add_axes([0, 1, 1, 1])               
    ax1.set_title(name+"K线图与交易量指标",  fontsize=15)
    ax1.set_xlim(-1, len(data)+1)

    for i in range(len(data)):
        close_price,open_price = data.iloc[i, 1], data.iloc[i, 0]
        high_price, low_price = data.iloc[i,2], data.iloc[i, 3]
        trade_date = data.index[i]
        if close_price > open_price:#画阳线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, fill=False, color='r'))
            ax1.plot([i, i], [low_price, open_price], 'r')
            ax1.plot([i, i], [close_price, high_price], 'r')
        else:#画阴线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, color='g'))
            ax1.plot([i, i], [low_price, high_price], color='g')
    ax1.set_title("Price", fontsize=15, loc='left', color='r')
    #设置x轴标签
    ax1.set_xticks(range(0,len(data),5))#位置
    ax1.set_xticklabels([(data.index[i]).strftime('%Y-%m-%d') for i in ax1.get_xticks()] , rotation=20)
    high, low, close, volume = np.array(data['high']),np.array(data['low']),np.array(data['close']),np.array(data['volume'])
    #计算AD线
    AD = ta.AD(high, low, close, volume)       
    #计算ADOSC线
    ADOSC = ta.ADOSC(high,low, close, volume, fastperiod=3, slowperiod=10)      
    #计算OBC线
    OBV = ta.OBV(close, volume)                                                        

    ax2 = ax1.twinx() 
    ax2.plot(AD, color='r', linewidth=2, label='AD')
    ax2.plot(ADOSC, color='b', linewidth=2, label='ADOSC')
    ax2.plot(OBV, color='y', linewidth=2, label='OBV')
    ax2.legend(loc=0)
plot_line('东方通信')plot_line('上证综指')plot_line('创业板指')plot_line('中国平安')最后,在万矿上使用AD线进行了历史回测,作为演示例子,这里只对东方通信和中国平安股票进行了回测,期间为2018年1月1日至2019年3月25日。从AD线单一指标回测来看,在市场反弹或形成向上趋势时跑赢市场,但是最大回撤也比较大,如东方通信达到43.2%,当然这与回测期间和标的选择有很大的关系。这里只是作为演示例子,深入研究还得待结合其他指标。


东方通信AD线回测结果:


中国平安AD线回测结果:

结语

价量分析系统属于技术分析,而技术分析是股票分析的温度计。温度计无法预测未来的准确温度,更不可能决定温度。因此,技术分析只是告诉你发生了什么,但不能预测未来会发生什么。不要过于依赖技术指标提供的信号,市场总是充满突发性的事件,交易者情绪波动较大,因此股价并不是总是沿着规律运行。在使用量价关系时,不仅要分析量价关系中量的变化对价的影响,还应该分析量变化的原因,更应该知道这些变化之后交易者的情绪或行为,只有这样才能真正体会量价关系的精髓,提高自己预判的准确率。 查看全部
如果操作过量,即使对市场判断正确,仍会一败涂地。——索罗斯

引言

成交量是股票市场的温度计,许多股票的疯狂上涨并非基本面发生了实质性的变化,而是短期筹码和资金供求关系造成的。量价关系分析法是一种将价格走势与成交量变化相结合的研究方法,正所谓,大军未动,粮草先行。成交量一直被看为是股票市场的“粮草”,成交量的变化是股价变化的前兆。因此,成交量是分析判断市场行情,并作出投资决策时的重要依据,也是各种技术分析指标应用时不可或缺的参照。

本文延续“手把手教你使用Python的TA-Lib”系列,着重介绍交易量指标(Volume Indicators)及其运用。【手把手教你】股市技术分析利器之TA-Lib(一)主要探讨了重叠指标的相关原理与Python实现,【手把手教你】股市技术分析利器之TA-Lib(二)则着重介绍了TA-Lib中强大的数学运算、数学变换、统计函数、价格变换、周期指标和波动率指标函数及其应用实例。TA-Lib的安装使用可查看以前推文。

                        


01
A/D Line 累积派发线


Chaikin Accumulation/Distribution Line (AD),是Marc Chaikin提出的用来平衡交易量的指标,以当日收盘价、最高价和最低价来估算一段时间内该股票累积的资金流量, 用来确定潜在的趋势以及预测趋势反转。


函数名:AD

调用格式:ta.AD(high,low,close,volume)

计算方法: AD=前日AD值+(多空对比*成交量)

多空对比=((收盘价-最低价)-(最高价-收盘价))/(最高价-最低价);注意:当最高价等于最低价时,多空对比 = (收盘价 / 昨收盘) - 1

运用要点:

AD测量资金流向,AD向上表明多方占优势,反之表明空方占优势;

AD与价格的背离可视为买卖信号:底背离考虑买入,顶背离考虑卖出;

AD指标无需设置参数,但在应用时,可结合均线、MACD、KDJ等指标进行分析;

AD指标忽略了缺口的影响,有时无法真实反映价格与成交量的关系。


02
A/D Oscillator 震荡指标


震荡指标是计算长短周期的AD差,将资金流动情况与价格行为相对比,用来研判市场中资金流入和流出的情况。


函数名:ADOSC

调用格式:ta. ADOSC(high,low,close,volume,

              fastperiod=3,slowperiod=10)

计算方法:fastperiod AD - slowperiod AD,AD的计算同上。

运用要点:

交易信号是背离:看涨背离做多,看跌背离做空;

股价与90天移动平均结合,与其他指标结合;

由正变负卖出,由负变正买进。

03
OBV - 能量潮


全称为 On Balance Volume, 由 Joe Granville 提出,通过统计成交量变动的趋势推测股价趋势。


函数名:OBV

调用格式:ta.OBV(close, volume)

计算公式:以某日为基期,逐日累计每日股票总成交量,若隔日指数或股票上涨,则基期OBV加上本日成交量为本日OBV。隔日指数或股票下跌, 则基期OBV减去本日成交量为本日OBV。

研判:

以“N”字型为波动单位,一浪高于一浪称“上升潮”,下跌称“跌潮”;

上升潮买进,跌潮卖出;

须配合K线图、股价走势和其他指标。


04
应用实例代码


#先引入后面可能用到的包(package)
import pandas as pd  
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline   

#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False


#引入TA-Lib库
import talib as ta


#获取交易数据函数,这里使用tushare的老接口,比较方便
import tushare as ts
def get_data(code,start='2018-11-01',end='2019-03-26'):
    df=ts.get_k_data(code,start,end)
    df.index=pd.to_datetime(df.date)
    df=df.sort_index()
    return df[['open','close','high','low','volume']]


#获取当前交易是所有股票代码和名字
basics=ts.get_stock_basics()
print(len(basics))
#basics.head()


3602


index={'上证综指': 'sh','深证成指': 'sz','沪深300': 'hs300',
               '创业板指': 'cyb', '上证50': 'sz50','中小板指': 'zxb'}


#将当前交易的股票和常用指数代码和名称写入字典,方便调用
stock=dict(zip(basics.name,basics.index))
stocks=dict(stock,**index)



计算交易量指标并可视化

#使用matplotlib画k线图以及
import matplotlib.patches as patches
def plot_line(name):   
    code=stocks[name]
    data=get_data(code)
    fig = plt.figure(figsize=(12,5))
    ax1 = fig.add_axes([0, 1, 1, 1])               
    ax1.set_title(name+"K线图与交易量指标",  fontsize=15)
    ax1.set_xlim(-1, len(data)+1)

    for i in range(len(data)):
        close_price,open_price = data.iloc[i, 1], data.iloc[i, 0]
        high_price, low_price = data.iloc[i,2], data.iloc[i, 3]
        trade_date = data.index[i]
        if close_price > open_price:#画阳线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, fill=False, color='r'))
            ax1.plot([i, i], [low_price, open_price], 'r')
            ax1.plot([i, i], [close_price, high_price], 'r')
        else:#画阴线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, color='g'))
            ax1.plot([i, i], [low_price, high_price], color='g')
    ax1.set_title("Price", fontsize=15, loc='left', color='r')
    #设置x轴标签
    ax1.set_xticks(range(0,len(data),5))#位置
    ax1.set_xticklabels([(data.index[i]).strftime('%Y-%m-%d') for i in ax1.get_xticks()] , rotation=20)
    high, low, close, volume = np.array(data['high']),np.array(data['low']),np.array(data['close']),np.array(data['volume'])
    #计算AD线
    AD = ta.AD(high, low, close, volume)       
    #计算ADOSC线
    ADOSC = ta.ADOSC(high,low, close, volume, fastperiod=3, slowperiod=10)      
    #计算OBC线
    OBV = ta.OBV(close, volume)                                                        

    ax2 = ax1.twinx() 
    ax2.plot(AD, color='r', linewidth=2, label='AD')
    ax2.plot(ADOSC, color='b', linewidth=2, label='ADOSC')
    ax2.plot(OBV, color='y', linewidth=2, label='OBV')
    ax2.legend(loc=0)
plot_line('东方通信')plot_line('上证综指')plot_line('创业板指')plot_line('中国平安')最后,在万矿上使用AD线进行了历史回测,作为演示例子,这里只对东方通信和中国平安股票进行了回测,期间为2018年1月1日至2019年3月25日。从AD线单一指标回测来看,在市场反弹或形成向上趋势时跑赢市场,但是最大回撤也比较大,如东方通信达到43.2%,当然这与回测期间和标的选择有很大的关系。这里只是作为演示例子,深入研究还得待结合其他指标。


东方通信AD线回测结果:


中国平安AD线回测结果:

结语

价量分析系统属于技术分析,而技术分析是股票分析的温度计。温度计无法预测未来的准确温度,更不可能决定温度。因此,技术分析只是告诉你发生了什么,但不能预测未来会发生什么。不要过于依赖技术指标提供的信号,市场总是充满突发性的事件,交易者情绪波动较大,因此股价并不是总是沿着规律运行。在使用量价关系时,不仅要分析量价关系中量的变化对价的影响,还应该分析量变化的原因,更应该知道这些变化之后交易者的情绪或行为,只有这样才能真正体会量价关系的精髓,提高自己预判的准确率。

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

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

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





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

echarts.png

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

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

李魔佛 发表了文章 • 0 个评论 • 667 次浏览 • 2019-01-30 10:59 • 来自相关话题

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





 点击查看大图

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




 点击查看大图

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

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


# 确定价格的范围

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

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

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

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

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

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

bar = Bar('可转债价格分布')
bar.add('A+',value,list(ret_A_add.values()),is_stack=True,yaxis_max=11)
bar.add('',value,list(retAA_.values()),is_stack=True,yaxis_max=11)
bar.add('AA',value,list(retAA.values()),is_stack=True,yaxis_max=11)
bar.add('AA+',value,list(retAA_add.values()),is_stack=True,yaxis_max=11)
bar.add('AAA',value,list(retAAA.values()),is_stack=True,yaxis_max=11)
如果没有安装pyecharts,需要用pip安装即可。
 
上面代码运行后就可以得到上面最开始那张堆叠图了。
github:https://github.com/Rockyzsu/convertible_bond​ 
 
 
原创文章
转载请注明出处:
 http://30daydo.com/article/400 

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

可转债数据.JPG

 点击查看大图

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

 点击查看大图

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

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


# 确定价格的范围

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

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

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

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

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

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

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

如果没有安装pyecharts,需要用pip安装即可。
 
上面代码运行后就可以得到上面最开始那张堆叠图了。
github:https://github.com/Rockyzsu/convertible_bond​ 
 
 
原创文章
转载请注明出处:
 http://30daydo.com/article/400 

 

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

李魔佛 发表了文章 • 0 个评论 • 1153 次浏览 • 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 个评论 • 8709 次浏览 • 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()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。
 
原创文章
转载请注明出处:
http://www.30daydo.com/article/376
  查看全部
看名字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()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。
 
原创文章
转载请注明出处:
http://www.30daydo.com/article/376