鱼C论坛

 找回密码
 立即注册
查看: 2176|回复: 14

数据处理分析

[复制链接]
发表于 2017-2-14 16:26:50 | 显示全部楼层 |阅读模式
23鱼币
左边的数据是时间,右边的数据是信号强度。作图出来是这样的情况:

我需要截取时间大于0,并且回升幅度在20到80%的信号(例如信号如果在16到18,那么我需要的信号就是(16+(18-16)*0.2,16+(18-16)*0.8)也就是(16.4,17.6)这段区间。截取完数据之后对选出来的原始数据按照公式=LN(LOG10((前两百次信号平均-自己设定的一个常数a)/(某次信号-常数a)))对信号进行下一步处理得到我需要的数据A,最后用数据A对时间作图,线性拟合然后得出曲线的斜率和相关系数。

本来我可以用EXCEL解决的,但是无奈数据太多了(要对10000个左右的EXCEL做这样的机械操作,吃不消),求大神指点一下。最近为了这个问题到处找,也是为了这个才开始学PYTHON,充值成为VIP的,我把自己全部的鱼币都拿出来了,希望能得到解答。


刚才在论坛里面找到了一个“python读取txt数据文件并作图”的帖子,代码如下:
import numpy as np
import matplotlib.pyplot as plt

path = "E:\\data.txt" # 文件路径
f = open(path) #打开文件
content = f.read().splitlines() # 读取并分割行,splitlines()默认按照'\n'分割
head = content[0] # 每列的head,如果没有head,此行可忽略
data_str = content[1:] # 此时数据以字符串的形式存入一个列表
data_num = [[]]*len(data_str) # 创建一个空列表,用以装入转后后的数据

# for循环用以将字符串形式的数据转换成数字,这一步结束就已经完成了转换了
# 转换后的数据存储在data_num中
for i in range(len(data_str)):
    data_num = [float(x) for x in data_str.split(',')]

# 下面是利用numpy和matplotlib.pyplot进行数组转换和画图
data_array = np.array(data_num) # 将数据转换成二维数组

# 下面将二维数组中的每一列存储到一个列向量中,以备画图
lamda = data_array[:, 0]
s_lamda = data_array[:, 1]
n_bulk = data_array[:, 2]
k_bulk = data_array[:, 3]
n_1L = data_array[:, 4]
k_1L = data_array[:, 5]
n_si = data_array[:, 6]
k_si = data_array[:, 7]

# 下面是创建图形,并作图;利用上面的lamda作为x坐标轴,其余数据作为y,进行画图。
plt.figure()
plt.plot(lamda, s_lamda)
plt.figure()
plt.plot(lamda, n_bulk, lamda, k_bulk, lamda, n_1L, lamda, k_1L)
plt.figure()
plt.plot(lamda, n_si, lamda, k_si)
plt.show()
不过我把代码用来尝试的时候却出现了问题(红字处)无法转换成浮点数。
picture-90844d6e866ce3164eaf0386fd4bf2f9.jpg
picture-72675530d008c406e24547805de48265.jpg

最佳答案

查看完整内容

你的问题主要出在split('\t')和文件内容不一致的地方 因为你是截图,我不知道你这个txt的编码方式还有每行的换行符是什么 我给你个例子参考一下 比如我有这么个test.txt文件 我在输入时采用了tab间隔,但是每个间隔因为数据位数不一致导致长短不一,你单纯用split('\t')不能很好的分割出来 我可以这么做: split()缺省参数时会将所有连续的white space视为分隔符,这样转换float就不会出错了 还可以看一下这几个变 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-14 16:26:51 | 显示全部楼层
本帖最后由 DarkmasterSugar 于 2017-2-15 12:43 编辑

你的问题主要出在split('\t')和文件内容不一致的地方
因为你是截图,我不知道你这个txt的编码方式还有每行的换行符是什么
我给你个例子参考一下

比如我有这么个test.txt文件
  1. -0.1    18.1
  2. -0.2    18.21
  3. -0.3    18.3
  4. -0.35   18.2
  5. -0.4    18.18
复制代码

我在输入时采用了tab间隔,但是每个间隔因为数据位数不一致导致长短不一,你单纯用split('\t')不能很好的分割出来
我可以这么做:
  1. import numpy as np
  2. import matplotlib.pyplot as plt

  3. with open("F:\\file_py_project\\plot\\test.txt") as f:
  4.     data_str=[eachline.split() for eachline in f]
  5. x_str, y_str = zip(*data_str)
  6. x_numeric = np.array([float(x) for x in x_str])
  7. y_numeric = np.array([float(y) for y in y_str])

  8. fig, ax = plt.subplots()
  9. ax.plot(x_numeric, y_numeric)
  10. plt.show()
复制代码


split()缺省参数时会将所有连续的white space视为分隔符,这样转换float就不会出错了
还可以看一下这几个变量里面存放的内容
dataset.jpg
绘制的图
figure_1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-14 20:48:50 | 显示全部楼层
一点建议:
1. 首先,我从头看到尾,感觉你的问题描述的很模糊,你到底遇到了什么难题?
代码报错了?你的报错信息在哪里?你自己的代码在哪里?(这段代码明显不是用来解决你描述的什么信号处理的,原封不动套用别人的代码显然是不可行的)
2. 数据的预处理本身就是数值计算工作很重要的一个环节,你用.txt存储数据当然可以,但是你的文档内容比较混乱(至少在你贴出来的图上,我不知道这些数据怎么读,又是字符又是时间的),可以copy一份txt然后把少量没用的英文字符去掉,之后代码处理起来也方便
3. 根据你需求描述,你可能需要最小二乘线性回归来拟合,那么简单的plt.plot()是不能直接用的,这只是最基本的绘制折线图函数,采用的是两点线性插值的方法,你用这个是求不出斜率的

另,代码用代码格式发。只有把问题描述清楚了,别人才好帮助你,不然怎么下手?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-14 21:24:40 From FishC Mobile | 显示全部楼层
要画图必然是numpy+matplotlib啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-14 21:26:43 From FishC Mobile | 显示全部楼层
线性规划也有专门的模块啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-14 22:05:49 | 显示全部楼层
我可能问题没有说的太清楚,首先我自己还只是刚刚开始在学,而且时间有点紧(要发文章)。
先说一下我的目的:
(1)把数据从txt文件拷贝下来,并按照列分成x轴,y轴的数据。
(2)按照要求截取自己需要的数据(x>0,y取信号强度在20%到80%的)
(3)讲截取筛选出来的数据按照公式进行处理,并把处理的结果列成y1。
(4)用y1和x的数据进行线性拟合,得到斜率和相关系数R。
  1. import numpy as np
  2. path = "E:\\33.txt"
  3. f = open(path)
  4. content = f.read().splitlines()
  5. data_str = content[1:]
  6. data_num = [[]]*len(data_str)
  7. for i in range(len(data_str)):
  8.     data_num[i] = [float(x) for x in data_str[i].split('\t')]
  9. data_array = np.array(data_num)
  10. print(data_num)
复制代码

听了楼上的朋友说的有道理,我把前面的标题删了,只留下数据。
首先我是打算先试试把TXT数据拷出来,但是按照这个代码的方法会出现如下错误:
ValueError: could not convert string to float:
我的数据情况就是这样的(图一):
想问一下这个是什么情况?




图一

图一
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-15 15:28:45 | 显示全部楼层
DarkmasterSugar 发表于 2017-2-15 11:41
你的问题主要出在split('\t')和文件内容不一致的地方
因为你是截图,我不知道你这个txt的编码方式还有每行 ...

谢谢,虽然问题还是没有解决完,但是已经开始变得可能了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-15 16:40:38 | 显示全部楼层
晕了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-15 17:17:51 | 显示全部楼层
DarkmasterSugar 发表于 2017-2-15 11:41
你的问题主要出在split('\t')和文件内容不一致的地方
因为你是截图,我不知道你这个txt的编码方式还有每行 ...

我一开始放到我截取的一段数据可行,但是当我放我的原始数据又试了一下之后发现如下错误:
CIM8SEUKI7GDW5GHX@HO7BD.png
应该是数据太多导致内存不够的问题吧?这个问题有办法解决吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-15 18:15:56 | 显示全部楼层
txckl 发表于 2017-2-15 17:17
我一开始放到我截取的一段数据可行,但是当我放我的原始数据又试了一下之后发现如下错误:

应该是数据 ...

我代码里的*号是有意义的
zip(*data_str)是用来把data_str中各个元组拆出来的,不要把*去掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-15 20:08:23 | 显示全部楼层
DarkmasterSugar 发表于 2017-2-15 18:15
我代码里的*号是有意义的
zip(*data_str)是用来把data_str中各个元组拆出来的,不要把*去掉

我加上了*输出的结果是这样的:
ValueError: not enough values to unpack (expected 2, got 0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-15 20:17:56 | 显示全部楼层
本帖最后由 DarkmasterSugar 于 2017-2-15 21:15 编辑
txckl 发表于 2017-2-15 20:08
我加上了*输出的结果是这样的:
ValueError: not enough values to unpack (expected 2, got 0)


把你的txt文件传上来
或者发我邮箱:******@qq.com
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-15 21:11:13 | 显示全部楼层
DarkmasterSugar 发表于 2017-2-15 20:17
把你的txt文件传上来
或者发我邮箱:

好的,我现在就发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-18 15:05:42 | 显示全部楼层
跟着大牛们学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-18 16:45:12 | 显示全部楼层
进来瞧一瞧,学习了!支持楼主 !
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 23:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表