【问题标题】:How to use pandas to check daily tick data in a monthly tick data csv?如何使用 pandas 检查每月刻度数据 csv 中的每日刻度数据?
【发布时间】:2018-05-16 13:04:30
【问题描述】:

我有一个每月的tick数据要分析,是这样的:

Time (UTC),Ask,Bid,AskVolume,BidVolume
2007.04.01 21:00:47.593,95.203,95.159,19.1,8.8
2007.04.01 21:00:47.968,95.174,95.124,23.9,9.2
2007.04.01 21:01:02.695,95.132,95.092,4,4
2007.04.01 21:01:05.934,95.154,95.104,11.2,4
2007.04.01 21:01:18.430,95.171,95.131,12,5.2
2007.04.01 21:01:19.957,95.188,95.153,8,9.2
2007.04.01 21:01:56.308,95.208,95.148,22.3,4
2007.04.01 21:01:57.233,95.192,95.152,7.2,9.2
2007.04.01 21:01:57.443,95.188,95.143,7.2,9.2
2007.04.01 21:01:59.691,95.184,95.139,7.2,9.2
2007.04.01 21:01:59.934,95.181,95.141,8,3.9
2007.04.01 21:02:10.569,95.171,95.136,11.9,4
2007.04.01 21:02:20.708,95.166,95.126,11.2,8.8
2007.04.01 21:02:35.211,95.17,95.135,21.5,4
2007.04.01 21:02:39.946,95.196,95.156,7.2,8.8
2007.04.01 21:02:40.206,95.224,95.164,0.8,0.8
2007.04.01 21:02:43.600,95.222,95.177,8,9.2
2007.04.01 21:02:54.578,95.216,95.186,25.5,5.2
2007.04.01 21:03:04.811,95.23,95.18,7.9,7.9

一直到每月的最后一天。

只要当天卖价的百分比变化((max - min) / max) 大于 0.05,我就需要知道这一天。我的方法是每天分离数据,计算百分比变化,看看当天价格是否下跌超过 5%,如果是,则返回当天。我是 pandas 的新手,到目前为止,这是我所拥有的:

import pandas as pd

df = pd.read_csv('AUDJPY_Ticks_2007.04.01_2007.04.30.csv')
percentChange = ((df['Ask'].max() - df['Ask'].min()) / df['Ask'].max()) >= 0.05
print(percentChange)

我只能得到整个月而不是每天的百分比变化。

【问题讨论】:

标签: python pandas csv


【解决方案1】:

resampletransform 的解决方案:


数据:

我修改了您的示例数据,只允许我们的测试用例查看多天,因此至少一天的变化大于 0.05%。此外,下一个阅读本文的人将有一个复制粘贴可重现的示例。

import pandas as pd
from io import StringIO

test_data = StringIO("""Time (UTC),Ask,Bid,AskVolume,BidVolume
2007.04.01 21:00:47.593,95.203,95.159,19.1,8.8
2007.04.01 21:00:47.968,95.174,95.124,23.9,9.2
2007.04.01 21:01:02.695,95.132,95.092,4,4
2007.04.01 21:01:05.934,95.154,95.104,11.2,4
2007.04.02 21:01:18.430,95.171,95.131,12,5.2
2007.04.02 21:01:19.957,95.188,95.153,8,9.2
2007.04.02 21:01:56.308,95.208,95.148,22.3,4
2007.04.02 21:01:57.233,95.192,95.152,7.2,9.2
2007.04.03 21:01:57.443,91.188,95.143,7.2,9.2
2007.04.03 21:01:59.691,97.684,95.139,7.2,9.2 
2007.04.03 21:01:59.934,95.181,95.141,8,3.9
2007.04.03 21:02:10.569,95.171,95.136,11.9,4
2007.04.04 21:02:20.708,95.166,95.126,11.2,8.8
2007.04.04 21:02:35.211,95.17,95.135,21.5,4
2007.04.04 21:02:39.946,95.196,95.156,7.2,8.8
2007.04.04 21:02:40.206,95.224,95.164,0.8,0.8
2007.04.05 21:02:43.600,95.222,95.177,8,9.2
2007.04.05 21:02:54.578,95.216,95.186,25.5,5.2
2007.04.05 21:03:04.811,95.23,95.18,7.9,7.9""")

df = pd.read_table(test_data, sep=",", header=[0], parse_dates=["Time (UTC)"])


将索引设置为日期时间列:

df.set_index("Time (UTC)", drop=True, inplace=True)


重采样和变换:

daily_ask = df.resample("D")["Ask"]
df["daily_ask_min"] = daily_ask.transform("min")
df["daily_ask_max"] = daily_ask.transform("max")


计算每日变化百分比:

df["daily_ask_change"] = (df["daily_ask_max"] - df["daily_ask_min"]) / df["daily_ask_max"]


查找大于 0.05 % 的变化:

df[df.daily_ask_change > 0.05]["daily_ask_change"]

# Time (UTC)
# 2007-04-03 21:01:57.443    0.0665
# 2007-04-03 21:01:59.691    0.0665
# 2007-04-03 21:01:59.934    0.0665
# 2007-04-03 21:02:10.569    0.0665
# Name: daily_ask_change, dtype: float64


df[df.daily_ask_change > 0.05]["daily_ask_change"].resample("D").mean()

# Time (UTC)
# 2007-04-03    0.0665
# Freq: D, Name: daily_ask_change, dtype: float64

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2018-07-08
    • 2012-07-25
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多