python数据分析vip班级笔记

本文记录了作者从基础班毕业后的学习历程,主要涉及Python数据分析工具matplotlib和pandas的使用,包括散点图、条形图、直方图、箱线图的绘制,以及数据处理和时间序列分析。文中还提到了升级matplotlib和解决Python版本问题的技巧,并通过实例展示了金叉死叉策略和股票投资模拟。
摘要由CSDN通过智能技术生成

终于从基础班毕业了,从周一开始学习python的数据分析课。

第一节课是开班典礼,没有什么重要的内容。主要是安装jupyter,直接连接国外的网站太慢,要换国内的源,比如清华源
pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple/
安装完之后,用jupyter-notebook 和
jupyter notebook都能运行。

有位同学好像专门写了一个文章,解决安装不上问题的诸多原因:
https://blog.csdn.net/weixin_49088841/article/details/107091652?utm_source=app

第二节课主要讲了如何画图, 刻度,标题,中文,字体,颜色,线的格式,标签等等如何设置。把以前的列表推导式,字符串的格式化,等等内容又顺带复习了一下。
import matplotlib.pyplot as plt

等同于from matplotlib import pyplot as plt

#plt.figure??
#plt.figure()

fig=plt.figure()

#plt.subplot??

# plt.subplot(221)

ax1=plt.subplot(2,2,1) # 2*2 最多为4个图形,这里选择了第一个。

#3*3则最多为9个图形, subplot(225)则报错

ax2=plt.subplot(2,2,2)

ax3=plt.subplot(2,2,3)

ax4=plt.subplot(2,2,4)

ax1.scatter(range(5),range(5))

plt.show()# 展示图片

plt.subplots(2,2)

plt.subplots(2,2,sharex=True,sharey=True)

plt.subplots(2,2,sharex=True,sharey=True,figsize=(14,8))

fig,axs=plt.subplots(2,2,sharex=True,sharey=True,figsize=(14,8))

#注意这个函数有2个返回值,一个是fig是图片,一个是axs是数组。中间用逗号,

#用fig axe接收相当于拆包

axs[0,0].scatter(range(5),range(5)) #选中第一张图

axs[0,1].scatter(range(5),list(range(5)[::-1])) #选中第二张图

plt.subplots_adjust(wspace=0,hspace=0)

plt.show()

plt.plot??

x=[1,2,3,4]

y=[4,2,3,1]

# plt.plot(x,y) #绘制折线图

plt.plot(x,y,color=“g”,linestyle="–",marker="*")# 可以设置线条的颜色和形状

plt.show()#展示图片,释放内存

#x=range(2,26,2)
plt.figure(figsize=(14,8))
x=range(0,24,2)
#range() start,stop,step不要用浮点数,只用整数
y=[15,13,14.5,17,20,25,26,26,27,22,18,15]
#设置刻度 以0 0.5 23.5显示 【i/2 for i in range (0,48)】
x_t=[i/2 for i in range (0,48)] # 注意,这个是刻度
x_l=["{}h".format(i/2) for i in range (0,48)] # 注意,这个是标签

#plt.xticks(x)
#plt.xticks(x_t)
plt.xticks(x_t, x_l,rotation=45)

#设置y的刻度
y_t=range(min(y),max(y)+1)
plt.yticks(y_t)
#添加标签标题
plt.xlabel(“time”)
plt.ylabel(“temp”)
plt.title(“temp during the day”)

#添加网格
plt.grid()

plt.plot(x,y)
plt.savefig(“mat.png”)
plt.show()
#plt.savefig(“mat.png”) 这样保存则为空白,要在show之前保存,

import matplotlib.pyplot as plt
import random
import matplotlib
font={
‘family’:‘SimHei’,
‘weight’:‘bold’,
‘size’:12
}
matplotlib.rc(“font”,**font)

这是全局设置方式,设置自带字体,只能设置ttf字体,不支持ttc字体

x=range(0,120)
y=[random.randint(30,38) for i in range(0,120)]#生成120个随机数的气温
plt.plot(x,y)
#设置刻度
x_t=range(0,120,10)
#设置标签
x_l=[“ten{}m”.format(i) for i in range(0,60,10)]

x_l=x_l+{“十一{}m”.format(i) for i in range(0,60,10)}

x_l+=[“十一{}m”.format(i) for i in range(0,60,10)]
plt.xticks(x_t,x_l,rotation=45)

plt.show()

第三节课讲了如何设置图例 plt.legend,设置字体,设置文本注释。
绘制散点图和条形图。
x1=range(11,31)

a=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b=[1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]
x1_t=range(11,31)
x1_l=["{}岁".format(i) for i in range(11,31)]
plt.xticks(x1_t,x1_l,rotation=45)

