我有一个应用,需要使用pandas去mysql数据库里用pd. read_sql方法读取数据,进行一定处理后通过数据可视化组件Pyecharts在网页上进行可视化展示,图形为折线图,在显示时发现有些系列(series)的值不显示,查看pyecharts网页端的JavaScript脚本代码,发现Series的值都显示为null,后来查了资料,发现是pandas的数值类型有些跟pyecharts不兼容,pyecharts官网是这么说的:
Note: 在使用 Pandas&Numpy 时,请确保将数值类型转换为 python 原生的 int/float。比如整数类型请确保为 int,而不是 numpy.int32
在网上查了很多资料,比如直接使用df.astype(‘int’)对整个数据表进行转换,或者编写自定义函数然后调用df.apply()方法,都是报错,因为我的pandas原始数据里面有int,object等不同的数据类型,不能直接转换。后来就弄了一个for循环,循环每1行,然后对每一行使用.apply()方法调用lambda函数进行转换,数据就正常显示,虽然用循环感觉比较笨,但还是开心,解决了问题。毕竟现在电脑配置那么高,不太需要考虑程序效率,能把问题解决就行了。
核心代码如下:
#从数据库读取数据
df=pd.read_sql(sql=sql,con=conn,index_col="日期",coerce_float=False)
#折线图
line = Line(init_opts=opts.InitOpts(width="1200px",height = "600px"))
line.add_xaxis(df.columns.tolist()) #一定要加tolist()方法,不然会没有任何内容。
#设置Y轴反转,X轴朝下,不用对其零值
yaxis_opts=opts.AxisOpts(is_inverse= True,is_show=True,axisline_opts=opts.AxisLineOpts(is_on_zero=False)))
for i in range(0,df.shape[0],1): #轮循df里的所有行,添加到折线图。
series_name = df.iloc[i].name #系列名称
y_axis_value=df.iloc[i].apply(lambda x: x.astype('float') if x is not None else x) #这里把所有非空值强行转换为float
line.add_yaxis(series_name=series_name, y_axis=y_axis_value,label_opts=opts.LabelOpts(is_show=True),
linestyle_opts=opts.LineStyleOpts(width=2),)
#添加Y轴数据