小编Man*_*gia的帖子

如何使用pandas数据帧创建滞后数据结构

s=pd.Series([5,4,3,2,1], index=[1,2,3,4,5])
print s 
1    5
2    4
3    3
4    2
5    1
Run Code Online (Sandbox Code Playgroud)

有没有一种有效的方法来创建一个系列.例如,在每一行中包含滞后值(在此示例中最多滞后2)

3    [3, 4, 5]
4    [2, 3, 4]
5    [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

这相当于s = pd.Series([[3,4,5],[2,3,4],[1,2,3]],index = [3,4,5])

对于具有很长时间序列的数据帧,如何以高效的方式完成这项工作?

谢谢

看到答案后编辑

好的,最后我实现了这个功能:

def buildLaggedFeatures(s,lag=2,dropna=True):
'''
Builds a new DataFrame to facilitate regressing over all possible lagged features
'''
if type(s) is pd.DataFrame:
    new_dict={}
    for col_name in s:
        new_dict[col_name]=s[col_name]
        # create lagged Series
        for l in range(1,lag+1):
            new_dict['%s_lag%d' %(col_name,l)]=s[col_name].shift(l)
    res=pd.DataFrame(new_dict,index=s.index)

elif type(s) is pd.Series:
    the_range=range(lag+1) …
Run Code Online (Sandbox Code Playgroud)

python pandas

36
推荐指数
5
解决办法
3万
查看次数

熊猫:有什么相当于SQL组?

使用groupby和并行的最有效方法是在pandas中应用过滤器?

基本上我要求SQL中的等价物

select *
...
group by col_name
having condition
Run Code Online (Sandbox Code Playgroud)

我认为有很多用例,包括条件均值,总和,条件概率等,这些都会使这样的命令非常强大.

我需要一个非常好的性能,所以理想情况下这样的命令不会是在python中完成的几个分层操作的结果.

python pandas pandas-groupby

36
推荐指数
1
解决办法
2万
查看次数

什么是熊猫系列的分位数函数的反转?

分位数函数给出了给定的大熊猫系列分位数,

例如

s.quantile(0.9)是4.2

是否存在反函数(即累积分布),它找到值x

s.quantile(X)= 4

谢谢

python quantile pandas

31
推荐指数
6
解决办法
1万
查看次数

熊猫与numpy的不同std

大熊猫和numpy之间的标准偏差不同.为什么和哪一个是正确的?(相对差异是3.5%,这不应该来自四舍五入,这在我看来很高).

import numpy as np
import pandas as pd
from StringIO import StringIO

a='''0.057411
0.024367
 0.021247
-0.001809
-0.010874
-0.035845
0.001663
0.043282
0.004433
-0.007242
0.029294
0.023699
0.049654
0.034422
-0.005380'''


df = pd.read_csv(StringIO(a.strip()), delim_whitespace=True, header=None)

df.std()==np.std(df) # False
df.std() # 0.025801
np.std(df) # 0.024926

(0.024926 - 0.025801) / 0.024926 # 3.5% relative difference
Run Code Online (Sandbox Code Playgroud)

我使用这些版本:

熊猫:'0.14.0'numpy:'1.8.1'

python precision numpy pandas

26
推荐指数
2
解决办法
8058
查看次数

python selenium:不等到click()命令后加载页面

有人知道如何等到页面加载?我尝试了我在网上找到的所有可能的变种但是根本不起作用.

我需要在触发click()命令后等待,在Web服务器上有一些内部脚本,这些脚本会欺骗检查(例如,我排除导入所需模块的代码并使用标准命名约定):

WebDriverWait(browser, 10).until(lambda d: d.find_element_by_id(the_id))
Run Code Online (Sandbox Code Playgroud)

要么

browser.implicitly_wait(10) 
Run Code Online (Sandbox Code Playgroud)

要么

elem2=wait.until(EC.presence_of_element_located((By.ID,the_id)))
Run Code Online (Sandbox Code Playgroud)

所有上述检查都不起作用,即使页面仍在加载,它们也会返回True.这会导致我正在阅读的文本不完整,因为在click()命令之后页面未完全加载.似乎在python中命令clickAndWait不可用(但同样,它可能无法解决问题,因为其他测试也失败).理想情况下,会有一个命令等待整个网页加载(无论页面的特定元素如何).

我设法通过在循环中手动插入time.sleep(5)来解决问题,但这是次优的,因为它可能会减慢整个过程.如果可能的话,最好只等待严格要求的时间.

谢谢

python selenium

20
推荐指数
1
解决办法
2万
查看次数

为什么numpy比数字化示例上的matlab慢得多?

我正在比较numpy和matlab的性能,在一些情况下我观察到numpy明显变慢(索引,对数组的简单操作,如绝对值,乘法,求和等).让我们看看下面的例子,它以某种方式引人注目,涉及函数digitize(我打算用它来同步时间戳):

import numpy as np
import time
scale=np.arange(1,1e+6+1)
y=np.arange(1,1e+6+1,10)
t1=time.time()
ind=np.digitize(scale,y)
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1)
Run Code Online (Sandbox Code Playgroud)

结果是:

时间过去了55.91秒

