首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python和Pandas列,“计算方向”并显示“到目前为止的平均值”。

Python和Pandas列,“计算方向”并显示“到目前为止的平均值”。
EN

Stack Overflow用户
提问于 2013-08-23 10:48:14
回答 1查看 1.5K关注 0票数 2

我有一个DataFrame,它包含(股票的)在特定分钟结束时的价格。

DF列是:

  • minute_id: 0-1440,0为午夜,480为上午8:00 (60*8)
  • 价格:一分钟结束时的股票价格
  • 价格变动:价格变动。分分钟
  • 方向:改变的方向

从熊猫进口numpy.random n= 10 #样品数#从上午8:00开始,设定4-5 df = DataFrame({'minute_id':range(480,480+n),‘DataFrame’:(5-4)* nprnd.random(n) +4 }) df‘’change‘= df.price - df.price.shift(1) df’方向‘= df.change.map(lambda x: 0 if x == 0 of x/abs(x)) df= df.dropna() df()

我想向这个DF添加几个列。

  1. 平均价格到现在为止的第一排,它将有价格。对于第二行,它将具有第n行第2行的平均价格,它将具有前n行的平均价格。
  2. “更改”列在当前方向上的和(每次“方向”切换时将为零)
  3. 按当前方向计数,直到现在为止,对于每一行,当前方向上运行的该行的数目是多少。
  4. 最后四行的平均价格

我可以通过一次迭代DF行来创建所有这些列。但我相信还有一种更多的方法来做这件事。

我也不知道如何处理丢失的数据(如果我在minute_id中有空白)

编辑:

在我想增加的4列中,1和4很容易.

C4:这只是一个周期为4的滚动平均值

C1:滚动均值可以得到最小周期的另一个参数。

将其设置为1并将窗口大小设置为df的长度将为集合中的每一行提供运行平均值。

df‘_avg’= pd.rolling_mean(df.price,n,1)

对于其他两列,我仍在努力寻找获得它的最佳方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-25 05:42:42

好吧,在“玩”了很多之后,我找到了一些对我有用的东西。

这可能是一种更多的“疯狂”的方式,但这是一个合理的方式来完成它。

我想感谢安迪海登,杰夫和菲利普克劳德指出,"10分钟到熊猫“,它没有直接的答案,但非常有帮助。此外,安迪海登派我创造滚动的均值,这对我很大程度上是一个方向。

因此,让我们逐列执行

  • 加1: nowRolling avg之前的平均价格,窗口大小是整个DataFrame的大小,最小值为1 df‘DataFrame_avg’= pd.rolling_mean(df.price,n,1)
  • 添加第4行:最后4行的平均价格 df‘’RA_wnd_4‘= pd.rolling_mean(df.price,4,1)
  • 在当前的"blcok“(方向)中添加Helper列,显示方向已更改的DF‘’dir_ change‘= (df.direction.shift(1) != df.direction).astype(int) #为每个方向更改的df' block’= df.dir_change.cumsum() #指定DF”块“的DF”块“,并根据分组=df.groupby(‘块’)# Add函数对块进行累积和(),并将其称为def f1(group):返回DataFrame({'rolling_count‘:group.cumsum()}) df’call _count‘= grouped.change.apply(f1)
  • 添加col 3:当前“块”中的行号(方向) df'one‘=1 df’‘one_count’= grouped.one.apply(f1) df= df.drop('one',axis=1)

全文代码:

代码语言:javascript
复制
import numpy.random as nprnd
from pandas import DataFrame
import pandas as pd

n = 10 # Number of samples
# Starting at 8:00 AM, set some (n) random prices between 4-5
df = DataFrame({'minute_id': range(480,480+n), 'price':(5-4) * nprnd.random(n) + 4 })
df['change'] = df.price - df.price.shift(1)
df['direction'] = df.change.map(lambda x: 0 if x == 0 else x/abs(x))
df = df.dropna()
#------------------------------------------
# Col 1, rolling Avg over the entire DF
df['rolling_avg'] = pd.rolling_mean(df.price, n, 1) 
#------------------------------------------
# Col 4, rolling Avg windows size of 4
df['RA_wnd_4'] = pd.rolling_mean(df.price, 4, 1)
#------------------------------------------
# Helper code for cols 2, 3 
# Adding Helper column that shows when direction have been changed
df['dir_change'] = (df.direction.shift(1) != df.direction).astype(int)
# Identify the DF "blocks" for every direction change
df['block'] = df.dir_change.cumsum()
# Split the DF based on those bolcks
grouped = df.groupby('block')
# Add Function that will cumsum() for a block, and call it
def f1(group):
     return DataFrame({'rolling_count' : group.cumsum()})
df['one'] = 1
#------------------------------------------
# Col 2, CumSum() of the 'change' column while in the current "blcok" (direction)
df['rolling_count'] = grouped.change.apply(f1)
#------------------------------------------
# Col 3, Count in the current "block" (Direction)
df['rolling_count'] = grouped.one.apply(f1)
df = df.drop('one', axis=1)

print df

输出:

代码语言:javascript
复制
 minute_id  price   change  direction   rolling_avg     RA_wnd_4    dir_change  block   rolling_count
1   481     4.771701    0.474349    1   4.771701    4.771701    1   1   1
2   482     4.300078    -0.471623   -1  4.535889    4.535889    1   2   1
3   483     4.946744    0.646666    1   4.672841    4.672841    1   3   1
4   484     4.529403    -0.417340   -1  4.636981    4.636981    1   4   1
5   485     4.434598    -0.094805   -1  4.596505    4.552706    0   4   2
6   486     4.171169    -0.263429   -1  4.525616    4.520479    0   4   3
7   487     4.416980    0.245810    1   4.510096    4.388038    1   5   1
8   488     4.727078    0.310098    1   4.537219    4.437456    0   5   2
9   489     4.049097    -0.677981   -1  4.482983    4.341081    1   6   1
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18400955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档