回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个像这样的数据框</p>
<pre><code>In [10]: vlr
Out[10]:
data tipoOP qtd ... flxCx flxCx_USD pmAtual_USD
ticker ...
JBSS3.SA 2020-03-06 C 4.0 ... -86.390000 NaN NaN
WEGE3.SA 2020-08-27 C 3.0 ... -198.050000 NaN NaN
ITUB4.SA 2020-09-09 C 8.0 ... -195.180000 NaN NaN
WEGE3.SA 2020-09-09 V -3.0 ... 193.150000 NaN NaN
ITSA4.SA 2020-09-18 C 33.0 ... -297.430000 NaN NaN
... ... ... ... ... ... ...
ARZZ3.SA 2021-06-01 C 2.0 ... -174.610000 NaN NaN
CP 2021-06-02 C 1.0 ... -417.103785 -81.55 81.55
HSY 2021-06-02 C 1.0 ... -884.843100 -173.00 173.00
ARKQ 2021-06-02 V -2.0 ... 836.650400 163.60 NaN
JPM 2021-06-02 C 1.0 ... -853.745724 -166.92 166.92
</code></pre>
<p>然后我在做:</p>
<pre><code>vlr_full = vlr.groupby('data')
vlr_full = vlr_full.apply(holding.ord_ativo).drop(columns=['data'])
vlr_full = vlr_full['qtdAtual']
</code></pre>
<p>要获取<code>vlr_full</code>(<code>qtdAtual</code>列是当天拥有的资产数量,累积):</p>
<pre><code>In [12]: vlr_full
Out[12]:
data ticker
2020-03-06 JBSS3.SA 4.0
2020-08-27 WEGE3.SA 3.0
2020-09-09 ITUB4.SA 8.0
WEGE3.SA 0.0
2020-09-18 ITSA4.SA 33.0
2021-06-01 PRIO3.SA 50.0
2021-06-02 ARKQ 0.0
CP 1.0
HSY 1.0
JPM 1.0
Name: qtdAtual, Length: 125, dtype: float64
</code></pre>
<p><strong>(qtdAtual是指“拥有的股份”及其由vlr中“qtd”列的股票报价人计算的总和)</strong></p>
<p>我有这样一个<code>DatetimeIndex</code>:</p>
<pre><code>idx = pd.date_range(first_day,end=yesterday,freq='D')
</code></pre>
<p>这给了我买东西的第一天,直到昨天</p>
<p>我的目标是用缺失的日期填充<code>vlr_full</code>“数据”级索引,并且对于每个日期,都有一个位于<code>vlr</code>的所有股票代码的索引。如果股票在给定日期没有交易,我将保留以前的值(如果尚未交易,则保留0)。因此,我计划使用<code>yfinance</code>模块获取历史报价数据,并将其作为新列插入(乘以我当时拥有的数量)。在那之后我会策划一些事情</p>
<p>我试过这样的东西:</p>
<pre><code>vlr_full.reindex(idx)
</code></pre>
<p>但是,显然它不起作用(ValueError:无法处理非唯一的多索引!)。我不确定如何继续,我尝试了一些相关的问题,但无法将它们应用到我的问题中。我确信有一些单行代码可以解决这个问题,但我在不断学习</p>
<p>至于我正在寻找的输出,它将类似于:</p>
<pre><code>In [12]: vlr_full
Out[12]:
data ticker
2020-03-06 ABEV3.SA 0.0
AMD 0.0
ARKQ 0.0
ARRZ3.SA 0.0
CP 0.0
HSY 0.0
ITUB4.SA 0.0
ITSA4.SA 0.0
JBSS3.SA 4.0
... ... ...
2020-03-07 ABEV3.SA 0.0
AMD 0.0
ARKQ 0.0
ARRZ3.SA 0.0
CP 0.0
HSY 0.0
ITUB4.SA 0.0
ITSA4.SA 0.0
JBSS3.SA 4.0
... ... ...
... ... ...
2021-06-17 ABEV3.SA 45
AMD 5
ARKQ 0
ARRZ3.SA 12
CP 1
HSY 1
ITUB4.SA 0.0
ITSA4.SA 139
JBSS3.SA 0.0
</code></pre>
<p>因此,对于每个日期,从2020-03-06(第一个日期)开始到昨天(2021-06-17,从今天开始),我希望有一个指数水平,通过我在某个点交易过的所有股票代码,并在该日期放置所拥有的股票(如果之前未交易,则为零)。
我的问题是在第一层填充缺失的日期,然后在第二层填充股票代码符号</p>
<p>请注意,在输出示例中,我在2020-03-06只有4份JBSS3.SA股票,仅此而已,直到2020-08-27,这一点都是正确的,同时仍然将所有其他股票归为0份</p>
<p><strong>EDIT1:</strong></p>
<p>我试过这个:</p>
<pre><code>vlr_full.reindex(pd.MultiIndex.from_product([idx,vlr_full.index.unique(level=1)], names=['data', 'ticker']), fill_value=0)
</code></pre>
<p>但它给了我:</p>
<pre><code>ValueError: cannot handle a non-unique multi-index!
</code></pre>
<p><code>idx</code>是:</p>
<pre><code>In [29]:idx
Out[29]:
DatetimeIndex(['2020-03-06', '2020-03-07', '2020-03-08', '2020-03-09',
'2020-03-10', '2020-03-11', '2020-03-12', '2020-03-13',
'2020-03-14', '2020-03-15',
...
'2021-06-08', '2021-06-09', '2021-06-10', '2021-06-11',
'2021-06-12', '2021-06-13', '2021-06-14', '2021-06-15',
'2021-06-16', '2021-06-17'],
dtype='datetime64[ns]', length=469, freq='D')
</code></pre>
<p>而{<cd8>}是:</p>
<pre><code>In [30]:vlr_full.index.unique(level=1)
Out[30]:
Index(['JBSS3.SA', 'WEGE3.SA', 'ITUB4.SA', 'ITSA4.SA', 'CPFE3.SA', 'TAEE11.SA',
'VIVT4.SA', 'OIBR3.SA', 'TAEE4.SA', 'EGIE3.SA', 'SAPR11.SA', 'TIMS3.SA',
'EQTL3.SA', 'VIVT3.SA', 'ABEV3.SA', 'HGLG11.SA', 'LEVE3.SA', 'RAIL3.SA',
'XPLG11.SA', 'TAEE3.SA', 'ARKQ', 'ARZZ3.SA', 'GME', 'AMD', 'DIS',
'EZTC3.SA', 'FLRY3.SA', 'RIO', 'FTM', 'JALL3.SA', 'PRIO3.SA',
'BLAU3.SA', 'CP', 'HSY', 'JPM'],
dtype='object', name='ticker')
</code></pre>