例
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) 使用groupby和并行的最有效方法是在pandas中应用过滤器?
基本上我要求SQL中的等价物
select *
...
group by col_name
having condition
Run Code Online (Sandbox Code Playgroud)
我认为有很多用例,包括条件均值,总和,条件概率等,这些都会使这样的命令非常强大.
我需要一个非常好的性能,所以理想情况下这样的命令不会是在python中完成的几个分层操作的结果.
分位数函数给出了给定的大熊猫系列的分位数,
例如
s.quantile(0.9)是4.2
是否存在反函数(即累积分布),它找到值x
s.quantile(X)= 4
谢谢
大熊猫和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'
有人知道如何等到页面加载?我尝试了我在网上找到的所有可能的变种但是根本不起作用.
我需要在触发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)来解决问题,但这是次优的,因为它可能会减慢整个过程.如果可能的话,最好只等待严格要求的时间.
谢谢
我正在比较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倍).
所以问题是:
我正在使用Fedora 16,我最近安装了ATLAS和LAPACK库(但性能已发生了很大变化).我是否应该重建numpy?我不确定我的numpy安装是否使用适当的库来获得最大速度,也许Matlab正在使用更好的库. …
我有几个python模块(组织成包),它们相互依赖.例如
让我们假设开发应用程序的相关接口在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等等....
谢谢!
这可能听起来像一个微不足道的问题,但我无法找到适当的文档,包括帮助(pd.Timestamp),它没有提供明确的构造函数.
我想创建例如2012-12-13天的最后时间戳,所以小时是23,分钟是59,秒是59,纳秒是999999999
或者,如果我有微秒精度,那么一天的最后时间戳将与之前一样,除了微秒是999999
我需要通过像df.ix [:last_timestamp]之类的东西索引原始系列来过滤所有时间戳直到给定(结束)日期
谢谢
我有很长一段时间,例如.
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)
这种方法存在以下问题:
我很清楚如何使用C++扩展Python,但是如果我想在Java中编写一个与numpy一起使用的函数呢?
这是一个简单的场景:我想使用Java类计算numpy数组的平均值.如何将numpy向量传递给Java类并收集结果?
谢谢你的帮助!
python ×9
pandas ×6
numpy ×3
time-series ×2
compilation ×1
cython ×1
indexing ×1
java ×1
matlab ×1
package ×1
performance ×1
precision ×1
quantile ×1
selenium ×1