拜师教育第一阶段day1-2_Python数据分析

第一章  数据分析的基本概念

1.了解matplotlib、numpy、pandas在数据分析中各自的功能:

       matplotlib一般用于将数据进行可视化展示,通过它绘制折线图、散点图、条形图、直方图等。numpy常用于处理数值型数据。pandas常用于处理字典、数值数组、字符串与列表等。利用这些模块下提供的数据分析函数比用常规for …in …遍历要方便的多。

2.   数据分析的基本概念:把大量数据进行统计整理,得出结果,为后续的决策提供数据支持。另外对于包含大量元素的数据集,我们常需要对其进行数据预处理,以获得其中需要的那一部分,这样可以得到准备数据。而且,获得结论和成果可视化实际上应是同步进行的,当获得结论后若想更直观,此时一般进行成果可视化(matplotlib 的作用:用于做数据可视化图表)。数据分析的流程如下图:

第二章   matplotlib绘图模块

1.matplotlib函数的导入:from matplotlib import pyplot as plt(在使用pyplot时可以直接使用plt调用更简单。)

2.图片大小与清晰度的调整(这个语句一般放置在开头导包后):通过plt.figure(figsize=(宽度参数,长度参数),dpi=清晰度相关参数)。其中dpi参数意味着每英寸上点的个数,当图片放大后变模糊时,可以改变dpi参数进行调整。

3.图片的保存(这个语句一般放在绘图指令(plt.plot/scatter/hist/bar/barh)之后):通过plt.savefig("./文件名.文件格式")(里边的参数为保存路径,其中‘.’表示在与.py文件相同级别的目录下,‘..’表示在.py文件上一级别的目录下。)

4.随机产生120个在20-35之间的整数:import random;y=[random.randint(20,35) for i in range(120]

5.(重点)调整X或者Y轴上的刻度(一般用在绘图指令后):

(I)调整坐标刻度的疏密:由于直接调用plt.plot()自动生成坐标刻度不一定是我们想要的,这时要通过plt.xticks()调整横坐标刻度,通过plt.yticks()调整纵坐标刻度。如果x坐标刻度太密集可以通过plt.xticks(x[::3])每三个取一个刻度使坐标刻度变稀疏。若x=list(range(2,10,1))如果x坐标刻度太稀疏可以通过x_ticks=[i/2 for i in range(4,19)],plt.xticks(x_ticks),这样使得坐标密度变为原来的二倍。

(II)调整坐标刻度的表示(不再单纯显示数字,而是以字符串显示每个坐标):

plt.xticks(x_[::3],x_ticks[::3],rotation=旋转参数),这里的x_与x_ticks均为列表list对象,他们的长度要一致才能覆盖整个轴,可以同时取间隔/步长。其中x_为数据型列表(这个X_不一定与x有必然关系,它可以是根据要修改的字符型坐标刻度列表长度而生成的range()对象),x_ticks为字符串型列表。最后的rotation为旋转参数,当为正数时逆时针将坐标刻度转过相应度数,为负数时逆时针将坐标刻度转过相应度数。

6.如何使得绘图部分无刻度,绘图区上另一部分有刻度:通过对plt.xticks()的x_ticks参数(有刻度的那一段)与plt.plot()的x参数(无刻度的那一段)的调整错位就可以实现。

7.折线图的绘制(plt.plot()):在绘图前将横坐标纵坐标两个对应的数据表准备好,调用plt.plot(x,y)就可以获得对应的折线图(注意这里的x,y最好是list对象,为方便后续修改坐标轴取步长做准备)。通过plt.show()可以展示图形。

8.如何修改中文显示:导入from matplotlib import font_manager ;my_font=font_manager.FontProperties(fname="字体的路径(可以通过windows搜索框搜索字体)"),在对应使用中文的地方添加fontproperties=my_font参数,但图例指令plt.legend()中接收的参数名称为prop=my_font。

9.为图添加描述信息:通过plt.xlabel(),plt.ylabel(),plt.title()添加信息并且如果包含中文字符,其内要添加参数fontproperties=my_font。

10.为图添加网格:通过plt.grid()为图片添加网格,其中可以通过linestyle参数设置线性,通过alpha设置透明度。可以通过linewidth和color两个参数设置plot折线的粗细和颜色

11.如何将两个折线绘制在一幅图中并添加图例:可以通过plot命令调用两次绘图指令这样可以绘制两个图,并且可以通过Plt.plot()中label=“图例名称”参数设置图例,在绘图指令后可以通过plt.legend(loc=图例位置编号,prop=my_font)。其中图例位置与编号关系如下:

12.作业(一):假设大家在30岁的时候,根据自己的实际情况,统计出来了你和你同桌各自11岁到30岁每年交的女()朋友的数量如列表ab,在一个图中绘制出该数据的折线图,以便比较自己和同桌20年间的差异,方便分析每年交女()朋友的数量走势。

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,3,3,2,1,2,1,1,1,1,1,1,1,1,1]

