繁体   English   中英

如何计算两个熊猫时间线向量之间的皮尔逊相关性

[英]How calculate pearson correlation between two pandas timeline vectors

我有一个社交网络中用户帖子的数据库,使用 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

这是微积分皮尔逊相关性的解决方案:

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

一个很好的链接到understant 合并

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM