【问题标题】:Finding clusers or coherent values in a dataset with Python/pandas使用 Python/pandas 在数据集中查找聚类或连贯值
【发布时间】:2020-05-17 13:26:14
【问题描述】:

我对 Python 很陌生,正在尝试进行事件分析。 我有两个数据集:一个包含事件,一个包含 stockdata。现在我需要构建等权重的投资组合并每个月“刷新”投资组合的构建。 因此我需要一致的数据(我猜)。我的意思是,对于每个日期,我都需要此分析中所有股票的股票价格。 不,我想以这种方式过滤数据,它向我展示了最大的“集群”,其中我拥有一段时间内所有股票的数据。 作为替代显示所有股票和有数据的时间段。 希望大家能理解我的解释。

import pandas_datareader as pdr
import pandas as pd
import numpy as np
from sklearn import linear_model
import scipy.stats as st
 d = {'Date': ['1.02.2019', '2.02.2019', '3.02.2019', '4.02.2019', '5.02.2019'], 
     'a': [3.6, 3.4, 4.1, 4.2, 4.3], 
     'b': ['',2.4, 2.5, 2.6, 2.5], 
     'c': [2.5, 2.4,'',2.5, 2.5], 
     'd': [2.3, 2.4, 2.4, 2.5, '']}

df = pd.DataFrame(data=d)
df.set_index('Date')

在这种情况下,它应该给我 a,b 从 2.5.2019 到 5.02.2019 或 a,d 从 1.05.2019 到 4.5.2019 或类似的东西。

pandas 中有这个论坛吗?

提前谢谢

【问题讨论】:

    标签: python pandas events data-quality


    【解决方案1】:

    你可以这样做,返回空值之间的日期范围:

    d = {'Date': ['1.02.2019', '2.02.2019', '3.02.2019', '4.02.2019', '5.02.2019', '6.02.2019', '7.02.2019', '8.02.2019', '9.02.2019', '10.02.2019'], 
         'a': [3.6, 3.4, 4.1, 4.2, 4.3, 3.6, 3.4, 4.1, 4.2, 4.3], 
         'b': ['',2.4, 2.5, 2.6, 2.5, '',2.4, 2.5, 2.6, 2.5], 
         'c': [2.5, 2.4,'',2.5, 2.5, 2.5, 2.4,'',2.5, 2.5], 
         'd': [2.3, 2.4, 2.4, 2.5, '', 2.3, 2.4, 2.4, 2.5, '']}
    
    df = pd.DataFrame(data=d)
    df = df.replace('', np.nan)
    df['Date'] = pd.to_datetime(df['Date'])
    df.sort_values(by=['Date'], inplace=True)
    df['Date'] = df['Date'].astype(str)
    
    stocks = ['a', 'b', 'c', 'd']
    for stock in stocks:
        print(f'Stock {stock}')
        nan_indexes = df[df[stock].isna()].index
        for i, value in enumerate(nan_indexes):
            if value == df.shape[0]-1:
                print(f'end index = {df.iloc[value-1]["Date"]}')
                continue
            if i==0:
                print(f'start index = {df.iloc[value+1]["Date"]}')
            else:
                print(f'end index = {df.iloc[value-1]["Date"]}')
                print(f'start index = {df.iloc[value+1]["Date"]}')
            if i==len(nan_indexes)-1:
                print(f'end index = {df.iloc[df.shape[0]-1]["Date"]}')
    

    输出

    Stock a
    Stock b
    start index = 2019-02-02
    end index = 2019-05-02
    start index = 2019-07-02
    end index = 2019-10-02
    Stock c
    start index = 2019-04-02
    end index = 2019-07-02
    start index = 2019-09-02
    end index = 2019-10-02
    Stock d
    start index = 2019-06-02
    end index = 2019-09-02
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 2017-07-07
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多