for x_i,y_i in zip(x1,a):

plt.annotate(f"{y_i}",xy=(x_i,y_i),xytext=(x_i,y_i-1),arrowprops={“width”:2})

for x_i,y_i in zip(x1,a):

plt.annotate(f"{y_i}",xy=(x_i,y_i),xytext=(x_i,y-i-1))

def auto_label(x_po,y_po):
for x_i,y_i in zip(x_po,y_po):
plt.annotate(f"{y_i}",xy=(x_i,y_i),xytext=(x_i,y_i))

auto_label(x1,a)
auto_label(x1,b)

plt.ylabel(“year”)
plt.xlabel(“numbers”)
plt.title(“seeking soul mates over the time”)
plt.plot(x1,a,label=“myself”)
plt.plot(x1,b,label=“desk”)
plt.legend()
plt.show()

li=[28,26,26,22,14,22,14,13,17,19]
y=li
x=range(10)
plt.plot(x,y,marker="*")
#plt.annotate(“28”,xy=(0,28),xytext=(-0.3,28))
#plt.annotate(“28”,xy=(0,28),xytext=(0,28)) 实现将每个点都使用上数据标签,思路:对应的参数坐标在变
#plt.annotate(“28”,xy=(0,28),xytext=(-0.3,25),arrowprops={“width”:2})
for x_i,y_i in zip(x,y):
plt.annotate(f"{y_i}",xy=(x_i,y_i),xytext=(x_i,y_i-1))

for x_i,y_i in zip(x,y):

plt.annotate(f"{y_i}",xy=(x_i,y_i),xytext=(x_i,y_i-1),arrowprops={“width”:2})

plt.show()

y_5 = [11,17,16,11,12,11,12,13,10,14,8,13,12,15,14,17,18,21,16,17,30,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,15,10,11,13,12,13,6]

5月和10月的每天天气

x=range(1,32)
x_5=range(1,32)
x_10=range(51,82)

plt.scatter(x,y_4)

plt.scatter(x,y_10)

plt.scatter(x_5,y_5)
plt.scatter(x_10,y_10)

x_t=list(x_5)+list(x_10)
x_l=[“Apr{}号”.format(i) for i in x_5]
#x_l+=[“Oct{}号”.format(i) for i in x_10]
x_l+=[“Oct{}号”.format(i-50) for i in x_10]
#plt.xticks(x_t,x_l)
plt.xticks(x_t[::5],x_l[::5],rotation=45)
plt.show()

a = [“流浪地球”,“复仇者联盟4:终局之战”,“哪吒之魔童降世”,“疯狂的外星人”,“飞驰人生”,“蜘蛛侠:英雄远征”,“扫毒2天地对决”,“烈火英雄”,“大黄蜂”,“惊奇队长”,“比悲伤更悲伤的故事”,“哥斯拉2:怪兽之王”,“阿丽塔:战斗天使”,“银河补习班”,“狮子王”,“反贪风暴4”,“熊出没”,“大侦探皮卡丘”,“新喜剧之王”,“使徒行者2:谍影行动”,“千与千寻”]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22]
plt.figure(figsize=(14,8))
#plt.bar(a,b,width=0.3,bottom=10) 默认柱子在中间,可以用edge靠右边,调整width的值为负值可以靠左
plt.bar(a,b,width=-0.3,bottom=10,align=‘edge’)
plt.xticks(rotation=90)

plt.show()

fruits=[“apple”,“pear”,“cheary”]
Q1_sales=[1000,800,3000]
Q2_sales=[1200,700,2800]
#柱子对应的位置为【0,1,2】
width=0.35

r1=plt.bar(list(range(len(fruits))),Q1_sales,width)

r2=plt.bar(list(range(len(fruits))),Q2_sales,width)

po_l=[i-width/2 for i in list(range(len(fruits)))]
po_r=[i+width/2 for i in list(range(len(fruits)))]
plt.bar(po_l,Q1_sales,width,label=“Q1”)
plt.bar(po_r,Q2_sales,width,label=“Q2”)
#设置数据标签
auto_label(po_l,Q1_sales)
auto_label(po_r,Q1_sales)
plt.xticks(list(range(len(fruits))),fruits)

plt.legend()

fruits=[“apple”,“pear”,“cheary”]
Q1_sales=[1000,800,3000]
Q2_sales=[1200,700,2800]

plt.bar(fruits,Q1_sales,width=0.5)
plt.bar(fruits,Q2_sales,width=0.5,bottom=Q1_sales)

