- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的问题是我有一个非常大的时间序列(约 5-10 百万个观察点),其中某些事件标有标志。在这种情况下,是股票价格下跌触发了一个事件,该事件的虚拟变量为 1 或 0,无论是否触发该事件。我想从这个时间序列中提取事件本身和随后 29 天的数据。显然,这涉及到某种类型的数组拼接。
我有一些简单的代码可以解决这个问题(它只是将标志和接下来的 29 天标记为 2,但从那里过滤数据帧很简单)但它依赖于不是很快的 pandas 数据帧拼接。这是代码:
def first_drop(df):
indexlen = len(df.dropflag[df.dropflag==1].index)
for y in range(indexlen):
x = df.dropflag[df.dropflag==1].index[y]
df.dropflag[x:30]=2
return df.dropflag
dstk['dropflag2'] = dstk[["permno","dropflag"]].groupby('permno').apply(first_drop)
有没有其他人发现的更快的方法来进行这种类型的拼接,您可以获得下一个 x 条目?我认为使用 numpy 数组或 cythonized 函数可能会更快,但我不太清楚从哪里开始。
最佳答案
这是一种可行的方法。也许没那么快,处理 10,000,000 行数据集需要 1 分钟。这个想法是,通过使用 .shift(-i)
在随后几天用数据填充新列,它避免了在每个 groupby
内循环遍历行。它的优点是可以灵活地 reshape 生成的数据框,例如 stack()
来获取堆叠的记录。
import pandas as pd
import numpy as np
# generate some artificial data, 10,000,000 rows
# ============================================================
np.random.seed(0)
dates = pd.date_range('2001-01-01', periods=2500, freq='B')
permno = np.arange(1000, 5000) # 4000 symbols
multi_index = pd.MultiIndex.from_product([permno, dates], names=['permno', 'dates'])
data = np.random.randn(10000000)
dropflag = np.random.choice([0,1], size=10000000)
df = pd.DataFrame({'data': data, 'dropflag': dropflag}, index=multi_index).reset_index('permno')
Out[273]:
permno data dropflag
dates
2001-01-01 1000 1.7641 1
2001-01-02 1000 0.4002 1
2001-01-03 1000 0.9787 0
2001-01-04 1000 2.2409 1
2001-01-05 1000 1.8676 0
... ... ... ...
2010-07-26 4999 0.5902 1
2010-07-27 4999 0.4676 1
2010-07-28 4999 -1.9447 1
2010-07-29 4999 -0.3440 1
2010-07-30 4999 -0.7402 0
[10000000 rows x 3 columns]
# processing
# ============================================================
def func(group):
all_data = [group]
for i in np.arange(1, 30):
temp = group.data.shift(-i)
temp.name = 'data_subday{}'.format(i)
all_data.append(temp)
dataset = pd.concat(all_data, axis=1).iloc[:-30]
return dataset.loc[dataset.dropflag==1]
%time df.groupby('permno').apply(func)
CPU times: user 59.7 s, sys: 1.83 s, total: 1min 1s
Wall time: 1min 5s
Out[277]:
permno data dropflag data_subday1 data_subday2 ... data_subday25 data_subday26 data_subday27 data_subday28 data_subday29
permno dates ...
1000 2001-01-01 1000 1.7641 1 0.4002 0.9787 ... -1.4544 0.0458 -0.1872 1.5328 1.4694
2001-01-02 1000 0.4002 1 0.9787 2.2409 ... 0.0458 -0.1872 1.5328 1.4694 0.1549
2001-01-04 1000 2.2409 1 1.8676 -0.9773 ... 1.5328 1.4694 0.1549 0.3782 -0.8878
2001-01-08 1000 -0.9773 1 0.9501 -0.1514 ... 0.1549 0.3782 -0.8878 -1.9808 -0.3479
2001-01-09 1000 0.9501 1 -0.1514 -0.1032 ... 0.3782 -0.8878 -1.9808 -0.3479 0.1563
... ... ... ... ... ... ... ... ... ... ... ...
4999 2010-06-09 4999 2.1195 1 1.5564 1.0739 ... 0.2677 1.2637 -0.3607 -1.4011 1.1292
2010-06-15 4999 -1.1747 1 0.2159 0.1221 ... 1.1292 1.1614 0.4842 1.3593 0.5902
2010-06-16 4999 0.2159 1 0.1221 0.0136 ... 1.1614 0.4842 1.3593 0.5902 0.4676
2010-06-17 4999 0.1221 1 0.0136 0.8378 ... 0.4842 1.3593 0.5902 0.4676 -1.9447
2010-06-18 4999 0.0136 1 0.8378 0.4887 ... 1.3593 0.5902 0.4676 -1.9447 -0.3440
[4941409 rows x 32 columns]
关于python - 拼接 Pandas Dataframe 的优化方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31275743/
.splice() 方法的基本问题,以及如何最好地从数组中删除元素。 我想使用 .splice() 从数组中删除一个项目,但是当我这样做时,我希望返回原始数组 减去 删除的元素。 .splice()
我正在过滤同位素库。单击按钮会添加到称为过滤器的数组中。这是正常工作的,但是当用户单击事件按钮时,我希望从数组中删除过滤的类别。由于某种原因,事实并非如此。 这是特定的代码: if($(this).h
几个月前,我将一个 Subversion 存储库转换为 Mercurial,结果在我的修订历史中留下了两个毫无意义的空白。我试图弄清楚我是否可以拼接间隙,但我一直无法让工具精确地完成我想要的。 在项目
我制作简单的射击游戏,但有一个问题(有时): GIF Game problem 3颗子弹被移除(但只有一颗子弹相撞)。子弹和敌人(蓝色方 block )位于一个数组中(var objects = []
假设我们在 JavaScript 中有两个数组,[3,4,7] 和 [5,6]。 在不排序或使用 .apply 的情况下,将 [5,6] 插入索引 2 处的 [3,4,7] 的最佳方式是什么实现结果数
我试图在从数组中删除项目时添加纸质警报对话框,但我似乎无法理解这是如何工作的。 我现在可以使用以下功能,无需对话框: _delete(e) { var index = this.t
我正在尝试使用 splice() 从 jQuery 对象中删除元素. 但是,最终发生的情况是所有其他项目都被删除。我假设这是由于使用 splice 重新索引造成的。 我要淡入每个 所以我需要从顶部开始
这是我尝试从数组中动态删除一个值的尝试 $('.btn-remove').click(function() { var players = ["compare","13076","13075"
我正在考虑在 Visual Studio 2008 上使用 OpenCV 2.3.1 实时拼接来自 2 个或更多(目前可能是 3 或 4 个)摄像头的图像。 但是,我很好奇它是如何完成的。 最近研究了
我在将两个数组拼接在一起时遇到问题。假设我有两个数组: a = array([1,2,3]) b = array([4,5,6]) 当我执行 vstack((a,b)) 时,我得到了 [[1,2,3]
我拼接 css 文件以提高性能。 现在我想包含一个 minify 函数,如下所示。我该如何合并它? function minify( $css ) { $css = preg_replace(
我有两个 matlab 向量。第一个有 N 个元素,另一个有 k*N。我知道 k 是什么,我想拼接列表,使第一个向量中的每个元素出现在下一个向量中相应的 k 元素之前。例如: k = 3 x = [1
我有以下上下文: https://jsfiddle.net/eqntaqbt/2/ obj.forEach(function(user, index){ var userName = user
假设你有一个像这样的数组: var arr= [{id:121, v:'a'}, {id:232, 'b'}]; 你需要找到 id: 232 并删除它,所以你可以这样做: for (var i = a
似乎是通过 建立报价语法非常低效。例如创建一个整数列表 let q1 = List.foldBack (fun n acc -> ) [1..100000] Real: 00:00:05.714,
我正在为一家希望为其用户创建服务的公司开发应用程序。该公司目前提供时长约为 1.5 小时的视频,他们想要集成的服务是让用户能够“录制”这个较大视频的剪辑,以创建本质上的精彩片段。此服务的最终结果将是
splice 当 OFFSET 在数组中但 LENGTH 的末尾超过数组末尾时,是否可以? 最佳答案 易于尝试。 $ perl -wE' my @a = "a".."e"; my @b =
以前从未使用过 Tkinter,我不太确定如何使用它或它是如何工作的。 Windows IDLE Shell。 import time from tkinter import * input("Pre
这里是 Javascript 新手 -- 我有以下数组: var group = ({ one: value1, two: value2, three:
我的屏幕上打印了以下行: Would you like to pay €xx to POS_ID Latte X 1....€2.50-Salad X 1....€4.00-Wrap X 1..
我是一名优秀的程序员,十分优秀!