Как рассчитать корреляцию Пирсона между двумя векторами временной шкалы pandas

#python #pandas #dataframe #timeline

#python #pandas #фрейм данных #временная шкала

Вопрос:

У меня есть база данных сообщений пользователей в социальной сети, используя Pandas DataFrame, я подсчитал ежемесячное количество сообщений каждого пользователя, в результате чего получилась таблица с 2 столбцами для каждого пользователя, содержащая месяц и количество сообщений. Я хочу рассчитать ежемесячную корреляцию между разными пользователями, зная, что месячные временные рамки различны для каждых двух пользователей (с некоторыми пересекающимися месяцами)

Это код для создания таблицы временной шкалы за месяц (agg)

 # Create an empty dataframe
df = pd.DataFrame()
# Create a column from the datetime variable
df['datetime'] = date_list
# Convert that column into a datetime datatype
df['datetime'] = pd.to_datetime(df['datetime'])
# Set the datetime column as the index
df['score'] = count
df.index = df['datetime'] 
# this is the table containing posts count for each month
agg = df['score'].resample('M').sum().to_frame()
  

Итак, в основном я должен применить функцию корреляции к двум переменным «agg», но не смог найти интуитивно понятный способ сделать это.
Вот два примера переменной agg, принадлежащей двум разным пользователям:

Первый столбец: Month , второй столбец: Number of posts .

 User A 
2018-04-30     39
2018-05-31     41
2018-06-30     19
2018-07-31     46
2018-08-31     61
2018-09-30     57
2018-10-31     33
2018-11-30     18

User B:
2017-11-30      0
2017-12-31      3
2018-01-31      0
2018-02-28      0
2018-03-31      22
2018-04-30      3
2018-05-31      11
  

Комментарии:

1. пожалуйста, используйте форматирование, предоставленное для написания кода в вопросе.

Ответ №1:

вот решение для вычисления корреляции Пирсона:

 import pandas as pd
data = """    
datetime     score 
2018-04-30     39
2018-05-31     41
2018-06-30     19
2018-07-31     46
2018-08-31     61
2018-09-30     57
2018-10-31     33
2018-11-30     18
    """
    datb = """    
datetime      score 
2017-11-30      0
2017-12-31      3
2018-01-31      0
2018-02-28      0
2018-03-31      22
2018-04-30      3
2018-05-31      11
        """
dfa = pd.read_csv(pd.compat.StringIO(data), sep='s ')
dfb = pd.read_csv(pd.compat.StringIO(datb), sep='s ')
dfa['datetime'] = pd.to_datetime(dfa['datetime'])
dfb['datetime'] = pd.to_datetime(dfb['datetime'])
dfa.index = dfa['datetime']
dfb.index = dfb['datetime']

agga = dfa['score'].resample('M').sum().to_frame()
aggb = dfb['score'].resample('M').sum().to_frame()
print(agga,aggb)
  

 #intersection of 2 dataframes on datetime
inter = agga.merge(aggb, on='datetime')
print(inter)
result = inter['score_x'].corr(inter['score_y'])
print(result)
  

  dfa
           score
datetime         
2018-04-30     39
2018-05-31     41
2018-06-30     19
2018-07-31     46
2018-08-31     61
2018-09-30     57
2018-10-31     33
2018-11-30     18

 dfb
             score
datetime         
2017-11-30      0
2017-12-31      3
2018-01-31      0
2018-02-28      0
2018-03-31     22
2018-04-30      3
2018-05-31     11

 inter
            score_x  score_y
datetime                    
2018-04-30       39        3
2018-05-31       41       11

 result
0.9999999999999999
  

Если вы хотите использовать объединение:

 union = pd.merge(agga, aggb, on='datetime', how='outer').fillna(0)
  

вывод объединения:

                 score_x  score_y
datetime                    
2018-04-30     39.0      3.0
2018-05-31     41.0     11.0
2018-06-30     19.0      0.0
2018-07-31     46.0      0.0
2018-08-31     61.0      0.0
2018-09-30     57.0      0.0
2018-10-31     33.0      0.0
2018-11-30     18.0      0.0
2017-11-30      0.0      0.0
2017-12-31      0.0      3.0
2018-01-31      0.0      0.0
2018-02-28      0.0      0.0
2018-03-31      0.0     22.0
  

хорошая ссылка для понимания слияния

Комментарии:

1. Спасибо за ответ! Применяем ли мы корреляцию Пирсона только для пересекающихся месяцев? разве мы не должны объединить две временные шкалы?

2. для корреляции вам нужно сравнить одинаковые элементы «сортировки», для этого я сделал пересечение. если вы сделаете объединение, у вас будет значение NaN, потому что некоторые месяцы не имеют значений.. итак, после того, как вам нужно будет оценить недостающие значения (извините за мой английский)

3. Есть ли способ расширить две временные шкалы, заполнив 0 баллов в несуществующих месяцах вместо NaN? чтобы я мог легко применить pearson к срокам объединения?

4. кстати, голосуйте по-английски, есть парфе 😉

5. пожалуйста, не забудьте подтвердить ответ, если все в порядке. Спасибо