Расчеты из сегментов (зацикливание) фрейма данных - PullRequest
2 голосов
/ 13 мая 2019

2 кадра данных.1 короткий 1 длинный.Я хочу разбить длинный на куски, сравнить их с коротким, используя коэффициент корреляции.

Раскол в порядке.Однако при расчете их возвращает Nan.

import pandas as pd

data_a = {'ID': ["a1","a2","a3","a4","a5","a6","a7","a8","a9","a10","a11","a12","a13","a14","a15"], 
'Unit_Weight': [178,153,193,195,214,157,205,212,219,166,217,186,170,207,204]}

df_a = pd.DataFrame(data_a)

data_b = {'ID': ["b1","b2","b3","b4","b5"], 
'Unit_Weight': [128,123,123,125,204]}

df_b = pd.DataFrame(data_b)

size = 5      # 5 rows in the long data-frame
list_of_df_a = [df_a.loc[i:i+size-1,:] for i in range(0, len(df_a),size)]

for each in list_of_df_a:
    corr_e = each['Unit_Weight'].corr(df_b['Unit_Weight'])

Вывод:

0.6797202605786716
nan
nan

Что пошло не так и как это можно исправить?Спасибо.

ps: это результаты, рассчитанные вручную:

0.6797202605786716
-0.5501914564062937
0.2653370297540246

   ID  Unit_Weight
0  a1          178
1  a2          153
2  a3          193
3  a4          195
4  a5          214
    ID  Unit_Weight
5   a6          157
6   a7          205
7   a8          212
8   a9          219
9  a10          166
     ID  Unit_Weight
10  a11          217
11  a12          186
12  a13          170
13  a14          207
14  a15          204

Ответы [ 3 ]

1 голос
/ 13 мая 2019

@ Jezrael имеет очень хороший ответ, но другой способ будет изменить:

list_of_df_a = [df_a.loc[i:i+size-1,:] for i in range(0, len(df_a),size)]

Кому:

list_of_df_a = [df_a.loc[i:i+size-1,:].reset_index(drop=True) for i in range(0, len(df_a),size)]

А теперь ваши результаты будут:

0.6797202605786716
-0.5501914564062937
0.26533702975402457
1 голос
/ 13 мая 2019

Для обоих Series необходимы одинаковые индексы, поэтому используйте DataFrame.reset_index с drop=True:

for each in list_of_df_a:
    corr_e = each['Unit_Weight'].reset_index(drop=True).corr(df_b['Unit_Weight'])
    print (corr_e)

0.6797202605786716
-0.5501914564062937
0.26533702975402457
0 голосов
/ 13 мая 2019

Вы также можете использовать numpy.corrcoef для автоматического решения проблемы индексации:

for each in list_of_df_a:
    corr_e = np.corrcoef(each['Unit_Weight'], df_b['Unit_Weight'])[0,1]
    print(corr_e)

0.6797202605786716
-0.5501914564062937
0.2653370297540246
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...