【问题标题】:filtring data of a csv file with pandas用 pandas 过滤 csv 文件的数据
【发布时间】:2021-05-14 17:57:01
【问题描述】:

我有一个CSV file,其中包含按日期和代码划分的股市数据。它有各种列,如日期、最高价格、最低价格等。我必须从 2019 年的最后四个月到 2020 年的前三个月以 10 天的频率重新采样这些数据,然后过滤大于 20000 的 Min.mean() 和小于 35000 的 Max.mean()。我写了这段代码:

import numpy as np
import pandas as pd
from datetime import datetime
stock_df = pd.read_csv('stock_data.csv')
stock_df.drop(columns = ['Unnamed: 0'],inplace=True)
column_names = {
"تاریخ":"str_date",
"اولین قیمت":"Open",
"نماد":"Symbol",
"نام":"Name",
"قیمت پایانی":"Close",
"قیمت آخرین معامله":"Last Trade",
"تعداد معاملات":"Quantity",
"حجم":"Volume",
"ارزش":"Value",
"کمترین قیمت":"Min",
"بیشترین قیمت":"Max",
"قیمت دیروز":"Yesterday Price",
"تغییر":"Change"}
stock_df.rename(columns=column_names,inplace=True)
stock_df["date"]  =  pd.to_datetime(stock_df["str_date"])

最初的尝试是这样的:

stock_df.set_index('date',inplace=True)
result = stock_df.loc["2019-09":"2020-03"].resample('10D').Max.mean()<=35000 & stock_df.loc["2019-09":"2020-03"].resample('10D').Min.mean()>=20000 

stock_df 是保存 CSV 文件数据的 DataFrame。最终答案必须放入数据框result。但是这段代码得到了这个错误:

TypeError: Cannot perform 'rand_' with a dtyped [float64] array and scalar of type [bool]

【问题讨论】:

    标签: python pandas numpy data-science


    【解决方案1】:

    下面的代码设置和排序您的日期索引,然后选择您的日期范围。

    由于您有多个符号,groupby 需要明确说明 date 上的重采样。然后取你提到的两列的平均值。

    最后,它创建您要求的布尔条件,剪切 tmp 数据框以仅选择那些行,重置索引以使其再次“平坦”,并将结果的副本放入 result

    tmp = stock_df.set_index(['date', 'Symbol']).sort_values(['date'])
    tmp = tmp.loc[pd.IndexSlice['2019-09-01':'2020-03-31', :], :]
    
    tmp = tmp.groupby([pd.Grouper(level='date', freq='10D'), pd.Grouper(level='Symbol')])[['Max','Min']].mean()
    
    cond1 = (tmp.Max <= 35000)
    cond2 = (tmp.Min >= 20000)
    result = tmp[cond1 & cond2].reset_index().copy()
    

    您应该验证结果是否符合您的预期,也许是在您提前知道结果的较小数据集上。希望这能给你足够的工作。

    【讨论】:

    • 我添加了 CSV 文件并编写了完整的代码。我尝试了您的代码,但是在运行命令时:res = np.load("answers.npz") assert res["values"].shape == (12,2) assert str(res["index"][0]) == '2019-09-03T00:00:00.000000000' 我遇到了这个错误:Object arrays cannot be loaded when allow_pickle=False
    • 我编辑了答案(和问题)以解决您的更新。在尝试之前,您应该保留原始问题的最后一行是stock_df["date"] = pd.to_datetime(stock_df["str_date"])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2019-08-03
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    相关资源
    最近更新 更多