首页 > 解决方案 > 从电生理图获得超极化深度

问题描述

我正在研究.abf格式的电生理数据。 在此处输入图像描述

我想获得如上图所示的超极化深度。这就是我到目前为止所做的;

import matplotlib.pyplot as plt
import pyabf
import pandas as pd
abf = pyabf.ABF("test.abf")
abf.setSweep(10) # I can access a given sweep. Here sweep 10
df = pd.DataFrame({'time': abf.sweepX, 'current':abf.sweepY})
df1 = df.loc[15650:15800]
df1.plot(x='time', y='current')

我正在考虑应用导数的变化来找到第一个兴趣点 (x1,y1),然后找到较低的点 (x2,y2),但它看起来很复杂。如果有人提供一些提示或程序,我将不胜感激。数据集如下,

time    current
0.7825  -63.323975
0.78255 -63.171387
0.7826  -62.89673
0.78265 -62.713623
0.7827  -62.469482
0.78275 -62.37793
0.7828  -62.10327
0.78285 -61.950684
0.7829  -61.76758
0.78295 -61.584473
0.783   -61.401367
0.78305 -61.24878
0.7831  -61.035156
0.78315 -60.85205
0.7832  -60.72998
0.78325 -60.516357
0.7833  -60.455322
0.78335 -60.2417
0.7834  -60.08911
0.78345 -59.96704
0.7835  -59.814453
0.78355 -59.661865
0.7836  -59.509277
0.78365 -59.417725
0.7837  -59.23462
0.78375 -59.11255
0.7838  -58.95996
0.78385 -58.86841
0.7839  -58.685303
0.78395 -58.59375
0.784   -58.441162
0.78405 -58.34961
0.7841  -58.19702
0.78415 -58.044434
0.7842  -57.922363
0.78425 -57.769775
0.7843  -57.678223
0.78435 -57.434082
0.7844  -57.34253
0.78445 -56.9458
0.7845  -56.274414
0.78455 -54.96216
0.7846  -53.253174
0.78465 -51.208496
0.7847  -48.950195
0.78475 -46.325684
0.7848  -43.09082
0.78485 -38.42163
0.7849  -31.036377
0.78495 -22.033691
0.785   -13.397217
0.78505 -6.072998
0.7851  -0.61035156
0.78515 2.7160645
0.7852  3.9367676
0.78525 3.4179688
0.7853  1.3427734
0.78535 -1.4953613
0.7854  -5.0964355
0.78545 -9.185791
0.7855  -13.641357
0.78555 -18.249512
0.7856  -23.132324
0.78565 -27.98462
0.7857  -32.714844
0.78575 -37.261963
0.7858  -41.47339
0.78585 -45.22705
0.7859  -48.553467
0.78595 -51.54419
0.786   -53.985596
0.78605 -56.18286
0.7861  -58.013916
0.78615 -59.539795
0.7862  -60.760498
0.78625 -61.88965
0.7863  -62.652588
0.78635 -63.323975
0.7864  -63.934326
0.78645 -64.2395
0.7865  -64.60571
0.78655 -64.78882
0.7866  -65.00244
0.78665 -64.971924
0.7867  -65.093994
0.78675 -65.03296
0.7868  -64.971924
0.78685 -64.819336
0.7869  -64.78882
0.78695 -64.66675
0.787   -64.48364
0.78705 -64.42261
0.7871  -64.2395
0.78715 -64.11743
0.7872  -63.964844
0.78725 -63.842773
0.7873  -63.659668
0.78735 -63.568115
0.7874  -63.446045
0.78745 -63.26294
0.7875  -63.171387
0.78755 -62.98828
0.7876  -62.89673
0.78765 -62.74414
0.7877  -62.713623
0.78775 -62.530518
0.7878  -62.438965
0.78785 -62.37793
0.7879  -62.25586
0.78795 -62.164307
0.788   -62.042236
0.78805 -62.01172
0.7881  -61.88965
0.78815 -61.88965
0.7882  -61.73706
0.78825 -61.706543
0.7883  -61.645508
0.78835 -61.61499
0.7884  -61.523438
0.78845 -61.462402
0.7885  -61.431885
0.78855 -61.340332
0.7886  -61.37085
0.78865 -61.279297
0.7887  -61.279297
0.78875 -61.157227
0.7888  -61.187744
0.78885 -61.09619
0.7889  -61.157227
0.78895 -61.12671
0.789   -61.09619
0.78905 -61.12671
0.7891  -61.00464
0.78915 -61.00464
0.7892  -60.97412
0.78925 -60.97412
0.7893  -60.943604
0.78935 -61.00464
0.7894  -60.913086
0.78945 -60.97412
0.7895  -60.943604
0.78955 -60.913086
0.7896  -60.943604
0.78965 -60.85205
0.7897  -60.85205
0.78975 -60.821533
0.7898  -60.88257
0.78985 -60.88257
0.7899  -60.913086
0.78995 -60.88257
0.79    -60.913086

标签: python-3.xpandasnumpy

解决方案


我们可以绘制current连续点之间的差异(这本质上是导数的常数因子,因为times 是均匀分布的)。第一张图表显示了实际diff的 s。基于此,我们可以设置一些阈值,例如0.3,并将其应用于过滤主 DataFrame。过滤后的值在第二个图表上以橙色显示:

fig, ax = plt.subplots(2, figsize=(8,8))

# plot derivative
df['current'].diff().plot(ax=ax[0])

# current
threshold = 0.4
df['filtered'] = df.loc[df['current'].diff().abs() > threshold]
df.plot(ax=ax[1])

# add spans
x = df['filtered'].dropna()
ax[1].axhspan(x.iloc[0], x.iloc[-1], alpha=0.3, edgecolor='skyblue', facecolor="none", hatch='////')
ax[1].axvspan(x.index.min(), x.index.max(), alpha=0.3, edgecolor='orange', facecolor="none", hatch='\\\\')

输出:

图片

如果您对范围值感兴趣,您可以dropna在过滤后的子集中查找值minmax从索引中查找和:

print('min', df['filtered'].dropna().index.min())
print('max', df['filtered'].dropna().index.max())

输出:

min 0.78445
max 0.7865

对于间隙的值,您可以使用:

abs(df['filtered'].dropna().iloc[-1] - df['filtered'].dropna().iloc[0])

输出:

7.6599100000000035

注意:我们也可以将这些跨度的左边缘作为点diff中的点低于阈值,diff而下一个点中的点高于阈值,右边缘也是如此。如果我们有多个峰值,这也将起作用:

threshold = 0.3

x = df['current'].diff().abs()

spanA = df.loc[(x < threshold) & (x.shift(-1) >= threshold)]
spanB = df.loc[(x >= threshold) & (x.shift(-1) < threshold)]

print(spanA)
         current
time            
0.7844 -57.34253

print(spanB)
         current
time            
0.7865 -64.60571

推荐阅读