pandas数据帧列中可变长模式的检测

2024-04-27 03:17:42 发布

您现在位置:Python中文网/ 问答频道 /正文

timeseries索引数据帧的最后2列标识物理进程的开始(“a”或“AA”或“AAA”)、结束(“F”或“FF”或“FFF”)和持续时间(开始和结束之间的行数),它们如下所示:

enter image description here

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'条件不匹配并一直追加同一行,我配对)时卡住了。另外,我的方法在排除最后一个“F”行时也是错误的,它仍然属于同一个进程,应该被视为它的一部分!在

另外,前1000行df在这里http://www.filedropper.com/ccgtgestartup1000

p.p.s.除了不起作用外,我的方法也错误地排除了最后一行“F”,它仍然属于同一个进程,应该被视为它的一部分!在

p.p.p.s.这两列指的是两个不同的进程/机器,它们是不相关的(稍后会有更多的讨论),我想对这两个列做同样的分析(它们将引用不同列的平均值)。第一个“A”字符串标记进程的开始,并重复到最后一个用“F”字符串标记的时间戳。在原始文件中,时间戳是递减的,这就是我使用sort_index()方法的原因。字符串长度取决于其他列的值,但明显的标志列相关性仅存在于3个字符字符串“AAA”和“FFF”中,因为只有当两个进程以彼此的+-1时间戳开始时才会发生这种情况。在


Tags: 方法字符串importdfindexfff进程时间
1条回答
网友
1楼 · 发布于 2024-04-27 03:17:42

这就是我如何设法得到想要的结果的方法(注意,我后来决定只有单个字符'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)

任何在迭代中进行计算并避免所有“准备工作”的改进和建议都是受欢迎的。在

相关问题 更多 >