Unir datos de mimicIII a mimicII


In [1]:
import psycopg2
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig_size = [12,9]
plt.rcParams["figure.figsize"] = fig_size

In [2]:
def findAllSubject(dbname="mimic") :
    conn = psycopg2.connect("dbname="+dbname)
    cur = conn.cursor()
    select_stament = ("SELECT DISTINCT m.subject_id "
                      " FROM waveformqrst m"
    )
    cur.execute(select_stament)
    select = []
    for row in cur :
        subject_id=str(row[0]).zfill(5)
        select.append(("mimic2wdb/matched/s"+subject_id+"/s"+subject_id+"-",row[0]))
    cur.close()
    conn.close()
    return select

In [3]:
def notExistQRST(record):
    conn = psycopg2.connect("dbname=mimic")
    cur = conn.cursor()
    select_stament = "SELECT id FROM subjectrecord WHERE record LIKE '"+record+"%' LIMIT 1"
#    print(cur.mogrify(select_stament))
    cur.execute(select_stament)
    exist = cur.fetchone() is None
    conn.close()
    return exist

In [4]:
def difference(first,second):
    if first is None or second is None :
        return None
    else :
        return first-second

In [5]:
def getWaveFormqrst(subject_id,dbname="mimic") :
    conn = psycopg2.connect("dbname="+dbname)
    cur = conn.cursor()
    select_stament = ("SELECT subject_id,recorddate,q_i,q_amp,r_i,r_amp,s_i,s_amp,t_i,t_amp "
                      " FROM waveformqrst m WHERE m.subject_id = %s "
                      " ORDER BY subject_id,qrtsorder "
    )
#    print(cur.mogrify(select_stament,(subject_id,)))
    cur.execute(select_stament,(subject_id,))
    select = []
    for row in cur :
        subject_id = str(row[0]).zfill(5)
        recorddate = row[1]
        record = 'mimic3wdb/matched/s'+subject_id+'/s'+subject_id+'-'+recorddate
        select.append({'record':record,
                       'Q_s':row[2],'Q_a':row[3],
                       'R_s':row[4],'R_a':row[5],
                       'S_s':row[6],'S_a':row[7],
                       'T_s':row[8],'T_a':row[9]})
    cur.close()
    conn.close()
    return select

In [6]:
def moveWaves(wave):
    retorno = []
    for i in range(0,len(wave)-1) :
        r = wave[i+1]['R_s']
        q_s,r_s,s_s,t_s = wave[i+1]['Q_s'],wave[i]['R_s'],wave[i]['S_s'],wave[i]['T_s']
        q_a,r_a,s_a,t_a = wave[i+1]['Q_a'],wave[i]['R_a'],wave[i]['S_a'],wave[i]['T_a']
        qt,ts,sr = difference(q_s,t_s),difference(t_s,s_s),difference(s_s,r_s)
        diff = difference(r_s,r)
        if (qt is not None and qt>0 and qt<1000 and ts is not None and sr is not None and ts+sr<1000
            and diff is not None and diff <1000 and ts > 0 ):
            retorno.append({'record':wave[i]['record'],'Q_s':q_s,'Q_a':q_a,
                            'R_s':r_s,'R_a':r_a,
                            'S_s':s_s,'S_a':s_a,'T_s':t_s,'T_a':t_a,
                            'qt':qt,'ts':ts,'sr':sr})
    return retorno

In [17]:
def saveWave(waves,dbname="mimic") :
    conn = psycopg2.connect("dbname="+dbname)
    cur = conn.cursor()
    insert_statement= '''INSERT INTO rstq(record, r_s, r_a, s_s, s_a, t_s, t_a, q_s, q_a, qt, ts, sr)
    SELECT unnest( %(record)s ) ,
    unnest( %(r_s)s) , unnest( %(r_a)s), 
    unnest( %(s_s)s) , unnest( %(s_a)s), 
    unnest( %(t_s)s) , unnest( %(t_a)s), 
    unnest( %(q_s)s) , unnest( %(q_a)s),
    unnest( %(qt)s) , unnest( %(ts)s), unnest( %(sr)s) '''
    print(waves)
    record=[r['record'] for r in waves]
    r_s,r_a=[r['r_s'] for r in waves],[r['r_a'] for r in waves]
    s_s,s_a=[r['s_s'] for r in waves],[r['s_a'] for r in waves]
    t_s,t_a=[r['t_s'] for r in waves],[r['t_a'] for r in waves]
    q_s,q_a=[r['q_s'] for r in waves],[r['q_a'] for r in waves]
    qt,ts,sr=[r['qt'] for r in waves],[r['ts'] for r in waves],[r['sr'] for r in waves]
#    print(cur.mogrify(insert_statement,locals()))
    cur.execute(insert_statement,locals())
    conn.commit()
    cur.close()
    conn.close()

In [7]:
subjects = findAllSubject()

In [8]:
existentWaves = []
for row in subjects:
#    row = subjects[i]
    if notExistQRST(row[0]) :
        existentWaves.append(row[1])

In [18]:
cleanwaves = []
for ewaves in existentWaves:
    waves = getWaveFormqrst(ewaves)
    cleanwave = moveWaves(waves)
    saveWave(cleanwave)
    for wave in cleanwave:
        cleanwaves.append(wave)
qt = np.array([item['qt'] for item in cleanwaves])
ts = np.array([item['ts'] for item in cleanwaves])
sr = np.array([item['sr'] for item in cleanwaves])


{'T_a': 0.032, 'S_a': -0.0496, 'R_s': 16, 'R_a': 0.0992, 'T_s': 61, 'S_s': 28, 'sr': 12, 'qt': 35, 'Q_s': 96, 'record': 'mimic3wdb/matched/s16639/s16639-2108-09-27-16-33', 'Q_a': 0.0688, 'ts': 33}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-091deffb742b> in <module>()
      4     cleanwave = moveWaves(waves)
      5     for wave in cleanwave:
----> 6         saveWave(wave)
      7         cleanwaves.append(wave)
      8 qt = np.array([item['qt'] for item in cleanwaves])

<ipython-input-17-d3aca5fd33dd> in saveWave(waves, dbname)
     10     unnest( %(qt)s) , unnest( %(ts)s), unnest( %(sr)s) '''
     11     print(waves)
---> 12     record=[r['record'] for r in waves]
     13     r_s,r_a=[r['r_s'] for r in waves],[r['r_a'] for r in waves]
     14     s_s,s_a=[r['s_s'] for r in waves],[r['s_a'] for r in waves]

<ipython-input-17-d3aca5fd33dd> in <listcomp>(.0)
     10     unnest( %(qt)s) , unnest( %(ts)s), unnest( %(sr)s) '''
     11     print(waves)
---> 12     record=[r['record'] for r in waves]
     13     r_s,r_a=[r['r_s'] for r in waves],[r['r_a'] for r in waves]
     14     s_s,s_a=[r['s_s'] for r in waves],[r['s_a'] for r in waves]

TypeError: string indices must be integers

In [10]:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(ts,qt, sr)
plt.show()



In [11]:
fig = plt.figure()
ax = fig.add_subplot(221)
ax.set_title("qt/ts")
ax.set_xlabel("qt")
ax.scatter(qt,ts)
ax = fig.add_subplot(222)
ax.set_title("ts/sr")
ax.set_xlabel("ts")
ax.scatter(ts,sr)
ax = fig.add_subplot(223)
ax.set_title("sr/qt")
ax.set_xlabel("sr")
ax.scatter(sr,qt)
plt.show()



In [ ]: