优化POWER BI 新建列函数:PO= IF([yr]<2023 && [ym] =12&&[so]>0,1,if([yr]>=2023&&[ym]=max(ltab[ym])&&[so]>0,1,0))
时间: 2023-11-24 12:06:13 浏览: 59
,"Y","N")
谢谢提问。关于优化 POWER BI 新建列函数,我们可以考虑以下几点:
1. 简化 IF 函数: 在以上代码中,可以将 IF([yr]<2023, "Y", "N") 简化为 [yr]<2023,因为[yr]<2023 已经返回 Y 或 N 。
2. 优化计算速度: 如果这个表很大,而且需要使用这个新建列函数,我们可以考虑使用计算列而不是新建列。因为计算列只会在需要时计算一次。而新建列会持久化保存在模型中,会增加模型的大小和加载速度。
3. 利用 Power Query: 通过 Power Query,我们可以在数据加载之前对数据进行转换。因此,我们可以考虑在 Power Query 中添加一个自定义列,然后使用相同的逻辑“IF([yr]<2023,"Y","N")”来创建一个新列。
希望这些建议能够对你有所帮助。如果你还有其他问题,请随时向我提问。
相关问题
T=2s,yr(k)为史密斯预估器的预估输出。PID控制器中:Kp=0.5,Ki=0.01,Kd=0 被控对象传递函数:G=(e^(-15s))/(88.2s+1) 史密斯预估器的传递函数: G0(s)=(1一e^(-15s))/(88.2s+1) 对史密斯预估器进行离散化: yT(k) =ayT(k 一1)+ b[u(k)- u(k -N)] 其中: a=e88.2 ,b=1-e88.2。 计算史密斯预估器的输出: u(k)= u(k - 1)+Kp[e2(k)- e2(k -1)]+Kie2(k)+Kd[e2(k)一2e2(k -1)+e2(k 一2)]/////根据这些数据设计一个史密斯预估器,编写c语言程序,并画出结构框图
根据给出的数据,我们可以设计一个史密斯预估器的C语言程序,并画出结构框图。以下是程序和框图的代码:
```c
#include <stdio.h>
#define T 2.0
#define N 1
#define Kp 0.5
#define Ki 0.01
#define Kd 0.0
#define a exp(88.2*T*(-1.0))
#define b (1.0-a)
// 史密斯预估器的状态变量
double y[N+1];
double u[N+1];
// 史密斯预估器的输出
double yr;
// 史密斯预估器的计算
void smith_predictor(double e2)
{
int i;
double du, de2, de2_old, de2_old2;
// 计算控制量的增量
de2 = e2 - y[0];
de2_old = y[0] - y[1];
de2_old2 = y[1] - y[2];
du = Kp*(de2 - de2_old) + Ki*e2 + Kd*(de2 + 2.0*de2_old - de2_old2);
// 更新状态变量
for(i = N; i > 0; i--)
{
y[i] = y[i-1];
u[i] = u[i-1];
}
u[0] += du;
y[0] = a*y[0] + b*u[0];
// 更新输出
yr = y[0];
}
int main()
{
// 初始化状态变量和输出
int i;
for(i = 0; i <= N; i++)
{
y[i] = 0.0;
u[i] = 0.0;
}
yr = 0.0;
// 计算史密斯预估器的输出
smith_predictor(0.0); // 初始化
for(i = 1; i <= 100; i++)
{
double e2 = 1.0; // 输入信号
smith_predictor(e2);
printf("%.2f\n", yr);
}
return 0;
}
```
框图如下:
```
+-----+ +---+ +---+
u(k)----| |----| a |----| |----yr(k)
| | +---+ | 1 |
| Kp | | |
| Ki | | b |
| Kd | +---+
+-----+
```
其中,Kp、Ki和Kd分别为PID控制器的参数,a和b为离散化系数,N为时延,T为采样周期。
long operator int ()const //成员转换函数 { long ndays = 0; //步骤1) for (int i = 1; i < yr; ++i) //步骤2) ndays += Leapyear(i) ? 366 : 365; for (int i = 1; i < mo; ++i) //步骤3) ndays += dys[i - 1]; if (mo > 2 && Leapyear(yr)) //闰年闰月加一天 ++ndays; ndays += day; //步骤4) return ndays; 怎么改进为正确形式
这段代码需要的改进是将其转换为正确的形式。目前这段代码存在以下问题:
1. 不应该将 `operator int()` 定义为 `const` 成员函数,因为它会修改对象的状态。
2. 在计算年份对应的天数时,应该考虑当前年份是否为闰年。如果当前年份是闰年,应该将该年份的天数加一。
3. 在计算月份对应的天数时,应该考虑当前月份之前的所有月份的天数总和。
下面是改进后的代码:
```
operator int() {
int ndays = 0;
for (int i = 1; i < yr; ++i) {
ndays += Leapyear(i) ? 366 : 365;
}
if (Leapyear(yr) && mo > 2) {
ndays += 1; // 当前年份是闰年且当前月份大于2,因此需要加一天
}
for (int i = 1; i < mo; ++i) {
ndays += dys[i - 1];
}
ndays += day;
return ndays;
}
```
阅读全文