要求: y轴表示个数x轴表示岁数,比如11,12岁;并使得图片尽量美观。

# -*- coding:utf-8 -*-
from matplotlib import pyplot as plt
from matplotlib import font_manager
plt.figure(figsize=(5,5),dpi=80)
my_font=font_manager.FontProperties(fname='C:/WINDOWS/FONTS/SIMHEI.TTF')
x=list(range(11,31))
y1= [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2= [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]
plt.plot(x,y1,color='b',linestyle='--',label="自己")
plt.plot(x,y2,color='g',linestyle='-.',label="同桌")
plt.legend(loc=1,prop=my_font)
x_ticks=["{0}岁".format(i) for i in range(11,31)]
plt.xticks(x[::2],x_ticks[::2],fontproperties=my_font)
plt.xlabel("年龄",fontproperties=my_font)
plt.ylabel("恋爱对象个数",fontproperties=my_font)
plt.title("恋爱对象个数随年龄变化图",fontproperties=my_font)
plt.grid(alpha=0.9,linestyle=':')
plt.savefig("./t2.png")
plt.show()

13.不同场合下图形的选择:

14.绘制散点图plt.scatter():

如何在同一个图上的左右两部分绘制不同的散点图:仍然是调用两次plt.scatter()指令,然后对两个散点图的x轴进行一定的偏移使其图点错开。

# -*- coding:utf-8 -*-
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname='C:/WINDOWS/FONTS/SIMHEI.TTF')
plt.figure(figsize=(8,4),dpi=100)
x3=list(range(1,32))
x10=list(range(41,72))
y3=[11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y10=[26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
plt.scatter(x3,y3,label="3月")
plt.scatter(x10,y10,label='10月')
x_ticks=["3月{0}日".format(i) for i in x3]
x_ticks+=["10月{0}日".format(i-40) for i in x10]
x_=x3+x10
plt.xticks(x_[::3],x_ticks[::3],rotation=45,fontproperties=my_font)
y_=list(range(min(y10),max(y10)+1))
y_ticks=["{0}℃".format(i) for i in y_]
plt.yticks(y_[::3],y_ticks[::3],fontproperties=my_font)
plt.legend(loc=1,prop=my_font)
plt.show()

15.绘制散点图(plt.barh/bar绘制横/纵向条形图):其中条形图用于统计离散数据(是指之间没有相互关系的数据),plt.bar()中条形粗细的参数为width,plt.barh()中条形粗细的参数为height,可以通过plt.bar(range(len(a)),y)实现横坐标为数字,纵坐标为数量的竖状条形图,之后利用plt.xticks修改横坐标刻度即可。如果当字符串过长可以将过长的字符串通过“\n”使其换行,也可以通过plt.barh(range(len(a)),y,height=0.5);plt.yticks()设置为横向条形图。

在同一个图形中如何绘制错开的条形图:首先多次调用plt.bar(),然后对预错开的数据的不同坐标轴刻度进行重构列表,在原列表基础上使每个移动一定的宽度即可实现。

16.作业(二):假设你知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现该数据?

a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]

b_14 = [2358,399,2358,362];b_15 = [12357,156,2045,168];b_16 = [15746,312,4497,319]

# -*- coding:utf-8 -*-
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname='C:/WINDOWS/FONTS/SIMHEI.TTF')
plt.figure(figsize=(6,4),dpi=100)
a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
b_14 = [2358,399,2358,362]
b_15 = [12357,156,2045,168]
b_16 = [15746,312,4497,319]
barwid=0.2
x_14=list(range(len(a)))
x_15=[i+barwid*1 for i in x_14]
x_16=[i+barwid*2 for i in x_14]
plt.bar(x_14,b_14,width=barwid,label="9-14")
plt.bar(x_15,b_15,width=barwid,label="9-15")
plt.bar(x_16,b_16,width=barwid,label="9-15")
plt.xticks(x_15,a,fontproperties=my_font)
plt.grid(alpha=0.3)
plt.legend(loc=1)
plt.show()

 

17.绘制直方图(plt.hist(未统计整理过的元素数据列表,组数)):统计整理后的数据做直方图时应使用bar函数,而不能使用hist函数。当元素数量在100个以内时,常将组数分为5-12组,组数为num_bins=(max(a)-min(a))(极差)//d(组距),对于组距的选择一定要能够将极差整除在无法除尽时,可以选择为num_bins输入一个步长为d的列表对象num_bins=range(min(a),max(a)+d,d),这时绘制出来的表便不会产生偏移否则由于上述取整运算的存在,会使图形越来越偏向一侧。当绘制的为频率分布直方图而不是频数分布直方图时,plt.hist()函数中应添加一个参数normed=1(在python3中已替换为density=1)。

