0

我对 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')

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

大熊猫中有这个论坛吗?

提前谢谢

4

1 回答 1

0

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

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
于 2020-05-17T15:30:04.743 回答