现在让我们使用等效函数histc尝试相同的Matlab 示例

scale=[1:1e+6];
y=[1:10:1e+6];
tic
[N,bin]=histc(scale,y);
t=toc;
display(['Time passed is ',num2str(t), ' seconds'])
Run Code Online (Sandbox Code Playgroud)

结果是:

时间过去了0.10237秒

要快560倍!

当我学习使用C++扩展Python时,我实现了自己的数字化版本(使用扩展库的boost库):

import analysis # my C++ module implementing digitize
t1=time.time()
ind2=analysis.digitize(scale,y)
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1)
np.all(ind==ind2) #ok
Run Code Online (Sandbox Code Playgroud)

结果是:

时间过去了0.02秒

因为我的数字化版本假设输入都是单调的,所以有一点作弊,这可能解释为什么它比Matlab更快.但是,对大小为1e + 6的数组进行排序需要0.16秒(使用numpy.sort),因此与Matlab函数histc相比,我的函数性能更差(约1.6倍).

所以问题是:

  • 为什么numpy.digitize这么慢?这个函数不应该用编译和优化的代码编写吗?
  • 为什么我自己的数字化版本比numpy.digitize快得多,但仍然比Matlab慢(我相信我使用最快的算法,假设我假设输入已经排序)?

我正在使用Fedora 16,我最近安装了ATLAS和LAPACK库(但性能已发生了很大变化).我是否应该重建numpy?我不确定我的numpy安装是否使用适当的库来获得最大速度,也许Matlab正在使用更好的库. …

python performance matlab numpy

14
推荐指数
2
解决办法
4054
查看次数

如何使用cython编译和链接多个python模块(或包)?

我有几个python模块(组织成包),它们相互依赖.例如

  • 模块1
  • Module2:导入Module1
  • 单词数
  • Module4:导入Module3,Module 2,Module 1

让我们假设开发应用程序的相关接口在Module4中,我想使用cython生成Module4.so.如果我以天真的方式继续,我得到一个扩展Module4.so我可以导入扩展依赖于 Module1,Module2,Module3 的python源代码.

有没有一种方法可以编译,以便Module1,Module2,Module3被编译并链接到Module4?我想避免手动完成所有操作,例如首先编译Module1.so然后在Module2中更改import声明,以便导入Module1.so而不是Module1.py,然后将Module2编译成Module2.so等等....

谢谢!

python compilation package cython

14
推荐指数
1
解决办法
1万
查看次数

如何创建一个pandas Timestamp对象?

这可能听起来像一个微不足道的问题,但我无法找到适当的文档,包括帮助(pd.Timestamp),它没有提供明确的构造函数.

我想创建例如2012-12-13天的最后时间戳,所以小时是23,分钟是59,秒是59,纳秒是999999999

或者,如果我有微秒精度,那么一天的最后时间戳将与之前一样,除了微秒是999999

我需要通过像df.ix [:last_timestamp]之类的东西索引原始系列来过滤所有时间戳直到给定(结束)日期

谢谢

python time-series pandas

11
推荐指数
1
解决办法
1万
查看次数

如何按天拆分pandas数据帧或系列(可能使用迭代器)

我有很长一段时间,例如.

import pandas as pd
index=pd.date_range(start='2012-11-05', end='2012-11-10', freq='1S').tz_localize('Europe/Berlin')
df=pd.DataFrame(range(len(index)), index=index, columns=['Number'])
Run Code Online (Sandbox Code Playgroud)

现在我想提取每天的所有子DataFrame,以获得以下输出:

df_2012-11-05: data frame with all data referring to day 2012-11-05
df_2012-11-06: etc.
df_2012-11-07
df_2012-11-08
df_2012-11-09
df_2012-11-10
Run Code Online (Sandbox Code Playgroud)

最有效的方法是什么,避免检查index.date == give_date是否非常慢.此外,用户不知道框架中的天数范围.

任何提示都使用迭代器来做到这一点?

我目前的解决方案是这样,但它不是那么优雅,并且有两个问题定义如下:

time_zone='Europe/Berlin'
# find all days
a=np.unique(df.index.date) # this can take a lot of time
a.sort()
results=[]
for i in range(len(a)-1):
    day_now=pd.Timestamp(a[i]).tz_localize(time_zone)
    day_next=pd.Timestamp(a[i+1]).tz_localize(time_zone)
    results.append(df[day_now:day_next]) # how to select if I do not want day_next included?

# last day
results.append(df[day_next:])
Run Code Online (Sandbox Code Playgroud)

这种方法存在以下问题:

  • a = np.unique(df.index.date)可能需要很长时间
  • df [day_now:day_next]包含day_next,但我需要将其排除在范围内

python indexing time-series pandas

9
推荐指数
2
解决办法
1万
查看次数

如何从python/numpy调用java函数?

我很清楚如何使用C++扩展Python,但是如果我想在Java中编写一个与numpy一起使用的函数呢?

这是一个简单的场景:我想使用Java类计算numpy数组的平均值.如何将numpy向量传递给Java类并收集结果?

谢谢你的帮助!

java numpy

8
推荐指数
1
解决办法
1万
查看次数