2016-10-04 2 views
2

이 질문은 누락 된 데이터가있는 시계열에 어려움을 겪던 나 (Remapping `numpy.array` with missing values)의 이전 질문과 다소 관련이 있으며 누군가가 "팬더 사용!"이라고 제안했습니다.. 그래서 여기에 내가 간다 ...누락 된 데이터/레코드가있는 팬더 시간 시리즈 비교

나는 큰 데이터 세트를 다루고 있는데, 기본적으로 서로 다른 관찰 사이트의 시계열로 구성되어있다. 나는 통계적으로 사이트를 비교하고 싶다. 이 데이터 세트는 상당히 지저분합니다. 누락 된 데이터 (예 : -99으로 표시), 누락 된 시간 기록 (하나의 방송국은 시간 기록을 가질 수 있고, 다른 방송국은 없을 수도 있음) 및 데이터를 포함/비교하려는 경우 (1) 모든 사이트가 특정 변수에 대한 데이터를 가지고 있거나, 또는 (2) 내가 비교하고 싶은 두 사이트는 다른 사이트가 데이터를 가지고 있는지 여부를 무시하고 그 변수에 대한 데이터를 가지고 있습니다.

이 최소한의 예를 보자

-99이 누락 된 값을 나타냅니다
import pandas as pd 
from io import StringIO 

data = StringIO("""\ 
    1, 2001-01-01, 00:00, 1.0, 0.5, 1.0 
    1, 2001-01-01, 01:00, 1.1, 0.6, 2.0 
    1, 2001-01-01, 02:00, 1.2, 0.7, 3.0 
    1, 2001-01-01, 03:00, 1.3, 0.8, 4.0 

    2, 2001-01-01, 00:00, 2.0, -99, -99 
    2, 2001-01-01, 01:00, -99, 1.6, 2.0 
    2, 2001-01-01, 02:00, 2.2, 1.7, 3.0 
    2, 2001-01-01, 03:00, 2.3, 1.8, 4.0 

    3, 2001-01-01, 00:00, 3.0, 2.5, 1.0 
    3, 2001-01-01, 01:00, 3.1, 2.6, -99 
    3, 2001-01-01, 02:00, -99, -99, 3.0 
    3, 2001-01-01, 03:00, 3.3, 2.8, 4.0 
    3, 2001-01-01, 04:00, 3.4, 2.9, 5.0 
""") 

columns = ['id','date','time','T','Td','cc'] 
df = pd.read_table(data, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']]) 

. 서로 다른 사이트의 데이터 (열 , Td, cc)를 비교하고 싶습니다 (두 번째 또는 모두 id에 관심이있는 변수의 데이터가있는 경우에만 언급 됨). 다른 열의 데이터가 누락되었습니다). 이 예를 들어, 그래서

, 모든 사이트 중 하나 id=2 또는 id=3T, 그리고 마지막 레코드가 없습니다 만 다른 시간에 있기 때문에, 2001-01-01, 00:0003:00에서 데이터를 비교 초래 T을 비교, 데이터를해야하는 경우 id=3은 다른 id에 완전히 없습니다.

나는 몇 시간 동안이 게임을 해왔지만 솔직히 나는 어디서부터 시작해야할지 몰라. 위에서 설명한 기준을 사용하여 n_sites x n_valid_values (이 예에서는 3x2)의 numpy.array을 추출 할 수 있습니까? 그렇다면 추가 분석에 사용할 수 있습니까?

부분으로 편집하지만 정말 (정말) 추한 솔루션은이 같은 뭔가가 작동하는 것 같다 :

# Loop over all indexes where T is nan: 
for i in np.where(df['T'].isnull())[0]: 
    # For each of them, set records with the same date_time to nan 
    j = np.where(df['date_time'] == df['date_time'][i])[0] 
    df['T'][j] = np.nan 
# Drop all records where T is nan 
df2 = df.dropna(subset=['T']) 

# Group by the different stations: 
g = df2.groupby('id') 

# Get the arrays (could automate this based on the unique id's): 
v1 = g.get_group(1)['T'] 
v2 = g.get_group(2)['T'] 
v3 = g.get_group(3)['T'] 

을하지만 여전히 id=3, date_time=2001-01-01, 04:00에 대한 기록을 드롭하지 않으며, 나는 Pandas으로 더 우아한 방법이 있다고 생각합니다.

+0

왜이'2, 2001-01-01, 00:00, 2.0, -99, -99' -99는 괜찮습니까? – Boud

+0

이 경우 나는 'T' 열에 데이터가 있는지 여부에 관심이 있습니다. 다른 열은 무시합니다. – Bart

답변

0
(이를 바탕 : https://stackoverflow.com/a/34985243/3581217 답) 한 가지 방법

작동하는 것 같다 중 모든 열을 subset 세트 또는 두 사이트 I와 다음 다른 사이트에서 관찰이 다른 컬럼을 가지고 Dataframe하는 dropna()을 만드는 것입니다 비교를 원하면 데이터가없는 모든 행을 삭제합니다.

import pandas as pd 
import numpy as np 
from io import StringIO 

data1 = StringIO("""\ 
    1, 2001-01-01, 00:00, 1.0 
    1, 2001-01-01, 01:00, 1.1 
    1, 2001-01-01, 02:00, 1.2 
    1, 2001-01-01, 03:00, 1.3 
""") 

data2 = StringIO("""\ 
    2, 2001-01-01, 00:00, 2.0 
    2, 2001-01-01, 01:00, -99 
    2, 2001-01-01, 02:00, 2.2 
    2, 2001-01-01, 03:00, 2.3 
""") 

data3 = StringIO("""\ 
    3, 2001-01-01, 00:00, 3.0 
    3, 2001-01-01, 01:00, 3.1 
    3, 2001-01-01, 02:00, -99 
    3, 2001-01-01, 03:00, 3.3 
    3, 2001-01-01, 04:00, 3.4 
""") 

columns = ['id','date','time','T1'] 
df1 = pd.read_table(data1, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']]) 
columns = ['id','date','time','T2'] 
df2 = pd.read_table(data2, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']]) 
columns = ['id','date','time','T3'] 
df3 = pd.read_table(data3, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']]) 

df = pd.concat([df1,df2,df3]).groupby('date_time').max() 
df = df.dropna(subset=['T1','T2','T3']) 

Dataframe을 결과하는 것은 다음과 같습니다

In [234]: df 
Out[234]: 
         T1 T2 T3 id 
date_time        
2001-01-01 00:00:00 1.0 2.0 3.0 3 
2001-01-01 02:00:00 1.2 2.2 NaN 3 
2001-01-01 03:00:00 1.3 2.3 3.3 3 

이 있습니다 :

In [232]: df 
Out[232]: 
         T1 T2 T3 id 
date_time        
2001-01-01 00:00:00 1.0 2.0 3.0 3 
2001-01-01 03:00:00 1.3 2.3 3.3 3 

그리고 나는 df.dropna(subset=['T1','T2']) 결과이 경우 T3에 무시하고, 두 사이트를 비교하려는 경우 갈 길? 아직도 약간의 팬더가 아니라고 느낀다. ..?