关于dask.dataframe行为,我有些不明白。假设我想从熊猫复制这个
import pandas as pd
import dask.dataframe as dd
import random
s = "abcd"
lst = 10*[0]+list(range(1,6))
n = 100
df = pd.DataFrame({"col1": [random.choice(s) for i in range(n)],
"col2": [random.choice(lst) for i in range(n)]})
# I will need an hash in dask
df["hash"] = 2*df.col1
df = df[["hash","col1","col2"]]
def fun(data):
if data["col2"].mean()>1:
data["col3"]=2
else:
data["col3"]=1
return(data)
df1 = df.groupby("col1").apply(fun)
df1.head()
Run Code Online (Sandbox Code Playgroud)
这返回
hash col1 col2 col3
0 dd d 0 1
1 aa a 0 2
2 bb b …Run Code Online (Sandbox Code Playgroud) 我有几个文件,其中有一列被调用idx,我想将它用作索引。获得的数据帧大约有 13M 行。我知道我可以通过这种方式读取和分配索引(这很慢~40秒)
df = dd.read_parquet("file-*.parq")
df = df.set_index("idx")
Run Code Online (Sandbox Code Playgroud)
或以其他方式(快约 40 毫秒)
df = dd.read_parquet("file-*.parq", index = "idx")
Run Code Online (Sandbox Code Playgroud)
使用第二种方法计算长度的简单操作要快 4 倍。我不明白的是
df.known_divisions返回,True而在第二种情况下是False。我期待相反的行为。然后我df在没有 known_division 的情况下做了几个操作,我总是获得更好的性能。我正在挠头想知道这是否是故意发生的。更新
这不仅仅是计算len哪个更快。在我的计算中,我使用 groupby 创建了 4 个新数据帧,多次申请和加入,这些是时间
| |Load and reindex (s)|Load with index (s)|
|:-----------------|-------------------:|------------------:|
| load | 12.5000 | 0.0124 |
| grp, apply, join | 11.4000 | 6.2700 |
| compute() | 146.0000 | 125.0000 |
| TOTAL | 169.9000 | …Run Code Online (Sandbox Code Playgroud) 鉴于此示例数据框,
Cents Date
MN
Shop 0.03 01012019
Shop 0.22 01012019
Shop 0.12 01012019
Shop 0.08 02012019
Shop 0.02 02012019
Shop 0.02 02012019
Shop 0.02 03012019
Shop 0.09 03012019
Shop 0.11 03012019
Shop 0.02 04012019
Shop 0.03 04012019
Shop 0.04 04012019
Run Code Online (Sandbox Code Playgroud)
我想重塑我的数据框成为
到目前为止我尝试过的,
删除原始样本数据帧的索引
df1 = df.reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)旋转示例数据框,
df1.pivot(index=None, columns='Date', values='Cents')
Run Code Online (Sandbox Code Playgroud)旋转后我无法获得想要的结果,这就是我得到的
有人可以告诉我为什么会这样吗?我很确定它与数据透视表如何与我的数据框一起工作有关(也许我需要一个在这种情况下我不能拥有的唯一索引?)。如果您能让我知道我应该如何继续,我将不胜感激。
谢谢你。
我需要在 python 中以 plotly 更改子图标题,即将其旋转 90 度。我很努力,但没有成功。
这是我的代码
import plotly.offline as pyo
import plotly.graph_objs as go
from plotly import tools
trace1 = go.Bar(
x=[1, 2, 3],
y=[10, 11, 12]
)
trace2 = go.Bar(
x=[1, 2, 3],
y=[100, 110, 120],
)
trace3 = go.Bar(
x=[1, 2, 3],
y=[1000, 1100, 1200],
)
fig = tools.make_subplots(rows=1, cols=3,
shared_xaxes=True, shared_yaxes=True,
vertical_spacing=0.001,
subplot_titles = ('first_title', 'second_title', 'third_title'))
fig.append_trace(trace1, 1, 1)
fig.append_trace(trace2, 1, 2)
fig.append_trace(trace3, 1, 3)
fig['layout'].update(height=600, width=600, title='main_title')
pyo.plot(fig, filename='file.html')
Run Code Online (Sandbox Code Playgroud)
所以,我想旋转'first_title','second_title' …
我正在尝试绘制一条动态定位的垂直线,以便在进行过滤时,该线将相应地移动。例如,使用下面的代码,我可以在25K处绘制一条固定的垂直线,该垂直线将整个数据集用作中值,但是当数据被过滤为“ Americas”时(仅因为x轴范围现在为45K),该线不再位于中间位置。
那么,如何绘制位于x轴范围的中间位置的垂直线呢?谢谢
import pandas as pd
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)
df = pd.read_csv('https://raw.githubusercontent.com/yankev/test/master/life-expectancy-per-GDP-2007.csv')
americas = df[(df.continent=='Americas')]
europe = df[(df.continent=='Europe')]
trace_comp0 = go.Scatter(
x=americas.gdp_percap,
y=americas.life_exp,
mode='markers',
marker=dict(size=12,
line=dict(width=1),
color="navy"
),
name='Americas',
text=americas.country,
)
trace_comp1 = go.Scatter(
x=europe.gdp_percap,
y=europe.life_exp,
mode='markers',
marker=dict(size=12,
line=dict(width=1),
color="red"
),
name='Europe',
text=europe.country,
)
data_comp = [trace_comp0, trace_comp1]
layout_comp = go.Layout(
title='Life Expectancy v. Per Capita GDP, 2007',
hovermode='closest',
xaxis=dict(
title='GDP per capita (2000 dollars)',
ticklen=5,
zeroline=False,
gridwidth=2,
range=[0, 50_000],
),
yaxis=dict( …Run Code Online (Sandbox Code Playgroud) 我有一个数据框
Date Category Sum
0 2019-06-03 "25M" 34
1 2019-06-03 "25M" 60
2 2019-06-03 "50M" 23
3 2019-06-04 "25M" 67
4 2019-06-05 "50M" -90
5 2019-06-05 "50M" 100
6 2019-06-06 "100M" 6
7 2019-06-07 "25M" -100
8 2019-06-08 "100M" 67
9 2019-06-09 "25M" 450
10 2019-06-10 "50M" 600
11 2019-06-11 "25M" -9
12 2019-07-12 "50M" 45
13 2019-07-13 "50M" 67
14 2019-07-14 "100M" 130
15 2019-07-14 "50M" 45
16 2019-07-15 "100M" 100
17 2019-07-16 "25M" -90
18 2019-07-17 "25M" 700 …Run Code Online (Sandbox Code Playgroud) 我对如何从 dask 中获得最佳效果感到困惑。
问题
我有一个包含多个时间序列的数据帧(每个都有自己的时间序列key),我需要my_fun在每个时间序列上运行一个函数。使用 Pandas 解决它的一种方法涉及
df = list(df.groupby("key"))然后应用my_fun
多处理。尽管 RAM 使用量很大,但性能在我的机器上非常好,而在谷歌云计算上却很糟糕。
在 Dask 我目前的工作流程是:
import dask.dataframe as dd
from dask.multiprocessing import get
Run Code Online (Sandbox Code Playgroud)
因为我没有设置索引df.known_divisions是False
问题:
df.npartitions作为倍数更好ncpu还是无关紧要?从这个似乎是更好地设置索引的关键。我的猜测是我可以做类似的事情
df["key2"] = df["key"] df = df.set_index("key2")
但是,同样,我不知道这是否是最好的方法。
我想要一个包含两个子图的图,一个较大的带有地图,第二个较小的带有散点图。我正在使用 cartopy 来绘制地图。我使用 gridspec_kw 确定高度的分数。然而,由于投影的限制,它也会影响宽度。
。
这就是我得到的。
import matplotlib.pyplot as plt
import cartopy as ccrs
fig, ax = plt.subplots(2,1,subplot_kw=dict(projection=ccrs.crs.PlateCarree()),gridspec_kw={'height_ratios': [4, 1]})
Run Code Online (Sandbox Code Playgroud)
一种可能的解决方案是仅对上面板使用 subplot_kw=dict(projection=ccrs.crs.PlateCarree() 。但我无法弄清楚如何做到这一点。有一些方法推荐 add_subplot ,但这是非常手动的我不喜欢这个。可以用 plt.subplots() 来做吗?
我想使用 dask 2.14 扩展我在 Pandas 数据帧上执行的一些操作。例如,我想对数据框的列应用移位:
import dask.dataframe as dd
data = dd.read_csv('some_file.csv')
data.set_index('column_A')
data['column_B'] = data.groupby(['column_A'])['column_B'].shift(-1)
Run Code Online (Sandbox Code Playgroud)
但是我AttributeError: 'SeriesGroupBy' object has no attribute 'shift'
读了 dask 文档,发现没有这样的方法(而在熊猫中)
你能提出一些有效的替代方案吗?
谢谢
python ×9
dask ×5
plotly ×3
group-by ×2
pandas ×2
plotly-dash ×2
apply ×1
cartopy ×1
dataframe ×1
geospatial ×1
matplotlib ×1