我希望这样做没有一个循环(速度和学习如何)。
为了找出目前市场上有多少辆汽车,假设你有从1923年到今天的所有年份的销量。
这是5个不同国家的情况。
对于所有国家,我也有一个衰减向量,因为汽车在某个点停止工作,向量包含了在生产后给定年数时发生故障并退出市场的汽车数量。
它可能看起来像这样:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(100,1000,size=(100, 5)), columns=list('ABCDE'))
break_vector = np.random.dirichlet(np.ones(100),size=1)
break_vector的和为1,因为我们可以假设这些汽车中没有一辆能在道路上行驶超过100年。
我们要计算的是每个国家每年的剩余汽车数量,所以计算基本上是针对每个市场:
从df
中取出1923年售出的汽车数量,乘以break_vector
,在1924年,我们需要做同样的事情,然后加上1923年以来尚未分解的汽车数量(break_vector
中前两位的总和乘以1923年售出的汽车数量),依此类推。
最后,我们得到了一个 Dataframe ,其中包含了每个国家每年仍在行驶的汽车数量--国家是列,指数是年。
我想要的是一个 Dataframe ,其中包含在任何一年中有多少辆汽车在A国行驶的信息。
我已经在一个循环中完成了它,但是我如何使用向量来完成它,并希望得到更容易调试和运行更快的代码呢?
我试着用循环的方式来做,它工作了(这意味着它做了我上面描述的事情),但是在更大的范围内,如果我们能看到向量/矩阵是如何完成的,那将是令人惊讶的,而且如果我们谈论的是50个国家的话,它会快多少。
import pandas as pd
import numpy as np
#Creating data
df = pd.DataFrame(np.random.randint(100,1000,size=(100, 5)), columns=list('ABCDE'))
break_vector = np.random.dirichlet(np.ones(100),size=1)
#Empty dataframe to store results
all_markets = pd.DataFrame()
#The countries to include
countries = list('ABCDE')
#Loopty loop stuff
for country in countries:
zero_data = np.zeros(shape=(1000,1000))
d = pd.DataFrame(zero_data)
sold = df[country].cumsum()
for sales in range(0,100):
sales_year=df.iloc[sales,countries.index(country)]
for breaks in range(0,100):
breakdowns = sales_year*break_vector[0,breaks]
d.iloc[breaks+sales,sales]=breakdowns
print(breaks+sales)
#Remaining in market - row sums
result1 = sold-d.sum(axis=1).cumsum()[0:100]
all_markets[country] = result1
´´´
1条答案
按热度按时间von4xj4u1#
我的解决方案的要点是,当你把生存向量(break_vector)乘以新车时,你会得到每年坏掉的所有汽车,作为矩阵中对角线的总和,其中偏移量=0是现在,99是最老的一辆:
您可以使用以下方法可视化解决方案:
每个国家的迭代,我会做一个循环,但也可以矢量化使用三维矩阵以同样的方式。