作业(三):在美国2004年人口普查发现有124 million的人在离家相对较远的地方工作。根据他们从家到上班地点所需要的时间,通过抽样统计(最后一列)出了下表的数据,现在请将其绘制为直方图。其中:

interval = [0,5,10,15,20,25,30,35,40,45,60,90]

width = [5,5,5,5,5,5,5,5,5,15,30,60]

quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]

 

# -*- coding:utf-8 -*-
from matplotlib import pyplot as plt
from matplotlib import  font_manager
my_font=font_manager.FontProperties(fname='C:/WINDOWS/FONTS/SIMHEI.TTF')
plt.figure(figsize=(8,5),dpi=100)
interval=[0,5,10,15,20,25,30,35,40,45,60,90]
interval_=interval+[150]
width=[5,5,5,5,5,5,5,5,5,15,30,60]
quantity=[836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]
x=range(len(interval))
x_=[i-0.5 for i in range(len(interval)+1)]
plt.bar(x,quantity,width=1)
plt.xticks(x_,interval_)
plt.grid(alpha=0.4)
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("频数",fontproperties=my_font)
plt.title("从家到上班地点花费时间的直方图",fontproperties=my_font)
plt.show()

 

 

 

 

 

 

 

 

 

 

 

STM32G070CBT6是一款基于Arm Cortex-M0+内核的微控制器,它使用 HAL (Hardware Abstraction Layer) 库来简化外设的驱动程序配置。初始化串口1(USART1)和DMA接收完整数据帧通常涉及以下几个步骤: 1. **包含头文件**: 首先,在C代码中引入相关的HAL库头文件: ```c #include "stm32g0xx_hal.h" ``` 2. **初始化系统资源**: 确保已正确配置和启动了系统时钟和低功耗模式。 3. **初始化串口**: 使用`HAL_USART_Init`函数初始化串口,设置波特率、数据位数、停止位等配置: ```c USART_HandleTypeDef usartHandle; usartHandle.Instance = USART1; HAL_USART_Init(&usartHandle); ``` 设置工作模式,例如成帧的UART模式 (`USART十条通信模式`,`USART_IT_RXNE`中断表示接收缓冲区有新数据): ```c usartHandle.Init.WordLength = USART_WORDLENGTH_8B; usartHandle.Init.StopBits = USART_STOPBITS_1; usartHandle.Init.Parity = USART_PARITY_NONE; usartHandle.Init.BaudRate = YOUR_BAUD_RATE; // 替换为实际需要的速率 if (HAL_USART_Init(&usartHandle) != HAL_OK) { // 处理错误 } ``` 4. **启用串口接收中断**: ```c HAL_NVIC_EnableIRQ(USART1_IRQn); // 开启串口接收中断 HAL_NVIC_SetPriority(USART1_IRQn, YOUR_PRIORITY, 0); // 设置中断优先级 HAL_UART_IRQHandler(&usartHandle); // 这里应该在主循环中注册 ``` 5. **初始化DMA接收**: - 创建并初始化DMA结构体: ```c DMA_HandleTypeDef dmaHandle; dmaHandle.Instance = DMA1_Channel1; // 如果使用的是DMA1 Channel 1 ``` - 配置DMA: ```c dmaHandle.Init.Direction = DMA_PERIPH_TO_MEMORY; dmaHandle.Init.PeriphInc = DMA_PINC_DISABLE; dmaHandle.Init.MemInc = DMA_MINC_ENABLE; dmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; dmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; dmaHandle.Init.Mode = DMA_NORMAL; dmaHandle.Init.Priority = DMA_PRIORITY_HIGH; dmaHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; dmaHandle.Init.Request = DMA_REQUEST_USART1RX; ``` - 初始化DMA: ```c if (HAL_DMA_Init(&dmaHandle) != HAL_OK) { // 处理错误 } ``` - 将DMA连接到串口接收数据的内存区域: ```c __HAL_LINKDMA(&usartHandle, hdmaRx, dmaHandle); ``` 6. **配置DMA传输完成标志处理**: ```c HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); // 开启DMA中断 HAL_DMA拜师学艺_DMA2 InterruptionRequest(DMA1_Stream1_IRQn); // 注册中断请求 // 当DMA传输完成后,会触发这个中断 void DMA1_Stream1_IRQHandler(void) { HAL_DMA_IRQHandler(dmaHandle.HAL_Handle); } ``` 7. **启用串口接收中断处理**: ```c HAL_UART_IRQHandler(&usartHandle); ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值