在 pandas 数据帧列中检测可变长度模式
Detection of variable length pattern in pandas dataframe column
时间序列索引数据帧的最后两列标识开始('A' 或 'AA' 或 'AAA')、结束('F' 或 'FF'或 'FFF') 和持续时间(开始和结束之间的行数),它们看起来像这样:
并且A-F序列或者它们之间的n个序列是可变长度的。
如何识别这些模式并为每个模式计算相应行的其他列的平均值?
我非常糟糕地尝试做以下事情:
import pandas as pd
import xlrd
##### EXCEL LOAD
filepath= 'H:\CCGT GE startup.xlsx'
df = pd.read_excel(filepath,sheet_name='Sheet1',header=0,skiprows=0,parse_cols='A:CO',index_col=0)
df = df.sort_index() # set increasing time index, source data is time decreasing
gas=[]
for i,row in df.iterrows():
if df['FLAG STARTUP TG1'] is not 'n':
while 'F' not in df['FLAG STARTUP TG1']:
gas.append(df['PORTATA GREZZA TG1 - m3/h'])
gas.append(i)
但是脚本卡在了第一个 if(与 'n' 条件不匹配并继续追加同一行,i 对)。此外,我的方法在排除仍然属于同一进程的最后 'F' 行时也是错误的,应将其视为其中的一部分!
p.s。前 1000 行 df 在这里 http://www.filedropper.com/ccgtgestartup1000
p.p.s。除了不起作用之外,我的方法在排除仍然属于同一进程的最后 'F' 行方面也是错误的,应将其视为其中的一部分!
p.p.p.s。 2 列引用 2 个不同的 processes/machines 并且不相关(几乎,稍后会详细介绍),我想对两者进行相同的分析(它们将引用不同列的平均值)。第一个 "A" 字符串标记进程的开始并重复,直到最后一个用 'F' 字符串标记的时间戳。在原始文件中,时间戳是递减的,这就是我使用 sort_index() 方法的原因。字符串长度取决于其他列值,但明显的 FLAG 列相关性仅在 3 个字符串 'AAA'&'FFF' 中,因为只有当 2 个进程从每个进程的 +-1 时间戳开始时才会发生这种情况其他。
这就是我设法获得所需结果的方法(N.B。后来我决定只对单个字符 'A'-->'F' 序列感兴趣)
import pandas as pd
import numpy as np
##### EXCEL LOAD
filepath= 'H:\CCGT GE startup.xlsx'
df = pd.read_excel(filepath,sheet_name='Sheet1',header=0,skiprows=0,parse_cols='A:CO',index_col=0)
df = df.sort_index() # set increasing time index, source data is time decreasing
tg1 = pd.DataFrame(index=df.index.copy(),columns=['counter','flag','gas','p','raw_p','tv_p','lhv','fs'])
k = 0
for i,row in df.iterrows():
if 'A' == str(row['FLAG STARTUP TG1']):
tg1.ix[i,'flag']=row['FLAG STARTUP TG1']
tg1.ix[i,'gas']=row['Portata gas naturale']
tg1.ix[i,'counter']=k
tg1.ix[i,'fs']=row['1FIRED START COUNT - N°']
tg1.ix[i,'p']=row['POTENZA ATTIVA MONTANTE 1 SU 400 KV - MW']
tg1.ix[i,'raw_p']=row['POTENZA ATTIVA MONTANTE 1 SU 15 KV - MW']
tg1.ix[i,'tv_p']=row['POTENZA ATTIVA MONTANTE TV - MW']
tg1.ix[i,'lhv']=row['LHV - MJ/Sm3']
elif 'F' == str(row['FLAG STARTUP TG1']):
tg1.ix[i,'flag']=row['FLAG STARTUP TG1']
tg1.ix[i,'gas']=row['Portata gas naturale']
tg1.ix[i,'counter']=k
tg1.ix[i,'fs']=row['1FIRED START COUNT - N°']
tg1.ix[i,'p']=row['POTENZA ATTIVA MONTANTE 1 SU 400 KV - MW']
tg1.ix[i,'raw_p']=row['POTENZA ATTIVA MONTANTE 1 SU 15 KV - MW']
tg1.ix[i,'tv_p']=row['POTENZA ATTIVA MONTANTE TV - MW']
tg1.ix[i,'lhv']=row['LHV - MJ/Sm3']
k+=1
tg1 = tg1.dropna(axis=0)
tg1 = tg1[tg1['gas'] != 0] #data where gas flow measurement is missing is dropped
tg1 = tg1.convert_objects(convert_numeric=True)
#timestamp count for each startup for duration calculation
counts = pd.DataFrame(tg1['counter'].value_counts(),columns=['duration'])
counts['start']=counts.index
counts = counts.set_index(np.arange(len(tg1['counter'].value_counts())))
tg1 = tg1.merge(counts,how='inner',left_on='counter',right_on='start')
# filter out non pertinent startups (too long or too short)
tg1 = tg1[tg1['duration'].isin([6,7])]
#calculate thermal input per start (process)
table = tg1.groupby(['counter']).mean()
table['t_in']=table.apply((lambda row: row['gas']*row['duration']*0.25*row['lhv']/3600),axis=1)
欢迎在迭代中进行计算并避免所有 "prep- work" 之后的任何改进和建议。
时间序列索引数据帧的最后两列标识开始('A' 或 'AA' 或 'AAA')、结束('F' 或 'FF'或 'FFF') 和持续时间(开始和结束之间的行数),它们看起来像这样:
并且A-F序列或者它们之间的n个序列是可变长度的。
如何识别这些模式并为每个模式计算相应行的其他列的平均值?
我非常糟糕地尝试做以下事情:
import pandas as pd
import xlrd
##### EXCEL LOAD
filepath= 'H:\CCGT GE startup.xlsx'
df = pd.read_excel(filepath,sheet_name='Sheet1',header=0,skiprows=0,parse_cols='A:CO',index_col=0)
df = df.sort_index() # set increasing time index, source data is time decreasing
gas=[]
for i,row in df.iterrows():
if df['FLAG STARTUP TG1'] is not 'n':
while 'F' not in df['FLAG STARTUP TG1']:
gas.append(df['PORTATA GREZZA TG1 - m3/h'])
gas.append(i)
但是脚本卡在了第一个 if(与 'n' 条件不匹配并继续追加同一行,i 对)。此外,我的方法在排除仍然属于同一进程的最后 'F' 行时也是错误的,应将其视为其中的一部分!
p.s。前 1000 行 df 在这里 http://www.filedropper.com/ccgtgestartup1000
p.p.s。除了不起作用之外,我的方法在排除仍然属于同一进程的最后 'F' 行方面也是错误的,应将其视为其中的一部分!
p.p.p.s。 2 列引用 2 个不同的 processes/machines 并且不相关(几乎,稍后会详细介绍),我想对两者进行相同的分析(它们将引用不同列的平均值)。第一个 "A" 字符串标记进程的开始并重复,直到最后一个用 'F' 字符串标记的时间戳。在原始文件中,时间戳是递减的,这就是我使用 sort_index() 方法的原因。字符串长度取决于其他列值,但明显的 FLAG 列相关性仅在 3 个字符串 'AAA'&'FFF' 中,因为只有当 2 个进程从每个进程的 +-1 时间戳开始时才会发生这种情况其他。
这就是我设法获得所需结果的方法(N.B。后来我决定只对单个字符 'A'-->'F' 序列感兴趣)
import pandas as pd
import numpy as np
##### EXCEL LOAD
filepath= 'H:\CCGT GE startup.xlsx'
df = pd.read_excel(filepath,sheet_name='Sheet1',header=0,skiprows=0,parse_cols='A:CO',index_col=0)
df = df.sort_index() # set increasing time index, source data is time decreasing
tg1 = pd.DataFrame(index=df.index.copy(),columns=['counter','flag','gas','p','raw_p','tv_p','lhv','fs'])
k = 0
for i,row in df.iterrows():
if 'A' == str(row['FLAG STARTUP TG1']):
tg1.ix[i,'flag']=row['FLAG STARTUP TG1']
tg1.ix[i,'gas']=row['Portata gas naturale']
tg1.ix[i,'counter']=k
tg1.ix[i,'fs']=row['1FIRED START COUNT - N°']
tg1.ix[i,'p']=row['POTENZA ATTIVA MONTANTE 1 SU 400 KV - MW']
tg1.ix[i,'raw_p']=row['POTENZA ATTIVA MONTANTE 1 SU 15 KV - MW']
tg1.ix[i,'tv_p']=row['POTENZA ATTIVA MONTANTE TV - MW']
tg1.ix[i,'lhv']=row['LHV - MJ/Sm3']
elif 'F' == str(row['FLAG STARTUP TG1']):
tg1.ix[i,'flag']=row['FLAG STARTUP TG1']
tg1.ix[i,'gas']=row['Portata gas naturale']
tg1.ix[i,'counter']=k
tg1.ix[i,'fs']=row['1FIRED START COUNT - N°']
tg1.ix[i,'p']=row['POTENZA ATTIVA MONTANTE 1 SU 400 KV - MW']
tg1.ix[i,'raw_p']=row['POTENZA ATTIVA MONTANTE 1 SU 15 KV - MW']
tg1.ix[i,'tv_p']=row['POTENZA ATTIVA MONTANTE TV - MW']
tg1.ix[i,'lhv']=row['LHV - MJ/Sm3']
k+=1
tg1 = tg1.dropna(axis=0)
tg1 = tg1[tg1['gas'] != 0] #data where gas flow measurement is missing is dropped
tg1 = tg1.convert_objects(convert_numeric=True)
#timestamp count for each startup for duration calculation
counts = pd.DataFrame(tg1['counter'].value_counts(),columns=['duration'])
counts['start']=counts.index
counts = counts.set_index(np.arange(len(tg1['counter'].value_counts())))
tg1 = tg1.merge(counts,how='inner',left_on='counter',right_on='start')
# filter out non pertinent startups (too long or too short)
tg1 = tg1[tg1['duration'].isin([6,7])]
#calculate thermal input per start (process)
table = tg1.groupby(['counter']).mean()
table['t_in']=table.apply((lambda row: row['gas']*row['duration']*0.25*row['lhv']/3600),axis=1)
欢迎在迭代中进行计算并避免所有 "prep- work" 之后的任何改进和建议。