我有一个简单的堆叠线图,它具有我想要使用以下代码时神奇地设置的日期格式.
df_ts = df.resample("W", how='max')
df_ts.plot(figsize=(12,8), stacked=True)
Run Code Online (Sandbox Code Playgroud)
然而,当绘制与条形图相同的数据时,日期神秘地将自身转换为丑陋且不可读的格式.
df_ts = df.resample("W", how='max')
df_ts.plot(kind='bar', figsize=(12,8), stacked=True)
Run Code Online (Sandbox Code Playgroud)
原始数据进行了一些转换,以获得每周最大值.为什么自动设定日期发生了根本变化?我怎样才能拥有如上所述的格式良好的日期?
这是一些虚拟数据
start = pd.to_datetime("1-1-2012")
idx = pd.date_range(start, periods= 365).tolist()
df=pd.DataFrame({'A':np.random.random(365), 'B':np.random.random(365)})
df.index = idx
df_ts = df.resample('W', how= 'max')
df_ts.plot(kind='bar', stacked=True)
Run Code Online (Sandbox Code Playgroud) 我试图从使用seaborn的统计学习简介一书中重新创建以下情节
我特别想用seaborn lmplot
来创建前两个图并boxplot
创建第二个图.主要问题是lmplot facetgrid
根据这个答案创建了一个强制我为盒子图添加另一个matplotlib轴.我想知道是否有更简单的方法来实现这一目标.下面,我必须进行相当多的手动操作才能获得所需的情节.
seaborn_grid = sns.lmplot('value', 'wage', col='variable', hue='education', data=df_melt, sharex=False)
seaborn_grid.fig.set_figwidth(8)
left, bottom, width, height = seaborn_grid.fig.axes[0]._position.bounds
left2, bottom2, width2, height2 = seaborn_grid.fig.axes[1]._position.bounds
left_diff = left2 - left
seaborn_grid.fig.add_axes((left2 + left_diff, bottom, width, height))
sns.boxplot('education', 'wage', data=df_wage, ax = seaborn_grid.fig.axes[2])
ax2 = seaborn_grid.fig.axes[2]
ax2.set_yticklabels([])
ax2.set_xticklabels(ax2.get_xmajorticklabels(), rotation=30)
ax2.set_ylabel('')
ax2.set_xlabel('');
leg = seaborn_grid.fig.legends[0]
leg.set_bbox_to_anchor([0, .1, 1.5,1])
Run Code Online (Sandbox Code Playgroud)
DataFrames的示例数据:
df_melt = {'education': {0: '1. < HS Grad',
1: '4. College Grad',
2: '3. Some College', …
Run Code Online (Sandbox Code Playgroud) 我试图找到最有效的方法来从NumPy数组中查找唯一值.NumPy的unique
功能非常慢,在找到唯一值之前先对值进行排序.Pandas使用klib C库来散列值,这个库要快得多.我正在寻找一个Cython解决方案.
最简单的解决方案似乎是遍历数组并使用Python集添加每个元素,如下所示:
from numpy cimport ndarray
from cpython cimport set
@cython.wraparound(False)
@cython.boundscheck(False)
def unique_cython_int(ndarray[np.int64_t] a):
cdef int i
cdef int n = len(a)
cdef set s = set()
for i in range(n):
s.add(a[i])
return s
Run Code Online (Sandbox Code Playgroud)
我也试过c ++中的unordered_set
from libcpp.unordered_set cimport unordered_set
@cython.wraparound(False)
@cython.boundscheck(False)
def unique_cpp_int(ndarray[np.int64_t] a):
cdef int i
cdef int n = len(a)
cdef unordered_set[int] s
for i in range(n):
s.insert(a[i])
return s
Run Code Online (Sandbox Code Playgroud)
性能
# create array of 1,000,000
a = np.random.randint(0, …
Run Code Online (Sandbox Code Playgroud) 我使用Cython或NumPy对一维数组中的每个元素求和.当求和整数时, Cython的速度提高了约20%.总结浮点数时,Cython 慢约2.5倍.以下是使用的两个简单函数.
#cython: boundscheck=False
#cython: wraparound=False
def sum_int(ndarray[np.int64_t] a):
cdef:
Py_ssize_t i, n = len(a)
np.int64_t total = 0
for i in range(n):
total += a[i]
return total
def sum_float(ndarray[np.float64_t] a):
cdef:
Py_ssize_t i, n = len(a)
np.float64_t total = 0
for i in range(n):
total += a[i]
return total
Run Code Online (Sandbox Code Playgroud)
创建两个每个包含100万个元素的数组:
a_int = np.random.randint(0, 100, 10**6)
a_float = np.random.rand(10**6)
%timeit sum_int(a_int)
394 µs ± 30 µs per loop (mean ± std. dev. of 7 …
Run Code Online (Sandbox Code Playgroud) Numpy的字符串函数都非常慢,并且性能低于纯python列表.我期待使用Cython优化所有正常的字符串函数.
例如,让我们采用一个100,000个unicode字符串的numpy数组,其数据类型为unicode或object,每个字符串为lowecase.
alist = ['JsDated', '???????'] * 50000
arr_unicode = np.array(alist)
arr_object = np.array(alist, dtype='object')
%timeit np.char.lower(arr_unicode)
51.6 ms ± 1.99 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Run Code Online (Sandbox Code Playgroud)
使用列表理解同样快
%timeit [a.lower() for a in arr_unicode]
44.7 ms ± 2.69 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Run Code Online (Sandbox Code Playgroud)
对于对象数据类型,我们无法使用np.char
.列表理解速度是3倍.
%timeit [a.lower() for a in arr_object]
16.1 ms ± 147 µs per loop (mean ± std. dev. of 7 …
Run Code Online (Sandbox Code Playgroud) 我有一个pd DataFrame,通常采用以下格式:
1 2 3 4
0.1100 0.0000E+00 1.0000E+00 5.0000E+00
0.1323 7.7444E-05 8.7935E-01 1.0452E+00
0.1545 4.3548E-04 7.7209E-01 4.5432E-01
0.1768 1.2130E-03 6.7193E-01 2.6896E-01
0.1990 2.5349E-03 5.7904E-01 1.8439E-01
0.2213 4.5260E-03 4.9407E-01 1.3771E-01
Run Code Online (Sandbox Code Playgroud)
我想要做的是从列表中重新采样列1(索引)值,例如:
indexList = numpy.linspace(0.11, 0.25, 8)
Run Code Online (Sandbox Code Playgroud)
然后我需要从输入DataFrame线性插值第2,3和4列的值(我总是只重新采样/重新索引我的第1列) - 如果需要外推,作为我的最小值/最大值list不一定在我现有的第1列(索引)中.然而,关键点是插值部分.我是python的新手,但我正在考虑使用这样的方法:
不知何故感觉我应该能够使用.interpolate功能,但我无法弄清楚如何.我不能直接使用它 - 它太不准确了,因为在第2-4列中提到的重新索引后的大部分条目都是NaN的; 插值应该在我的初始DataFrame的两个最接近的值内完成.任何好的提示有人吗?(如果我的格式/意图不清楚,请告诉我......)
我想知道是否有一种简单的方法可以获取 wordnet 中名词的同义词。看来形容词的同义词很容易找到。
for ss in wn.synsets('beautiful'):
print(ss)
for sim in ss.similar_tos():
print(' {}'.format(sim))
Run Code Online (Sandbox Code Playgroud)
我从另一个 SO 问题中找到了上面的代码,它对于形容词效果很好。但当我说“汽油”或“火”时,结果就很糟糕了。理想情况下,我会得到一个与该网站非常相似的单词列表。
我尝试过的其他方法取得了良好的效果,但速度非常慢,如下:
def syn(word, lch_threshold=2.26):
for net1 in wn.all_synsets():
try:
lch = net1.lch_similarity(wn.synset(word))
except:
continue
# The value to compare the LCH to was found empirically.
# (The value is very application dependent. Experiment!)
if lch >= lch_threshold:
yield (net1, lch)
for x in syn('gasoline.n.1'):
print x
Run Code Online (Sandbox Code Playgroud)
这也是从另一个 SO 问题中找到的。有没有更简单的方法来获取上面提供的链接中的名词同义词?
我正在尝试完成SAS BI Web服务开发人员指南第19页上的示例.我已逐字按照说明操作,但在发出帖子请求时无法获取存储过程(自动为Web服务)以返回正确的结果.我正在尝试SOAP和XML.错误是永远找不到'instream'数据源.
我要求的是有人复制示例并使用post请求(以curl的形式)提供确切的XML和/或SOAP.
这是SOAP(直接来自指南)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:sas="urn:schemas-microsoft-com:xml-analysis">
<soapenv:Header/>
<soapenv:Body>
<sas:Execute>
<sas:Command>
<StoredProcess name="/WebServicesExamples/sampMeans">
<Parameter name="tablename">InData</Parameter>
<Stream name="instream">
<Table>
<InData>
<Column1>1</Column1>
<Column2>20</Column2>
<Column3>99</Column3>
</InData>
<InData>
<Column1>50</Column1>
<Column2>200</Column2>
<Column3>9999</Column3>
</InData>
<InData>
<Column1>100</Column1>
<Column2>2000</Column2>
<Column3>1000000</Column3>
</InData>
</Table>
</Stream>
</StoredProcess>
</sas:Command>
<sas:Properties>
<PropertyList>
<DataSourceInfo>Provider=SASSPS;</DataSourceInfo>
</PropertyList>
</sas:Properties>
</sas:Execute>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
我通过curl发帖.这是我的curl命令
curl -H "Content-Type: text/xml" -X POST https://mycompany.com:port/SASBIWS/services/WebServicesExamples/sampMeans --data "@sampmeanssoap.xml"
Run Code Online (Sandbox Code Playgroud)
但这会产生错误
在执行"WebServicesExamples/sampMeans"服务期间发生了"客户端"类型的异常.例外如下:未指定预期的流'instream'.
XML产生类似的响应
<StoredProcess name="/WebServicesExamples/sampMeans">
<Parameter name="tablename">InData</Parameter>
<Stream name="instream">
<Table>
<InData>
<Column1>1</Column1>
<Column2>20</Column2>
<Column3>99</Column3>
</InData>
<InData>
<Column1>50</Column1>
<Column2>200</Column2>
<Column3>9999</Column3>
</InData>
<InData>
<Column1>100</Column1> …
Run Code Online (Sandbox Code Playgroud) 熊猫apply/map
是我的克星,甚至在小数据集上也可能令人痛苦地慢.下面是一个非常简单的例子,其速度差异近3个数量级.下面我创建一个Series
包含100万个值的数据,只想将大于.5的值映射到"是",将小于.5的值映射到"否".如何对此进行矢量化或显着加快速度?
ser = pd.Series(np.random.rand(1000000))
# vectorized and fast
%%timeit
ser > .5
Run Code Online (Sandbox Code Playgroud)
1000个循环,最佳3:477μs/循环
%%timeit
ser.map(lambda x: 'Yes' if x > .5 else 'No')
Run Code Online (Sandbox Code Playgroud)
1个循环,每个循环最好为3:255 ms
我试图找到使用 Cython 对 numpy 数组进行水平求和的最快方法。首先,假设我有一个 10 x 100,000 随机浮点数的 2D 数组。我可以创建一个object
数组,每列作为数组中的一个值,如下所示:
n = 10 ** 5
a = np.random.rand(10, n)
a_obj = np.empty(n, dtype='O')
for i in range(n):
a_obj[i] = a[:, i]
Run Code Online (Sandbox Code Playgroud)
我想做的就是找到每一行的总和。它们都可以这样简单地计算:
%timeit a.sum(1)
414 µs ± 24.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit a_obj.sum()
113 ms ± 7.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Run Code Online (Sandbox Code Playgroud)
对象数组慢 250 倍。
在尝试总结之前,我想对每个元素的访问时间进行计时。Cython 在直接遍历每个项目时无法加速访问对象数组的每个成员:
def access_obj(ndarray[object] …
Run Code Online (Sandbox Code Playgroud)