python - 检测 Python Pandas DataFrame 连续行中的错误数据

标签 python pandas finance

在对季度 yield 日期的 Pandas DataFrame 进行操作时,并意识到我想要进行季度与季度(即第二季度到第三季度)的比较,我意识到我应该确定我的数据排序正确且完整。

所以, 1. 始终是“正确”的季度(q1->q2->q3->q4->q1->q2...) 2. 并且不缺少任何四分之一 (q1->q2->q4->q1->q2->q3) 不如缺少 q3。

我已经加载了一个数据帧,并认为在 pandas 中检查它比返回并检查预加载更有意义。

我想出了两个稍微有点创可贴的解决方案来解决问题,但我认为发布问题和我的解决方案可能会很有趣,看看是否有人有一些启发或发现这很有趣。有时似乎很难找到 Pandas 信息来帮助我从初级到中级水平。

我想对于这个问题有一个更优雅的解决方案,并且可能还有一个我可以在这里学习和应用的更广泛适用的概念以及其他问题。话不多说。或者是废话?...

我有一组财务 yield 数据。它看起来像这样:

Index   Symbol  Time    Earning_Date    Year    Quarter Last_Quarter
0   AAPL    16:30:00    10/27/2015  2015    Q4  Q3
1   AAPL    16:30:00    7/21/2015   2015    Q3  Q2
2   AAPL    16:30:00    4/27/2015   2015    Q2  Q1
3   AAPL    16:30:00    1/27/2015   2015    Q1  Q4
4   AAPL    16:30:00    10/20/2014  2014    Q4  Q3
5   AAPL    16:30:00    7/22/2014   2014    Q3  Q2
6   AAPL    16:30:00    4/23/2014   2014    Q2  Q1
7   AAPL    16:30:00    1/27/2014   2014    Q1  Q4
8   AAPL    16:30:00    10/28/2013  2013    Q4  Q3
9   AAPL    16:30:00    7/23/2013   2013    Q3  Q2
10  AAPL    16:30:00    4/23/2013   2013    Q2  Q1
11  AAPL    16:30:00    1/23/2013   2013    Q1  Q4
12  AAPL    16:30:00    10/25/2012  2012    Q4  Q3
13  AAPL    16:30:00    7/24/2012   2012    Q3  Q2
14  AAPL    16:30:00    4/24/2012   2012    Q2  Q1
15  AAPL    16:30:00    1/24/2012   2012    Q1  Q4
16  AAPL    16:30:00    10/18/2011  2011    Q4  Q3
17  AAPL    16:30:00    7/19/2011   2011    Q3  Q2
18  AAPL    16:30:00    4/20/2011   2011    Q2  Q1
19  AAPL    16:30:00    1/18/2011   2011    Q1  NaN

首先,全面披露 - 我已经用“解决方案”填充了此 DF,以解决将 Last_Quarter 附加到每行的问题 - 我只是使用 .shift(-1) 来填充它。我确信这可以做得更好——数据对于 DF 来说至关重要,因为它帮助我以两种方式解决了问题。但如果我们在没有 Last_Quarter 列的情况下解决问题也没关系。希望这是有道理的。

更大的问题是清理潜在丢失或错误的数据。如果一只股票跳过了 yield 季度,或者我的数据被损坏,则序列可能会显示为 Index 2 Quarter Q2、Index 3 Quarter Q4,因此 Q3 被跳过,并且许多假设可能是错误的。所以我想确保所有数据 Q1 遵循 Q4,Q2 遵循 Q1,Q3 遵循 Q2,Q4 遵循 Q3。

如果数据不好,至少要抛出一个异常。以下是我们提出的两个解决方案:

    accptbl_qtr_pr_tpls = [('Q3','Q4'),('Q4','Q1'),('Q1','Q2'),('Q2','Q3')]
    rows_that_pass = 0
    rows_total = len(self.df)
    print 'total rows', rows_total
    for accptbl_qtr_pr_tpl in accptbl_qtr_pr_tpls:
        foo = self.df.ix[(self.df['Last_Quarter'] == accptbl_qtr_pr_tpl[0]) & (self.df['Quarter'] == accptbl_qtr_pr_tpl[1])]
        rows_that_pass += len(foo)
    if rows_total != 1+rows_that_pass: # the + 1 is to account for NaN in earliest result last_quarter column
        print 'quarter issue!, exiting'

我们还想出了:

        if not (((self.df['Last_Quarter'] == 'Q1') & (self.df['Quarter'] == 'Q2')).any() and ((self.df['Last_Quarter'] == 'Q2') & (self.df['Quarter'] == 'Q3')).any() \
           and ((self.df['Last_Quarter'] == 'Q3') & (self.df['Quarter'] == 'Q4')).any() and ((self.df['Last_Quarter'] == 'Q4') & (self.df['Quarter'] == 'Q1')).any()):
            print "bad data"
        else:
            print 'good data'

我想我会把这个扔在这里,看看我们有多聪明,或者我们在解决一个已解决的问题上浪费了多少时间

最佳答案

我将编写一个函数,根据 Quarter 和 Last_Quarter 中值的有效组合返回 True 或 False,然后通过按行应用该函数来创建一个包含有效状态结果的新列。

这将使您能够获取仅包含好行或坏行的 DataFrame 切片。

该函数看起来像这样:

def check_quarters(row):
   # if either Quarter or Last_Quarter is NaN, return False
   if (row['Quarter'] != row['Quarter']) or (row['Last_Quarter'] != row['Last_Quarter']):
      return False
   # check for valid combination when Quarter is Q2 Q3 or Q4
   if int(row['Quarter'][1:2]) - 1 == int(row['Last_Quarter'][1:2]):
      return True
   # check for valid combination when Quarter is Q1
   elif int(row['Quarter'][1:2]) == 1 and int(row['Last_Quarter'][1:2]) == 4:
      return True
   else:
      return False

应用该函数来创建新列:

df['Valid_Quarters'] = df.apply(check_quarters, axis = 1)

现在您可以对 DataFrame 进行切片以仅获取有效行:

df.loc[df['Valid_Quarters'],:]

关于python - 检测 Python Pandas DataFrame 连续行中的错误数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34668109/

相关文章:

python - __init__ 的目的

python - 当另一列包含该子字符串时,Pandas 会删除列中字符串的子字符串

python - Pandas 的 EMA 与股票的 EMA 不匹配?

finance - 了解盈透证券报价事件

python - 使用seaborn深色主题并删除条形图中条形之间的间隙

python - 将 libgfortran 与 NumPy 捆绑在一起

python - imoporting GDAL : ImportError, 库未加载时出现问题,找不到图像

用于检查数据框中是否存在用户输入值的 Python 脚本

python - 使用选择的 5*5 网格和范围字符串转换 DataFrame

javascript - 金融应用程序的外汇汇率