0.前言
虽说python运行速度慢,但其编程速度,第三方包的丰富度是真的高。 涉及到文件批处理还是会选择python。
1. 动态文件名
在文件批处理中,文件名经常只有编号是不同的,可以通过给字符串传递不同的编号来获取动态文件名。
file_num = 324
for i in range(file_num):
file_name = "正常数据\\{}.正常.txt".format(i + 1)
...
2. 将文件转换为csv格式
一般数据提供者为了节省存储空间,都会通过规定的格式存储到txt文件中,这种格式对计算机可能并不友好。而逗号文件csv格式可以轻松被numpy、pandas等数据处理包读取。 首先通过逐行读取获取每行数据(大部分数据文件都是每行格式相同,如果数据只有一行,可以全部读取或者逐字符读取),之后通过line.replace(’\n’, ‘’)将每行的换行符删除,以免最后得到的csv文件有空行。 使用line.split(’:’)将字符串分解为多个字段。 通过csv.writer写入整行。
import csv
outFile = open(file_path + outFile_name, 'w', encoding='utf-8', newline='' "")
csv_writer = csv.writer(outFile)
with open(file_path + file_name, "r") as f:
index = 0
for line in f:
if index == 0:
csv_writer.writerow(['T', 'TimeStamp', 'RangeReport', 'TagID', 'AnchorID',
'ranging', 'check', 'SerialNumber', 'DataID'])
index = index + 1
continue
line = line.replace('\n', '')
str = line.split(':')
csv_writer.writerow(str)
3. 初步处理csv文件
一开始得到的csv文件往往是我们不想要的,需要进行简单的处理。 例如我想将四行数据合并为一行。 使用pandas读取csv文件为一个表df。将希望生成的格式简单做一个有标题、有一行数据的文件,读取为另一个表df2. 可以使用
del df['T']
来删除指定的列。
可以通过
df2.loc[row] = list
来确定新文件的一行数据。pandas访问行数据
import pandas as pd
df = pd.read_csv(file_path + file_name)
del df['T']
del df['RangeReport']
del df['TagID']
del df['AnchorID']
df2 = pd.read_csv(file_path + "合并格式.csv")
for row in range(int(df.shape[0]/4)):
list = [3304,229,90531088,90531088,90531088,90531088,760,760,760,760,760,760,760,760]
list[0] = df['DataID'][row*4]
list[1] = df['SerialNumber'][row*4]
list[2] = df['TimeStamp'][row*4+0]
list[3] = df['TimeStamp'][row*4+1]
list[4] = df['TimeStamp'][row*4+2]
list[5] = df['TimeStamp'][row*4+3]
list[6] = df['ranging'][row*4+0]
list[7] = df['check'][row*4+0]
list[8] = df['ranging'][row*4+1]
list[9] = df['check'][row*4+1]
list[10] = df['ranging'][row*4+2]
list[11] = df['check'][row*4+2]
list[12] = df['ranging'][row*4+3]
list[13] = df['check'][row*4+3]
df2.loc[row] = list
df2.to_csv(file_path+contact_name)
4. 获取部分数据
可以通过
df0 = df.iloc[:, 3:7]
或者
df0 = df[["check0","check1","check2","check3"]]
来获取一个表的某几列。
5. 数据间的格式转换
一般会在list、numpy、pandas三种格式间进行数据转换。 自己创建数据时,经常使用
y_show = []
y_show.append(n_clusters_)
维度调整好后,可以是一维或者多维,再转换为numpy或者pandas。 其中转换成numpy的方法如下
y = np.array(y_show)
6. 离群点、重合点的处理
使用DBSCAN算法进行聚类。具体算法描述随便搜就有。 有两个重要参数,一个是聚类半径,另一个是最小邻居数。 指定较大半径以及较大邻居数可以筛选出离散点。 指定较小半径可以筛选出重合点、相似点。 代码如下,使用一个n*m的numpy矩阵作为输入,对m维的点进行聚类。 通过一通操作获取labels,是一个map,key值为int数值,-1,0,1,2…。-1代表离群点,其他代表第几簇。value是一个list,代表各簇的点的下标。
from sklearn.cluster import DBSCAN
y = df[["d0","d1","d2","d3"]].to_numpy()
db = DBSCAN(eps=3, min_samples=2).fit(y)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
7. 数据绘制
绘制二维的比较简单,这里只贴上三维绘制代码
import matplotlib.pyplot as plt
import pandas as pd
from mpl_toolkits.mplot3d import axes3d
df = pd.read_csv(file_path+file_name)
x1 = df["x"].to_numpy()
y1 = df["y"].to_numpy()
z1 = df["z"].to_numpy()
df = pd.read_csv(file_path+file_name2)
x2 = df["x"].to_numpy()
y2 = df["y"].to_numpy()
z2 = df["z"].to_numpy()
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
figure2 = ax.plot(x2, y2, z2, c='r')
ax.set_xlim(0, 7000)
ax.set_zlim(0, 3000)
plt.show()
8. numpy的矩阵运算
Zk = Zk.astype(float)
np.linalg.norm(a-b)
np.matmul(A, B)
np.linalg.inv(A)
np.eye(dims)
Zk = Zk.T
9. 保存文件
可以使用csv writerow存文件,见1. 也可以使用numpy或者pandas保存文件。 如果直接使用pandas的
df2.to_csv(file_path+contact_name)
保存文件,会额外保存一行index。可以通过参数,index=False来控制。 如果还有其他要求可以查阅pd.to_csv
也可使用numpy,将一个numpy类型数据通过指定格式存文件。这里一般要指定格式,否则有可能会存成自己不希望的类型。
np.savetxt(file_path + "异常数据.txt", np.array(y_show,dtype=np.int16), fmt="%d")
|