a = [“流浪地球”,“复仇者联盟4:终局之战”,“哪吒之魔童降世”,“疯狂的外星人”,“飞驰人生”,“蜘蛛侠:英雄远征”,“扫毒2天地对决”,“烈火英雄”,“大黄蜂”,“惊奇队长”,“比悲伤更悲伤的故事”,“哥斯拉2:怪兽之王”,“阿丽塔:战斗天使”,“银河补习班”,“狮子王”,“反贪风暴4”,“熊出没”,“大侦探皮卡丘”,“新喜剧之王”,“使徒行者2:谍影行动”,“千与千寻”]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22]
plt.figure(figsize=(14,8))
plt.barh(a,b)

第三节课我发现我的matplotlib没有老师上课时候用的一个属性,我的是2.1.2,老师的是3.0.3. 好多帖子都写了如何升级,其实那些命令我这边没有一个能用的,于是去了matplotlib的官网,果然,可以升级,我升级到了最新版3.3.1,单更麻烦的事情来了,我的plt都不能用了,因为python的版本太低了,于是我又去重新下载python3.8.5又重新安装Anaconda,设置环境变量,搞了一下午,终于工作了。这节课讲了快3个小时,东西都特别琐碎,讲了如何绘制直方图,扇形图,雷达图,箱型图(类似K线又不同于K线)如果封装函数,matplotlib的一些配置项,设置文本的另外方式,设置XY轴的上下限等。.
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
import random
import matplotlib
from matplotlib import ticker

font={
‘family’:‘SimHei’,
‘weight’:‘bold’,
‘size’:12
}
matplotlib.rc(“font”,**font)
import numpy as np
plt.rcParams[‘font.sans-serif’] = [‘SimHei’] # 步骤一(替换sans-serif字体)
plt.rcParams[‘axes.unicode_minus’] = False # 步骤二(解决坐标轴负数的负号显示问题)
temp_li= [6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]
max(temp_li)
min(temp_li)
cha=max(temp_li)-min(temp_li)
b=1
bi=round(cha)//b # round 四舍五入
#plt.hist(temp_li,bins=bi) #注意bins为整数类型
plt.hist(temp_li,bins=bi,density=True) #注意bins为整数类型

#display label
plt.xlabel(“区间”)
plt.ylabel(“频数/频率”)
plt.title(‘直方图’)
plt.show()
frac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50]
label = [’[3,4]’,’(4,5]’,’(5,6]’,’(6,7]’,’(7,8]’,’(8,9]’,’(9,10]’]
#plt.pie(frac,labels=label,autopct="%.2f") %为00, 没有这个符号%
explodes=(0,0,0.1,0,0,0,0) # 每个数字对应lalel里的一个元组,如果想让那个label突出显示,则设置一个值
#plt.pie(frac,labels=label,autopct="%.2f%%",explode=explodes)
#plt.pie(frac,labels=label,autopct="%.2f%%",explode=explodes,shadow=True) #shadow 会让图像显得有立体感

#可以用拆包的方式来接收pie的3个返回值, 中间用逗号隔开。 print可以打印出全部,单独一个patches则显示最后一个值
patches,texts,autotexts= plt.pie(frac,labels=label,autopct="%.2f%%",explode=explodes,shadow=True)

print(patches)

print(texts)

print(autotexts)

for autotext in autotexts:
autotext.set_color(“w”)
plt.show()

data=[random.randint(1,100) for i in range(100)]
data.extend([-100,500])
#plt.boxplot(data,sym="^",widths=0.2)
plt.boxplot(data,sym="^",widths=0.2,meanline=True,showmeans=True)
plt.show()

theta=np.linspace(0,np.pi*2.5)

plt.polar(theta,sales)

quaters = [‘Q1’,‘Q2’,‘Q3’,‘Q4’] # 不是x,x是弧度
sales = [40,91,44,90,40]

求theta 2*PI

#theta = np.linspace(0,np.pi2,5) # 创建等差数列, 注意,这里是5而不是4
theta = np.linspace(0,np.pi
2,5)

绘制图形

plt.polar(theta,sales)

设置刻度标签

plt.xticks(theta,quaters)
#plt.fill(theta,sales)

plt.show()
fig = plt.figure()
ax1 = plt.subplot(111)
ax1.plot(range(10),range(10),marker=“o”)

想在(0,0)的位置显示文本

ax1.text(0,0,"(0,0)")
#ax1.text(-0.3,0.5,"(0,0)")

plt.show()

fig = plt.figure()
ax1 = plt.subplot(111)
ax1.plot(range(10),range(10))

给x,y轴设置上下限 为-2 到 12

ax1.set_xlim(-2,12)
ax1.set_ylim(-2,12)
plt.show()

