2015-09-04 2 views
1

Я использую Python и Pandas для анализа серии данных. Мой DF выглядит так:Недостающие значения во временных рядах

      ActivePowerkW WindSpeedms WindSpeedmsstd 
time                
    2015-05-26 11:40:00  836.6328  8.234862  1.414558 
    2015-05-26 11:50:00  968.5992  8.761620  1.572579 
    2015-05-26 12:30:00  614.0503  7.267871  1.575504 
    2015-05-26 13:50:00  945.5604  8.709115  1.527079 
    2015-05-26 14:00:00  926.6531  8.538967  1.589221 
    2015-05-26 14:30:00  666.7984  7.590645  1.324495 
    2015-05-26 14:40:00  911.0134  8.466603  1.708189 
    2015-05-26 15:10:00  1256.1740  9.868224  1.636775 
    2015-05-26 15:30:00  1706.7070 11.225540  1.576277 

Нулевые значения опущены. Я хотел бы подсчитать все нулевые значения в процентах ежемесячно.

Я думал, что самый простой способ будет создавать новые временные ряды

timeseries_comp = pd.date_range(df.index[0], df.index[df_length], freq='10min') 

, а затем совместите это с моей ФР

dif = df.align(timeseries_comp) 

, а затем просто сосчитать NAN. Это не работает. Выровнять ошибку unsupported type.

То, что я, наконец, после того, как что-то вроде следующего

Availability

Любые идеи?

+2

Вы пробовали переиндексации? поэтому 'df.reindex (timeseries_comp)' – EdChum

+0

Спасибо. reindex делает именно то, что я хочу. Теперь мне нужно рассчитывать ежемесячно. Я попробовал 'Avail_Count = df.resample ('M', how = {df.count(): 'count'})' и, похоже, работает, но я не о результатах. – ardms

+0

Вы должны иметь возможность делать df.reindex (timeseries_comp) .groupby ([df.index.year, df.index.month]). Value_counts (drop_na = False) 'это должно дать вам все уникальные значения, включая' NaN' , или, может быть, 'df.reindex (timeseries_comp) .groupby ([df.index.year, df.index.month]). apply (pd.Series.isnull) .sum()' – EdChum

ответ

0

ОК, я бы reindex используя ваши time_series, затем groupby на индексе, а затем применить isnull и вызовите sum:

In [113]: 
# load your data, you can ignore this step 
t="""time,ActivePowerkW,WindSpeedms,WindSpeedmsstd 
2015-05-26 11:40:00,836.6328,8.234862,1.414558 
2015-05-26 11:50:00,968.5992,8.761620,1.572579 
2015-05-26 12:30:00,614.0503,7.267871,1.575504 
2015-05-26 13:50:00,945.5604,8.709115,1.527079 
2015-05-26 14:00:00,926.6531,8.538967,1.589221 
2015-05-26 14:30:00,666.7984,7.590645,1.324495 
2015-05-26 14:40:00,911.0134,8.466603,1.708189 
2015-05-26 15:10:00,1256.1740,9.868224,1.636775 
2015-05-26 15:30:00,1706.7070,11.225540,1.576277""" 
df = pd.read_csv(io.StringIO(t), parse_dates=[0], index_col=[0]) 
df 
Out[113]: 
        ActivePowerkW WindSpeedms WindSpeedmsstd 
time               
2015-05-26 11:40:00  836.6328  8.234862  1.414558 
2015-05-26 11:50:00  968.5992  8.761620  1.572579 
2015-05-26 12:30:00  614.0503  7.267871  1.575504 
2015-05-26 13:50:00  945.5604  8.709115  1.527079 
2015-05-26 14:00:00  926.6531  8.538967  1.589221 
2015-05-26 14:30:00  666.7984  7.590645  1.324495 
2015-05-26 14:40:00  911.0134  8.466603  1.708189 
2015-05-26 15:10:00  1256.1740  9.868224  1.636775 
2015-05-26 15:30:00  1706.7070 11.225540  1.576277 

In [115]: 
# create your timeseries 
timeseries_comp = pd.date_range(df.index[0], df.index[len(df)-1], freq='10min') 
timeseries_comp 
Out[115]: 
DatetimeIndex(['2015-05-26 11:40:00', '2015-05-26 11:50:00', 
       '2015-05-26 12:00:00', '2015-05-26 12:10:00', 
       '2015-05-26 12:20:00', '2015-05-26 12:30:00', 
       '2015-05-26 12:40:00', '2015-05-26 12:50:00', 
       '2015-05-26 13:00:00', '2015-05-26 13:10:00', 
       '2015-05-26 13:20:00', '2015-05-26 13:30:00', 
       '2015-05-26 13:40:00', '2015-05-26 13:50:00', 
       '2015-05-26 14:00:00', '2015-05-26 14:10:00', 
       '2015-05-26 14:20:00', '2015-05-26 14:30:00', 
       '2015-05-26 14:40:00', '2015-05-26 14:50:00', 
       '2015-05-26 15:00:00', '2015-05-26 15:10:00', 
       '2015-05-26 15:20:00', '2015-05-26 15:30:00'], 
       dtype='datetime64[ns]', freq='10T', tz=None) 

In [120]: 
# reindex 
new_df = df.reindex(timeseries_comp) 
# group on hour and minute, you can group on some other resolution 
new_df.groupby([new_df.index.hour, new_df.index.minute]).apply(pd.Series.isnull).sum() 
Out[120]: 
ActivePowerkW  15 
WindSpeedms  15 
WindSpeedmsstd 15 
dtype: int64 
+0

Будет ли это считать все значения NAN за каждый месяц, час или минуту? Кажется, что все нулевые значения в new_df – ardms

+0

зависят от того, как вы его группируете. В моем ответе я использовал час и минуту, но на самом деле вы также должны включать год, месяц, день, чтобы он мог различать разные дни. думая об этом, возможно, все, что вам нужно, это просто 'df.reindex (timeseries_comp) .isnull(). sum()' – EdChum

+0

Я думаю, что не понял, что мне нужно. Мне нужно иметь значения null/NAN для каждого месяца (или в вашем примере каждый час). Не общее количество нулевых значений. Я отредактировал свой вопрос и включил диаграмму. – ardms

Смежные вопросы