python 数据处理
matplotlib
绘制折线图
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([17, 24, 15, 33, 44, 26, 37, 28])
plt.plot(x, y, c='green', alpha=0.5, label='图例') # 数组数据传给plot,设置界面参数
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 设置中文编码
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题/让负号正常显示
plt.title('标 题', fontsize=18)
plt.xlabel('x 轴', fontsize=12)
plt.ylabel('y 轴', fontsize=12)
x_major_locator = MultipleLocator(2) # MultipleLocator()函数设置了x轴相邻显示点的间隔
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.ylim(y.min() * 0.9, y.max() * 1.1)
plt.legend() # 显示图例
plt.grid() # 网格
# plt.gcf().autofmt_xdate() # 自动旋转日期标记
plt.tick_params(labelsize=10) # 刻度值大小
plt.show() # 显示图形
def pic(data_x, data_y ,title):
plt.plot(data_x, data_y, c='b', alpha=0.7, label='图例', linewidth=0.8) # 数组数据传给plot,设置界面参数
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 设置中文编码
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题/让负号正常显示
plt.title(title, fontsize=18)
plt.xlabel('x 轴', fontsize=12)
plt.ylabel('y 轴', fontsize=12)
x_major_locator = MultipleLocator(len(data_x)/10) # MultipleLocator()函数设置了x轴相邻显示点的间隔
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.ylim(data_y.min() * 0, data_y.max() * 1.1)
plt.legend() # 显示图例
plt.grid() # 网格
# plt.gcf().autofmt_xdate() # 自动旋转日期标记
plt.tick_params(labelsize=10) # 刻度值大小
plt.show() # 显示图形
设置坐标范围
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 5), dpi=80)
plt.subplot(111)
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
S = np.sin(X)
C = np.cos(X)
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-")
plt.xlim(X.min() * 1.1, X.max() * 1.1)
plt.ylim(C.min() * 1.5, C.max() * 1.5)
plt.show()
Matplotlib.pyplot中subplot
plt.subplot作用是把一个绘图区域(可以理解成画布)分成多个小区域,用来绘制多个子图。
nrows和ncols表示将画布分成(nrows*ncols)个小区域,每个小区域可以单独绘制图形;plot_number表示将图绘制在第plot_number个子区域。
subplot(nrows, ncols, plot_number)
from matplotlib import pyplot
import pandas as pd
df = pd.DataFrame({'$a': [1, 12, 13, 14, 15],
'$b': [12, 1, 14, 15, 16],
'$c': [13, 14, 1, 16, 17],
'$d': [13, 14, 15, 1, 17],
'$e': [14, 15, 16, 17, 1]})
values = df.values
groups = [0, 1, 2, 3, 4]
i = 1
# plot each column
pyplot.figure()
for group in groups:
pyplot.subplot(len(groups), 1, i)
pyplot.plot(values[:, group])
pyplot.title(df.columns[group], y=0.5, loc='right')
i += 1
pyplot.show()
subplot绘制子图的排布和极坐标图绘制
import numpy as np
import matplotlib.pylab as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
import math
pi = math.pi
x = np.linspace(0, 2*pi, 1000)
y = np.abs(np.cos(x))
xmajorLocator = MultipleLocator(pi/4) #将x主刻度标签设置为pi/4的倍数
xmajorFormatter = FormatStrFormatter('%1.1f') #设置x轴标签文本的格式
xminorLocator = MultipleLocator(pi/8) #将x轴次刻度标签设置为pi/8的倍数
ymajorLocator = MultipleLocator(0.2) #将y轴主刻度标签设置为0.2的倍数
ymajorFormatter = FormatStrFormatter('%1.1f') #设置y轴标签文本的格式
yminorLocator = MultipleLocator(0.1) #将此y轴次刻度标签设置为0.1的倍数
ax1 = plt.subplot(121)#1代表行,2代表列,所以一共有2个图,1代表此时绘制第二个图。其中ax1是为了坐标轴主次刻度大小的设置
plt.plot(x, y) #绘制x-y直角坐标图
#设置主刻度标签的位置,标签文本的格式
ax1.xaxis.set_major_locator(xmajorLocator)
ax1.xaxis.set_major_formatter(xmajorFormatter)
ax1.yaxis.set_major_locator(ymajorLocator)
ax1.yaxis.set_major_formatter(ymajorFormatter)
#显示次刻度标签的位置,没有标签文本
ax1.xaxis.set_minor_locator(xminorLocator)
ax1.yaxis.set_minor_locator(yminorLocator)
ax1.xaxis.grid(True, which='major') #x坐标轴的网格使用主刻度
ax1.yaxis.grid(True, which='minor') #y坐标轴的网格使用次刻度
ax2 = plt.subplot(122, polar=True)#1代表行,2代表列,所以一共有2个图,2代表此时绘制第二个图。polar=True表示绘制极坐标图,其中ax2是为了坐标轴主次刻度大小的设置。
plt.plot(x,y) #x代表角度(弧度制表示),y代表与原点的距离(需为正)。
plt.show()
Numpy
生成随机浮点数
import numpy as np
a = np.random.uniform(10, 15, 20)
print(a)
合并数组
import numpy as np
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = ['a', 'b', 'c', 'd']
a = np.array(a)
b = np.array(b)
c = np.array(c)
d = np.vstack((a, b, c))
print(d)
>>>
[['1' '2' '3' '4']
['5' '6' '7' '8']
['a' 'b' 'c' 'd']]
Pandas
写入和读取csv文件
import pandas as pd
# 任意的多组列表
a = [1, 2, 3]
b = [4, 5, 6]
# 字典中的key值即为csv中列名
dataframe = pd.DataFrame({'a_name': a, 'b_name': b})
# 将DataFrame存储为csv,index表示是否显示行名,default=True
dataframe.to_csv('F:/pic3/' + "test.csv", index=False, sep=',')
# read
import pandas as pd
data = pd.read_csv('test.csv')
csv文件数据切片
import pandas as pd
import numpy as np
data = pd.read_csv(".csv")
data_1 = data.iloc[:,0] # data.iloc[:,0:2]获取从0列开始的两列
data_1 =np.array(data_1)
print(data_1)
pandas内置set_option()在pycharm控制台打印完整结果
import pandas as pd
pd.set_option('display.max_columns', 1000)
pd.set_option('display.width', 1000)
pd.set_option('display.max_colwidth', 1000)
用columns修改列名
有一个DataFrame,列名为:[‘
a
′
,
′
a', '
a′,′b’, ‘
c
′
,
′
c', '
c′,′d’, ‘$e’]
现在要修改为[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
import pandas as pd
df = pd.DataFrame({'$a': [1, 2], '$b': [1, 2], '$c': [1, 2], '$d': [1, 2], '$e': [1, 2]})
print(df)
df.columns = ['a', 'b', 'c', 'd', 'e']
print(df)
=============================================================================================
$a $b $c $d $e
0 1 1 1 1 1
1 2 2 2 2 2
a b c d e
0 1 1 1 1 1
1 2 2 2 2 2
二维数组与三维数组切片
如果对象是二维数组,则切片应当是x[:]的形式,里面有一个冒号,冒号之前和之后分别表示对象的第0个维度和第1个维度;
如果对象是三维数组,则切片应当是x[::],里面有两个冒号,分割出三个间隔,三个间隔的前、中和后分别表示对象的第0、1、2个维度。
x[n,:]、x[:,n]、x[m:n,:]、x[:,m:n]
用 “:” 前后区分操作对应的维度,操作命令参数与冒号之间用逗号隔开。
(m:n)则表示对第m号到第n-1号元素操作,即左闭右开区间。
举例:
import numpy as np
a = np.array([[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7],
[2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7],
[3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7]])
print(a.shape)
print('第0行', a[0, :], a[0, :].shape)
print('第1行', a[1, :], a[1, :].shape)
print('倒1行', a[-1, :], a[-1, :].shape)
print('倒2行', a[-2, :], a[-2, :].shape)
print('0-1行', a[0:2, :], a[0:2, :].shape)
print('第0列', a[:, 0], a[:, 0].shape)
print('第1列', a[:, 1], a[:, 1].shape)
print('倒1列', a[:, -1], a[:, -1].shape)
print('0-1列', a[:, 0:2], a[:, 0:2].shape)
=============================================================================================
(3, 7)
第0行 [1.1 1.2 1.3 1.4 1.5 1.6 1.7] (7,)
第1行 [2.1 2.2 2.3 2.4 2.5 2.6 2.7] (7,)
倒1行 [3.1 3.2 3.3 3.4 3.5 3.6 3.7] (7,)
倒2行 [2.1 2.2 2.3 2.4 2.5 2.6 2.7] (7,)
0-1行 [[1.1 1.2 1.3 1.4 1.5 1.6 1.7]
[2.1 2.2 2.3 2.4 2.5 2.6 2.7]] (2, 7)
第0列 [1.1 2.1 3.1] (3,)
第1列 [1.2 2.2 3.2] (3,)
倒1列 [1.7 2.7 3.7] (3,)
0-1列 [[1.1 1.2]
[2.1 2.2]
[3.1 3.2]] (3, 2)
x[n,::]、x[:,n:]、x[::,n]、x[:,:,n]、x[m:n,::]、x[:,m:n:]、x[::,m:n]、x[:,:,m:n]
import numpy as np
b = np.array([[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]],
[[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]],
[[25, 26, 27, 28], [29, 30, 31, 32], [33, 34, 35, 36]],
])
print(b.shape)
print(b[0, ::], b[0, ::].shape, 'b[0, ::]')
print(b[1, ::], b[1, ::].shape, 'b[1, ::]')
print(b[-1, ::], b[-1, ::].shape, 'b[-1, ::]')
print(b[0:2, ::], b[0:2, ::].shape, 'b[0:2, ::]')
print('============================================')
print(b[:, 0:], b[:, 0:].shape, 'b[:, 0:]')
print(b[:, 1:], b[:, 1:].shape, 'b[:, 1:]')
print(b[:, -1:], b[:, -1:].shape, 'b[:, -1:]')
print(b[:, 0:2:], b[:, 0:2:].shape, 'b[:, 0:2:]')
print('============================================')
print(b[::, 0], b[::, 0].shape, 'b[::, 0]')
print(b[::, 1], b[::, 1].shape, 'b[::, 1]')
print(b[::, -1], b[::, -1].shape, 'b[::, -1]')
print(b[::, 0:2:], b[::, 0:2].shape, 'b[::, 0:2:]')
print('============================================')
print(b[:, :, 0], b[:, :, 0].shape, 'b[:, :, 0]')
print(b[:, :, 1], b[:, :, 1].shape, 'b[:, :, 1]')
print(b[:, :, -1], b[:, :, -1].shape, 'b[:, :, -1]')
print(b[:, :, 0:2:], b[:, :, 0:2].shape, 'b[:, :, 0:2:]')
=============================================================================================
(3, 3, 4)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]] (3, 4) b[0, ::]
[[13 14 15 16]
[17 18 19 20]
[21 22 23 24]] (3, 4) b[1, ::]
[[25 26 27 28]
[29 30 31 32]
[33 34 35 36]] (3, 4) b[-1, ::]
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[13 14 15 16]
[17 18 19 20]
[21 22 23 24]]] (2, 3, 4) b[0:2, ::]
============================================
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[13 14 15 16]
[17 18 19 20]
[21 22 23 24]]
[[25 26 27 28]
[29 30 31 32]
[33 34 35 36]]] (3, 3, 4) b[:, 0:]
[[[ 5 6 7 8]
[ 9 10 11 12]]
[[17 18 19 20]
[21 22 23 24]]
[[29 30 31 32]
[33 34 35 36]]] (3, 2, 4) b[:, 1:]
[[[ 9 10 11 12]]
[[21 22 23 24]]
[[33 34 35 36]]] (3, 1, 4) b[:, -1:]
[[[ 1 2 3 4]
[ 5 6 7 8]]
[[13 14 15 16]
[17 18 19 20]]
[[25 26 27 28]
[29 30 31 32]]] (3, 2, 4) b[:, 0:2:]
============================================
[[ 1 2 3 4]
[13 14 15 16]
[25 26 27 28]] (3, 4) b[::, 0]
[[ 5 6 7 8]
[17 18 19 20]
[29 30 31 32]] (3, 4) b[::, 1]
[[ 9 10 11 12]
[21 22 23 24]
[33 34 35 36]] (3, 4) b[::, -1]
[[[ 1 2 3 4]
[ 5 6 7 8]]
[[13 14 15 16]
[17 18 19 20]]
[[25 26 27 28]
[29 30 31 32]]] (3, 2, 4) b[::, 0:2:]
============================================
[[ 1 5 9]
[13 17 21]
[25 29 33]] (3, 3) b[:, :, 0]
[[ 2 6 10]
[14 18 22]
[26 30 34]] (3, 3) b[:, :, 1]
[[ 4 8 12]
[16 20 24]
[28 32 36]] (3, 3) b[:, :, -1]
[[[ 1 2]
[ 5 6]
[ 9 10]]
[[13 14]
[17 18]
[21 22]]
[[25 26]
[29 30]
[33 34]]] (3, 3, 2) b[:, :, 0:2:]
Scipy
插值
# 三角函数插值
import numpy as np
from scipy import interpolate
import pylab as pl
x = np.linspace(0, 10, 11)
y = np.sin(x)
xnew = np.linspace(0, 10, 101)
pl.plot(x, y, 'ro')
list1 = ['linear', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic'] # zero, slinear, quadratic, cubic(0123次样条插值)
list2 = [0, 1, 2, 3]
for kind in list1:
print(kind)
f = interpolate.interp1d(x, y, kind=kind)
# f是一个函数,用这个函数就可以找插值点的函数值了:
ynew = f(xnew)
pl.plot(xnew, ynew, label=kind)
pl.legend(loc='lower right')
pl.show()
datetime
时间标签转换与修改
from datetime import datetime
now = datetime.now()
print(now.strftime('%a, %b %d %H:%M'))
cday = datetime.strptime('2017-8-1 18:20:20', '%Y-%m-%d %H:%M:%S')
print(cday)
# %%
from datetime import datetime, timedelta
now = datetime.now()
print(now, '现在时间')
now = now + timedelta(hours=10)
print(now, '+ 10 hours')
now = now - timedelta(days=1)
print(now, '- 1 day')
now = now + timedelta(days=2, hours=12)
print(now, '+ 2 day, + 12 hours')
print(datetime(2017, 5, 18, 16, 57, 3, 540997))
program
读取文件夹中所有csv并分别绘图
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
import pandas as pd
import os
'''
按文件夹下csv文件名依次读取数据,各自作图以判断数据整体状态特点
'''
file_dir = "F:/"
files = []
root = ''
for root, dirs, files in os.walk(file_dir, topdown=False):
print(root) # 当前目录路径
print(dirs) # 当前目录下所有子目录
print(files) # 当前路径下所有非目录子文件(文件名)
print(files.__len__()) # 子文件数目
print(files[0])
def pic(a, b, n): # 根据 a(列数据) 、n(序号)和 b(标签名) 显示图像
plt.plot(n, a, c='b', alpha=0.5, label='', linewidth=0.2) # 数组数据传给plot,设置界面参数
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 设置中文编码
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题/让负号正常显示
plt.title(b, fontsize=18)
plt.xlabel('', fontsize=12)
plt.ylabel('', fontsize=12)
x_major_locator = MultipleLocator(len(n)/20) # MultipleLocator()函数设置了x轴相邻显示点的间隔
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.grid() # 网格
plt.gcf().autofmt_xdate() # 自动旋转日期标记
plt.tick_params(labelsize=6) # 刻度值大小
plt.savefig('F:/'+header1+'.jpg')
plt.show() # 显示图形
for i in range(files.__len__()): #
data = pd.read_csv(root+'/'+files[i], encoding='GB18030', index_col=False) # encoding='GB18030'识别汉字表头;index_col=False 使得pandas不用第一列做索引(行名)
column_headers = list(data.columns.values)
data1 = data['值']
data1 = np.array(data1)
header1 = os.path.splitext(files[i])[0]
print(data1)
print(header1)
length = data1.__len__()
num = np.arange(1, length+1)
pic(data1, header1, num)