fig = plt.figure()
ax1 = plt.subplot(111)
ax1.bar(range(10),[random.randint(-10,40) for i in range(10)])
ax1.set_ylabel(‘温度’)
ax2=ax1.twinx()
ax2.plot(range(10),[random.randint(0,400) for i in range(10)],marker="*")
ax2.set_ylabel(‘降水量’)

plt.show()
fig = plt.figure()
ax1 = plt.subplot(111)
ax1.bar(range(10),[random.randint(-10,40) for i in range(10)])
ax1.set_ylabel(‘温度’)
#设置y轴label的位置为上方
ax1.yaxis.set_label_coords(-0.1,1)

fig = plt.figure()
width = (2,1) # 宽为2:1 0列:1列 的宽度 2:1
height = (2,1) # 高为2:1 0行:1行 的宽度 2:1
gs = fig.add_gridspec(2,2,width_ratios=width,height_ratios=height)

[行,列] [0,0] 取一整行 列取全部

fig.add_subplot(gs[0,:])
fig.add_subplot(gs[1,0])
fig.add_subplot(gs[1,1])

第二周第一节课,总第5节课。
今天上课时间正好和一个FRM的直播课程重叠,跟谁学的FRM也是8点开始,我一把老骨头了,搞的比学生还累。
今天讲了文件的各种读写操作,open,with open as f,json(json load, json dump). 如何操作csv文件 writerow, writerows,next, for 循环还有强大的pandas pd.read_csv, df.to_csv(). 然后讲了excel的各种读取创建方法,xlwt,xlrd,openpyxl. 最后讲了大名鼎鼎的numpy,指定数据类型,创建后修改数据类型。
f=open(“student.txt”,“r”,encoding=“utf8”)

f.read() # \n 是换行符,如果在pycharm 里面则会分2行显示。

#f.readline逐行读取,但是f.readline 是不可逆的操作

f.readline()

f.readline()

f.readlines()
f.close()

f=open(“demo.txt”,“w”) #在写模式下,文件不存在则创建模式
#f.write(“hello teacher”) #返回结果为字符串的数目
f.write(“hello wuwangchuxin”) #再次写入为覆盖 ,关闭后需要重新打开
f.close()
with open(“student.txt”,“r”,encoding=“utf8”) as f:
print(f.readlines())
# 不需要写close语句,其他操作都和open一致
import json
#json与python中字典的格式非常类似,json中的数据必须用双引号包裹

data={“age”:18}
with open(“data.json”,“w”) as f:
# f.write(data) #使用write w模式必须写入str
json.dump(data,f) #dump,将python 对象转化为json对象,写入文件

with open(“data.json”,“r”) as f:

print(f.read())

print(type(f.read()))

#dict(f.read())  字符串传入dict里面生成字典会报错
#json对象转为python对象: 字典
j_data=json.load(f)
print(j_data)
print(type(j_data))
print(j_data["age"])
import csv

with open(“demo3.csv”,“w”) as f:
#创建csv写的对象
datawriter=csv.writer(f)

datawriter.writerow([“name”,“age”,“gender”])

datawriter.writerow([“amy”,“18”,“female”])# 逐行写入, 这样写中间有一行空着,

#如果不想如此,则在with open语句zhong写入with open(“demo3.csv”,“w”,newline="") as f:

datawriter.writerows([["class",'name'],["1","Amy"],["2","Jim"]])

with open(“demo3.csv”,“r”) as f:
datareader=csv.reader(f)

#迭代器,只能往下读取,每次一行

print(next(datareader))

print(next(datareader))

print(next(datareader))

#通过for 循环一次性取出
for i in datareader:
    print(i)
    import pandas as pd # pip install pandas ,同时需要安装xlwt, xlrd来操作excel 

#但是他们没有openpyxl好用,openpyxl只支持2010版本以上的xlsx文件
data=pd.read_csv(“demo3.csv”)
data

data.to_csv(“demo4.csv”) #这样多一个0和逗号

data.to_csv(“demo4.csv”,index=False)

from openpyxl import Workbook
wb=Workbook() #创建工作簿
ws=wb.active #激活第一个工作表
#数据构成
data=[[“class”,‘name’],[“1”,“Amy”],[“2”,“Jim”]]
#获取data中数据,写入工作表
for row in data:
ws.append(row)
#保存工作簿
wb.save(“demo4.xlsx”)

from openpyxl import load_workbook
wb=load_workbook(“demo4.xlsx”) #打开工作簿
ws=wb.active #读取第一个工作表
ws.rows #生成器对象
for row in ws.rows:

print(row)

for cell in row:
    #print(cell)
    print(cell.value)
    
    import pandas as pd

pd.read_excel(“demo4.xlsx”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值